diff options
-rw-r--r-- | src/or/connection_edge.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c index 31bc9ba351..01b4810b0d 100644 --- a/src/or/connection_edge.c +++ b/src/or/connection_edge.c @@ -354,6 +354,7 @@ static int connection_ap_handshake_process_socks(connection_t *conn) { socks_request_t *socks; int sockshere; hostname_type_t addresstype; + routerinfo_t *router; tor_assert(conn); tor_assert(conn->type == CONN_TYPE_AP); @@ -411,16 +412,16 @@ static int connection_ap_handshake_process_socks(connection_t *conn) { log_fn(LOG_WARN,"Malformed address '%s.exit'. Refusing.", socks->address); return -1; } - if (strlen(s+1) == HEX_DIGEST_LEN) { - conn->chosen_exit_name = tor_malloc(HEX_DIGEST_LEN+2); - *(conn->chosen_exit_name) = '$'; - strlcpy(conn->chosen_exit_name+1, s+1, HEX_DIGEST_LEN+1); - } else { - conn->chosen_exit_name = tor_strdup(s+1); - } + conn->chosen_exit_name = tor_strdup(s+1); *s = 0; - if (!is_legal_nickname_or_hexdigest(conn->chosen_exit_name)) { - log_fn(LOG_WARN, "%s is not a legal exit node nickname; rejecting.", + router = router_get_by_nickname(conn->chosen_exit_name); + if(!router) { + log_fn(LOG_WARN,"Requested exit point '%s' is not known. Closing.", + conn->chosen_exit_name); + return -1; + } + if (!connection_ap_can_use_exit(conn, router)) { + log_fn(LOG_WARN, "Requested exit point '%s' would refuse request. Closing.", conn->chosen_exit_name); return -1; } |