From 3d9e52ac5661fda80d2967df22a22a4d92fd1cdf Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Tue, 1 May 2012 19:52:55 -0400 Subject: [PATCH] When retransmitting a timed-out DNS request, pick a fresh nameserver. Otherwise, requests initially sent to a failing nameserver would stay there indefinitely, even if other nameservers would work. Fix for sourceforge bug 3518439 --- evdns.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/evdns.c b/evdns.c index 72e44673..ed2dbdc5 100644 --- a/evdns.c +++ b/evdns.c @@ -2161,9 +2161,13 @@ evdns_request_timeout_callback(evutil_socket_t fd, short events, void *arg) { request_finished(req, &REQ_HEAD(req->base, req->trans_id), 1); } else { /* retransmit it */ + struct nameserver *new_ns; log(EVDNS_LOG_DEBUG, "Retransmitting request %p; tx_count==%d", arg, req->tx_count); (void) evtimer_del(&req->timeout_event); + new_ns = nameserver_pick(base); + if (new_ns) + req->ns = new_ns; evdns_request_transmit(req); } EVDNS_UNLOCK(base);