Просмотр исходного кода

Merge remote-tracking branch 'origin/maint-0.2.2'

Nick Mathewson 13 лет назад
Родитель
Сommit
d0e7c545ba
3 измененных файлов с 29 добавлено и 8 удалено
  1. 4 0
      changes/bug3216
  2. 19 7
      src/or/connection.c
  3. 6 1
      src/or/router.c

+ 4 - 0
changes/bug3216

@@ -0,0 +1,4 @@
+  o Major bugfixes:
+    - Don't try to build descriptors if "ORPort auto" is set and we
+      don't know our actual ORPort yet.  Fix for bug 3216; bugfix on
+      0.2.2.26-beta.

+ 19 - 7
src/or/connection.c

@@ -2006,37 +2006,40 @@ retry_all_listeners(smartlist_t *replaced_conns,
                     smartlist_t *new_conns)
 {
   or_options_t *options = get_options();
+  int retval = 0;
+  const uint16_t old_or_port = router_get_advertised_or_port(options);
+  const uint16_t old_dir_port = router_get_advertised_dir_port(options);
 
   if (retry_listeners(CONN_TYPE_OR_LISTENER, options->ORListenAddress,
                       options->ORPort, "0.0.0.0",
                       replaced_conns, new_conns, options->ClientOnly,
                       AF_INET)<0)
-    return -1;
+    retval = -1;
   if (retry_listeners(CONN_TYPE_DIR_LISTENER, options->DirListenAddress,
                       options->DirPort, "0.0.0.0",
                       replaced_conns, new_conns, options->ClientOnly,
                       AF_INET)<0)
-    return -1;
+    retval = -1;
   if (retry_listeners(CONN_TYPE_AP_LISTENER, options->SocksListenAddress,
                       options->SocksPort, "127.0.0.1",
                       replaced_conns, new_conns, 0,
                       AF_INET)<0)
-    return -1;
+    retval = -1;
   if (retry_listeners(CONN_TYPE_AP_TRANS_LISTENER, options->TransListenAddress,
                       options->TransPort, "127.0.0.1",
                       replaced_conns, new_conns, 0,
                       AF_INET)<0)
-    return -1;
+    retval = -1;
   if (retry_listeners(CONN_TYPE_AP_NATD_LISTENER, options->NATDListenAddress,
                       options->NATDPort, "127.0.0.1",
                       replaced_conns, new_conns, 0,
                       AF_INET)<0)
-    return -1;
+    retval = -1;
   if (retry_listeners(CONN_TYPE_AP_DNS_LISTENER, options->DNSListenAddress,
                       options->DNSPort, "127.0.0.1",
                       replaced_conns, new_conns, 0,
                       AF_INET)<0)
-    return -1;
+    retval = -1;
   if (retry_listeners(CONN_TYPE_CONTROL_LISTENER,
                       options->ControlListenAddress,
                       options->ControlPort, "127.0.0.1",
@@ -2050,7 +2053,16 @@ retry_all_listeners(smartlist_t *replaced_conns,
                       AF_UNIX)<0)
     return -1;
 
-  return 0;
+  if (old_or_port != router_get_advertised_or_port(options) ||
+      old_dir_port != router_get_advertised_dir_port(options)) {
+    /* Our chosen ORPort or DirPort is not what it used to be: the
+     * descriptor we had (if any) should be regenerated.  (We won't
+     * automatically notice this because of changes in the option,
+     * since the value could be "auto".) */
+    mark_my_descriptor_dirty("Chosen Or/DirPort changed");
+  }
+
+  return retval;
 }
 
 /** Return 1 if we should apply rate limiting to <b>conn</b>,

+ 6 - 1
src/or/router.c

@@ -805,6 +805,8 @@ decide_to_advertise_dirport(or_options_t *options, uint16_t dir_port)
     return 0;
   if (!check_whether_dirport_reachable())
     return 0;
+  if (!router_get_advertised_dir_port(options))
+    return 0;
 
   /* Section two: reasons to publish or not publish that the user
    * might find surprising. These are generally config options that
@@ -1142,6 +1144,8 @@ decide_if_publishable_server(void)
     return 0;
   if (authdir_mode(options))
     return 1;
+  if (!router_get_advertised_or_port(options))
+    return 0;
 
   return check_whether_orport_reachable();
 }
@@ -1421,7 +1425,8 @@ router_rebuild_descriptor(int force)
   if (desc_clean_since && !force)
     return 0;
 
-  if (router_pick_published_address(options, &addr) < 0) {
+  if (router_pick_published_address(options, &addr) < 0 ||
+      router_get_advertised_or_port(options) == 0) {
     /* Stop trying to rebuild our descriptor every second. We'll
      * learn that it's time to try again when ip_address_changed()
      * marks it dirty. */