Forráskód Böngészése

Merge remote-tracking branch 'asn/bug21969_bridges_030' into maint-0.3.0

Nick Mathewson 6 éve
szülő
commit
e84127d99e
8 módosított fájl, 50 hozzáadás és 6 törlés
  1. 3 0
      changes/bug21969
  2. 5 1
      src/or/bridges.c
  3. 4 2
      src/or/directory.c
  4. 3 1
      src/or/directory.h
  5. 28 0
      src/or/entrynodes.c
  6. 4 0
      src/or/entrynodes.h
  7. 2 1
      src/or/router.c
  8. 1 1
      src/or/routerlist.c

+ 3 - 0
changes/bug21969

@@ -0,0 +1,3 @@
+  o Major bugfixes (entry guards):
+    - Don't block bootstrapping when a primary bridge is offline and we can't
+      get its descriptor. Fixes bug 21969; bugfix on 0.3.0.3-alpha.

+ 5 - 1
src/or/bridges.c

@@ -547,6 +547,7 @@ static void
 launch_direct_bridge_descriptor_fetch(bridge_info_t *bridge)
 {
   const or_options_t *options = get_options();
+  circuit_guard_state_t *guard_state = NULL;
 
   if (connection_get_by_type_addr_port_purpose(
       CONN_TYPE_DIR, &bridge->addr, bridge->port,
@@ -570,12 +571,15 @@ launch_direct_bridge_descriptor_fetch(bridge_info_t *bridge)
     return;
   }
 
+  guard_state = get_guard_state_for_bridge_desc_fetch(bridge->identity);
+
   directory_initiate_command(&bridge->addr, bridge->port,
                              NULL, 0, /*no dirport*/
                              bridge->identity,
                              DIR_PURPOSE_FETCH_SERVERDESC,
                              ROUTER_PURPOSE_BRIDGE,
-                             DIRIND_ONEHOP, "authority.z", NULL, 0, 0);
+                             DIRIND_ONEHOP, "authority.z", NULL, 0, 0,
+                             guard_state);
 }
 
 /** Fetching the bridge descriptor from the bridge authority returned a

+ 4 - 2
src/or/directory.c

@@ -1131,6 +1131,7 @@ directory_command_should_use_begindir(const or_options_t *options,
  * <b>router_purpose</b>, making an (in)direct connection as specified in
  * <b>indirection</b>, with command <b>resource</b>, <b>payload</b> of
  * <b>payload_len</b>, and asking for a result only <b>if_modified_since</b>.
+ * If <b>guard_state</b> is set, assign it to the directory circuit.
  */
 void
 directory_initiate_command(const tor_addr_t *or_addr, uint16_t or_port,
@@ -1139,7 +1140,8 @@ directory_initiate_command(const tor_addr_t *or_addr, uint16_t or_port,
                            uint8_t dir_purpose, uint8_t router_purpose,
                            dir_indirection_t indirection, const char *resource,
                            const char *payload, size_t payload_len,
-                           time_t if_modified_since)
+                           time_t if_modified_since,
+                           circuit_guard_state_t *guard_state)
 {
   tor_addr_port_t or_ap, dir_ap;
 
@@ -1166,7 +1168,7 @@ directory_initiate_command(const tor_addr_t *or_addr, uint16_t or_port,
                              digest, dir_purpose,
                              router_purpose, indirection,
                              resource, payload, payload_len,
-                             if_modified_since, NULL, NULL);
+                             if_modified_since, NULL, guard_state);
 }
 
 /** Same as directory_initiate_command(), but accepts rendezvous data to

+ 3 - 1
src/or/directory.h

@@ -12,6 +12,7 @@
 #ifndef TOR_DIRECTORY_H
 #define TOR_DIRECTORY_H
 
+
 int directories_have_accepted_server_descriptor(void);
 void directory_post_to_dirservers(uint8_t dir_purpose, uint8_t router_purpose,
                                   dirinfo_type_t type, const char *payload,
@@ -79,7 +80,8 @@ void directory_initiate_command(const tor_addr_t *or_addr, uint16_t or_port,
                                 dir_indirection_t indirection,
                                 const char *resource,
                                 const char *payload, size_t payload_len,
-                                time_t if_modified_since);
+                                time_t if_modified_since,
+                                struct circuit_guard_state_t *guard_state);
 
 #define DSR_HEX       (1<<0)
 #define DSR_BASE64    (1<<1)

+ 28 - 0
src/or/entrynodes.c

@@ -2940,6 +2940,34 @@ entry_guard_get_by_id_digest(const char *digest)
       get_guard_selection_info(), digest);
 }
 
+/** We are about to connect to bridge with identity <b>digest</b> to fetch its
+ *  descriptor. Create a new guard state for this connection and return it. */
+circuit_guard_state_t *
+get_guard_state_for_bridge_desc_fetch(const char *digest)
+{
+  circuit_guard_state_t *guard_state = NULL;
+  entry_guard_t *guard = NULL;
+
+  guard = entry_guard_get_by_id_digest_for_guard_selection(
+                                    get_guard_selection_info(), digest);
+  if (!guard) {
+    return NULL;
+  }
+
+  /* Update the guard last_tried_to_connect time since it's checked by the
+   * guard susbsystem. */
+  guard->last_tried_to_connect = approx_time();
+
+  /* Create the guard state */
+  guard_state = tor_malloc_zero(sizeof(circuit_guard_state_t));
+  guard_state->guard = entry_guard_handle_new(guard);
+  guard_state->state = GUARD_CIRC_STATE_USABLE_ON_COMPLETION;
+  guard_state->state_set_at = approx_time();
+  guard_state->restrictions = NULL;
+
+  return guard_state;
+}
+
 /** Release all storage held by <b>e</b>. */
 STATIC void
 entry_guard_free(entry_guard_t *e)

+ 4 - 0
src/or/entrynodes.h

@@ -323,6 +323,10 @@ const node_t *guards_choose_dirguard(circuit_guard_state_t **guard_state_out);
 entry_guard_t *entry_guard_get_by_id_digest_for_guard_selection(
     guard_selection_t *gs, const char *digest);
 entry_guard_t *entry_guard_get_by_id_digest(const char *digest);
+
+circuit_guard_state_t *
+get_guard_state_for_bridge_desc_fetch(const char *digest);
+
 void entry_guards_changed_for_guard_selection(guard_selection_t *gs);
 void entry_guards_changed(void);
 guard_selection_t * get_guard_selection_info(void);

+ 2 - 1
src/or/router.c

@@ -1391,7 +1391,8 @@ consider_testing_reachability(int test_or, int test_dir)
                                me->cache_info.identity_digest,
                                DIR_PURPOSE_FETCH_SERVERDESC,
                                ROUTER_PURPOSE_GENERAL,
-                               DIRIND_ANON_DIRPORT, "authority.z", NULL, 0, 0);
+                               DIRIND_ANON_DIRPORT, "authority.z",
+                               NULL, 0, 0, NULL);
   }
 }
 

+ 1 - 1
src/or/routerlist.c

@@ -961,7 +961,7 @@ authority_certs_fetch_resource_impl(const char *resource,
                                DIR_PURPOSE_FETCH_CERTIFICATE,
                                0,
                                indirection,
-                               resource, NULL, 0, 0);
+                               resource, NULL, 0, 0, NULL);
     return;
   }