From: dzwdz Date: Sat, 6 Sep 2025 19:29:14 +0000 (+0200) Subject: add a log_backtrace_once macro X-Git-Tag: tor-0.4.9.3-alpha~9^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=603fbccdabb5ba489d6a226a4b3cc07c90cd18dc;p=thirdparty%2Ftor.git add a log_backtrace_once macro This is a common pattern when calling log_backtrace, and we already have similar macros like tor_assert_nonfatal_once. --- diff --git a/src/core/mainloop/connection.c b/src/core/mainloop/connection.c index d8fd4839f9..c8c3a660de 100644 --- a/src/core/mainloop/connection.c +++ b/src/core/mainloop/connection.c @@ -2338,15 +2338,11 @@ connection_connect_log_client_use_ip_version(const connection_t *conn) /* Check if we broke a mandatory address family restriction */ if ((must_ipv4 && tor_addr_family(&real_addr) == AF_INET6) || (must_ipv6 && tor_addr_family(&real_addr) == AF_INET)) { - static int logged_backtrace = 0; log_info(LD_BUG, "Outgoing %s connection to %s violated ClientUseIPv%s 0.", conn->type == CONN_TYPE_OR ? "OR" : "Dir", fmt_addr(&real_addr), options->ClientUseIPv4 == 0 ? "4" : "6"); - if (!logged_backtrace) { - log_backtrace(LOG_INFO, LD_BUG, "Address came from"); - logged_backtrace = 1; - } + log_backtrace_once(LOG_INFO, LD_BUG, "Address came from"); } /* Bridges are allowed to break IPv4/IPv6 ORPort preferences to connect to diff --git a/src/feature/dirclient/dirclient.c b/src/feature/dirclient/dirclient.c index 9aa3164a65..367cbae28f 100644 --- a/src/feature/dirclient/dirclient.c +++ b/src/feature/dirclient/dirclient.c @@ -688,7 +688,6 @@ directory_choose_address_routerstatus(const routerstatus_t *status, /* We rejected all addresses in the relay's status. This means we can't * connect to it. */ if (!have_or && !have_dir) { - static int logged_backtrace = 0; char *ipv6_str = tor_addr_to_str_dup(&status->ipv6_addr); log_info(LD_BUG, "Rejected all OR and Dir addresses from %s when " "launching an outgoing directory connection to: IPv4 %s OR %d " @@ -697,10 +696,7 @@ directory_choose_address_routerstatus(const routerstatus_t *status, status->ipv4_dirport, ipv6_str, status->ipv6_orport, status->ipv4_dirport); tor_free(ipv6_str); - if (!logged_backtrace) { - log_backtrace(LOG_INFO, LD_BUG, "Addresses came from"); - logged_backtrace = 1; - } + log_backtrace_once(LOG_INFO, LD_BUG, "Addresses came from"); return -1; } @@ -1325,15 +1321,11 @@ directory_initiate_request,(directory_request_t *request)) /* Make sure that the destination addr and port we picked is viable. */ if (!port || tor_addr_is_null(&addr)) { - static int logged_backtrace = 0; log_warn(LD_DIR, "Cannot make an outgoing %sconnection without a remote %sPort.", use_begindir ? "begindir " : "", use_begindir ? "OR" : "Dir"); - if (!logged_backtrace) { - log_backtrace(LOG_INFO, LD_BUG, "Address came from"); - logged_backtrace = 1; - } + log_backtrace_once(LOG_INFO, LD_BUG, "Address came from"); return; } diff --git a/src/lib/err/backtrace.h b/src/lib/err/backtrace.h index ec14d1ab02..ac63758452 100644 --- a/src/lib/err/backtrace.h +++ b/src/lib/err/backtrace.h @@ -29,6 +29,14 @@ const char *get_tor_backtrace_version(void); #define log_backtrace(sev, dom, msg) \ log_backtrace_impl((sev), (dom), (msg), tor_log) +#define log_backtrace_once(sev, dom, msg) STMT_BEGIN \ + static int backtrace_logged__ = 0; \ + if (!backtrace_logged__) { \ + backtrace_logged__ = 1; \ + log_backtrace((sev), (dom), (msg)); \ + } \ + STMT_END + #ifdef BACKTRACE_PRIVATE #if defined(HAVE_EXECINFO_H) && defined(HAVE_BACKTRACE) && \ defined(HAVE_BACKTRACE_SYMBOLS_FD) && defined(HAVE_SIGACTION)