diff options
Diffstat (limited to 'util')
-rw-r--r-- | util/ChangeLog | 4 | ||||
-rw-r--r-- | util/errors.c | 1 | ||||
-rw-r--r-- | util/secmem.c | 32 |
3 files changed, 33 insertions, 4 deletions
diff --git a/util/ChangeLog b/util/ChangeLog index 8644bb7d6..edcbb5ca3 100644 --- a/util/ChangeLog +++ b/util/ChangeLog @@ -1,3 +1,7 @@ +Mon Sep 14 09:38:18 1998 Werner Koch (wk@(none)) + + * secmem.c (init_pool): Now mmaps /dev/zero if we do not have MAP_ANON. + Wed Sep 9 13:52:28 1998 Werner Koch (wk@(none)) * ttyio.c (do_get): Ctrl-D is now a valid but special character diff --git a/util/errors.c b/util/errors.c index 54671a297..dc3f7e811 100644 --- a/util/errors.c +++ b/util/errors.c @@ -92,6 +92,7 @@ g10_errstr( int err ) X(TIME_CONFLICT ,"Timestamp conflict") X(WR_PUBKEY_ALGO ,"Unusable pubkey algorithm") X(FILE_EXISTS ,"File exists") + X(WEAK_KEY ,"Weak key") default: p = buf; sprintf(buf, "g10err=%d", err); break; } #undef X 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)); |