diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/or/connection_edge.c | 11 | ||||
-rw-r--r-- | src/or/dns.c | 2 |
2 files changed, 7 insertions, 6 deletions
diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c index 17b9cc41dd..e67be3dfcf 100644 --- a/src/or/connection_edge.c +++ b/src/or/connection_edge.c @@ -904,18 +904,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: /* The result was cached; a resolved cell was sent. */ - case -1: - /* dummy_conn got freed, don't touch it */ + case -1: /* Impossible to resolve; a resolved cell was sent. */ + connection_free(dummy_conn); return 0; case 0: /* resolve added to pending list */ + dummy_conn->next_stream = circ->resolving_streams; + circ->resolving_streams = dummy_conn; assert_circuit_ok(circ); - ; + break; } return 0; } diff --git a/src/or/dns.c b/src/or/dns.c index 5e68c63f9d..7b23f60ea9 100644 --- a/src/or/dns.c +++ b/src/or/dns.c @@ -216,6 +216,8 @@ int dns_resolve(connection_t *exitconn) { * know the answer. */ if (tor_inet_aton(exitconn->address, &in) != 0) { exitconn->addr = ntohl(in.s_addr); + if (exitconn->purpose == EXIT_PURPOSE_RESOLVE) + send_resolved_cell(exitconn, RESOLVED_TYPE_IPV4); return 1; } |