Sfoglia il codice sorgente

attempted patch for bug 220: don't assert when we've tried all the
intro points for a hidden service and we try fetching the service
descriptor again.


svn:r5838

Roger Dingledine 20 anni fa
parent
commit
d682c84e79
3 ha cambiato i file con 15 aggiunte e 6 eliminazioni
  1. 1 0
      src/or/connection.c
  2. 1 1
      src/or/connection_edge.c
  3. 13 5
      src/or/rendclient.c

+ 1 - 0
src/or/connection.c

@@ -337,6 +337,7 @@ connection_about_to_close_connection(connection_t *conn)
         /* It's a directory connection and connecting or fetching
          * failed: forget about this router, and maybe try again. */
         connection_dir_request_failed(conn);
+        // XXX if it's rend desc we may want to retry -RD
       }
       if (conn->purpose == DIR_PURPOSE_FETCH_RENDDESC)
         rend_client_desc_here(conn->rend_query); /* give it a try */

+ 1 - 1
src/or/connection_edge.c

@@ -1133,7 +1133,7 @@ connection_ap_handshake_process_socks(connection_t *conn)
     /* see if we already have it cached */
     r = rend_cache_lookup_entry(conn->rend_query, -1, &entry);
     if (r<0) {
-      warn(LD_REND,"Invalid service descriptor %s",
+      warn(LD_BUG,"Bug: Invalid service name '%s'",
            safe_str(conn->rend_query));
       connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL);
       return -1;

+ 13 - 5
src/or/rendclient.c

@@ -258,7 +258,7 @@ rend_client_refetch_renddesc(const char *query)
   }
 }
 
-/** remove failed_intro from ent. if ent now has no intro points, or
+/** Remove failed_intro from ent. If ent now has no intro points, or
  * service is unrecognized, then launch a new renddesc fetch.
  *
  * Return -1 if error, 0 if no intro points remain or service
@@ -423,9 +423,18 @@ rend_client_desc_here(const char *query)
   connection_t *conn;
   rend_cache_entry_t *entry;
   time_t now = time(NULL);
-
-  while ((conn = connection_get_by_type_state_rendquery(CONN_TYPE_AP,
-                                 AP_CONN_STATE_RENDDESC_WAIT, query))) {
+  int i, n_conns;
+  connection_t **carray;
+
+  get_connection_array(&carray, &n_conns);
+
+  for (i = 0; i < n_conns; ++i) {
+    conn = carray[i];
+    if (conn->type != CONN_TYPE_AP ||
+        conn->state != AP_CONN_STATE_RENDDESC_WAIT ||
+        conn->marked_for_close ||
+        rend_cmp_service_ids(query, conn->rend_query))
+      continue;
     assert_connection_ok(conn, now);
     if (rend_cache_lookup_entry(conn->rend_query, -1, &entry) == 1 &&
         entry->parsed->n_intro_points > 0) {
@@ -445,7 +454,6 @@ rend_client_desc_here(const char *query)
         warn(LD_REND,"Rendezvous attempt failed. Closing.");
         connection_mark_unattached_ap(conn, END_STREAM_REASON_CANT_ATTACH);
       }
-      tor_assert(conn->state != AP_CONN_STATE_RENDDESC_WAIT); /* avoid loop */
     } else { /* 404, or fetch didn't get that far */
       notice(LD_REND,"Closing stream for '%s.onion': hidden service is "
              "unavailable (try again later).", safe_str(query));