From: Vladimír Čunát Date: Wed, 12 May 2021 11:48:00 +0000 (+0200) Subject: lib/utils kr_fail(): don't mangle errno X-Git-Tag: v5.4.0~18^2~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4b62334f290460fb2d4bebc4a74120a4cdc816ec;p=thirdparty%2Fknot-resolver.git lib/utils kr_fail(): don't mangle errno --- diff --git a/lib/utils.c b/lib/utils.c index b3e9b549e..7287fcfe4 100644 --- a/lib/utils.c +++ b/lib/utils.c @@ -43,6 +43,7 @@ int kr_dbg_assumption_fork = DBG_ASSUMPTION_FORK; void kr_fail(bool is_fatal, const char *expr, const char *func, const char *file, int line) { + const int errno_orig = errno; if (is_fatal) kr_log_critical("requirement \"%s\" failed in %s@%s:%d\n", expr, func, file, line); else @@ -51,12 +52,12 @@ void kr_fail(bool is_fatal, const char *expr, const char *func, const char *file if (is_fatal || (kr_dbg_assumption_abort && !kr_dbg_assumption_fork)) abort(); else if (!kr_dbg_assumption_abort || !kr_dbg_assumption_fork) - return; + goto recover; // We want to fork and abort the child, unless rate-limited. static uint64_t limited_until = 0; const uint64_t now = kr_now(); if (now < limited_until) - return; + goto recover; if (kr_dbg_assumption_fork > 0) { // Add jitter +- 25%; in other words: 75% + uniform(0,50%). // Motivation: if a persistent problem starts happening, desynchronize @@ -66,6 +67,8 @@ void kr_fail(bool is_fatal, const char *expr, const char *func, const char *file } if (fork() == 0) abort(); +recover: + errno = errno_orig; } /* diff --git a/lib/utils.h b/lib/utils.h index 82bcf66e4..e11e8b144 100644 --- a/lib/utils.h +++ b/lib/utils.h @@ -57,6 +57,7 @@ typedef void (*trace_log_f)(const struct kr_request *request, const char *msg); * If the check fails, optionally fork()+abort() to generate coredump * and continue running in parent process. Return value must be handled to * ensure safe recovery from error. Use kr_require() for unrecoverable checks. + * The errno variable is not mangled, e.g. you can: if (!kr_assume(...)) return errno; */ #define kr_assume(expression) kr_assume_func((expression), #expression, \ __func__, __FILE__, __LINE__) diff --git a/modules/dnstap/dnstap.c b/modules/dnstap/dnstap.c index 56e101227..73e8df7dd 100644 --- a/modules/dnstap/dnstap.c +++ b/modules/dnstap/dnstap.c @@ -387,7 +387,7 @@ static int find_string(const JsonNode *node, char **val, size_t len) { return kr_error(EINVAL); *val = strndup(node->string_, len); if (!kr_assume(*val != NULL)) - return kr_error(EFAULT); + return kr_error(errno); return kr_ok(); }