diff --git a/crypto/sec_mem.c b/crypto/sec_mem.c index b7a9d3b6e..2e29219d5 100644 --- a/crypto/sec_mem.c +++ b/crypto/sec_mem.c @@ -19,8 +19,11 @@ # include # include # include +# include # include # include +# include +# include #endif #define LOCK() CRYPTO_w_lock(CRYPTO_LOCK_MALLOC) @@ -336,8 +339,21 @@ static int sh_init(size_t size, int minsize) pgsize = PAGE_SIZE; #endif sh.map_size = pgsize + sh.arena_size + pgsize; - sh.map_result = mmap(NULL, sh.map_size, - PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, -1, 0); + if (1) { +#ifdef MAP_ANON + sh.map_result = mmap(NULL, sh.map_size, + PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, -1, 0); + } else { +#endif + int fd; + + sh.map_result = MAP_FAILED; + if ((fd = open("/dev/zero", O_RDWR)) >= 0) { + sh.map_result = mmap(NULL, sh.map_size, + PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0); + close(fd); + } + } OPENSSL_assert(sh.map_result != MAP_FAILED); if (sh.map_result == MAP_FAILED) goto err;