commit 603fbccdabb5ba489d6a226a4b3cc07c90cd18dc
parent 3b2157e4f0a155dd777c628e623d5e3ee623f76d
Author: dzwdz <not@dzwdz.net>
Date: Sat, 6 Sep 2025 21:29:14 +0200
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.
Diffstat:
3 files changed, 11 insertions(+), 15 deletions(-)
diff --git 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
@@ -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
@@ -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)