]> git.ipfire.org Git - thirdparty/dhcp.git/commitdiff
Merged #32744 (out of memory)
authorFrancis Dupont <fdupont@isc.org>
Wed, 8 Mar 2017 13:58:20 +0000 (14:58 +0100)
committerFrancis Dupont <fdupont@isc.org>
Wed, 8 Mar 2017 13:58:20 +0000 (14:58 +0100)
RELNOTES
omapip/alloc.c

index acc7ed179829082dbe7e3c5aed6991635187290b..29de8f11f078695a86e590baf4d5a410cfab7893 100644 (file)
--- a/RELNOTES
+++ b/RELNOTES
@@ -981,6 +981,10 @@ by Eric Young (eay@cryptsoft.com).
   causing the legacy configure script to loop when run with --enable-libtool.
   [ISC-Bugs #43546]
 
+- 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.2.0 (new features)
 
 - If a client renews before 'dhcp-cache-threshold' percent of its lease
index 905434466cf26ffdd216991e044940ad0a5bc1a4..a95ad6cafca3b803534d26a5b674e9c3489c5d60 100644 (file)
@@ -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);