]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Fix a segfault when a client is hup'd.
authorSebastian Hahn <sebastian@torproject.org>
Sat, 3 Apr 2010 10:13:25 +0000 (12:13 +0200)
committerSebastian Hahn <sebastian@torproject.org>
Sat, 3 Apr 2010 10:31:59 +0000 (12:31 +0200)
We need to make sure we have an event_base in dns.c before we call
anything that wants one. Make sure we always have one in dns_reset()
when we're a client. Fixes bug 1341.

changes/dont_segfault_client_on_hup [new file with mode: 0644]
src/or/dns.c

diff --git a/changes/dont_segfault_client_on_hup b/changes/dont_segfault_client_on_hup
new file mode 100644 (file)
index 0000000..96ffeb7
--- /dev/null
@@ -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.
index 54acef4be29a2032efbaaca2647cb6bf25b37e31..192a1929d7ba7df72236736172002b1b1aa18fdc 100644 (file)
@@ -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);