Selaa lähdekoodia

get more serious about hunting The Bug
(it has been haunting us since the days of 0.0.2preX)


svn:r1576

Roger Dingledine 20 vuotta sitten
vanhempi
commit
4011906b6b
3 muutettua tiedostoa jossa 27 lisäystä ja 5 poistoa
  1. 14 0
      src/or/dns.c
  2. 12 5
      src/or/main.c
  3. 1 0
      src/or/or.h

+ 14 - 0
src/or/dns.c

@@ -263,6 +263,19 @@ void assert_connection_edge_not_dns_pending(connection_t *conn) {
   }
 }
 
+void assert_all_pending_dns_resolves_ok(void) {
+  struct pending_connection_t *pend;
+  struct cached_resolve *resolve;
+
+  SPLAY_FOREACH(resolve, cache_tree, &cache_root) {
+    for(pend = resolve->pending_connections;
+        pend;
+        pend = pend->next) {
+      assert_connection_ok(pend->conn, 0);
+    }
+  }
+}
+
 /* Cancel all pending connections. Then cancel the resolve itself,
  * and remove the 'struct cached_resolve' from the cache.
  */
@@ -344,6 +357,7 @@ static void dns_found_answer(char *address, uint32_t addr, char outcome) {
   if (resolve->state != CACHE_STATE_PENDING) {
     log_fn(LOG_WARN, "Resolved '%s' which was already resolved; ignoring",
            address);
+    assert(resolve->pending_connections == NULL);
     return;
   }
   /* Removed this assertion: in fact, we'll sometimes get a double answer

+ 12 - 5
src/or/main.c

@@ -181,13 +181,14 @@ static void conn_read(int i) {
   log_fn(LOG_DEBUG,"socket %d wants to read.",conn->s);
 
   assert_connection_ok(conn, time(NULL));
+  assert_all_pending_dns_resolves_ok();
 
   if(
-      /* XXX does POLLHUP also mean it's definitely broken? */
+    /* XXX does POLLHUP also mean it's definitely broken? */
 #ifdef MS_WINDOWS
-      (poll_array[i].revents & POLLERR) ||
+    (poll_array[i].revents & POLLERR) ||
 #endif
-      connection_handle_read(conn) < 0) {
+    connection_handle_read(conn) < 0) {
       if (!conn->marked_for_close) {
         /* this connection is broken. remove it */
         /* XXX This shouldn't ever happen anymore. */
@@ -196,8 +197,9 @@ static void conn_read(int i) {
                CONN_TYPE_TO_STRING(conn->type), conn->s);
         connection_mark_for_close(conn,0);
       }
-    }
-    assert_connection_ok(conn, time(NULL));
+  }
+  assert_connection_ok(conn, time(NULL));
+  assert_all_pending_dns_resolves_ok();
 }
 
 static void conn_write(int i) {
@@ -212,6 +214,7 @@ static void conn_write(int i) {
     return;
 
   assert_connection_ok(conn, time(NULL));
+  assert_all_pending_dns_resolves_ok();
 
   if (connection_handle_write(conn) < 0) {
     if (!conn->marked_for_close) {
@@ -223,6 +226,7 @@ static void conn_write(int i) {
     }
   }
   assert_connection_ok(conn, time(NULL));
+  assert_all_pending_dns_resolves_ok();
 }
 
 static void conn_close_if_marked(int i) {
@@ -231,6 +235,7 @@ static void conn_close_if_marked(int i) {
 
   conn = connection_array[i];
   assert_connection_ok(conn, time(NULL));
+  assert_all_pending_dns_resolves_ok();
   if(!conn->marked_for_close)
     return; /* nothing to see here, move along */
 
@@ -446,7 +451,9 @@ static int prepare_for_poll(void) {
   if(now.tv_sec > current_second) { /* the second has rolled over. check more stuff. */
 
     ++stats_n_seconds_reading;
+    assert_all_pending_dns_resolves_ok();
     run_scheduled_events(now.tv_sec);
+    assert_all_pending_dns_resolves_ok();
 
     current_second = now.tv_sec; /* remember which second it is, for next time */
   }

+ 1 - 0
src/or/or.h

@@ -914,6 +914,7 @@ int connection_dns_finished_flushing(connection_t *conn);
 int connection_dns_process_inbuf(connection_t *conn);
 void connection_dns_remove(connection_t *conn);
 void assert_connection_edge_not_dns_pending(connection_t *conn);
+void assert_all_pending_dns_resolves_ok(void);
 void dns_cancel_pending_resolve(char *question);
 int dns_resolve(connection_t *exitconn);