diff --git a/changes/dont_segfault_client_on_hup b/changes/dont_segfault_client_on_hup new file mode 100644 index 0000000000000000000000000000000000000000..96ffeb710f65d4449c1a6f4b796b6abefd505b37 --- /dev/null +++ b/changes/dont_segfault_client_on_hup @@ -0,0 +1,3 @@ + o Major bugfixes: + - Fix a segfault that happens whenever a Tor client is hup'd. Bugfix + on 0.2.2.5-alpha; fixes bug 1341. diff --git a/src/or/dns.c b/src/or/dns.c index 54acef4be29a2032efbaaca2647cb6bf25b37e31..192a1929d7ba7df72236736172002b1b1aa18fdc 100644 --- a/src/or/dns.c +++ b/src/or/dns.c @@ -260,6 +260,14 @@ dns_reset(void) { or_options_t *options = get_options(); if (! server_mode(options)) { + + if (!the_evdns_base) { + if (!(the_evdns_base = evdns_base_new(tor_libevent_get_base(), 0))) { + log_err(LD_BUG, "Couldn't create an evdns_base"); + return -1; + } + } + evdns_base_clear_nameservers_and_suspend(the_evdns_base); evdns_base_search_clear(the_evdns_base); nameservers_configured = 0; @@ -1377,6 +1385,8 @@ launch_resolve(edge_connection_t *exitconn) r = tor_addr_parse_reverse_lookup_name( &a, exitconn->_base.address, AF_UNSPEC, 0); + + tor_assert(the_evdns_base); if (r == 0) { log_info(LD_EXIT, "Launching eventdns request for %s", escaped_safe_str(exitconn->_base.address)); @@ -1546,6 +1556,7 @@ launch_wildcard_check(int min_len, int max_len, const char *suffix) log_info(LD_EXIT, "Testing whether our DNS server is hijacking nonexistent " "domains with request for bogus hostname \"%s\"", addr); + tor_assert(the_evdns_base); req = evdns_base_resolve_ipv4( the_evdns_base, /* This "addr" tells us which address to resolve */ @@ -1576,6 +1587,7 @@ launch_test_addresses(int fd, short event, void *args) * be an exit server.*/ if (!options->ServerDNSTestAddresses) return; + tor_assert(the_evdns_base); SMARTLIST_FOREACH_BEGIN(options->ServerDNSTestAddresses, const char *, address) { char *a = tor_strdup(address);