summaryrefslogtreecommitdiff
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
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
-rw-r--r--ChangeLog4
-rw-r--r--src/or/eventdns.c21
2 files changed, 19 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 5ee17fcd34..f91dd07d05 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -14,6 +14,10 @@ Changes in version 0.1.2.9-??? - 2007-??-??
to INT32_MAX.
- Fix a potential race condition in the rpm installer. Found by
Stefan Nordhausen.
+ - Try to fix eventdns warnings once and for all: do not treat a dns rcode
+ of 2 as indicating that the server is completely bad; it sometimes
+ means that the server is just bad for the request in question. (may fix
+ the last of bug 326.)
Changes in version 0.1.2.8-beta - 2007-02-26
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