From: Francis Dupont Date: Wed, 8 Mar 2017 14:29:38 +0000 (+0100) Subject: Merged #32744 (out of memory) X-Git-Tag: v4_1_esv_r15b1~29 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3017a20673b62401b59c93e8d0f18eddf81a44d2;p=thirdparty%2Fdhcp.git Merged #32744 (out of memory) --- diff --git a/RELNOTES b/RELNOTES index 387cc4f23..445acdfd2 100644 --- a/RELNOTES +++ b/RELNOTES @@ -75,6 +75,10 @@ by Eric Young (eay@cryptsoft.com). Thanks to Fernando Soto at BlueCat Networks for reporting the issue. [ISC-Bugs #43219] +- When memory allocation fails in a repeated way the process writes + "Run out of memory." on the standard error and exists with status 1. + [ISC-Bugs #32744] + Changes since 4.1-ESV-R14b1 - None diff --git a/omapip/alloc.c b/omapip/alloc.c index 0d846a7a8..800bca73a 100644 --- a/omapip/alloc.c +++ b/omapip/alloc.c @@ -52,6 +52,9 @@ int rc_history_count; static void print_rc_hist_entry (int); #endif +static int dmalloc_failures; +static char out_of_memory[] = "Run out of memory."; + void * dmalloc(size_t size, const char *file, int line) { unsigned char *foo; @@ -69,8 +72,21 @@ dmalloc(size_t size, const char *file, int line) { foo = malloc(len); - if (!foo) + if (!foo) { + dmalloc_failures++; + if (dmalloc_failures > 10) { + /* In case log_fatal() returns here */ + IGNORE_RET(write(STDERR_FILENO, + out_of_memory, + strlen(out_of_memory))); + IGNORE_RET(write(STDERR_FILENO, "\n", 1)); + exit(1); + } else if (dmalloc_failures >= 10) { + /* Something went wrong beyond repair. */ + log_fatal("Fatal error: out of memory."); + } return NULL; + } bar = (void *)(foo + DMDOFFSET); memset (bar, 0, size);