Fix the Big Bug in router_compare_addr_to_exit_policy: we used port 0

to mean "unknown port".  But no exit policy supports (nonexistant)
port 0, except accept *:*, and we had no special handling for 'unknown port'.

Now we do.


svn:r1098
This commit is contained in:
Nick Mathewson 2004-02-17 08:52:03 +00:00
parent 46ffc5984d
commit bab6c0a332

View File

@ -404,24 +404,25 @@ int router_compare_addr_to_exit_policy(uint32_t addr, uint16_t port,
int maybe_reject = 0; int maybe_reject = 0;
int maybe_accept = 0; int maybe_accept = 0;
int match = 0; int match = 0;
int maybe = 0;
struct in_addr in; struct in_addr in;
struct exit_policy_t *tmpe; struct exit_policy_t *tmpe;
for(tmpe=policy; tmpe; tmpe=tmpe->next) { for(tmpe=policy; tmpe; tmpe=tmpe->next) {
log_fn(LOG_DEBUG,"Considering exit policy %s", tmpe->string); log_fn(LOG_DEBUG,"Considering exit policy %s", tmpe->string);
maybe = 0;
if (!addr) { if (!addr) {
/* Address is unknown. */ /* Address is unknown. */
if (tmpe->msk == 0 && (port >= tmpe->prt_min && port <= tmpe->prt_max)) { if (port >= tmpe->prt_min && port <= tmpe->prt_max) {
/* The exit policy is accept/reject *:port */ /* The port definitely matches. */
match = 1; if (tmpe->msk == 0) {
} else if (port >= tmpe->prt_min && port <= tmpe->prt_max) { match = 1;
if (tmpe->policy_type == EXIT_POLICY_REJECT) {
/* The exit policy is reject ???:port */
maybe_reject = 1;
} else { } else {
/* The exit policy is accept ???:port */ maybe = 1;
maybe_accept = 1;
} }
} else if (!port) {
/* The port maybe matches. */
maybe = 1;
} }
} else { } else {
/* Address is known */ /* Address is known */
@ -431,6 +432,12 @@ int router_compare_addr_to_exit_policy(uint32_t addr, uint16_t port,
match = 1; match = 1;
} }
} }
if (maybe) {
if (tmpe->policy_type == EXIT_POLICY_REJECT)
maybe_reject = 1;
else
maybe_accept = 1;
}
if (match) { if (match) {
in.s_addr = htonl(addr); in.s_addr = htonl(addr);
log_fn(LOG_INFO,"Address %s:%d matches exit policy '%s'", log_fn(LOG_INFO,"Address %s:%d matches exit policy '%s'",