diff options
author | Roger Dingledine <arma@torproject.org> | 2004-04-09 09:39:42 +0000 |
---|---|---|
committer | Roger Dingledine <arma@torproject.org> | 2004-04-09 09:39:42 +0000 |
commit | 4011906b6b82e237777fc10a3598d9d52c9039cc (patch) | |
tree | 7236419178c0b4de4f096c4775c057ad89be5ab7 | |
parent | 9b436c7f7a9a10bdae78614cb808cebb980a4f0f (diff) | |
download | tor-4011906b6b82e237777fc10a3598d9d52c9039cc.tar.gz tor-4011906b6b82e237777fc10a3598d9d52c9039cc.zip |
get more serious about hunting The Bug
(it has been haunting us since the days of 0.0.2preX)
svn:r1576
-rw-r--r-- | src/or/dns.c | 14 | ||||
-rw-r--r-- | src/or/main.c | 17 | ||||
-rw-r--r-- | src/or/or.h | 1 |
3 files changed, 27 insertions, 5 deletions
diff --git a/src/or/dns.c b/src/or/dns.c index 36bdefeec0..85676e129f 100644 --- a/src/or/dns.c +++ b/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 diff --git a/src/or/main.c b/src/or/main.c index 6262abce34..a73f047c7c 100644 --- a/src/or/main.c +++ b/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 */ } diff --git a/src/or/or.h b/src/or/or.h index a288854648..5e868a9ab3 100644 --- a/src/or/or.h +++ b/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); |