+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
# 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__
/* 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. */
# include <unistd.h>
#endif
+#include "xalloc.h"
+#include "xreadlink.h"
+
#ifndef SIZE_MAX
# define SIZE_MAX ((size_t) -1)
#endif
# 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).