mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-12-06 19:41:15 +01:00
get more serious about hunting The Bug
(it has been haunting us since the days of 0.0.2preX) svn:r1576
This commit is contained in:
@@ -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
@@ -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 */
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user