]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Abort on memory allocation failure
authorOndřej Surý <ondrej@sury.org>
Mon, 12 Nov 2018 10:50:52 +0000 (11:50 +0100)
committerOndřej Surý <ondrej@sury.org>
Thu, 15 Nov 2018 16:24:08 +0000 (17:24 +0100)
lib/isc/mem.c

index 7a2691f481a5d3398237ab8784f8c4fb8e10bfdc..120760ee23d4cf040d72b4a40db80cb6d5b6a6f6 100644 (file)
@@ -14,6 +14,7 @@
 #include <config.h>
 
 #include <inttypes.h>
+#include <errno.h>
 #include <stdbool.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -712,10 +713,32 @@ mem_putstats(isc__mem_t *ctx, void *ptr, size_t size) {
 
 static void *
 default_memalloc(void *arg, size_t size) {
+       void *ptr;
        UNUSED(arg);
-       if (size == 0U)
-               size = 1;
-       return (malloc(size));
+
+       ptr = malloc(size);
+
+       /*
+        * If the space cannot be allocated, a null pointer is returned. If the
+        * size of the space requested is zero, the behavior is
+        * implementation-defined: either a null pointer is returned, or the
+        * behavior is as if the size were some nonzero value, except that the
+        * returned pointer shall not be used to access an object.
+        * [ISO9899 § 7.22.3]
+        *
+        * [ISO9899]
+        *   ISO/IEC WG 9899:2011: Programming languages - C.
+        *   International Organization for Standardization, Geneva, Switzerland.
+        *   http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1570.pdf
+        */
+
+       if (ptr == NULL && size != 0) {
+               char strbuf[ISC_STRERRORSIZE];
+               strerror_r(errno, strbuf, sizeof(strbuf));
+               isc_error_fatal(__FILE__, __LINE__, "malloc failed: %s", strbuf);
+       }
+
+       return (ptr);
 }
 
 static void