Reject allocations of exactly SIZE_MAX bytes.
authorPaul Eggert <eggert@cs.ucla.edu>
Thu, 6 Nov 2003 19:40:49 +0000 (19:40 +0000)
committerPaul Eggert <eggert@cs.ucla.edu>
Thu, 6 Nov 2003 19:40:49 +0000 (19:40 +0000)
lib/ChangeLog
lib/xalloc.h
lib/xreadlink.c

index 077788b..74022b7 100644 (file)
@@ -1,3 +1,11 @@
+2003-11-06  Paul Eggert  <eggert@twinsun.com>
+
+       * xalloc.h [HAVE_STDINT_H]: Include <stdint.h>.
+       (xalloc_oversized) [! (PTRDIFF_MAX < SIZE_MAX)]:
+       Reject sizes of exactly SIZE_MAX bytes.
+       * xreadlink.c: Include "xalloc.h" before checking whether SIZE_MAX
+       is defined, since "xalloc.h" now defines SIZE_MAX on modern hosts.
+       
 2003-11-05  Bruno Haible  <bruno@clisp.org>
 
        * xsize.h: Include limits.h, to avoid a possible collision with
index 5ccea22..a09015f 100644 (file)
@@ -21,6 +21,9 @@
 # define XALLOC_H_
 
 # include <stddef.h>
+# if HAVE_STDINT_H
+#  include <stdint.h>
+# endif
 
 # ifndef __attribute__
 #  if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) || __STRICT_ANSI__
@@ -62,8 +65,19 @@ char *xstrdup (const char *str);
 /* Return 1 if an array of N objects, each of size S, cannot exist due
    to size arithmetic overflow.  S must be positive and N must be
    nonnegative.  This is a macro, not an inline function, so that it
-   works correctly even when SIZE_MAX < N.  */
-#define xalloc_oversized(n, s) ((size_t) -1 / (s) < (n))
+   works correctly even when SIZE_MAX < N.
+
+   By gnulib convention, SIZE_MAX represents overflow in size
+   calculations, so reject attempted allocations of exactly SIZE_MAX
+   bytes.  However, malloc (SIZE_MAX) fails on all known hosts where
+   PTRDIFF_MAX < SIZE_MAX, so do not bother to test for
+   exactly-SIZE_MAX allocations on such hosts; this avoids a test and
+   branch when S is known to be 1.  */
+# if defined PTRDIFF_MAX && PTRDIFF_MAX < SIZE_MAX
+#  define xalloc_oversized(n, s) ((size_t) -1 / (s) < (n))
+# else
+#  define xalloc_oversized(n, s) ((size_t) -1 / (s) <= (n))
+# endif
 
 /* These macros are deprecated; they will go away soon, and are retained
    temporarily only to ease conversion to the functions described above.  */
index e8c677b..2fb389e 100644 (file)
@@ -36,6 +36,9 @@ extern int errno;
 # include <unistd.h>
 #endif
 
+#include "xalloc.h"
+#include "xreadlink.h"
+
 #ifndef SIZE_MAX
 # define SIZE_MAX ((size_t) -1)
 #endif
@@ -43,9 +46,6 @@ extern int errno;
 # define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2))
 #endif
 
-#include "xalloc.h"
-#include "xreadlink.h"
-
 /* Call readlink to get the symbolic link value of FILENAME.
    Return a pointer to that NUL-terminated string in malloc'd storage.
    If readlink fails, return NULL (caller may use errno to diagnose).