]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
add a log_backtrace_once macro
authordzwdz <not@dzwdz.net>
Sat, 6 Sep 2025 19:29:14 +0000 (21:29 +0200)
committerdzwdz <not@dzwdz.net>
Wed, 10 Sep 2025 21:26:04 +0000 (23:26 +0200)
This is a common pattern when calling log_backtrace, and we already have
similar macros like tor_assert_nonfatal_once.

src/core/mainloop/connection.c
src/feature/dirclient/dirclient.c
src/lib/err/backtrace.h

index d8fd4839f939b0bca692c9e093a0ee6a59d03fb9..c8c3a660de7612e8742a5ff49d69cd703e8cc19c 100644 (file)
@@ -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
index 9aa3164a65644dd336d599301d52675464929e0f..367cbae28f6fc2138d4cf3924f44619abbe24242 100644 (file)
@@ -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;
   }
 
index ec14d1ab024056c1a461f40403f5c25c062f05d0..ac63758452f3176c194761e761eb81e928f52523 100644 (file)
@@ -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)