From 515925a0f0d8c6b6e5f7a5f116d5cc43efe1eb4e Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Tue, 21 Sep 2004 18:12:12 +0000 Subject: [PATCH] Attach dummy resolve connections to a circuit *before* calling dns_resolve(). This fixes a bug where cached answers would never be sent in RESOLVED cells. svn:r2360 --- trunk/src/or/connection_edge.c | 14 ++++++-------- trunk/src/or/dns.c | 2 ++ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/trunk/src/or/connection_edge.c b/trunk/src/or/connection_edge.c index e6b02257fd..d1bf109f22 100644 --- a/trunk/src/or/connection_edge.c +++ b/trunk/src/or/connection_edge.c @@ -855,19 +855,17 @@ int connection_exit_begin_resolve(cell_t *cell, circuit_t *circ) { dummy_conn->state = EXIT_CONN_STATE_RESOLVEFAILED; dummy_conn->purpose = EXIT_PURPOSE_RESOLVE; + dummy_conn->next_stream = circ->resolving_streams; + circ->resolving_streams = dummy_conn; + /* send it off to the gethostbyname farm */ switch(dns_resolve(dummy_conn)) { - case 1: /* resolve worked; resolved cell was sent. */ + case 1: /* The result was cached; a resolved cell was sent. */ + case -1: + circuit_detach_stream(circuit_get_by_conn(dummy_conn), dummy_conn); connection_free(dummy_conn); return 0; - case -1: /* resolve failed; resolved cell was sent. */ - log_fn(LOG_INFO,"Resolve failed (%s).",dummy_conn->address); - connection_free(dummy_conn); - break; case 0: /* resolve added to pending list */ - /* add it into the linked list of resolving_streams on this circuit */ - dummy_conn->next_stream = circ->resolving_streams; - circ->resolving_streams = dummy_conn; assert_circuit_ok(circ); ; } diff --git a/trunk/src/or/dns.c b/trunk/src/or/dns.c index 3534de1b08..0e583c0844 100644 --- a/trunk/src/or/dns.c +++ b/trunk/src/or/dns.c @@ -225,6 +225,8 @@ int dns_resolve(connection_t *exitconn) { send_resolved_cell(exitconn, RESOLVED_TYPE_IPV4); return 1; case CACHE_STATE_FAILED: + log_fn(LOG_DEBUG,"Connection (fd %d) found cached error for '%s'", + exitconn->s, exitconn->address); if (exitconn->purpose == EXIT_PURPOSE_RESOLVE) send_resolved_cell(exitconn, RESOLVED_TYPE_ERROR); return -1;