summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/or/connection_edge.c11
-rw-r--r--src/or/dns.c2
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;
}