diff options
author | Nick Mathewson <nickm@torproject.org> | 2014-03-21 14:08:17 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2014-03-26 11:09:34 -0400 |
commit | e8fe749dba6be5094f4e9c7a236b54a7b33f9eeb (patch) | |
tree | c5ed4fd4b1ddbc3687bbedd87f09ac774a4af0fd /evdns.c | |
parent | 9f39c8875683d12f64cfe2c9d32d9c15982a1f33 (diff) | |
download | libevent-e8fe749dba6be5094f4e9c7a236b54a7b33f9eeb.tar.gz |
Fix a crash in evdns related to shutting down evdns
(Improved version to deal correctly with probe requests)
Patch from YASUOKA Masahiko; fix for libevent github issue #113.
Diffstat (limited to 'evdns.c')
-rw-r--r-- | evdns.c | 19 |
1 files changed, 12 insertions, 7 deletions
@@ -3946,6 +3946,10 @@ evdns_nameserver_free(struct nameserver *server) event_debug_unassign(&server->event); if (server->state == 0) (void) event_del(&server->timeout_event); + if (server->probe_request) { + evdns_cancel_request(server->base, server->probe_request); + server->probe_request = NULL; + } event_debug_unassign(&server->timeout_event); mm_free(server); } @@ -3961,13 +3965,6 @@ evdns_base_free_and_unlock(struct evdns_base *base, int fail_requests) /* TODO(nickm) we might need to refcount here. */ - for (i = 0; i < base->n_req_heads; ++i) { - while (base->req_heads[i]) { - if (fail_requests) - reply_schedule_callback(base->req_heads[i], 0, DNS_ERR_SHUTDOWN, NULL); - request_finished(base->req_heads[i], &REQ_HEAD(base, base->req_heads[i]->trans_id), 1); - } - } for (server = base->server_head; server; server = server_next) { server_next = server->next; evdns_nameserver_free(server); @@ -3976,6 +3973,14 @@ evdns_base_free_and_unlock(struct evdns_base *base, int fail_requests) } base->server_head = NULL; base->global_good_nameservers = 0; + + for (i = 0; i < base->n_req_heads; ++i) { + while (base->req_heads[i]) { + if (fail_requests) + reply_schedule_callback(base->req_heads[i], 0, DNS_ERR_SHUTDOWN, NULL); + request_finished(base->req_heads[i], &REQ_HEAD(base, base->req_heads[i]->trans_id), 1); + } + } while (base->req_waiting_head) { if (fail_requests) reply_schedule_callback(base->req_waiting_head, 0, DNS_ERR_SHUTDOWN, NULL); |