]> granicus.if.org Git - libevent/commitdiff
Fix a double-delete on the request timeout event. Port from Tor.
authorNick Mathewson <nickm@torproject.org>
Sun, 5 Apr 2009 17:50:18 +0000 (17:50 +0000)
committerNick Mathewson <nickm@torproject.org>
Sun, 5 Apr 2009 17:50:18 +0000 (17:50 +0000)
svn:r1138

evdns.c

diff --git a/evdns.c b/evdns.c
index bad3990801f1c50447cabb3f7705011a0f1e7a12..bd8dbf3f273577f116aba9b937b8d49b5239b556 100644 (file)
--- a/evdns.c
+++ b/evdns.c
@@ -1972,13 +1972,13 @@ evdns_request_timeout_callback(evutil_socket_t fd, short events, void *arg) {
                nameserver_failed(req->ns, "request timed out.");
        }
 
-       (void) evtimer_del(&req->timeout_event);
        if (req->tx_count >= req->base->global_max_retransmits) {
                /* this request has failed */
                reply_callback(req, 0, DNS_ERR_TIMEOUT, NULL);
                request_finished(req, &REQ_HEAD(req->base, req->trans_id));
        } else {
                /* retransmit it */
+               (void) evtimer_del(&req->timeout_event);
                evdns_request_transmit(req);
        }
 }
@@ -2471,6 +2471,7 @@ request_submit(struct evdns_request *const req) {
 void
 evdns_cancel_request(struct evdns_base *base, struct evdns_request *req)
 {
+        /* XXX Does anything ever free the request */
        if (req->ns) {
                /* remove from inflight queue */
                evdns_request_remove(req, &REQ_HEAD(base, req->trans_id));