aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2007-02-28 20:24:23 +0000
committerNick Mathewson <nickm@torproject.org>2007-02-28 20:24:23 +0000
commit3008c3b768f2cb8ab735e8ebbda2d4322910b19e (patch)
tree305dc3660e47d3e733d3928cda6fe621d9c1804b /src
parent08c75f4349067815f4d131ca2cd4b425ec8fc38c (diff)
downloadtor-3008c3b768f2cb8ab735e8ebbda2d4322910b19e.tar.gz
tor-3008c3b768f2cb8ab735e8ebbda2d4322910b19e.zip
r12000@catbus: nickm | 2007-02-28 15:12:21 -0500
Try to fix eventdns bug 326 again, this time by noting that rcode 2 (serverfailed) does not really mean "The server is useless." svn:r9687
Diffstat (limited to 'src')
-rw-r--r--src/or/eventdns.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/src/or/eventdns.c b/src/or/eventdns.c
index bb97c31c74..7270df5052 100644
--- a/src/or/eventdns.c
+++ b/src/or/eventdns.c
@@ -696,7 +696,6 @@ reply_handle(struct request *const req, u16 flags, u32 ttl, struct reply *reply)
}
switch(error) {
- case DNS_ERR_SERVERFAILED:
case DNS_ERR_NOTIMPL:
case DNS_ERR_REFUSED:
// we regard these errors as marking a bad nameserver
@@ -708,6 +707,15 @@ reply_handle(struct request *const req, u16 flags, u32 ttl, struct reply *reply)
if (!request_reissue(req)) return;
}
break;
+ case DNS_ERR_SERVERFAILED:
+ // rcode 2 (servfailed) sometimes means "we are broken" and
+ // sometimes (with some binds) means "that request was very
+ // confusing." Treat this as a timeout, not a failure.
+ /*XXXX refactor the parts of */
+ log(EVDNS_LOG_DEBUG, "Got a SERVERFAILED from nameserver %s; "
+ "will allow the request to time out.",
+ debug_nota(req->ns->address));
+ break;
default:
// we got a good reply from the nameserver
nameserver_up(req->ns);
@@ -1876,9 +1884,9 @@ evdns_request_transmit(struct request *req) {
case 2:
// failed in some other way
retcode = 1;
- // fall through
+ break;
default:
- // all ok
+ // transmitted; we need to check for timeout.
log(EVDNS_LOG_DEBUG,
"Setting timeout for request %lx", (unsigned long) req);
evtimer_set(&req->timeout_event, evdns_request_timeout_callback, req);
@@ -1888,10 +1896,11 @@ evdns_request_transmit(struct request *req) {
(unsigned long) req);
// ???? Do more?
}
- req->tx_count++;
- req->transmit_me = 0;
- return retcode;
}
+
+ req->tx_count++;
+ req->transmit_me = 0;
+ return retcode;
}
static void