From 378d26619d815cb38633109831f39405bd795dff Mon Sep 17 00:00:00 2001 From: Bob Halley Date: Sat, 23 Oct 1999 00:33:04 +0000 Subject: [PATCH] catch assertion failures and library fatal errors --- bin/named/main.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/bin/named/main.c b/bin/named/main.c index 749d4a5374..ee26eba94c 100644 --- a/bin/named/main.c +++ b/bin/named/main.c @@ -23,6 +23,7 @@ #include #include +#include #include #include #include @@ -109,12 +110,66 @@ early_fatal(char *format, ...) { } else { vfprintf(stderr, format, args); fprintf(stderr, "\n"); + fflush(stderr); } va_end(args); exit(1); } +static void +assertion_failed(char *file, int line, isc_assertiontype_t type, char *cond) { + /* + * Handle assertion failures. + */ + + if (ns_g_lctx != NULL) { + isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, + NS_LOGMODULE_MAIN, ISC_LOG_CRITICAL, + "%s:%d: %s(%s) failed", file, line, + isc_assertion_typetotext(type), cond); + isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, + NS_LOGMODULE_MAIN, ISC_LOG_CRITICAL, + "exiting (due assertion failure)"); + } else { + fprintf(stderr, "%s:%d: %s(%s) failed\n", + file, line, isc_assertion_typetotext(type), cond); + fflush(stderr); + } + + if (ns_g_coreok) + abort(); + exit(1); +} + +static void +library_fatal_error(char *file, int line, char *format, va_list args) { + /* + * Handle isc_error_fatal() calls from our libraries. + */ + + if (ns_g_lctx != NULL) { + isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, + NS_LOGMODULE_MAIN, ISC_LOG_CRITICAL, + "%s:%d: fatal error", file, line); + isc_log_vwrite(ns_g_lctx, NS_LOGCATEGORY_GENERAL, + NS_LOGMODULE_MAIN, ISC_LOG_CRITICAL, + format, args); + isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, + NS_LOGMODULE_MAIN, ISC_LOG_CRITICAL, + "exiting (due to fatal error in library)"); + } else { + fprintf(stderr, "%s:%d: fatal error: ", file, line); + vfprintf(stderr, format, args); + fprintf(stderr, "\n"); + fflush(stderr); + } + + if (ns_g_coreok) + abort(); + exit(1); +} + static void usage(void) { fprintf(stderr, @@ -285,6 +340,9 @@ main(int argc, char *argv[]) { linux_dropprivs(); #endif + isc_assertion_setcallback(assertion_failed); + isc_error_setfatal(library_fatal_error); + result = isc_app_start(); if (result != ISC_R_SUCCESS) early_fatal("isc_app_start() failed: %s",