aboutsummaryrefslogtreecommitdiffstats
path: root/util/secmem.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>1998-09-14 15:49:56 +0000
committerWerner Koch <[email protected]>1998-09-14 15:49:56 +0000
commitc07a88da5d293db89726767fef58090177b423f4 (patch)
tree7ea1d5d10d3e65cf29c4b03616772fb4c829f4d1 /util/secmem.c
parentUpdates (diff)
downloadgnupg-c07a88da5d293db89726767fef58090177b423f4.tar.gz
gnupg-c07a88da5d293db89726767fef58090177b423f4.zip
New release
Diffstat (limited to '')
-rw-r--r--util/secmem.c32
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));