mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-24 12:23:32 +01:00
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:
parent
46ffc5984d
commit
bab6c0a332
@ -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. */
|
||||||
|
if (tmpe->msk == 0) {
|
||||||
match = 1;
|
match = 1;
|
||||||
} else if (port >= tmpe->prt_min && port <= tmpe->prt_max) {
|
|
||||||
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'",
|
||||||
|
Loading…
Reference in New Issue
Block a user