* global.c (gcry_calloc,gcry_calloc_secure): Check for overflow.
authorWerner Koch <wk@gnupg.org>
Mon, 9 Dec 2002 10:43:45 +0000 (10:43 +0000)
committerWerner Koch <wk@gnupg.org>
Mon, 9 Dec 2002 10:43:45 +0000 (10:43 +0000)
Noted by Florian Weimer.

src/ChangeLog
src/gcrypt.h
src/global.c

index 1b5994e..1ace063 100644 (file)
@@ -1,3 +1,8 @@
+2002-12-09  Werner Koch  <wk@gnupg.org>
+
+       * global.c (gcry_calloc,gcry_calloc_secure): Check for overflow.
+       Noted by Florian Weimer. 
+
 2002-11-10  Simon Josefsson  <jas@extundo.com>
 
        * gcrypt.h (gcry_ctl_cmds): New GCRYCTL_SET_CBC_CTS control flag.
index b301b71..8504979 100644 (file)
@@ -37,7 +37,7 @@ extern "C" {
    autoconf (using the AM_PATH_GCRYPT macro) check that this header
    matches the installed library.  Note: Do not edit the next line as
    configure may fix the string here.  */
-#define GCRYPT_VERSION "1.1.10"
+#define GCRYPT_VERSION "1.1.11"
 
 /* Internal: We can't to use the convenience macros for the multi
    precision integer functions when building this library. */
index 20e74a1..1a6ff50 100644 (file)
@@ -25,6 +25,8 @@
 #include <stdarg.h>
 #include <ctype.h>
 #include <assert.h>
+#include <limits.h>
+#include <errno.h>
 
 #include "g10lib.h"
 #include "cipher.h"
@@ -438,21 +440,41 @@ gcry_free( void *p )
 }
 
 void *
-gcry_calloc( size_t n, size_t m )
+gcry_calloc (size_t n, size_t m)
 {
-    void *p = gcry_malloc( n*m );
-    if( p )
-       memset( p, 0, n*m );
-    return p;
+  size_t bytes;
+  void *p;
+
+  bytes = n * m; /* size_t is unsigned so the behavior on overflow is defined. */
+  if (m && bytes / m != n) 
+    {
+      errno = ENOMEM;
+      return NULL;
+    }
+
+  p = gcry_malloc (bytes);
+  if (p)
+    memset (p, 0, bytes);
+  return p;
 }
 
 void *
-gcry_calloc_secure( size_t n, size_t m )
+gcry_calloc_secure (size_t n, size_t m)
 {
-    void *p = gcry_malloc_secure( n*m );
-    if( p )
-       memset( p, 0, n*m );
-    return p;
+  size_t bytes;
+  void *p;
+
+  bytes = n * m; /* size_t is unsigned so the behavior on overflow is defined. */
+  if (m && bytes / m != n) 
+    {
+      errno = ENOMEM;
+      return NULL;
+    }
+  
+  p = gcry_malloc_secure (bytes);
+  if (p)
+    memset (p, 0, bytes);
+  return p;
 }