Skip to content

Commit

Permalink
Avoid segfault on weird timeout during name lookup.
Browse files Browse the repository at this point in the history
If an evdns_getaddrinfo timeout happens while pending_cb is set, and
a callback is about to run, but we get a call to
evdns_getaddrinfo_gotresolve before it finishes.

Github issue libevent#60. Thanks to Greg Hazel for patch and patience.
  • Loading branch information
ghazel authored and nmathewson committed Jul 30, 2012
1 parent a0912e3 commit dc32077
Showing 1 changed file with 15 additions and 0 deletions.
15 changes: 15 additions & 0 deletions evdns.c
Expand Up @@ -4214,13 +4214,17 @@ evdns_getaddrinfo_timeout_cb(evutil_socket_t fd, short what, void *ptr)

/* Cancel any pending requests, and note which one */
if (data->ipv4_request.r) {
/* XXXX This does nothing if the request's callback is already
* running (pending_cb is set). */
evdns_cancel_request(NULL, data->ipv4_request.r);
v4_timedout = 1;
EVDNS_LOCK(data->evdns_base);
++data->evdns_base->getaddrinfo_ipv4_timeouts;
EVDNS_UNLOCK(data->evdns_base);
}
if (data->ipv6_request.r) {
/* XXXX This does nothing if the request's callback is already
* running (pending_cb is set). */
evdns_cancel_request(NULL, data->ipv6_request.r);
v6_timedout = 1;
EVDNS_LOCK(data->evdns_base);
Expand All @@ -4244,6 +4248,10 @@ evdns_getaddrinfo_timeout_cb(evutil_socket_t fd, short what, void *ptr)
data->user_cb(e, NULL, data->user_data);
}

data->user_cb = NULL; /* prevent double-call if evdns callbacks are
* in-progress. XXXX It would be better if this
* weren't necessary. */

if (!v4_timedout && !v6_timedout) {
/* should be impossible? XXXX */
free_getaddrinfo_request(data);
Expand Down Expand Up @@ -4314,6 +4322,13 @@ evdns_getaddrinfo_gotresolve(int result, char type, int count,
return;
}

if (data->user_cb == NULL) {
/* We already answered. XXXX This shouldn't be needed; see
* comments in evdns_getaddrinfo_timeout_cb */
free_getaddrinfo_request(data);
return;
}

if (result == DNS_ERR_NONE) {
if (count == 0)
err = EVUTIL_EAI_NODATA;
Expand Down

0 comments on commit dc32077

Please sign in to comment.