Переглянути джерело

Reinit keys at the start of options_act().

Previously we did this nearer to the end (in the old_options &&
transition_affects_workers() block).  But other stuff cares about
keys being consistent with options... particularly anything which
tries to access a key, which can die in assert_identity_keys_ok().

Fixes bug 3228; bugfix on 0.2.2.18-alpha.

Conflicts:

	src/or/config.c
Nick Mathewson 13 роки тому
батько
коміт
55d9e4b8ba
2 змінених файлів з 18 додано та 8 видалено
  1. 3 0
      changes/bug3228
  2. 15 8
      src/or/config.c

+ 3 - 0
changes/bug3228

@@ -0,0 +1,3 @@
+  o Major bugfixes:
+    - Resolve a crash that occured when setting BridgeRelay to 1 with
+      accounting enabled. Fixes bug 3228; bugfix on 0.2.2.18-alpha.

+ 15 - 8
src/or/config.c

@@ -1269,12 +1269,26 @@ options_act(or_options_t *old_options)
   or_options_t *options = get_options();
   int running_tor = options->command == CMD_RUN_TOR;
   char *msg;
+  const int transition_affects_workers =
+    old_options && options_transition_affects_workers(old_options, options);
 
   if (running_tor && !have_lockfile()) {
     if (try_locking(options, 1) < 0)
       return -1;
   }
 
+  /* We want to reinit keys as needed before we do much of anything else:
+     keys are important, and other things can depend on them. */
+  if (running_tor &&
+      (transition_affects_workers ||
+       (options->V3AuthoritativeDir && (!old_options ||
+                                        !old_options->V3AuthoritativeDir)))) {
+    if (init_keys() < 0) {
+      log_warn(LD_BUG,"Error initializing keys; exiting");
+      return -1;
+    }
+  }
+
   if (consider_adding_dir_authorities(options, old_options) < 0)
     return -1;
 
@@ -1368,14 +1382,10 @@ options_act(or_options_t *old_options)
       geoip_remove_old_clients(time(NULL)+(2*60*60));
     }
 
-    if (options_transition_affects_workers(old_options, options)) {
+    if (transition_affects_workers) {
       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)) {
         ip_address_changed(0);
         if (has_completed_circuit || !any_predicted_circuits(time(NULL)))
@@ -1388,9 +1398,6 @@ options_act(or_options_t *old_options)
       if (dns_reset())
         return -1;
     }
-
-    if (options->V3AuthoritativeDir && !old_options->V3AuthoritativeDir)
-      init_keys();
   }
 
   /* Maybe load geoip file */