diff options
Diffstat (limited to 'src/or')
-rw-r--r-- | src/or/config.c | 13 | ||||
-rw-r--r-- | src/or/connection_edge.c | 12 | ||||
-rw-r--r-- | src/or/or.h | 1 |
3 files changed, 17 insertions, 9 deletions
diff --git a/src/or/config.c b/src/or/config.c index f50bd42f9..0e475db5e 100644 --- a/src/or/config.c +++ b/src/or/config.c @@ -1106,10 +1106,15 @@ static int parse_redirect_line(or_options_t *options, log_fn(LOG_WARN, "Error parsing source address in RedirectExit line"); goto err; } - if (parse_addr_port(smartlist_get(elements,1),NULL,&r->addr_dest, - &r->port_dest)) { - log_fn(LOG_WARN, "Error parseing dest address in RedirectExit line"); - goto err; + if (0==strcasecmp(smartlist_get(elements,1), "pass")) { + r->is_redirect = 0; + } else { + if (parse_addr_port(smartlist_get(elements,1),NULL,&r->addr_dest, + &r->port_dest)) { + log_fn(LOG_WARN, "Error parseing dest address in RedirectExit line"); + goto err; + } + r->is_redirect = 1; } goto done; diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c index 0fba0ae24..6ff223bce 100644 --- a/src/or/connection_edge.c +++ b/src/or/connection_edge.c @@ -901,11 +901,13 @@ void connection_exit_connect(connection_t *conn) { if ((addr&r->mask)==(r->addr&r->mask) && (r->port_min <= port) && (port <= r->port_max)) { struct in_addr in; - addr = r->addr_dest; - port = r->port_dest; - in.s_addr = htonl(addr); - log_fn(LOG_DEBUG, "Redirecting connection from %s:%d to %s:%d", - conn->address, conn->port, inet_ntoa(in), port); + if (r->is_redirect) { + addr = r->addr_dest; + port = r->port_dest; + in.s_addr = htonl(addr); + log_fn(LOG_DEBUG, "Redirecting connection from %s:%d to %s:%d", + conn->address, conn->port, inet_ntoa(in), port); + } break; } }); diff --git a/src/or/or.h b/src/or/or.h index 65fea556a..196a1dc9a 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -824,6 +824,7 @@ typedef struct exit_redirect_t { uint16_t port_min; uint16_t port_max; + int is_redirect; uint32_t addr_dest; uint16_t port_dest; } exit_redirect_t; |