]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
r12000@catbus: nickm | 2007-02-28 15:12:21 -0500
authorNick Mathewson <nickm@torproject.org>
Wed, 28 Feb 2007 20:24:23 +0000 (20:24 +0000)
committerNick Mathewson <nickm@torproject.org>
Wed, 28 Feb 2007 20:24:23 +0000 (20:24 +0000)
 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

ChangeLog
src/or/eventdns.c

index 5ee17fcd347e3f457b9b5c174c4922b32d61486e..f91dd07d05993b65c718a8622618109e9918d8a9 100644 (file)
--- 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
index bb97c31c7435f665d95d1cf39bbce04ea9882da4..7270df5052e793724cceddf64988adfc8b584509 100644 (file)
@@ -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