changeset 29144:d368d97d2441

Fix a compilation error of realloc.c on OSF/1 4.0d and similar bugs.
author Bruno Haible <bruno@clisp.org>
date Tue, 06 Nov 2007 00:27:27 +0100
parents 4380657d0b90
children 63694be8fe7c
files ChangeLog lib/realloc.c modules/malloc modules/realloc
diffstat 4 files changed, 40 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Mon Nov 05 08:27:07 2007 +0100
+++ b/ChangeLog	Tue Nov 06 00:27:27 2007 +0100
@@ -1,3 +1,13 @@
+2007-10-27  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>
+            Bruno Haible  <bruno@clisp.org>
+
+	* modules/malloc (configure.ac): Define GNULIB_MALLOC_GNU always.
+	* modules/realloc (configure.ac): Define GNULIB_REALLOC_GNU always.
+	* lib/realloc.c (SYSTEM_MALLOC_GLIBC_COMPATIBLE): New macro.
+	(malloc): Undefine also before including <stdlib.h>.
+	(rpl_realloc): Turn malloc(0) into malloc(1) if necessary.
+	Needed on OSF/1 4.0.
+
 2007-11-05  Jim Meyering  <meyering@redhat.com>
 
 	git-version-gen: sync from coreutils.
--- a/lib/realloc.c	Mon Nov 05 08:27:07 2007 +0100
+++ b/lib/realloc.c	Tue Nov 06 00:27:27 2007 +0100
@@ -18,18 +18,32 @@
 /* written by Jim Meyering and Bruno Haible */
 
 #include <config.h>
+
 /* Only the AC_FUNC_REALLOC macro defines 'realloc' already in config.h.  */
 #ifdef realloc
-# define NEED_REALLOC_GNU
-# undef realloc
+# define NEED_REALLOC_GNU 1
 #endif
 
+/* Infer the properties of the system's malloc function.
+   Only the AC_FUNC_MALLOC macro defines 'malloc' already in config.h.  */
+#if GNULIB_MALLOC_GNU && !defined malloc
+# define SYSTEM_MALLOC_GLIBC_COMPATIBLE 1
+#endif
+
+/* Below we want to call the system's malloc and realloc.
+   Undefine the symbols here so that including <stdlib.h> provides a
+   declaration of malloc(), not of rpl_malloc(), and likewise for realloc.  */
+#undef malloc
+#undef realloc
+
 /* Specification.  */
 #include <stdlib.h>
 
 #include <errno.h>
 
-/* Call the system's malloc and realloc below.  */
+/* Below we want to call the system's malloc and realloc.
+   Undefine the symbols, if they were defined by gnulib's <stdlib.h>
+   replacement.  */
 #undef malloc
 #undef realloc
 
@@ -42,7 +56,7 @@
 {
   void *result;
 
-#ifdef NEED_REALLOC_GNU
+#if NEED_REALLOC_GNU
   if (n == 0)
     {
       n = 1;
@@ -53,7 +67,16 @@
     }
 #endif
 
-  result = (p == NULL ? malloc (n) : realloc (p, n));
+  if (p == NULL)
+    {
+#if GNULIB_REALLOC_GNU && !NEED_REALLOC_GNU && !SYSTEM_MALLOC_GLIBC_COMPATIBLE
+      if (n == 0)
+	n = 1;
+#endif
+      result = malloc (n);
+    }
+  else
+    result = realloc (p, n);
 
 #if !HAVE_REALLOC_POSIX
   if (result == NULL)
--- a/modules/malloc	Mon Nov 05 08:27:07 2007 +0100
+++ b/modules/malloc	Tue Nov 06 00:27:27 2007 +0100
@@ -9,6 +9,7 @@
 
 configure.ac:
 AC_FUNC_MALLOC
+AC_DEFINE([GNULIB_MALLOC_GNU], 1, [Define to indicate the 'malloc' module.])
 
 Makefile.am:
 
--- a/modules/realloc	Mon Nov 05 08:27:07 2007 +0100
+++ b/modules/realloc	Tue Nov 06 00:27:27 2007 +0100
@@ -9,6 +9,7 @@
 
 configure.ac:
 AC_FUNC_REALLOC
+AC_DEFINE([GNULIB_REALLOC_GNU], 1, [Define to indicate the 'realloc' module.])
 
 Makefile.am: