stgMallocBytes: Tolerate malloc(0) returning a NULL ptr
authorHerbert Valerio Riedel <hvr@gnu.org>
Mon, 21 Mar 2016 20:40:23 +0000 (21:40 +0100)
committerHerbert Valerio Riedel <hvr@gnu.org>
Mon, 21 Mar 2016 20:46:37 +0000 (21:46 +0100)
This is valid behaviour for `malloc()` according to ISO C99 and POSIX,
and there's at least one operating system (AIX) which actually does return
NULL for 0-sized allocations.

The `createAdjustor()` routine is currently the only known use-site of
`stgMallocBytes` which may call `stgMallocBytes()` requesting a 0-size
allocation.

(cherry picked from commit 1934f7f1066423a6b35b1f17bf63d40c92681d31)

rts/RtsUtils.c

index 72e19a0..a36532c 100644 (file)
@@ -64,6 +64,19 @@ stgMallocBytes (int n, char *msg)
 
     n2 = (size_t) n;
     if ((space = (char *) malloc(n2)) == NULL) {
+      /* Quoting POSIX.1-2008 (which says more or less the same as ISO C99):
+       *
+       *   "Upon successful completion with size not equal to 0, malloc() shall
+       *   return a pointer to the allocated space. If size is 0, either a null
+       *   pointer or a unique pointer that can be successfully passed to free()
+       *   shall be returned. Otherwise, it shall return a null pointer and set
+       *   errno to indicate the error."
+       *
+       * Consequently, a NULL pointer being returned by `malloc()` for a 0-size
+       * allocation is *not* to be considered an error.
+       */
+      if (n == 0) return NULL;
+
       /* don't fflush(stdout); WORKAROUND bug in Linux glibc */
       rtsConfig.mallocFailHook((W_) n, msg); /*msg*/
       stg_exit(EXIT_INTERNAL_ERROR);