Loading src/or/connection_edge.c +23 −5 Changes for src/or/connection_edge.c: 23 added lines, 5 removed lines. Original line number Diff line number Diff line Loading @@ -912,16 +912,34 @@ static int connection_ap_handshake_process_socks(connection_t *conn) { addresstype = parse_extended_hostname(socks->address); if (addresstype == EXIT_HOSTNAME) { /* .exit -- modify conn to specify the exit node. */ /* foo.exit -- modify conn->chosen_exit_node to specify the exit * node, and conn->address to hold only the address portion.*/ char *s = strrchr(socks->address,'.'); if (!s || s[1] == '\0') { log_fn(LOG_WARN,"Malformed exit address '%s'. Refusing.", if (s && s[1] != '\0') { conn->chosen_exit_name = tor_strdup(s+1); *s = 0; } else if (s[1] == '\0') { log_fn(LOG_WARN,"Malformed exit address '%s.exit'. Refusing.", safe_str(socks->address)); connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL); return -1; } else { tor_assert(!s); /* address is of the form server.exit. */ struct in_addr in; routerinfo_t *r = router_get_by_nickname(socks->address); if (r) { conn->chosen_exit_name = tor_strdup(socks->address); /* XXXX Should this use server->address instead? */ in.s_addr = htonl(r->addr); strlcpy(socks->address, inet_ntoa(in), sizeof(socks->address)); } else { log_fn(LOG_WARN, "Unrecognized server in exit address '%s.exit'. Refusing.", safe_str(socks->address)); connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL); return -1; } conn->chosen_exit_name = tor_strdup(s+1); *s = 0; } } if (addresstype != ONION_HOSTNAME) { Loading Loading
src/or/connection_edge.c +23 −5 Changes for src/or/connection_edge.c: 23 added lines, 5 removed lines. Original line number Diff line number Diff line Loading @@ -912,16 +912,34 @@ static int connection_ap_handshake_process_socks(connection_t *conn) { addresstype = parse_extended_hostname(socks->address); if (addresstype == EXIT_HOSTNAME) { /* .exit -- modify conn to specify the exit node. */ /* foo.exit -- modify conn->chosen_exit_node to specify the exit * node, and conn->address to hold only the address portion.*/ char *s = strrchr(socks->address,'.'); if (!s || s[1] == '\0') { log_fn(LOG_WARN,"Malformed exit address '%s'. Refusing.", if (s && s[1] != '\0') { conn->chosen_exit_name = tor_strdup(s+1); *s = 0; } else if (s[1] == '\0') { log_fn(LOG_WARN,"Malformed exit address '%s.exit'. Refusing.", safe_str(socks->address)); connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL); return -1; } else { tor_assert(!s); /* address is of the form server.exit. */ struct in_addr in; routerinfo_t *r = router_get_by_nickname(socks->address); if (r) { conn->chosen_exit_name = tor_strdup(socks->address); /* XXXX Should this use server->address instead? */ in.s_addr = htonl(r->addr); strlcpy(socks->address, inet_ntoa(in), sizeof(socks->address)); } else { log_fn(LOG_WARN, "Unrecognized server in exit address '%s.exit'. Refusing.", safe_str(socks->address)); connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL); return -1; } conn->chosen_exit_name = tor_strdup(s+1); *s = 0; } } if (addresstype != ONION_HOSTNAME) { Loading