浏览代码

Fix assert for relay/bridge state change

When we added support for separate client tls certs on bridges in
a2bb0bfdd5 we forgot to correctly initialize this when changing
from relay to bridge or vice versa while Tor is running. Fix that
by always initializing keys when the state changes.

Fixes bug 2433.
Sebastian Hahn 14 年之前
父节点
当前提交
68f8ca357f
共有 2 个文件被更改,包括 11 次插入5 次删除
  1. 5 0
      changes/bug2433
  2. 6 5
      src/or/config.c

+ 5 - 0
changes/bug2433

@@ -0,0 +1,5 @@
+  o Major bugfixes:
+    - Don't assert when changing from bridge to relay or vice versa with a controller.
+      The assert happened because we didn't properly initialize our keys in this case.
+      Bugfix on 0.2.2.18, fixes bug 2433. Issue first discovered by bastik.
+

+ 6 - 5
src/or/config.c

@@ -1250,7 +1250,6 @@ options_act(or_options_t *old_options)
 
   /* Check for transitions that need action. */
   if (old_options) {
-
     if ((options->UseEntryGuards && !old_options->UseEntryGuards) ||
         (options->ExcludeNodes &&
          !routerset_equal(old_options->ExcludeNodes,options->ExcludeNodes)) ||
@@ -1298,11 +1297,12 @@ options_act(or_options_t *old_options)
     if (options_transition_affects_workers(old_options, options)) {
       log_info(LD_GENERAL,
                "Worker-related options changed. Rotating workers.");
+
+      if (init_keys() < 0) {
+        log_warn(LD_BUG,"Error initializing keys; exiting");
+        return -1;
+      }
       if (server_mode(options) && !server_mode(old_options)) {
-        if (init_keys() < 0) {
-          log_warn(LD_BUG,"Error initializing keys; exiting");
-          return -1;
-        }
         ip_address_changed(0);
         if (can_complete_circuit || !any_predicted_circuits(time(NULL)))
           inform_testing_reachability();
@@ -3810,6 +3810,7 @@ options_transition_affects_workers(or_options_t *old_options,
                                        new_options->ServerDNSSearchDomains ||
       old_options->SafeLogging != new_options->SafeLogging ||
       old_options->ClientOnly != new_options->ClientOnly ||
+      public_server_mode(old_options) != public_server_mode(new_options) ||
       !config_lines_eq(old_options->Logs, new_options->Logs))
     return 1;