Browse Source

r13908@catbus: nickm | 2007-07-25 18:55:47 -0400
Patch from Robert Hogan: set conn->dns_server_port correctly so that we can close dns server ports when they change, thus avoiding crashes and dangling references and other sources of unhappiness.


svn:r10933

Nick Mathewson 17 years ago
parent
commit
7f3e2378b6
4 changed files with 6 additions and 1 deletions
  1. 2 0
      ChangeLog
  2. 1 0
      src/or/connection.c
  3. 2 1
      src/or/dnsserv.c
  4. 1 0
      src/or/hibernate.c

+ 2 - 0
ChangeLog

@@ -76,6 +76,8 @@ Changes in version 0.2.0.3-alpha - 2007-??-??
     - Add DNSPort connections to the global connection list, so that we
       can time them out correctly. (Bug found by mwenge) [Bugfix on
       0.2.0.2-alpha]
+    - Fix a dangling reference that could lead to a crash when DNSPort is
+      changed or closed (Patch from Robert Hogan.) [Bugfix on 0.2.0.2-alpha]
 
   o Minor bugfixes (controller)
     - Provide DNS expiry times in GMT, not in local time.  For backward

+ 1 - 0
src/or/connection.c

@@ -2423,6 +2423,7 @@ connection_is_listener(connection_t *conn)
   if (conn->type == CONN_TYPE_OR_LISTENER ||
       conn->type == CONN_TYPE_AP_LISTENER ||
       conn->type == CONN_TYPE_AP_TRANS_LISTENER ||
+      conn->type == CONN_TYPE_AP_DNS_LISTENER ||
       conn->type == CONN_TYPE_AP_NATD_LISTENER ||
       conn->type == CONN_TYPE_DIR_LISTENER ||
       conn->type == CONN_TYPE_CONTROL_LISTENER)

+ 2 - 1
src/or/dnsserv.c

@@ -255,7 +255,8 @@ dnsserv_configure_listener(connection_t *conn)
   tor_assert(conn->s);
   tor_assert(conn->type == CONN_TYPE_AP_DNS_LISTENER);
 
-  evdns_add_server_port(conn->s, 0, evdns_server_callback, NULL);
+  conn->dns_server_port = evdns_add_server_port(conn->s, 0,
+                                                evdns_server_callback, NULL);
 }
 
 /** Free the evdns server port for <b>conn</b>, which must be an

+ 1 - 0
src/or/hibernate.c

@@ -771,6 +771,7 @@ hibernate_begin(hibernate_state_t new_state, time_t now)
   while ((conn = connection_get_by_type(CONN_TYPE_OR_LISTENER)) ||
          (conn = connection_get_by_type(CONN_TYPE_AP_LISTENER)) ||
          (conn = connection_get_by_type(CONN_TYPE_AP_TRANS_LISTENER)) ||
+         (conn = connection_get_by_type(CONN_TYPE_AP_DNS_LISTENER)) ||
          (conn = connection_get_by_type(CONN_TYPE_AP_NATD_LISTENER)) ||
          (conn = connection_get_by_type(CONN_TYPE_DIR_LISTENER))) {
     log_info(LD_NET,"Closing listener type %d", conn->type);