Make sure to return correct error codes for secmem failures.
authorWerner Koch <wk@gnupg.org>
Tue, 19 Apr 2011 14:22:48 +0000 (16:22 +0200)
committerWerner Koch <wk@gnupg.org>
Tue, 19 Apr 2011 14:22:48 +0000 (16:22 +0200)
ERRNO was not always set and thus it could happen that a misleading
error code was returned form a malloc functions.  Fix was to set
ERRNO.

At one place we also switched to the newer gpg_err_code_from_syserror
which makes sure to return a special error code in case ERRNO is not
set at all.

cipher/ChangeLog
cipher/cipher.c
src/ChangeLog
src/secmem.c
src/stdmem.c

index 2a28b20..fb05141 100644 (file)
@@ -1,3 +1,8 @@
+2011-04-19  Werner Koch  <wk@g10code.com>
+
+       * cipher.c (gcry_cipher_open): Replace gpg_err_code_from_errno by
+       gpg_err_code_from_syserror.
+
 2011-04-11  Werner Koch  <wk@g10code.com>
 
        * pubkey.c (gcry_pk_get_keygrip): Avoid double free of L2.
index 90fdb17..b0a532a 100644 (file)
@@ -786,7 +786,7 @@ gcry_cipher_open (gcry_cipher_hd_t *handle,
        h = gcry_calloc (1, size);
 
       if (! h)
-       err = gpg_err_code_from_errno (errno);
+       err = gpg_err_code_from_syserror ();
       else
        {
           size_t off = 0;
index 9476e82..2907e85 100644 (file)
@@ -1,3 +1,10 @@
+2011-04-19  Werner Koch  <wk@g10code.com>
+
+       * stdmem.c (_gcry_private_malloc_secure, _gcry_private_malloc):
+       Set ERRNO on failure.
+       * secmem.c (mb_get_new): Set ERRNO on failure.
+       (_gcry_secmem_malloc_internal): Ditto.
+
 2011-04-01  Werner Koch  <wk@g10code.com>
 
        * global.c (gcry_realloc): Divert to gcry_malloc or gcry_free.
index 30c2777..2beb234 100644 (file)
@@ -217,7 +217,10 @@ mb_get_new (memblock_t *block, size_t size)
       }
 
   if (! ptr_into_pool_p (mb))
-    mb = NULL;
+    {
+      gpg_err_set_errno (ENOMEM);
+      mb = NULL;
+    }
 
   return mb;
 }
@@ -516,12 +519,14 @@ _gcry_secmem_malloc_internal (size_t size)
         {
           log_info (_("operation is not possible without "
                       "initialized secure memory\n"));
+          gpg_err_set_errno (ENOMEM);
           return NULL;
         }
     }
   if (not_locked && fips_mode ())
     {
       log_info (_("secure memory pool is not locked while in FIPS mode\n"));
+      gpg_err_set_errno (ENOMEM);
       return NULL;
     }
   if (show_warning && !suspend_warning)
index c20c4b4..189da37 100644 (file)
@@ -49,6 +49,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <stdarg.h>
+#include <errno.h>
 
 #include "g10lib.h"
 #include "stdmem.h"
@@ -88,8 +89,12 @@ void *
 _gcry_private_malloc (size_t n)
 {
   if (!n)
-    return NULL; /* Allocating 0 bytes is undefined - we better return
-                    an error to detect such coding errors.  */
+    {
+      gpg_err_set_errno (EINVAL);
+      return NULL; /* Allocating 0 bytes is undefined - we better return
+                      an error to detect such coding errors.  */
+    }
+
   if (use_m_guard)
     {
       char *p;
@@ -118,8 +123,12 @@ void *
 _gcry_private_malloc_secure (size_t n)
 {
   if (!n)
-    return NULL; /* Allocating 0 bytes is undefined - better return an
-                    error to detect such coding errors.  */
+    {
+      gpg_err_set_errno (EINVAL);
+      return NULL; /* Allocating 0 bytes is undefined - better return an
+                      error to detect such coding errors.  */
+    }
+
   if (use_m_guard)
     {
       char *p;