diff options
author | Werner Koch <[email protected]> | 1998-09-14 15:49:56 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 1998-09-14 15:49:56 +0000 |
commit | c07a88da5d293db89726767fef58090177b423f4 (patch) | |
tree | 7ea1d5d10d3e65cf29c4b03616772fb4c829f4d1 /util/secmem.c | |
parent | Updates (diff) | |
download | gnupg-c07a88da5d293db89726767fef58090177b423f4.tar.gz gnupg-c07a88da5d293db89726767fef58090177b423f4.zip |
New release
Diffstat (limited to '')
-rw-r--r-- | util/secmem.c | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/util/secmem.c b/util/secmem.c index d78fabecf..44df08b16 100644 --- a/util/secmem.c +++ b/util/secmem.c @@ -28,6 +28,7 @@ #include <unistd.h> #include <sys/mman.h> #include <sys/types.h> + #include <fcntl.h> #endif #include "types.h" @@ -103,15 +104,38 @@ lock_pool( void *p, size_t n ) static void init_pool( size_t n) { + size_t pgsize; + poolsize = n; if( disable_secmem ) log_bug("secure memory is disabled"); - #if HAVE_MMAP && defined(MAP_ANON) - poolsize = (poolsize + 4095) & ~4095; - pool = mmap( 0, poolsize, PROT_READ|PROT_WRITE, - MAP_PRIVATE|MAP_ANON, -1, 0); + #ifdef HAVE_GETPAGESIZE + pgsize = getpagesize(); + #else + pgsize = 4096; + #endif + + #if HAVE_MMAP + poolsize = (poolsize + pgsize -1 ) & ~(pgsize-1); + #ifdef MAP_ANONYMOUS + pool = mmap( 0, poolsize, PROT_READ|PROT_WRITE, + MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); + #else /* map /dev/zero instead */ + { int fd; + + fd = open("/dev/zero", O_RDWR); + if( fd == -1 ) { + log_error("can't open /dev/zero: %s\n", strerror(errno) ); + pool = (void*)-1; + } + else { + pool = mmap( 0, poolsize, PROT_READ|PROT_WRITE, + MAP_PRIVATE, fd, 0); + } + } + #endif if( pool == (void*)-1 ) log_error("can't mmap pool of %u bytes: %s - using malloc\n", (unsigned)poolsize, strerror(errno)); |