See ChangeLog: Mon May 31 19:41:10 CEST 1999 Werner Koch
[gnupg.git] / util / secmem.c
index 30396f3..f48b0ed 100644 (file)
@@ -1,5 +1,5 @@
 /* secmem.c  - memory allocation from a secure heap
- *     Copyright (C) 1998 Free Software Foundation, Inc.
+ *     Copyright (C) 1998,1999 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
@@ -47,8 +47,7 @@ struct memblock_struct {
     unsigned size;
     union {
        MEMBLOCK *next;
-       long align_dummy;
-       char d[1];
+       PROPERLY_ALIGNED_TYPE aligned;
     } u;
 };
 
@@ -71,7 +70,7 @@ static int suspend_warning;
 
 
 static void
-print_warn()
+print_warn(void)
 {
     if( !no_warning )
        log_info(_("Warning: using insecure memory!\n"));
@@ -104,7 +103,7 @@ lock_pool( void *p, size_t n )
   #endif
 
     if( uid && !geteuid() ) {
-       if( setuid( uid ) )
+       if( setuid( uid ) || getuid() != geteuid()  )
            log_fatal("failed to reset uid: %s\n", strerror(errno));
     }
 
@@ -217,13 +216,13 @@ void
 secmem_init( size_t n )
 {
     if( !n ) {
-      #ifndef __MINGW32__
+      #ifndef HAVE_DOSISH_SYSTEM
        uid_t uid;
 
        disable_secmem=1;
        uid = getuid();
        if( uid != geteuid() ) {
-           if( setuid( uid ) )
+           if( setuid( uid ) || getuid() != geteuid() )
                log_fatal("failed to drop setuid\n" );
        }
       #endif
@@ -245,8 +244,12 @@ secmem_malloc( size_t size )
     MEMBLOCK *mb, *mb2;
     int compressed=0;
 
-    if( !pool_okay )
-       log_bug("secmem not initialized\n");
+    if( !pool_okay ) {
+       log_info(
+        _("operation is not possible without initialized secure memory\n"));
+       log_info(_("(you may have used the wrong program for this task)\n"));
+       exit(2);
+    }
     if( show_warning && !suspend_warning ) {
        show_warning = 0;
        print_warn();
@@ -287,7 +290,7 @@ secmem_malloc( size_t size )
        max_alloced = cur_alloced;
     if( cur_blocks > max_blocks )
        max_blocks = cur_blocks;
-    return &mb->u.d;
+    return &mb->u.aligned.c;
 }
 
 
@@ -298,7 +301,7 @@ secmem_realloc( void *p, size_t newsize )
     size_t size;
     void *a;
 
-    mb = (MEMBLOCK*)((char*)p - ((size_t) &((MEMBLOCK*)0)->u.d));
+    mb = (MEMBLOCK*)((char*)p - ((size_t) &((MEMBLOCK*)0)->u.aligned.c));
     size = mb->size;
     if( newsize < size )
        return p; /* it is easier not to shrink the memory */
@@ -319,8 +322,10 @@ secmem_free( void *a )
     if( !a )
        return;
 
-    mb = (MEMBLOCK*)((char*)a - ((size_t) &((MEMBLOCK*)0)->u.d));
+    mb = (MEMBLOCK*)((char*)a - ((size_t) &((MEMBLOCK*)0)->u.aligned.c));
     size = mb->size;
+    /* This does not make much sense: probably this memory is held in the
+     * cache. We do it anyway: */
     memset(mb, 0xff, size );
     memset(mb, 0xaa, size );
     memset(mb, 0x55, size );