Преглед на файлове

Report only the first bootstrap failure from an orconn

Otherwise, when we report "identity mismatch", we then later report
DONE when the connection gets closed.

Fixes bug 10431; bugfix on 0.2.1.1-alpha.
Nick Mathewson преди 11 години
родител
ревизия
b0bbe6b2f1
променени са 5 файла, в които са добавени 17 реда и са изтрити 3 реда
  1. 5 0
      changes/bug10431
  2. 6 1
      src/or/control.c
  3. 1 1
      src/or/control.h
  4. 4 0
      src/or/or.h
  5. 1 1
      src/test/test_extorport.c

+ 5 - 0
changes/bug10431

@@ -0,0 +1,5 @@
+  o Minor bugfixes:
+    - Only report the first fatal boostrap error on a given OR
+      connection.  This prevents controllers from declaring that a
+      connection has failed because of "DONE" or other junk reasons.
+      Fixes bug 10431; bugfix on 0.2.1.1-alpha.

+ 6 - 1
src/or/control.c

@@ -4884,7 +4884,7 @@ control_event_bootstrap(bootstrap_status_t status, int progress)
  */
 MOCK_IMPL(void,
           control_event_bootstrap_problem, (const char *warn, int reason,
-                                            const or_connection_t *or_conn))
+                                            or_connection_t *or_conn))
 {
   int status = bootstrap_percent;
   const char *tag, *summary;
@@ -4895,6 +4895,11 @@ MOCK_IMPL(void,
   /* bootstrap_percent must not be in "undefined" state here. */
   tor_assert(status >= 0);
 
+  if (or_conn->have_noted_bootstrap_problem)
+    return;
+
+  or_conn->have_noted_bootstrap_problem = 1;
+
   if (bootstrap_percent == 100)
     return; /* already bootstrapped; nothing to be done here. */
 

+ 1 - 1
src/or/control.h

@@ -94,7 +94,7 @@ void monitor_owning_controller_process(const char *process_spec);
 void control_event_bootstrap(bootstrap_status_t status, int progress);
 MOCK_DECL(void, control_event_bootstrap_problem,(const char *warn,
                                                  int reason,
-                                              const or_connection_t *or_conn));
+                                                 or_connection_t *or_conn));
 
 void control_event_clients_seen(const char *controller_str);
 void control_event_transport_launched(const char *mode,

+ 4 - 0
src/or/or.h

@@ -1481,6 +1481,10 @@ typedef struct or_connection_t {
   unsigned int is_outgoing:1;
   unsigned int proxy_type:2; /**< One of PROXY_NONE...PROXY_SOCKS5 */
   unsigned int wide_circ_ids:1;
+  /** True iff this connection has had its bootstrap failure logged with
+   * control_event_bootstrap_problem. */
+  unsigned int have_noted_bootstrap_problem:1;
+
   uint16_t link_proto; /**< What protocol version are we using? 0 for
                         * "none negotiated yet." */
 

+ 1 - 1
src/test/test_extorport.c

@@ -364,7 +364,7 @@ test_ext_or_cookie_auth_testvec(void *arg)
 
 static void
 ignore_bootstrap_problem(const char *warn, int reason,
-                       const or_connection_t *conn)
+                         or_connection_t *conn)
 {
   (void)warn;
   (void)reason;