Loading src/or/circuituse.c +3 −3 Original line number Diff line number Diff line Loading @@ -1183,11 +1183,11 @@ connection_ap_handshake_attach_chosen_circuit(edge_connection_t *conn, consider_recording_trackhost(conn, circ); /* fall through */ case SOCKS_COMMAND_CONNECT_DIR: if (connection_ap_handshake_send_begin(conn, circ)<0) if (connection_ap_handshake_send_begin(conn)<0) return -1; break; default: if (connection_ap_handshake_send_resolve(conn, circ)<0) if (connection_ap_handshake_send_resolve(conn)<0) return -1; } Loading Loading @@ -1286,7 +1286,7 @@ connection_ap_handshake_attach_circuit(edge_connection_t *conn) */ rendcirc->_base.timestamp_dirty = time(NULL); link_apconn_to_circ(conn, rendcirc); if (connection_ap_handshake_send_begin(conn, rendcirc) < 0) if (connection_ap_handshake_send_begin(conn) < 0) return 0; /* already marked, let them fade away */ return 1; } Loading src/or/command.c +5 −4 Original line number Diff line number Diff line Loading @@ -291,8 +291,9 @@ command_process_created_cell(cell_t *cell, or_connection_t *conn) } else { /* pack it into an extended relay cell, and send it. */ log_debug(LD_OR, "Converting created cell to extended relay cell, sending."); connection_edge_send_command(NULL, circ, RELAY_COMMAND_EXTENDED, cell->payload, ONIONSKIN_REPLY_LEN); relay_send_command_from_edge(0, circ, RELAY_COMMAND_EXTENDED, cell->payload, ONIONSKIN_REPLY_LEN, NULL); } } Loading Loading @@ -383,8 +384,8 @@ command_process_destroy_cell(cell_t *cell, or_connection_t *conn) char payload[1]; log_debug(LD_OR, "Delivering 'truncated' back."); payload[0] = (char)reason; connection_edge_send_command(NULL, circ, RELAY_COMMAND_TRUNCATED, payload, sizeof(payload)); relay_send_command_from_edge(0, circ, RELAY_COMMAND_TRUNCATED, payload, sizeof(payload), NULL); } } } Loading src/or/connection_edge.c +18 −18 Original line number Diff line number Diff line Loading @@ -211,7 +211,7 @@ connection_edge_end(edge_connection_t *conn, char reason) circ = circuit_get_by_edge_conn(conn); if (circ && !circ->marked_for_close) { log_debug(LD_EDGE,"Sending end on conn (fd %d).",conn->_base.s); connection_edge_send_command(conn, circ, RELAY_COMMAND_END, connection_edge_send_command(conn, RELAY_COMMAND_END, payload, payload_len); } else { log_debug(LD_EDGE,"No circ to send end on conn (fd %d).", Loading Loading @@ -301,7 +301,6 @@ connection_edge_finished_connecting(edge_connection_t *edge_conn) /* deliver a 'connected' relay cell back through the circuit. */ if (connection_edge_is_rendezvous_stream(edge_conn)) { if (connection_edge_send_command(edge_conn, circuit_get_by_edge_conn(edge_conn), RELAY_COMMAND_CONNECTED, NULL, 0) < 0) return 0; /* circuit is closed, don't continue */ } else { Loading @@ -310,7 +309,6 @@ connection_edge_finished_connecting(edge_connection_t *edge_conn) set_uint32(connected_payload+4, htonl(dns_clip_ttl(edge_conn->address_ttl))); if (connection_edge_send_command(edge_conn, circuit_get_by_edge_conn(edge_conn), RELAY_COMMAND_CONNECTED, connected_payload, 8) < 0) return 0; /* circuit is closed, don't continue */ Loading Loading @@ -1740,12 +1738,14 @@ again: * If ap_conn is broken, mark it for close and return -1. Else return 0. */ int connection_ap_handshake_send_begin(edge_connection_t *ap_conn, origin_circuit_t *circ) connection_ap_handshake_send_begin(edge_connection_t *ap_conn) { char payload[CELL_PAYLOAD_SIZE]; int payload_len; int begin_type; origin_circuit_t *circ; tor_assert(ap_conn->on_circuit); circ = TO_ORIGIN_CIRCUIT(ap_conn->on_circuit); tor_assert(ap_conn->_base.type == CONN_TYPE_AP); tor_assert(ap_conn->_base.state == AP_CONN_STATE_CIRCUIT_WAIT); Loading Loading @@ -1774,7 +1774,7 @@ connection_ap_handshake_send_begin(edge_connection_t *ap_conn, tor_assert(circ->build_state->onehop_tunnel == 0); } if (connection_edge_send_command(ap_conn, TO_CIRCUIT(circ), begin_type, if (connection_edge_send_command(ap_conn, begin_type, begin_type == RELAY_COMMAND_BEGIN ? payload : NULL, begin_type == RELAY_COMMAND_BEGIN ? payload_len : 0) < 0) return -1; /* circuit is closed, don't continue */ Loading @@ -1794,12 +1794,14 @@ connection_ap_handshake_send_begin(edge_connection_t *ap_conn, * If ap_conn is broken, mark it for close and return -1. Else return 0. */ int connection_ap_handshake_send_resolve(edge_connection_t *ap_conn, origin_circuit_t *circ) connection_ap_handshake_send_resolve(edge_connection_t *ap_conn) { int payload_len, command; const char *string_addr; char inaddr_buf[32]; origin_circuit_t *circ; tor_assert(ap_conn->on_circuit); circ = TO_ORIGIN_CIRCUIT(ap_conn->on_circuit); tor_assert(ap_conn->_base.type == CONN_TYPE_AP); tor_assert(ap_conn->_base.state == AP_CONN_STATE_CIRCUIT_WAIT); Loading Loading @@ -1841,7 +1843,7 @@ connection_ap_handshake_send_resolve(edge_connection_t *ap_conn, log_debug(LD_APP, "Sending relay cell to begin stream %d.", ap_conn->stream_id); if (connection_edge_send_command(ap_conn, TO_CIRCUIT(circ), if (connection_edge_send_command(ap_conn, RELAY_COMMAND_RESOLVE, string_addr, payload_len) < 0) return -1; /* circuit is closed, don't continue */ Loading Loading @@ -2238,13 +2240,14 @@ connection_exit_begin_conn(cell_t *cell, circuit_t *circ) return connection_exit_connect_dir(n_stream); } TO_OR_CIRCUIT(circ)->n_streams = n_stream; n_stream->on_circuit = circ; /* send it off to the gethostbyname farm */ switch (dns_resolve(n_stream, NULL)) { switch (dns_resolve(n_stream)) { case 1: /* resolve worked */ /* add it into the linked list of n_streams on this circuit */ n_stream->next_stream = TO_OR_CIRCUIT(circ)->n_streams; n_stream->on_circuit = circ; TO_OR_CIRCUIT(circ)->n_streams = n_stream; assert_circuit_ok(circ); Loading @@ -2255,12 +2258,11 @@ connection_exit_begin_conn(cell_t *cell, circuit_t *circ) end_payload[0] = END_STREAM_REASON_RESOLVEFAILED; relay_send_command_from_edge(rh.stream_id, circ, RELAY_COMMAND_END, end_payload, 1, NULL); /* n_stream got freed. don't touch it. */ /* n_stream got detached and freed. don't touch it. */ break; case 0: /* resolve added to pending list */ /* add it into the linked list of resolving_streams on this circuit */ n_stream->next_stream = TO_OR_CIRCUIT(circ)->resolving_streams; n_stream->on_circuit = circ; TO_OR_CIRCUIT(circ)->resolving_streams = n_stream; assert_circuit_ok(circ); ; Loading Loading @@ -2296,8 +2298,10 @@ connection_exit_begin_resolve(cell_t *cell, or_circuit_t *circ) dummy_conn->_base.state = EXIT_CONN_STATE_RESOLVEFAILED; dummy_conn->_base.purpose = EXIT_PURPOSE_RESOLVE; dummy_conn->on_circuit = TO_CIRCUIT(circ); /* send it off to the gethostbyname farm */ switch (dns_resolve(dummy_conn, circ)) { switch (dns_resolve(dummy_conn)) { case -1: /* Impossible to resolve; a resolved cell was sent. */ /* Connection freed; don't touch it. */ return 0; Loading @@ -2307,7 +2311,6 @@ connection_exit_begin_resolve(cell_t *cell, or_circuit_t *circ) return 0; case 0: /* resolve added to pending list */ dummy_conn->next_stream = circ->resolving_streams; dummy_conn->on_circuit = TO_CIRCUIT(circ); circ->resolving_streams = dummy_conn; assert_circuit_ok(TO_CIRCUIT(circ)); break; Loading Loading @@ -2392,7 +2395,6 @@ connection_exit_connect(edge_connection_t *edge_conn) /* rendezvous stream */ /* don't send an address back! */ connection_edge_send_command(edge_conn, circuit_get_by_edge_conn(edge_conn), RELAY_COMMAND_CONNECTED, NULL, 0); } else { /* normal stream */ Loading @@ -2402,7 +2404,6 @@ connection_exit_connect(edge_connection_t *edge_conn) set_uint32(connected_payload+4, htonl(dns_clip_ttl(edge_conn->address_ttl))); connection_edge_send_command(edge_conn, circuit_get_by_edge_conn(edge_conn), RELAY_COMMAND_CONNECTED, connected_payload, 8); } Loading Loading @@ -2475,7 +2476,6 @@ connection_exit_connect_dir(edge_connection_t *exit_conn) connection_start_reading(TO_CONN(exit_conn)); if (connection_edge_send_command(exit_conn, circuit_get_by_edge_conn(exit_conn), RELAY_COMMAND_CONNECTED, NULL, 0) < 0) { connection_mark_for_close(TO_CONN(exit_conn)); connection_mark_for_close(TO_CONN(dir_conn)); Loading src/or/dns.c +26 −51 Original line number Diff line number Diff line Loading @@ -92,9 +92,8 @@ static void purge_expired_resolves(time_t now); static void dns_found_answer(const char *address, int is_reverse, uint32_t addr, const char *hostname, char outcome, uint32_t ttl); static void send_resolved_cell(edge_connection_t *conn, or_circuit_t *circ, uint8_t answer_type); static int launch_resolve(edge_connection_t *exitconn, or_circuit_t *circ); static void send_resolved_cell(edge_connection_t *conn, uint8_t answer_type); static int launch_resolve(edge_connection_t *exitconn); static void add_wildcarded_test_address(const char *address); static int configure_nameservers(int force); static int answer_is_wildcarded(const char *ip); Loading Loading @@ -389,8 +388,7 @@ purge_expired_resolves(time_t now) * <b>conn</b>'s attached circuit. */ static void send_resolved_cell(edge_connection_t *conn, or_circuit_t *circ, uint8_t answer_type) send_resolved_cell(edge_connection_t *conn, uint8_t answer_type) { char buf[RELAY_PAYLOAD_SIZE]; size_t buflen; Loading Loading @@ -425,14 +423,7 @@ send_resolved_cell(edge_connection_t *conn, or_circuit_t *circ, } // log_notice(LD_EXIT, "Sending a regular RESOLVED reply: "); if (!circ) { circuit_t *tmp = circuit_get_by_edge_conn(conn); if (! CIRCUIT_IS_ORIGIN(tmp)) circ = TO_OR_CIRCUIT(tmp); } connection_edge_send_command(conn, TO_CIRCUIT(circ), RELAY_COMMAND_RESOLVED, buf, buflen); connection_edge_send_command(conn, RELAY_COMMAND_RESOLVED, buf, buflen); } /** Send a response to the RESOLVE request of a connection for an in-addr.arpa Loading @@ -444,8 +435,7 @@ send_resolved_cell(edge_connection_t *conn, or_circuit_t *circ, * <b>conn</b>'s attached circuit. */ static void send_resolved_hostname_cell(edge_connection_t *conn, or_circuit_t *circ, const char *hostname) send_resolved_hostname_cell(edge_connection_t *conn, const char *hostname) { char buf[RELAY_PAYLOAD_SIZE]; size_t buflen; Loading @@ -462,15 +452,8 @@ send_resolved_hostname_cell(edge_connection_t *conn, or_circuit_t *circ, set_uint32(buf+2+namelen, htonl(ttl)); buflen = 2+namelen+4; if (!circ) { circuit_t *tmp = circuit_get_by_edge_conn(conn); if (! CIRCUIT_IS_ORIGIN(tmp)) circ = TO_OR_CIRCUIT(tmp); } // log_notice(LD_EXIT, "Sending a reply RESOLVED reply: %s", hostname); connection_edge_send_command(conn, TO_CIRCUIT(circ), RELAY_COMMAND_RESOLVED, buf, buflen); connection_edge_send_command(conn, RELAY_COMMAND_RESOLVED, buf, buflen); // log_notice(LD_EXIT, "Sent"); } Loading Loading @@ -525,9 +508,8 @@ parse_inaddr_arpa_address(const char *address, struct in_addr *in) * need to send back an END cell, since connection_exit_begin_conn will * do that for us.) * * If <b>oncirc</b> is provided, and this is a resolve request, we have * a cached answer, send the answer back along oncirc; otherwise, send * the answer back along <b>exitconn</b>'s attached circuit. * If we have a cached answer, send the answer back along <b>exitconn</b>'s * attached circuit. * * Else, if seen before and pending, add conn to the pending list, * and return 0. Loading @@ -536,18 +518,17 @@ parse_inaddr_arpa_address(const char *address, struct in_addr *in) * dns farm, and return 0. */ int dns_resolve(edge_connection_t *exitconn, or_circuit_t *oncirc) dns_resolve(edge_connection_t *exitconn) { cached_resolve_t *resolve; cached_resolve_t search; pending_connection_t *pending_connection; circuit_t *circ; struct in_addr in; time_t now = time(NULL); int is_reverse = 0, is_resolve, r; or_circuit_t *oncirc = TO_OR_CIRCUIT(exitconn->on_circuit); assert_connection_ok(TO_CONN(exitconn), 0); tor_assert(exitconn->_base.s == -1); assert_cache_ok(); is_resolve = exitconn->_base.purpose == EXIT_PURPOSE_RESOLVE; Loading @@ -558,7 +539,7 @@ dns_resolve(edge_connection_t *exitconn, or_circuit_t *oncirc) exitconn->_base.addr = ntohl(in.s_addr); exitconn->address_ttl = DEFAULT_DNS_TTL; if (is_resolve) send_resolved_cell(exitconn, oncirc, RESOLVED_TYPE_IPV4); send_resolved_cell(exitconn, RESOLVED_TYPE_IPV4); return 1; } if (address_is_invalid_destination(exitconn->_base.address, 0)) { Loading @@ -566,10 +547,8 @@ dns_resolve(edge_connection_t *exitconn, or_circuit_t *oncirc) "Rejecting invalid destination address %s", escaped_safe_str(exitconn->_base.address)); if (is_resolve) send_resolved_cell(exitconn, oncirc, RESOLVED_TYPE_ERROR); circ = circuit_get_by_edge_conn(exitconn); if (circ) circuit_detach_stream(circ, exitconn); send_resolved_cell(exitconn, RESOLVED_TYPE_ERROR); circuit_detach_stream(TO_CIRCUIT(oncirc), exitconn); if (!exitconn->_base.marked_for_close) connection_free(TO_CONN(exitconn)); return -1; Loading Loading @@ -601,10 +580,8 @@ dns_resolve(edge_connection_t *exitconn, or_circuit_t *oncirc) escaped_safe_str(exitconn->_base.address)); if (exitconn->_base.purpose == EXIT_PURPOSE_RESOLVE) send_resolved_cell(exitconn, oncirc, RESOLVED_TYPE_ERROR); circ = circuit_get_by_edge_conn(exitconn); if (circ) circuit_detach_stream(circ, exitconn); send_resolved_cell(exitconn, RESOLVED_TYPE_ERROR); circuit_detach_stream(TO_CIRCUIT(oncirc), exitconn); if (!exitconn->_base.marked_for_close) connection_free(TO_CONN(exitconn)); return -1; Loading Loading @@ -637,12 +614,12 @@ dns_resolve(edge_connection_t *exitconn, or_circuit_t *oncirc) exitconn->address_ttl = resolve->ttl; if (resolve->is_reverse) { tor_assert(is_resolve); send_resolved_hostname_cell(exitconn, oncirc, send_resolved_hostname_cell(exitconn, resolve->result.hostname); } else { exitconn->_base.addr = resolve->result.addr; if (is_resolve) send_resolved_cell(exitconn, oncirc, RESOLVED_TYPE_IPV4); send_resolved_cell(exitconn, RESOLVED_TYPE_IPV4); } return 1; case CACHE_STATE_CACHED_FAILED: Loading @@ -650,10 +627,8 @@ dns_resolve(edge_connection_t *exitconn, or_circuit_t *oncirc) exitconn->_base.s, escaped_safe_str(exitconn->_base.address)); if (is_resolve) send_resolved_cell(exitconn, oncirc, RESOLVED_TYPE_ERROR); circ = circuit_get_by_edge_conn(exitconn); if (circ) circuit_detach_stream(circ, exitconn); send_resolved_cell(exitconn, RESOLVED_TYPE_ERROR); circuit_detach_stream(TO_CIRCUIT(oncirc), exitconn); if (!exitconn->_base.marked_for_close) connection_free(TO_CONN(exitconn)); return -1; Loading Loading @@ -683,7 +658,7 @@ dns_resolve(edge_connection_t *exitconn, or_circuit_t *oncirc) log_debug(LD_EXIT,"Launching %s.", escaped_safe_str(exitconn->_base.address)); assert_cache_ok(); return launch_resolve(exitconn, oncirc); return launch_resolve(exitconn); } /** Log an error and abort if conn is waiting for a DNS resolve. Loading Loading @@ -953,7 +928,7 @@ dns_found_answer(const char *address, int is_reverse, uint32_t addr, /* This detach must happen after we send the end cell. */ circuit_detach_stream(circuit_get_by_edge_conn(pendconn), pendconn); } else { send_resolved_cell(pendconn, NULL, RESOLVED_TYPE_ERROR); send_resolved_cell(pendconn, RESOLVED_TYPE_ERROR); /* This detach must happen after we send the resolved cell. */ circuit_detach_stream(circuit_get_by_edge_conn(pendconn), pendconn); } Loading @@ -980,9 +955,9 @@ dns_found_answer(const char *address, int is_reverse, uint32_t addr, * but it does the right thing. */ pendconn->_base.state = EXIT_CONN_STATE_RESOLVEFAILED; if (is_reverse) send_resolved_hostname_cell(pendconn, NULL, hostname); send_resolved_hostname_cell(pendconn, hostname); else send_resolved_cell(pendconn, NULL, RESOLVED_TYPE_IPV4); send_resolved_cell(pendconn, RESOLVED_TYPE_IPV4); circ = circuit_get_by_edge_conn(pendconn); tor_assert(circ); circuit_detach_stream(circ, pendconn); Loading Loading @@ -1187,7 +1162,7 @@ evdns_callback(int result, char type, int count, int ttl, void *addresses, /** For eventdns: start resolving as necessary to find the target for * <b>exitconn</b> */ static int launch_resolve(edge_connection_t *exitconn, or_circuit_t *circ) launch_resolve(edge_connection_t *exitconn) { char *addr = tor_strdup(exitconn->_base.address); struct in_addr in; Loading Loading @@ -1222,10 +1197,10 @@ launch_resolve(edge_connection_t *exitconn, or_circuit_t *circ) escaped_safe_str(addr), r); if (exitconn->_base.purpose == EXIT_PURPOSE_RESOLVE) { if (evdns_err_is_transient(r)) send_resolved_cell(exitconn, circ, RESOLVED_TYPE_ERROR_TRANSIENT); send_resolved_cell(exitconn, RESOLVED_TYPE_ERROR_TRANSIENT); else { exitconn->address_ttl = DEFAULT_DNS_TTL; send_resolved_cell(exitconn, circ, RESOLVED_TYPE_ERROR); send_resolved_cell(exitconn, RESOLVED_TYPE_ERROR); } } dns_cancel_pending_resolve(addr); /* also sends end and frees */ Loading src/or/or.h +4 −6 Original line number Diff line number Diff line Loading @@ -2195,10 +2195,8 @@ int connection_edge_end_errno(edge_connection_t *conn); int connection_edge_finished_flushing(edge_connection_t *conn); int connection_edge_finished_connecting(edge_connection_t *conn); int connection_ap_handshake_send_begin(edge_connection_t *ap_conn, origin_circuit_t *circ); int connection_ap_handshake_send_resolve(edge_connection_t *ap_conn, origin_circuit_t *circ); int connection_ap_handshake_send_begin(edge_connection_t *ap_conn); int connection_ap_handshake_send_resolve(edge_connection_t *ap_conn); int connection_ap_make_bridge(char *address, uint16_t port, const char *digest, int command); Loading Loading @@ -2477,7 +2475,7 @@ void connection_dns_remove(edge_connection_t *conn); void assert_connection_edge_not_dns_pending(edge_connection_t *conn); void assert_all_pending_dns_resolves_ok(void); void dns_cancel_pending_resolve(const char *question); int dns_resolve(edge_connection_t *exitconn, or_circuit_t *circ); int dns_resolve(edge_connection_t *exitconn); void dns_launch_correctness_checks(void); int dns_seems_to_be_broken(void); void dns_reset_correctness_checks(void); Loading Loading @@ -2619,7 +2617,7 @@ void relay_header_unpack(relay_header_t *dest, const char *src); int relay_send_command_from_edge(uint16_t stream_id, circuit_t *circ, int relay_command, const char *payload, size_t payload_len, crypt_path_t *cpath_layer); int connection_edge_send_command(edge_connection_t *fromconn, circuit_t *circ, int connection_edge_send_command(edge_connection_t *fromconn, int relay_command, const char *payload, size_t payload_len); int connection_edge_package_raw_inbuf(edge_connection_t *conn, Loading Loading
src/or/circuituse.c +3 −3 Original line number Diff line number Diff line Loading @@ -1183,11 +1183,11 @@ connection_ap_handshake_attach_chosen_circuit(edge_connection_t *conn, consider_recording_trackhost(conn, circ); /* fall through */ case SOCKS_COMMAND_CONNECT_DIR: if (connection_ap_handshake_send_begin(conn, circ)<0) if (connection_ap_handshake_send_begin(conn)<0) return -1; break; default: if (connection_ap_handshake_send_resolve(conn, circ)<0) if (connection_ap_handshake_send_resolve(conn)<0) return -1; } Loading Loading @@ -1286,7 +1286,7 @@ connection_ap_handshake_attach_circuit(edge_connection_t *conn) */ rendcirc->_base.timestamp_dirty = time(NULL); link_apconn_to_circ(conn, rendcirc); if (connection_ap_handshake_send_begin(conn, rendcirc) < 0) if (connection_ap_handshake_send_begin(conn) < 0) return 0; /* already marked, let them fade away */ return 1; } Loading
src/or/command.c +5 −4 Original line number Diff line number Diff line Loading @@ -291,8 +291,9 @@ command_process_created_cell(cell_t *cell, or_connection_t *conn) } else { /* pack it into an extended relay cell, and send it. */ log_debug(LD_OR, "Converting created cell to extended relay cell, sending."); connection_edge_send_command(NULL, circ, RELAY_COMMAND_EXTENDED, cell->payload, ONIONSKIN_REPLY_LEN); relay_send_command_from_edge(0, circ, RELAY_COMMAND_EXTENDED, cell->payload, ONIONSKIN_REPLY_LEN, NULL); } } Loading Loading @@ -383,8 +384,8 @@ command_process_destroy_cell(cell_t *cell, or_connection_t *conn) char payload[1]; log_debug(LD_OR, "Delivering 'truncated' back."); payload[0] = (char)reason; connection_edge_send_command(NULL, circ, RELAY_COMMAND_TRUNCATED, payload, sizeof(payload)); relay_send_command_from_edge(0, circ, RELAY_COMMAND_TRUNCATED, payload, sizeof(payload), NULL); } } } Loading
src/or/connection_edge.c +18 −18 Original line number Diff line number Diff line Loading @@ -211,7 +211,7 @@ connection_edge_end(edge_connection_t *conn, char reason) circ = circuit_get_by_edge_conn(conn); if (circ && !circ->marked_for_close) { log_debug(LD_EDGE,"Sending end on conn (fd %d).",conn->_base.s); connection_edge_send_command(conn, circ, RELAY_COMMAND_END, connection_edge_send_command(conn, RELAY_COMMAND_END, payload, payload_len); } else { log_debug(LD_EDGE,"No circ to send end on conn (fd %d).", Loading Loading @@ -301,7 +301,6 @@ connection_edge_finished_connecting(edge_connection_t *edge_conn) /* deliver a 'connected' relay cell back through the circuit. */ if (connection_edge_is_rendezvous_stream(edge_conn)) { if (connection_edge_send_command(edge_conn, circuit_get_by_edge_conn(edge_conn), RELAY_COMMAND_CONNECTED, NULL, 0) < 0) return 0; /* circuit is closed, don't continue */ } else { Loading @@ -310,7 +309,6 @@ connection_edge_finished_connecting(edge_connection_t *edge_conn) set_uint32(connected_payload+4, htonl(dns_clip_ttl(edge_conn->address_ttl))); if (connection_edge_send_command(edge_conn, circuit_get_by_edge_conn(edge_conn), RELAY_COMMAND_CONNECTED, connected_payload, 8) < 0) return 0; /* circuit is closed, don't continue */ Loading Loading @@ -1740,12 +1738,14 @@ again: * If ap_conn is broken, mark it for close and return -1. Else return 0. */ int connection_ap_handshake_send_begin(edge_connection_t *ap_conn, origin_circuit_t *circ) connection_ap_handshake_send_begin(edge_connection_t *ap_conn) { char payload[CELL_PAYLOAD_SIZE]; int payload_len; int begin_type; origin_circuit_t *circ; tor_assert(ap_conn->on_circuit); circ = TO_ORIGIN_CIRCUIT(ap_conn->on_circuit); tor_assert(ap_conn->_base.type == CONN_TYPE_AP); tor_assert(ap_conn->_base.state == AP_CONN_STATE_CIRCUIT_WAIT); Loading Loading @@ -1774,7 +1774,7 @@ connection_ap_handshake_send_begin(edge_connection_t *ap_conn, tor_assert(circ->build_state->onehop_tunnel == 0); } if (connection_edge_send_command(ap_conn, TO_CIRCUIT(circ), begin_type, if (connection_edge_send_command(ap_conn, begin_type, begin_type == RELAY_COMMAND_BEGIN ? payload : NULL, begin_type == RELAY_COMMAND_BEGIN ? payload_len : 0) < 0) return -1; /* circuit is closed, don't continue */ Loading @@ -1794,12 +1794,14 @@ connection_ap_handshake_send_begin(edge_connection_t *ap_conn, * If ap_conn is broken, mark it for close and return -1. Else return 0. */ int connection_ap_handshake_send_resolve(edge_connection_t *ap_conn, origin_circuit_t *circ) connection_ap_handshake_send_resolve(edge_connection_t *ap_conn) { int payload_len, command; const char *string_addr; char inaddr_buf[32]; origin_circuit_t *circ; tor_assert(ap_conn->on_circuit); circ = TO_ORIGIN_CIRCUIT(ap_conn->on_circuit); tor_assert(ap_conn->_base.type == CONN_TYPE_AP); tor_assert(ap_conn->_base.state == AP_CONN_STATE_CIRCUIT_WAIT); Loading Loading @@ -1841,7 +1843,7 @@ connection_ap_handshake_send_resolve(edge_connection_t *ap_conn, log_debug(LD_APP, "Sending relay cell to begin stream %d.", ap_conn->stream_id); if (connection_edge_send_command(ap_conn, TO_CIRCUIT(circ), if (connection_edge_send_command(ap_conn, RELAY_COMMAND_RESOLVE, string_addr, payload_len) < 0) return -1; /* circuit is closed, don't continue */ Loading Loading @@ -2238,13 +2240,14 @@ connection_exit_begin_conn(cell_t *cell, circuit_t *circ) return connection_exit_connect_dir(n_stream); } TO_OR_CIRCUIT(circ)->n_streams = n_stream; n_stream->on_circuit = circ; /* send it off to the gethostbyname farm */ switch (dns_resolve(n_stream, NULL)) { switch (dns_resolve(n_stream)) { case 1: /* resolve worked */ /* add it into the linked list of n_streams on this circuit */ n_stream->next_stream = TO_OR_CIRCUIT(circ)->n_streams; n_stream->on_circuit = circ; TO_OR_CIRCUIT(circ)->n_streams = n_stream; assert_circuit_ok(circ); Loading @@ -2255,12 +2258,11 @@ connection_exit_begin_conn(cell_t *cell, circuit_t *circ) end_payload[0] = END_STREAM_REASON_RESOLVEFAILED; relay_send_command_from_edge(rh.stream_id, circ, RELAY_COMMAND_END, end_payload, 1, NULL); /* n_stream got freed. don't touch it. */ /* n_stream got detached and freed. don't touch it. */ break; case 0: /* resolve added to pending list */ /* add it into the linked list of resolving_streams on this circuit */ n_stream->next_stream = TO_OR_CIRCUIT(circ)->resolving_streams; n_stream->on_circuit = circ; TO_OR_CIRCUIT(circ)->resolving_streams = n_stream; assert_circuit_ok(circ); ; Loading Loading @@ -2296,8 +2298,10 @@ connection_exit_begin_resolve(cell_t *cell, or_circuit_t *circ) dummy_conn->_base.state = EXIT_CONN_STATE_RESOLVEFAILED; dummy_conn->_base.purpose = EXIT_PURPOSE_RESOLVE; dummy_conn->on_circuit = TO_CIRCUIT(circ); /* send it off to the gethostbyname farm */ switch (dns_resolve(dummy_conn, circ)) { switch (dns_resolve(dummy_conn)) { case -1: /* Impossible to resolve; a resolved cell was sent. */ /* Connection freed; don't touch it. */ return 0; Loading @@ -2307,7 +2311,6 @@ connection_exit_begin_resolve(cell_t *cell, or_circuit_t *circ) return 0; case 0: /* resolve added to pending list */ dummy_conn->next_stream = circ->resolving_streams; dummy_conn->on_circuit = TO_CIRCUIT(circ); circ->resolving_streams = dummy_conn; assert_circuit_ok(TO_CIRCUIT(circ)); break; Loading Loading @@ -2392,7 +2395,6 @@ connection_exit_connect(edge_connection_t *edge_conn) /* rendezvous stream */ /* don't send an address back! */ connection_edge_send_command(edge_conn, circuit_get_by_edge_conn(edge_conn), RELAY_COMMAND_CONNECTED, NULL, 0); } else { /* normal stream */ Loading @@ -2402,7 +2404,6 @@ connection_exit_connect(edge_connection_t *edge_conn) set_uint32(connected_payload+4, htonl(dns_clip_ttl(edge_conn->address_ttl))); connection_edge_send_command(edge_conn, circuit_get_by_edge_conn(edge_conn), RELAY_COMMAND_CONNECTED, connected_payload, 8); } Loading Loading @@ -2475,7 +2476,6 @@ connection_exit_connect_dir(edge_connection_t *exit_conn) connection_start_reading(TO_CONN(exit_conn)); if (connection_edge_send_command(exit_conn, circuit_get_by_edge_conn(exit_conn), RELAY_COMMAND_CONNECTED, NULL, 0) < 0) { connection_mark_for_close(TO_CONN(exit_conn)); connection_mark_for_close(TO_CONN(dir_conn)); Loading
src/or/dns.c +26 −51 Original line number Diff line number Diff line Loading @@ -92,9 +92,8 @@ static void purge_expired_resolves(time_t now); static void dns_found_answer(const char *address, int is_reverse, uint32_t addr, const char *hostname, char outcome, uint32_t ttl); static void send_resolved_cell(edge_connection_t *conn, or_circuit_t *circ, uint8_t answer_type); static int launch_resolve(edge_connection_t *exitconn, or_circuit_t *circ); static void send_resolved_cell(edge_connection_t *conn, uint8_t answer_type); static int launch_resolve(edge_connection_t *exitconn); static void add_wildcarded_test_address(const char *address); static int configure_nameservers(int force); static int answer_is_wildcarded(const char *ip); Loading Loading @@ -389,8 +388,7 @@ purge_expired_resolves(time_t now) * <b>conn</b>'s attached circuit. */ static void send_resolved_cell(edge_connection_t *conn, or_circuit_t *circ, uint8_t answer_type) send_resolved_cell(edge_connection_t *conn, uint8_t answer_type) { char buf[RELAY_PAYLOAD_SIZE]; size_t buflen; Loading Loading @@ -425,14 +423,7 @@ send_resolved_cell(edge_connection_t *conn, or_circuit_t *circ, } // log_notice(LD_EXIT, "Sending a regular RESOLVED reply: "); if (!circ) { circuit_t *tmp = circuit_get_by_edge_conn(conn); if (! CIRCUIT_IS_ORIGIN(tmp)) circ = TO_OR_CIRCUIT(tmp); } connection_edge_send_command(conn, TO_CIRCUIT(circ), RELAY_COMMAND_RESOLVED, buf, buflen); connection_edge_send_command(conn, RELAY_COMMAND_RESOLVED, buf, buflen); } /** Send a response to the RESOLVE request of a connection for an in-addr.arpa Loading @@ -444,8 +435,7 @@ send_resolved_cell(edge_connection_t *conn, or_circuit_t *circ, * <b>conn</b>'s attached circuit. */ static void send_resolved_hostname_cell(edge_connection_t *conn, or_circuit_t *circ, const char *hostname) send_resolved_hostname_cell(edge_connection_t *conn, const char *hostname) { char buf[RELAY_PAYLOAD_SIZE]; size_t buflen; Loading @@ -462,15 +452,8 @@ send_resolved_hostname_cell(edge_connection_t *conn, or_circuit_t *circ, set_uint32(buf+2+namelen, htonl(ttl)); buflen = 2+namelen+4; if (!circ) { circuit_t *tmp = circuit_get_by_edge_conn(conn); if (! CIRCUIT_IS_ORIGIN(tmp)) circ = TO_OR_CIRCUIT(tmp); } // log_notice(LD_EXIT, "Sending a reply RESOLVED reply: %s", hostname); connection_edge_send_command(conn, TO_CIRCUIT(circ), RELAY_COMMAND_RESOLVED, buf, buflen); connection_edge_send_command(conn, RELAY_COMMAND_RESOLVED, buf, buflen); // log_notice(LD_EXIT, "Sent"); } Loading Loading @@ -525,9 +508,8 @@ parse_inaddr_arpa_address(const char *address, struct in_addr *in) * need to send back an END cell, since connection_exit_begin_conn will * do that for us.) * * If <b>oncirc</b> is provided, and this is a resolve request, we have * a cached answer, send the answer back along oncirc; otherwise, send * the answer back along <b>exitconn</b>'s attached circuit. * If we have a cached answer, send the answer back along <b>exitconn</b>'s * attached circuit. * * Else, if seen before and pending, add conn to the pending list, * and return 0. Loading @@ -536,18 +518,17 @@ parse_inaddr_arpa_address(const char *address, struct in_addr *in) * dns farm, and return 0. */ int dns_resolve(edge_connection_t *exitconn, or_circuit_t *oncirc) dns_resolve(edge_connection_t *exitconn) { cached_resolve_t *resolve; cached_resolve_t search; pending_connection_t *pending_connection; circuit_t *circ; struct in_addr in; time_t now = time(NULL); int is_reverse = 0, is_resolve, r; or_circuit_t *oncirc = TO_OR_CIRCUIT(exitconn->on_circuit); assert_connection_ok(TO_CONN(exitconn), 0); tor_assert(exitconn->_base.s == -1); assert_cache_ok(); is_resolve = exitconn->_base.purpose == EXIT_PURPOSE_RESOLVE; Loading @@ -558,7 +539,7 @@ dns_resolve(edge_connection_t *exitconn, or_circuit_t *oncirc) exitconn->_base.addr = ntohl(in.s_addr); exitconn->address_ttl = DEFAULT_DNS_TTL; if (is_resolve) send_resolved_cell(exitconn, oncirc, RESOLVED_TYPE_IPV4); send_resolved_cell(exitconn, RESOLVED_TYPE_IPV4); return 1; } if (address_is_invalid_destination(exitconn->_base.address, 0)) { Loading @@ -566,10 +547,8 @@ dns_resolve(edge_connection_t *exitconn, or_circuit_t *oncirc) "Rejecting invalid destination address %s", escaped_safe_str(exitconn->_base.address)); if (is_resolve) send_resolved_cell(exitconn, oncirc, RESOLVED_TYPE_ERROR); circ = circuit_get_by_edge_conn(exitconn); if (circ) circuit_detach_stream(circ, exitconn); send_resolved_cell(exitconn, RESOLVED_TYPE_ERROR); circuit_detach_stream(TO_CIRCUIT(oncirc), exitconn); if (!exitconn->_base.marked_for_close) connection_free(TO_CONN(exitconn)); return -1; Loading Loading @@ -601,10 +580,8 @@ dns_resolve(edge_connection_t *exitconn, or_circuit_t *oncirc) escaped_safe_str(exitconn->_base.address)); if (exitconn->_base.purpose == EXIT_PURPOSE_RESOLVE) send_resolved_cell(exitconn, oncirc, RESOLVED_TYPE_ERROR); circ = circuit_get_by_edge_conn(exitconn); if (circ) circuit_detach_stream(circ, exitconn); send_resolved_cell(exitconn, RESOLVED_TYPE_ERROR); circuit_detach_stream(TO_CIRCUIT(oncirc), exitconn); if (!exitconn->_base.marked_for_close) connection_free(TO_CONN(exitconn)); return -1; Loading Loading @@ -637,12 +614,12 @@ dns_resolve(edge_connection_t *exitconn, or_circuit_t *oncirc) exitconn->address_ttl = resolve->ttl; if (resolve->is_reverse) { tor_assert(is_resolve); send_resolved_hostname_cell(exitconn, oncirc, send_resolved_hostname_cell(exitconn, resolve->result.hostname); } else { exitconn->_base.addr = resolve->result.addr; if (is_resolve) send_resolved_cell(exitconn, oncirc, RESOLVED_TYPE_IPV4); send_resolved_cell(exitconn, RESOLVED_TYPE_IPV4); } return 1; case CACHE_STATE_CACHED_FAILED: Loading @@ -650,10 +627,8 @@ dns_resolve(edge_connection_t *exitconn, or_circuit_t *oncirc) exitconn->_base.s, escaped_safe_str(exitconn->_base.address)); if (is_resolve) send_resolved_cell(exitconn, oncirc, RESOLVED_TYPE_ERROR); circ = circuit_get_by_edge_conn(exitconn); if (circ) circuit_detach_stream(circ, exitconn); send_resolved_cell(exitconn, RESOLVED_TYPE_ERROR); circuit_detach_stream(TO_CIRCUIT(oncirc), exitconn); if (!exitconn->_base.marked_for_close) connection_free(TO_CONN(exitconn)); return -1; Loading Loading @@ -683,7 +658,7 @@ dns_resolve(edge_connection_t *exitconn, or_circuit_t *oncirc) log_debug(LD_EXIT,"Launching %s.", escaped_safe_str(exitconn->_base.address)); assert_cache_ok(); return launch_resolve(exitconn, oncirc); return launch_resolve(exitconn); } /** Log an error and abort if conn is waiting for a DNS resolve. Loading Loading @@ -953,7 +928,7 @@ dns_found_answer(const char *address, int is_reverse, uint32_t addr, /* This detach must happen after we send the end cell. */ circuit_detach_stream(circuit_get_by_edge_conn(pendconn), pendconn); } else { send_resolved_cell(pendconn, NULL, RESOLVED_TYPE_ERROR); send_resolved_cell(pendconn, RESOLVED_TYPE_ERROR); /* This detach must happen after we send the resolved cell. */ circuit_detach_stream(circuit_get_by_edge_conn(pendconn), pendconn); } Loading @@ -980,9 +955,9 @@ dns_found_answer(const char *address, int is_reverse, uint32_t addr, * but it does the right thing. */ pendconn->_base.state = EXIT_CONN_STATE_RESOLVEFAILED; if (is_reverse) send_resolved_hostname_cell(pendconn, NULL, hostname); send_resolved_hostname_cell(pendconn, hostname); else send_resolved_cell(pendconn, NULL, RESOLVED_TYPE_IPV4); send_resolved_cell(pendconn, RESOLVED_TYPE_IPV4); circ = circuit_get_by_edge_conn(pendconn); tor_assert(circ); circuit_detach_stream(circ, pendconn); Loading Loading @@ -1187,7 +1162,7 @@ evdns_callback(int result, char type, int count, int ttl, void *addresses, /** For eventdns: start resolving as necessary to find the target for * <b>exitconn</b> */ static int launch_resolve(edge_connection_t *exitconn, or_circuit_t *circ) launch_resolve(edge_connection_t *exitconn) { char *addr = tor_strdup(exitconn->_base.address); struct in_addr in; Loading Loading @@ -1222,10 +1197,10 @@ launch_resolve(edge_connection_t *exitconn, or_circuit_t *circ) escaped_safe_str(addr), r); if (exitconn->_base.purpose == EXIT_PURPOSE_RESOLVE) { if (evdns_err_is_transient(r)) send_resolved_cell(exitconn, circ, RESOLVED_TYPE_ERROR_TRANSIENT); send_resolved_cell(exitconn, RESOLVED_TYPE_ERROR_TRANSIENT); else { exitconn->address_ttl = DEFAULT_DNS_TTL; send_resolved_cell(exitconn, circ, RESOLVED_TYPE_ERROR); send_resolved_cell(exitconn, RESOLVED_TYPE_ERROR); } } dns_cancel_pending_resolve(addr); /* also sends end and frees */ Loading
src/or/or.h +4 −6 Original line number Diff line number Diff line Loading @@ -2195,10 +2195,8 @@ int connection_edge_end_errno(edge_connection_t *conn); int connection_edge_finished_flushing(edge_connection_t *conn); int connection_edge_finished_connecting(edge_connection_t *conn); int connection_ap_handshake_send_begin(edge_connection_t *ap_conn, origin_circuit_t *circ); int connection_ap_handshake_send_resolve(edge_connection_t *ap_conn, origin_circuit_t *circ); int connection_ap_handshake_send_begin(edge_connection_t *ap_conn); int connection_ap_handshake_send_resolve(edge_connection_t *ap_conn); int connection_ap_make_bridge(char *address, uint16_t port, const char *digest, int command); Loading Loading @@ -2477,7 +2475,7 @@ void connection_dns_remove(edge_connection_t *conn); void assert_connection_edge_not_dns_pending(edge_connection_t *conn); void assert_all_pending_dns_resolves_ok(void); void dns_cancel_pending_resolve(const char *question); int dns_resolve(edge_connection_t *exitconn, or_circuit_t *circ); int dns_resolve(edge_connection_t *exitconn); void dns_launch_correctness_checks(void); int dns_seems_to_be_broken(void); void dns_reset_correctness_checks(void); Loading Loading @@ -2619,7 +2617,7 @@ void relay_header_unpack(relay_header_t *dest, const char *src); int relay_send_command_from_edge(uint16_t stream_id, circuit_t *circ, int relay_command, const char *payload, size_t payload_len, crypt_path_t *cpath_layer); int connection_edge_send_command(edge_connection_t *fromconn, circuit_t *circ, int connection_edge_send_command(edge_connection_t *fromconn, int relay_command, const char *payload, size_t payload_len); int connection_edge_package_raw_inbuf(edge_connection_t *conn, Loading