/* 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
/* 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 "
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;
}
/* 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;
}
#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)