From 96b6bae5bcfb46c9f2773551cb037a4ccd9bb455 Mon Sep 17 00:00:00 2001 From: Tony Finch Date: Fri, 14 Oct 2022 17:37:47 +0100 Subject: [PATCH] Include the function name when reporting unexpected errors I.e. print the name of the function in BIND that called the system function that returned an error. Since it was useful for pthreads code, it seems worthwhile doing so everywhere. (cherry picked from commit 26ed03a61e0cb6359a985784ffad93630cb2aeff) --- bin/named/main.c | 26 ++++++++++--------- bin/tests/system/dyndb/driver/db.c | 6 ++--- bin/tests/system/dyndb/driver/log.h | 2 -- bin/tests/system/dyndb/driver/syncptr.c | 2 +- lib/isc/error.c | 33 +++++++++++-------------- lib/isc/include/isc/error.h | 14 +++++------ lib/isc/include/isc/util.h | 19 +++++++------- lib/isc/mem.c | 4 +-- 8 files changed, 50 insertions(+), 56 deletions(-) diff --git a/bin/named/main.c b/bin/named/main.c index 4fdfa98fa3..c496bfb587 100644 --- a/bin/named/main.c +++ b/bin/named/main.c @@ -240,12 +240,12 @@ assertion_failed(const char *file, int line, isc_assertiontype_t type, } noreturn static void -library_fatal_error(const char *file, int line, const char *format, - va_list args) ISC_FORMAT_PRINTF(3, 0); +library_fatal_error(const char *file, int line, const char *func, + const char *format, va_list args) ISC_FORMAT_PRINTF(3, 0); static void -library_fatal_error(const char *file, int line, const char *format, - va_list args) { +library_fatal_error(const char *file, int line, const char *func, + const char *format, va_list args) { /* * Handle isc_error_fatal() calls from our libraries. */ @@ -259,7 +259,7 @@ library_fatal_error(const char *file, int line, const char *format, isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL, NAMED_LOGMODULE_MAIN, ISC_LOG_CRITICAL, - "%s:%d: fatal error:", file, line); + "%s:%d:%s(): fatal error: ", file, line, func); isc_log_vwrite(named_g_lctx, NAMED_LOGCATEGORY_GENERAL, NAMED_LOGMODULE_MAIN, ISC_LOG_CRITICAL, format, args); @@ -267,7 +267,7 @@ library_fatal_error(const char *file, int line, const char *format, NAMED_LOGMODULE_MAIN, ISC_LOG_CRITICAL, "exiting (due to fatal error in library)"); } else { - fprintf(stderr, "%s:%d: fatal error: ", file, line); + fprintf(stderr, "%s:%d:%s(): fatal error: ", file, line, func); vfprintf(stderr, format, args); fprintf(stderr, "\n"); fflush(stderr); @@ -280,12 +280,13 @@ library_fatal_error(const char *file, int line, const char *format, } static void -library_unexpected_error(const char *file, int line, const char *format, - va_list args) ISC_FORMAT_PRINTF(3, 0); +library_unexpected_error(const char *file, int line, const char *func, + const char *format, va_list args) + ISC_FORMAT_PRINTF(3, 0); static void -library_unexpected_error(const char *file, int line, const char *format, - va_list args) { +library_unexpected_error(const char *file, int line, const char *func, + const char *format, va_list args) { /* * Handle isc_error_unexpected() calls from our libraries. */ @@ -293,12 +294,13 @@ library_unexpected_error(const char *file, int line, const char *format, if (named_g_lctx != NULL) { isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL, NAMED_LOGMODULE_MAIN, ISC_LOG_ERROR, - "%s:%d: unexpected error:", file, line); + "%s:%d:%s(): unexpected error: ", file, line, + func); isc_log_vwrite(named_g_lctx, NAMED_LOGCATEGORY_GENERAL, NAMED_LOGMODULE_MAIN, ISC_LOG_ERROR, format, args); } else { - fprintf(stderr, "%s:%d: fatal error: ", file, line); + fprintf(stderr, "%s:%d:%s(): fatal error: ", file, line, func); vfprintf(stderr, format, args); fprintf(stderr, "\n"); fflush(stderr); diff --git a/bin/tests/system/dyndb/driver/db.c b/bin/tests/system/dyndb/driver/db.c index 05485bd631..a2bdb6916b 100644 --- a/bin/tests/system/dyndb/driver/db.c +++ b/bin/tests/system/dyndb/driver/db.c @@ -133,7 +133,7 @@ beginload(dns_db_t *db, dns_rdatacallbacks_t *callbacks) { UNUSED(db); UNUSED(callbacks); - fatal_error("current implementation should never call beginload()"); + FATAL_ERROR("current implementation should never call beginload()"); /* Not reached */ return (ISC_R_SUCCESS); @@ -149,7 +149,7 @@ endload(dns_db_t *db, dns_rdatacallbacks_t *callbacks) { UNUSED(db); UNUSED(callbacks); - fatal_error("current implementation should never call endload()"); + FATAL_ERROR("current implementation should never call endload()"); /* Not reached */ return (ISC_R_SUCCESS); @@ -163,7 +163,7 @@ dump(dns_db_t *db, dns_dbversion_t *version, const char *filename, UNUSED(filename); UNUSED(masterformat); - fatal_error("current implementation should never call dump()"); + FATAL_ERROR("current implementation should never call dump()"); /* Not reached */ return (ISC_R_SUCCESS); diff --git a/bin/tests/system/dyndb/driver/log.h b/bin/tests/system/dyndb/driver/log.h index 2cb968bf81..375db2b46a 100644 --- a/bin/tests/system/dyndb/driver/log.h +++ b/bin/tests/system/dyndb/driver/log.h @@ -34,8 +34,6 @@ #include -#define fatal_error(...) isc_error_fatal(__FILE__, __LINE__, __VA_ARGS__) - #define log_error_r(fmt, ...) \ log_error(fmt ": %s", ##__VA_ARGS__, isc_result_totext(result)) diff --git a/bin/tests/system/dyndb/driver/syncptr.c b/bin/tests/system/dyndb/driver/syncptr.c index 81d98e5d43..5124df32b4 100644 --- a/bin/tests/system/dyndb/driver/syncptr.c +++ b/bin/tests/system/dyndb/driver/syncptr.c @@ -157,7 +157,7 @@ syncptr_find_zone(sample_instance_t *inst, dns_rdata_t *rdata, dns_name_t *name, break; default: - fatal_error("unsupported address type 0x%x", rdata->type); + FATAL_ERROR("unsupported address type 0x%x", rdata->type); break; } diff --git a/lib/isc/error.c b/lib/isc/error.c index 336be8432e..051a6c48aa 100644 --- a/lib/isc/error.c +++ b/lib/isc/error.c @@ -21,12 +21,12 @@ /*% Default unexpected callback. */ static void -default_unexpected_callback(const char *, int, const char *, va_list) - ISC_FORMAT_PRINTF(3, 0); +default_unexpected_callback(const char *, int, const char *, const char *, + va_list) ISC_FORMAT_PRINTF(4, 0); /*% Default fatal callback. */ static void -default_fatal_callback(const char *, int, const char *, va_list) +default_fatal_callback(const char *, int, const char *, const char *, va_list) ISC_FORMAT_PRINTF(3, 0); /*% unexpected_callback */ @@ -52,42 +52,39 @@ isc_error_setfatal(isc_errorcallback_t cb) { } void -isc_error_unexpected(const char *file, int line, const char *format, ...) { +isc_error_unexpected(const char *file, int line, const char *func, + const char *format, ...) { va_list args; va_start(args, format); - (unexpected_callback)(file, line, format, args); + (unexpected_callback)(file, line, func, format, args); va_end(args); } void -isc_error_fatal(const char *file, int line, const char *format, ...) { +isc_error_fatal(const char *file, int line, const char *func, + const char *format, ...) { va_list args; va_start(args, format); - (fatal_callback)(file, line, format, args); + (fatal_callback)(file, line, func, format, args); va_end(args); abort(); } -void -isc_error_runtimecheck(const char *file, int line, const char *expression) { - isc_error_fatal(file, line, "RUNTIME_CHECK(%s) failed", expression); -} - static void -default_unexpected_callback(const char *file, int line, const char *format, - va_list args) { - fprintf(stderr, "%s:%d: ", file, line); +default_unexpected_callback(const char *file, int line, const char *func, + const char *format, va_list args) { + fprintf(stderr, "%s:%d:%s(): ", file, line, func); vfprintf(stderr, format, args); fprintf(stderr, "\n"); fflush(stderr); } static void -default_fatal_callback(const char *file, int line, const char *format, - va_list args) { - fprintf(stderr, "%s:%d: fatal error: ", file, line); +default_fatal_callback(const char *file, int line, const char *func, + const char *format, va_list args) { + fprintf(stderr, "%s:%d:%s(): fatal error: ", file, line, func); vfprintf(stderr, format, args); fprintf(stderr, "\n"); fflush(stderr); diff --git a/lib/isc/include/isc/error.h b/lib/isc/include/isc/error.h index 96552bcb78..f4f668203f 100644 --- a/lib/isc/include/isc/error.h +++ b/lib/isc/include/isc/error.h @@ -23,7 +23,8 @@ ISC_LANG_BEGINDECLS -typedef void (*isc_errorcallback_t)(const char *, int, const char *, va_list); +typedef void (*isc_errorcallback_t)(const char *, int, const char *, + const char *, va_list); /*% set unexpected error */ void isc_error_setunexpected(isc_errorcallback_t); @@ -33,15 +34,12 @@ void isc_error_setfatal(isc_errorcallback_t); /*% unexpected error */ void -isc_error_unexpected(const char *, int, const char *, ...) - ISC_FORMAT_PRINTF(3, 4); +isc_error_unexpected(const char *, int, const char *, const char *, ...) + ISC_FORMAT_PRINTF(4, 5); /*% fatal error */ noreturn void -isc_error_fatal(const char *, int, const char *, ...) ISC_FORMAT_PRINTF(3, 4); - -/*% runtimecheck error */ -noreturn void -isc_error_runtimecheck(const char *, int, const char *); +isc_error_fatal(const char *, int, const char *, const char *, ...) + ISC_FORMAT_PRINTF(4, 5); ISC_LANG_ENDDECLS diff --git a/lib/isc/include/isc/util.h b/lib/isc/include/isc/util.h index 66b82eb1ad..6b8e581450 100644 --- a/lib/isc/include/isc/util.h +++ b/lib/isc/include/isc/util.h @@ -313,16 +313,17 @@ mock_assert(const int result, const char *const expression, #include /* for ISC_STRERRORSIZE */ #define UNEXPECTED_ERROR(...) \ - isc_error_unexpected(__FILE__, __LINE__, __VA_ARGS__) + isc_error_unexpected(__FILE__, __LINE__, __func__, __VA_ARGS__) -#define FATAL_ERROR(...) isc_error_fatal(__FILE__, __LINE__, __VA_ARGS__) +#define FATAL_ERROR(...) \ + isc_error_fatal(__FILE__, __LINE__, __func__, __VA_ARGS__) -#define REPORT_SYSERROR(report, err, fmt, ...) \ - { \ - char _strerr[ISC_STRERRORSIZE]; \ - strerror_r(err, _strerr, sizeof(_strerr)); \ - report(__FILE__, __LINE__, fmt ": %s (%d)", ##__VA_ARGS__, \ - _strerr, err); \ +#define REPORT_SYSERROR(report, err, fmt, ...) \ + { \ + char strerr[ISC_STRERRORSIZE]; \ + strerror_r(err, strerr, sizeof(strerr)); \ + report(__FILE__, __LINE__, __func__, fmt ": %s (%d)", \ + ##__VA_ARGS__, strerr, err); \ } #define UNEXPECTED_SYSERROR(err, ...) \ @@ -340,7 +341,7 @@ mock_assert(const int result, const char *const expression, #else /* UNIT_TESTING */ #define RUNTIME_CHECK(cond) \ - ((cond) ? (void)0 : isc_error_runtimecheck(__FILE__, __LINE__, #cond)) + ((cond) ? (void)0 : FATAL_ERROR("RUNTIME_CHECK(%s) failed", #cond)) #endif /* UNIT_TESTING */ diff --git a/lib/isc/mem.c b/lib/isc/mem.c index 9af25e600a..3ca55b6bb6 100644 --- a/lib/isc/mem.c +++ b/lib/isc/mem.c @@ -1236,9 +1236,7 @@ isc__mempool_destroy(isc_mempool_t **restrict mpctxp FLARG) { #endif if (mpctx->allocated > 0) { - UNEXPECTED_ERROR( - "isc_mempool_destroy(): mempool %s leaked memory", - mpctx->name); + UNEXPECTED_ERROR("mempool %s leaked memory", mpctx->name); } REQUIRE(mpctx->allocated == 0);