]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Fix broken directory request to the DirPort
authorDavid Goulet <dgoulet@ev0ke.net>
Thu, 24 Mar 2016 17:57:53 +0000 (13:57 -0400)
committerDavid Goulet <dgoulet@ev0ke.net>
Thu, 24 Mar 2016 17:57:53 +0000 (13:57 -0400)
Commit e72cbf7a4 introduced a change to directory_initiate_command_rend()
that made tor use the ORPort when making a directory request to the DirPort.
The primary consequence was that a relay couldn't selftest its DirPort thus
failing to work and join the network properly.

The main issue was we were always considering an anonymized connection to be
an OR connection which is not true.

Fixes #18623

Signed-off-by: David Goulet <dgoulet@ev0ke.net>
src/or/directory.c

index 21a879dcad8cc6af37f21512610fbc575b24f6b7..d057dacf51ecccb242fc716c9cdb8f3502478ad0 100644 (file)
@@ -1065,8 +1065,16 @@ directory_initiate_command_rend(const tor_addr_port_t *or_addr_port,
   const int use_begindir = directory_command_should_use_begindir(options,
                                      &or_addr_port->addr, or_addr_port->port,
                                      router_purpose, indirection);
+  /* Is it an anonymous connection? Be careful, it could be either an OR or
+   * directory connection. */
   const int anonymized_connection = dirind_is_anon(indirection);
-  const int or_connection = use_begindir || anonymized_connection;
+  /* Is it a connection to our DirPort? */
+  const int dir_connection = (indirection == DIRIND_ANON_DIRPORT ||
+                              indirection == DIRIND_DIRECT_CONN);
+  /* It's an OR connection if we should use BEGIN_DIR or if it's an
+   * anonymized connection but obviously not a directory connection. */
+  const int or_connection = (use_begindir ||
+                             (anonymized_connection && !dir_connection));
 
   tor_addr_t addr;
   tor_addr_copy(&addr, &(or_connection ? or_addr_port : dir_addr_port)->addr);
@@ -1096,7 +1104,7 @@ directory_initiate_command_rend(const tor_addr_port_t *or_addr_port,
 
   /* ensure that we don't make direct connections when a SOCKS server is
    * configured. */
-  if (!or_connection && !options->HTTPProxy &&
+  if (dir_connection && !options->HTTPProxy &&
       (options->Socks4Proxy || options->Socks5Proxy)) {
     log_warn(LD_DIR, "Cannot connect to a directory server through a "
                      "SOCKS proxy!");
@@ -1113,7 +1121,7 @@ directory_initiate_command_rend(const tor_addr_port_t *or_addr_port,
       logged_backtrace = 1;
     }
     return;
-  } else if (!or_connection && (!dir_addr_port->port
+  } else if (dir_connection && (!dir_addr_port->port
                                 || tor_addr_is_null(&dir_addr_port->addr))) {
     static int logged_backtrace = 0;
     log_warn(LD_DIR, "Cannot make an outgoing Dir connection without a Dir "
@@ -1153,7 +1161,7 @@ directory_initiate_command_rend(const tor_addr_port_t *or_addr_port,
   if (rend_query)
     conn->rend_data = rend_data_dup(rend_query);
 
-  if (!or_connection) {
+  if (dir_connection && !anonymized_connection) {
     /* then we want to connect to dirport directly */
 
     if (options->HTTPProxy) {