diff --git a/CHANGES b/CHANGES index 4e23fa28ad..d18ec89337 100644 --- a/CHANGES +++ b/CHANGES @@ -25,6 +25,8 @@ 5101. [bug] Fix default installation path for Python modules. [GL #730] +5098. [func] Failed memory allocations are now fatal. [GL #674] + 5097. [cleanup] Remove embedded ATF unit testing framework from BIND source distribution. [GL !875] diff --git a/lib/isc/mem.c b/lib/isc/mem.c index 41383ed7ef..49b61c994c 100644 --- a/lib/isc/mem.c +++ b/lib/isc/mem.c @@ -14,6 +14,7 @@ #include #include +#include #include #include #include @@ -28,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -861,11 +863,48 @@ mem_putstats(isc__mem_t *ctx, void *ptr, size_t size) { static void * default_memalloc(void *arg, size_t size) { UNUSED(arg); - if (size == 0U) + + if (size == 0U) { size = 1; + } + return (malloc(size)); } +static void * +internal_memalloc(void *arg, size_t size) { + void *ptr; + UNUSED(arg); + + if (size == 0U) { + size = 1; + } + + 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 default_memfree(void *arg, void *ptr) { UNUSED(arg); @@ -2707,7 +2746,7 @@ isc_mem_create(size_t init_max_size, size_t target_size, isc_mem_t **mctxp) { if (isc_bind9) return (isc_mem_createx2(init_max_size, target_size, - default_memalloc, default_memfree, + internal_memalloc, default_memfree, NULL, mctxp, isc_mem_defaultflags)); LOCK(&createlock); @@ -2726,7 +2765,7 @@ isc_mem_create2(size_t init_max_size, size_t target_size, isc_mem_t **mctxp, { if (isc_bind9) return (isc_mem_createx2(init_max_size, target_size, - default_memalloc, default_memfree, + internal_memalloc, default_memfree, NULL, mctxp, flags)); return (isc_mem_createx2(init_max_size, target_size,