From 905287415b834db1a92205e8436f66a3b2d6846c Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Thu, 8 Jan 2015 11:00:21 -0500 Subject: [PATCH] Avoid attempts to double-remove edge connections from the DNS resolver. Also, avoid crashing when we attempt to double-remove an edge connection from the DNS resolver: just log a bug warning instead. Fixes bug 14129. Bugfix on 0d20fee2fbd48978, which was in 0.0.7rc1. jowr found the bug. cypherpunks wrote the fix. I added the log message and removed the assert. --- changes/bug14129 | 7 +++++++ src/or/dns.c | 6 +++++- 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 changes/bug14129 diff --git a/changes/bug14129 b/changes/bug14129 new file mode 100644 index 0000000000..6153cd84fd --- /dev/null +++ b/changes/bug14129 @@ -0,0 +1,7 @@ + o Major bugfixes (exit node stability): + + - Fix an assertion failure that could occur under high DNS load. Fixes + bug 14129; bugfix on Tor 0.0.7rc1. Found by "jowr"; diagnosed and fixed + by "cypherpunks". + + diff --git a/src/or/dns.c b/src/or/dns.c index fb1b10d82c..8b6e3b0543 100644 --- a/src/or/dns.c +++ b/src/or/dns.c @@ -557,6 +557,8 @@ purge_expired_resolves(time_t now) /* Connections should only be pending if they have no socket. */ tor_assert(!SOCKET_OK(pend->conn->base_.s)); pendconn = pend->conn; + /* Prevent double-remove */ + pendconn->base_.state = EXIT_CONN_STATE_RESOLVEFAILED; if (!pendconn->base_.marked_for_close) { connection_edge_end(pendconn, END_STREAM_REASON_TIMEOUT); circuit_detach_stream(circuit_get_by_edge_conn(pendconn), pendconn); @@ -1132,7 +1134,9 @@ connection_dns_remove(edge_connection_t *conn) return; /* more are pending */ } } - tor_assert(0); /* not reachable unless onlyconn not in pending list */ + log_warn(LD_BUG, "Connection (fd "TOR_SOCKET_T_FORMAT") was not waiting " + "for a resolve of %s, but we tried to remove it.", + conn->base_.s, escaped_safe_str(conn->base_.address)); } }