Browse Source

Fix one case of bug 929.

svn:r18683
Nick Mathewson 16 years ago
parent
commit
27c3b43817
2 changed files with 9 additions and 2 deletions
  1. 4 0
      ChangeLog
  2. 5 2
      src/or/eventdns.c

+ 4 - 0
ChangeLog

@@ -32,6 +32,10 @@ Changes in version 0.2.1.13-????? - 2009-02-??
       circuit.  Patch from lark.
       circuit.  Patch from lark.
     - When we erroneously receive two EXTEND cells for the same circuit ID
     - When we erroneously receive two EXTEND cells for the same circuit ID
       on the same connection, drop the second.  Patch from lark.
       on the same connection, drop the second.  Patch from lark.
+    - Fix a crash that occurs on exit nodes when a nameserver request
+      timed out.  Bugfix on 0.1.2.1-alpha; our CLEAR debugging code
+      had been suppressing the bug since 0.1.2.10-alpha.  Partial fix
+      for bug 929.
 
 
   o Minor features:
   o Minor features:
     - On Linux, use the prctl call to re-enable core dumps when the user
     - On Linux, use the prctl call to re-enable core dumps when the user

+ 5 - 2
src/or/eventdns.c

@@ -2016,14 +2016,17 @@ evdns_request_timeout_callback(int fd, short events, void *arg) {
 		nameserver_failed(req->ns, "request timed out.");
 		nameserver_failed(req->ns, "request timed out.");
 	}
 	}
 
 
-	del_timeout_event(req);
-	CLEAR(&req->timeout_event);
 	if (req->tx_count >= global_max_retransmits) {
 	if (req->tx_count >= global_max_retransmits) {
 		/* this request has failed */
 		/* this request has failed */
 		reply_callback(req, 0, DNS_ERR_TIMEOUT, NULL);
 		reply_callback(req, 0, DNS_ERR_TIMEOUT, NULL);
 		request_finished(req, &req_head);
 		request_finished(req, &req_head);
 	} else {
 	} else {
 		/* retransmit it */
 		/* retransmit it */
+		/* Stop waiting for the timeout.  No need to do this in
+		 * request_finished; that one already deletes the timeout event.
+		 * XXXX021 port this change to libevent. */
+		del_timeout_event(req);
+		CLEAR(&req->timeout_event);
 		evdns_request_transmit(req);
 		evdns_request_transmit(req);
 	}
 	}
 }
 }