aboutsummaryrefslogtreecommitdiffstats
path: root/util
diff options
context:
space:
mode:
Diffstat (limited to 'util')
-rw-r--r--util/ChangeLog4
-rw-r--r--util/errors.c1
-rw-r--r--util/secmem.c32
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));