]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Fixed a munmap abort bug
authorMaria Matejka <mq@ucw.cz>
Wed, 13 Apr 2022 09:28:15 +0000 (11:28 +0200)
committerMaria Matejka <mq@ucw.cz>
Wed, 13 Apr 2022 09:36:54 +0000 (11:36 +0200)
When BIRD was munmapping too many pages, it sometimes aborted, saying
that munmap failed with "Not enough memory" as the address space was
getting more and more fragmented.

There is a workaround in place, simply keeping that page for future use,
yet it has never been compiled in because I somehow forgot to include
errno.h. And because I also thought that somebody may have ENOMEM not
defined (why?!), there was a check which quietly omitted that
workaround.

Anyway, ENOMEM is POSIX. It's an utter nonsense to check for its
existence. If it doesn't exist, something is broken.

sysdep/unix/alloc.c

index 0e944d57f3b35039aba344c7062629423c553e5b..90453f7b3050020a19ccb95fec6601ef075312f9 100644 (file)
@@ -11,6 +11,7 @@
 #include "lib/lists.h"
 #include "lib/event.h"
 
+#include <errno.h>
 #include <stdlib.h>
 #include <unistd.h>
 
@@ -116,10 +117,8 @@ cleanup_pages(void *data UNUSED)
     rem_node(ptr);
     if (munmap(ptr, get_page_size()) == 0)
       pages_kept--;
-#ifdef ENOMEM
     else if (errno == ENOMEM)
       add_tail(&pages_list, ptr);
-#endif
     else
       bug("munmap(%p) failed: %m", ptr);
   }