diff --git a/lib/isc/mem.c b/lib/isc/mem.c index 7a2691f481..120760ee23 100644 --- a/lib/isc/mem.c +++ b/lib/isc/mem.c @@ -14,6 +14,7 @@ #include #include +#include #include #include #include @@ -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