Quellcode durchsuchen

When launching a resolve request on behalf of an AF_UNIX control, omit the address field of the new entry connection. Fixes bug 8639.

Andrea Shepard vor 11 Jahren
Ursprung
Commit
ce147a2a9a
3 geänderte Dateien mit 35 neuen und 2 gelöschten Zeilen
  1. 5 0
      changes/bug8639
  2. 15 2
      src/or/control.c
  3. 15 0
      src/or/dnsserv.c

+ 5 - 0
changes/bug8639

@@ -0,0 +1,5 @@
+  o Normal bugfixes:
+     - When launching a resolve request on behalf of an AF_UNIX control
+       socket, omit the address field of the new entry connection, used in
+       subsequent controller events, rather than letting tor_dup_addr() set
+       it to "<unknown address type>".  Fixes bug 8639.

+ 15 - 2
src/or/control.c

@@ -3743,8 +3743,21 @@ control_event_stream_status(entry_connection_t *conn, stream_status_event_t tp,
   }
 
   if (tp == STREAM_EVENT_NEW || tp == STREAM_EVENT_NEW_RESOLVE) {
-    tor_snprintf(addrport_buf,sizeof(addrport_buf), " SOURCE_ADDR=%s:%d",
-                 ENTRY_TO_CONN(conn)->address, ENTRY_TO_CONN(conn)->port);
+    /*
+     * When the control conn is an AF_UNIX socket and we have no address,
+     * it gets set to "(Tor_internal)"; see dnsserv_launch_request() in
+     * dnsserv.c.
+     */
+    if (strcmp(ENTRY_TO_CONN(conn)->address, "(Tor_internal)") != 0) {
+      tor_snprintf(addrport_buf,sizeof(addrport_buf), " SOURCE_ADDR=%s:%d",
+                   ENTRY_TO_CONN(conn)->address, ENTRY_TO_CONN(conn)->port);
+    } else {
+      /*
+       * else leave it blank so control on AF_UNIX doesn't need to make
+       * something up.
+       */
+      addrport_buf[0] = '\0';
+    }
   } else {
     addrport_buf[0] = '\0';
   }

+ 15 - 0
src/or/dnsserv.c

@@ -183,8 +183,23 @@ dnsserv_launch_request(const char *name, int reverse,
   conn->base_.state = AP_CONN_STATE_RESOLVE_WAIT;
 
   tor_addr_copy(&TO_CONN(conn)->addr, &control_conn->base_.addr);
+#ifdef AF_UNIX
+  /*
+   * The control connection can be AF_UNIX and if so tor_dup_addr will
+   * unhelpfully say "<unknown address type>"; say "(Tor_internal)"
+   * instead.
+   */
+  if (control_conn->base_.socket_family == AF_UNIX) {
+    TO_CONN(conn)->port = 0;
+    TO_CONN(conn)->address = tor_strdup("(Tor_internal)");
+  } else {
+    TO_CONN(conn)->port = control_conn->base_.port;
+    TO_CONN(conn)->address = tor_dup_addr(&control_conn->base_.addr);
+  }
+#else
   TO_CONN(conn)->port = control_conn->base_.port;
   TO_CONN(conn)->address = tor_dup_addr(&control_conn->base_.addr);
+#endif
 
   if (reverse)
     entry_conn->socks_request->command = SOCKS_COMMAND_RESOLVE_PTR;