]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Use _exit() in the fatal() function
authorOndřej Surý <ondrej@isc.org>
Wed, 7 Feb 2024 13:44:39 +0000 (14:44 +0100)
committerOndřej Surý <ondrej@isc.org>
Thu, 8 Feb 2024 07:01:58 +0000 (08:01 +0100)
Since the fatal() isn't a correct but rather abrupt termination of the
program, we want to skip the various atexit() calls because not all
memory might be freed during fatal() call, etc.  Using _exit() instead
of exit() has this effect - the program will end, but no destructors or
atexit routines will be called.

13 files changed:
bin/check/named-checkzone.c
bin/confgen/util.c
bin/delv/delv.c
bin/dig/dighost.c
bin/dnssec/dnssectool.c
bin/named/main.c
bin/named/server.c
bin/nsupdate/nsupdate.c
bin/rndc/util.c
bin/tools/dnstap-read.c
bin/tools/mdig.c
bin/tools/named-rrchecker.c
bin/tools/nsec3hash.c

index da909d67de7325647d385b94963371223626e281..7ad917df9d1c22e780d960f2a79820f501711e32 100644 (file)
@@ -79,7 +79,7 @@ usage(void) {
                "%s zonename [ (filename|-) ]\n",
                prog_name,
                progmode == progmode_check ? "[-o filename]" : "-o filename");
-       exit(1);
+       exit(EXIT_FAILURE);
 }
 
 static void
@@ -206,7 +206,7 @@ main(int argc, char **argv) {
                        } else {
                                fprintf(stderr, "invalid argument to -i: %s\n",
                                        isc_commandline_argument);
-                               exit(1);
+                               exit(EXIT_FAILURE);
                        }
                        break;
 
@@ -240,7 +240,7 @@ main(int argc, char **argv) {
                        } else {
                                fprintf(stderr, "invalid argument to -k: %s\n",
                                        isc_commandline_argument);
-                               exit(1);
+                               exit(EXIT_FAILURE);
                        }
                        break;
 
@@ -251,7 +251,7 @@ main(int argc, char **argv) {
                        if (*endp != '\0') {
                                fprintf(stderr, "source serial number "
                                                "must be numeric");
-                               exit(1);
+                               exit(EXIT_FAILURE);
                        }
                        break;
 
@@ -262,7 +262,7 @@ main(int argc, char **argv) {
                        if (*endp != '\0') {
                                fprintf(stderr, "maximum TTL "
                                                "must be numeric");
-                               exit(1);
+                               exit(EXIT_FAILURE);
                        }
                        break;
 
@@ -279,7 +279,7 @@ main(int argc, char **argv) {
                        } else {
                                fprintf(stderr, "invalid argument to -n: %s\n",
                                        isc_commandline_argument);
-                               exit(1);
+                               exit(EXIT_FAILURE);
                        }
                        break;
 
@@ -296,7 +296,7 @@ main(int argc, char **argv) {
                        } else {
                                fprintf(stderr, "invalid argument to -m: %s\n",
                                        isc_commandline_argument);
-                               exit(1);
+                               exit(EXIT_FAILURE);
                        }
                        break;
 
@@ -321,7 +321,7 @@ main(int argc, char **argv) {
                        } else {
                                fprintf(stderr, "invalid argument to -r: %s\n",
                                        isc_commandline_argument);
-                               exit(1);
+                               exit(EXIT_FAILURE);
                        }
                        break;
 
@@ -334,7 +334,7 @@ main(int argc, char **argv) {
                                fprintf(stderr,
                                        "unknown or unsupported style: %s\n",
                                        isc_commandline_argument);
-                               exit(1);
+                               exit(EXIT_FAILURE);
                        }
                        break;
 
@@ -344,7 +344,7 @@ main(int argc, char **argv) {
                                fprintf(stderr, "isc_dir_chroot: %s: %s\n",
                                        isc_commandline_argument,
                                        isc_result_totext(result));
-                               exit(1);
+                               exit(EXIT_FAILURE);
                        }
                        break;
 
@@ -364,7 +364,7 @@ main(int argc, char **argv) {
                        } else {
                                fprintf(stderr, "invalid argument to -C: %s\n",
                                        isc_commandline_argument);
-                               exit(1);
+                               exit(EXIT_FAILURE);
                        }
                        break;
 
@@ -385,7 +385,7 @@ main(int argc, char **argv) {
                        } else {
                                fprintf(stderr, "invalid argument to -M: %s\n",
                                        isc_commandline_argument);
-                               exit(1);
+                               exit(EXIT_FAILURE);
                        }
                        break;
 
@@ -402,7 +402,7 @@ main(int argc, char **argv) {
                        } else {
                                fprintf(stderr, "invalid argument to -S: %s\n",
                                        isc_commandline_argument);
-                               exit(1);
+                               exit(EXIT_FAILURE);
                        }
                        break;
 
@@ -414,7 +414,7 @@ main(int argc, char **argv) {
                        } else {
                                fprintf(stderr, "invalid argument to -T: %s\n",
                                        isc_commandline_argument);
-                               exit(1);
+                               exit(EXIT_FAILURE);
                        }
                        break;
 
@@ -438,7 +438,7 @@ main(int argc, char **argv) {
                default:
                        fprintf(stderr, "%s: unhandled option -%c\n", prog_name,
                                isc_commandline_option);
-                       exit(1);
+                       exit(EXIT_FAILURE);
                }
        }
 
@@ -447,7 +447,7 @@ main(int argc, char **argv) {
                if (result != ISC_R_SUCCESS) {
                        fprintf(stderr, "isc_dir_chdir: %s: %s\n", workdir,
                                isc_result_totext(result));
-                       exit(1);
+                       exit(EXIT_FAILURE);
                }
        }
 
@@ -463,7 +463,7 @@ main(int argc, char **argv) {
                } else {
                        fprintf(stderr, "unknown file format: %s\n",
                                inputformatstr);
-                       exit(1);
+                       exit(EXIT_FAILURE);
                }
        }
 
@@ -481,12 +481,12 @@ main(int argc, char **argv) {
                            rawversion > 1U)
                        {
                                fprintf(stderr, "unknown raw format version\n");
-                               exit(1);
+                               exit(EXIT_FAILURE);
                        }
                } else {
                        fprintf(stderr, "unknown file format: %s\n",
                                outputformatstr);
-                       exit(1);
+                       exit(EXIT_FAILURE);
                }
        }
 
index 23b7f3fd57edb60e475c7513509464c15914bc9f..9f65ac1ccc3de25038efbb03cdb758ea0e42b34b 100644 (file)
 
 /*! \file */
 
-#include "util.h"
 #include <stdarg.h>
 #include <stdbool.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <unistd.h>
 
 #include <isc/tls.h>
 
+#include "util.h"
+
 extern bool verbose;
 extern const char *progname;
 
@@ -46,5 +48,5 @@ fatal(const char *format, ...) {
        va_end(args);
        fprintf(stderr, "\n");
        isc__tls_setfatalmode();
-       exit(1);
+       _exit(EXIT_FAILURE);
 }
index 16e005ab7fed40114818e062d46a32ccf34a99c2..2d4de3d9739d0c6cf7c0ede4d7cf2c56b0019d9f 100644 (file)
@@ -264,7 +264,7 @@ fatal(const char *format, ...) {
        va_end(args);
        fprintf(stderr, "\n");
        isc__tls_setfatalmode();
-       exit(1);
+       _exit(EXIT_FAILURE);
 }
 
 static void
index a02b4cbff989291dbca2a58bdec89bcb4225376d..1f10437a4128c76f9e1abd63e9c195e69d98c840 100644 (file)
@@ -359,8 +359,6 @@ get_reverse(char *reverse, size_t len, char *value, bool strict) {
        }
 }
 
-void (*dighost_pre_exit_hook)(void) = NULL;
-
 #if TARGET_OS_IPHONE
 void
 warn(const char *format, ...) {
@@ -393,10 +391,7 @@ digexit(void) {
                exitcode = 10;
        }
        if (fatalexit != 0) {
-               exitcode = fatalexit;
-       }
-       if (dighost_pre_exit_hook != NULL) {
-               dighost_pre_exit_hook();
+               _exit(fatalexit);
        }
        exit(exitcode);
 }
@@ -412,6 +407,11 @@ fatal(const char *format, ...) {
        va_end(args);
        fprintf(stderr, "\n");
        isc__tls_setfatalmode();
+       if (fatalexit == 0 && exitcode != 0) {
+               fatalexit = exitcode;
+       } else if (fatalexit == 0) {
+               fatalexit = EXIT_FAILURE;
+       }
        digexit();
 }
 
index 59fc80b3f650b145347c018086f83ed7dda85dcd..60c6e31832b7428851d7b8b1a611fe383078fed2 100644 (file)
@@ -20,6 +20,7 @@
 #include <inttypes.h>
 #include <stdbool.h>
 #include <stdlib.h>
+#include <unistd.h>
 
 #include <isc/base32.h>
 #include <isc/buffer.h>
@@ -84,7 +85,9 @@ fatal(const char *format, ...) {
                (*fatalcallback)();
        }
        isc__tls_setfatalmode();
-       exit(1);
+
+       /* Make sure that various atexit() calls are skipped */
+       _exit(EXIT_FAILURE);
 }
 
 void
index 36c0a553619f571b61f04cad6e97029422cba2b0..00ef0e0f7fb045b8490618411c7abde03d633860 100644 (file)
@@ -194,7 +194,7 @@ named_main_earlyfatal(const char *format, ...) {
        }
        va_end(args);
 
-       exit(1);
+       _exit(EXIT_FAILURE);
 }
 
 noreturn static void
@@ -233,7 +233,7 @@ assertion_failed(const char *file, int line, isc_assertiontype_t type,
        if (named_g_coreok) {
                abort();
        }
-       exit(1);
+       _exit(EXIT_FAILURE);
 }
 
 noreturn static void
@@ -273,7 +273,7 @@ library_fatal_error(const char *file, int line, const char *func,
        if (named_g_coreok) {
                abort();
        }
-       exit(1);
+       _exit(EXIT_FAILURE);
 }
 
 static void
index 6f9463f3446205ef15383a7b75415484e89f6150..09929237445a05d988db698a5575d5e6e113fb70 100644 (file)
@@ -10204,7 +10204,7 @@ fatal(const char *msg, isc_result_t result) {
                      "exiting (due to fatal error)");
        named_os_shutdown();
        isc__tls_setfatalmode();
-       exit(1);
+       _exit(EXIT_FAILURE);
 }
 
 static isc_result_t
index 7290ab28aa6ce477e4261884968c1cd4802411af..39858f30d05dbba6d58b26c4354888f187062367 100644 (file)
@@ -280,7 +280,7 @@ fatal(const char *format, ...) {
        va_end(args);
        fprintf(stderr, "\n");
        isc__tls_setfatalmode();
-       exit(1);
+       _exit(EXIT_FAILURE);
 }
 
 static void
index 23b7f3fd57edb60e475c7513509464c15914bc9f..948ca87334467614727926c2f1fcd5be797d18ae 100644 (file)
@@ -18,6 +18,7 @@
 #include <stdbool.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <unistd.h>
 
 #include <isc/tls.h>
 
@@ -46,5 +47,5 @@ fatal(const char *format, ...) {
        va_end(args);
        fprintf(stderr, "\n");
        isc__tls_setfatalmode();
-       exit(1);
+       _exit(EXIT_FAILURE);
 }
index b998d9db7ff48d1230cccd0491bc190887513463..d66f829f2bc75c7735de6a7f1e1482da8e0da309 100644 (file)
@@ -32,6 +32,7 @@
 #include <inttypes.h>
 #include <stdbool.h>
 #include <stdlib.h>
+#include <unistd.h>
 
 #include <protobuf-c/protobuf-c.h>
 
@@ -83,7 +84,7 @@ fatal(const char *format, ...) {
        vfprintf(stderr, format, args);
        va_end(args);
        fprintf(stderr, "\n");
-       exit(1);
+       _exit(EXIT_FAILURE);
 }
 
 static void
index 1c36679403472538855071b0fa83ff575da94193..8fb98e9f742daf8f6a0ecb2ebe718e286286edcb 100644 (file)
@@ -898,7 +898,7 @@ fatal(const char *format, ...) {
        va_end(args);
        fprintf(stderr, "\n");
        isc__tls_setfatalmode();
-       exit(-2);
+       _exit(EXIT_FAILURE);
 }
 
 static isc_result_t
index b20a7e7d280415f88cb79abfa3b21cd5b11eedc6..19e59f1e4ceeb8d4e78ba89bce25157dcc586e24 100644 (file)
@@ -13,6 +13,7 @@
 
 #include <stdbool.h>
 #include <stdlib.h>
+#include <unistd.h>
 
 #include <isc/attributes.h>
 #include <isc/buffer.h>
@@ -75,7 +76,7 @@ fatal(const char *format, ...) {
        va_end(args);
        fputc('\n', stderr);
        cleanup();
-       exit(1);
+       _exit(EXIT_FAILURE);
 }
 
 int
index aaa52d0bb042dcfb93e3cd5aab4be2d88c58a75b..b114c0280e7453dba2e39e8cbc61121e2d15cb0e 100644 (file)
@@ -14,6 +14,7 @@
 #include <stdarg.h>
 #include <stdbool.h>
 #include <stdlib.h>
+#include <unistd.h>
 
 #include <isc/attributes.h>
 #include <isc/base32.h>
@@ -48,7 +49,7 @@ fatal(const char *format, ...) {
        va_end(args);
        fprintf(stderr, "\n");
        isc__tls_setfatalmode();
-       exit(1);
+       _exit(1);
 }
 
 static void