diff options
author | Nick Mathewson <nickm@torproject.org> | 2004-10-16 21:42:09 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2004-10-16 21:42:09 +0000 |
commit | 8300c4ae6a0d55c40d94613b5e22cb25b5723bd1 (patch) | |
tree | e5456446b8a343b3d7ba67a829b54b2ce0524e87 /src/or/routerparse.c | |
parent | 69d7b468b47da6984a486f6ddd013ff729c18970 (diff) | |
download | tor-8300c4ae6a0d55c40d94613b5e22cb25b5723bd1.tar.gz tor-8300c4ae6a0d55c40d94613b5e22cb25b5723bd1.zip |
Make unit tests pass; refactor most of exit policy parfsing out into new function
svn:r2541
Diffstat (limited to 'src/or/routerparse.c')
-rw-r--r-- | src/or/routerparse.c | 85 |
1 files changed, 9 insertions, 76 deletions
diff --git a/src/or/routerparse.c b/src/or/routerparse.c index dd858f8faf..4469656b1a 100644 --- a/src/or/routerparse.c +++ b/src/or/routerparse.c @@ -387,10 +387,11 @@ router_parse_routerlist_from_directory(const char *str, log_fn(LOG_WARN, "Missing recommended-software line from directory."); goto err; } - if (tok->n_args != 1) { - log_fn(LOG_WARN, "Invalid recommended-software line"); goto err; + if (tok->n_args > 1) { + log_fn(LOG_WARN, "Invalid recommended-software line", tok->n_args);goto err; + } - versions = tor_strdup(tok->args[0]); + versions = tor->n_args ? tor_strdup(tok->args[0]) : tor_strdup(""); if (!(tok = find_first_by_keyword(tokens, K_RUNNING_ROUTERS))) { log_fn(LOG_WARN, "Missing running-routers line from directory."); @@ -1016,10 +1017,9 @@ static int router_add_exit_policy(routerinfo_t *router,directory_token_t *tok) static struct exit_policy_t * router_parse_exit_policy(directory_token_t *tok) { - struct exit_policy_t*newe; + struct exit_policy_t *newe; struct in_addr in; - char *arg, *address, *mask, *port, *endptr; - int bits; + char *arg, *address; tor_assert(tok->tp == K_REJECT || tok->tp == K_ACCEPT); @@ -1039,77 +1039,10 @@ router_parse_exit_policy(directory_token_t *tok) { } strcat(newe->string, arg); /* can't overflow */ - address = arg; - mask = strchr(arg,'/'); - port = strchr(mask?mask:arg,':'); - /* Break 'arg' into separate strings. 'arg' was already strdup'd by - * _router_get_next_token, so it's safe to modify. - */ - if (mask) - *mask++ = 0; - if (port) - *port++ = 0; - - if (strcmp(address, "*") == 0) { - newe->addr = 0; - } else if (tor_inet_aton(address, &in) != 0) { - newe->addr = ntohl(in.s_addr); - } else { - log_fn(LOG_WARN, "Malformed IP %s in exit policy; rejecting.", - address); + if (parse_addr_and_port_range(arg, &newe->addr, &newe->msk, + &newe->prt_min, &newe->prt_max)) goto policy_read_failed; - } - if (!mask) { - if (strcmp(address, "*") == 0) - newe->msk = 0; - else - newe->msk = 0xFFFFFFFFu; - } else { - endptr = NULL; - bits = (int) strtol(mask, &endptr, 10); - if (!*endptr) { - /* strtol handled the whole mask. */ - if (bits < 0 || bits > 32) { - log_fn(LOG_WARN, "Bad number of mask bits on exit policy; rejecting."); - goto policy_read_failed; - } - newe->msk = ~((1<<(32-bits))-1); - } else if (tor_inet_aton(mask, &in) != 0) { - newe->msk = ntohl(in.s_addr); - } else { - log_fn(LOG_WARN, "Malformed mask %s on exit policy; rejecting.", - mask); - goto policy_read_failed; - } - } - if (!port || strcmp(port, "*") == 0) { - newe->prt_min = 0; - newe->prt_max = 65535; - } else { - endptr = NULL; - newe->prt_min = (uint16_t) tor_parse_long(port, 10, 1, 65535, - NULL, &endptr); - if (*endptr == '-') { - port = endptr+1; - endptr = NULL; - newe->prt_max = (uint16_t) tor_parse_long(port, 10, 1, 65535, NULL, - &endptr); - if (*endptr || !newe->prt_max) { - log_fn(LOG_WARN, "Malformed port %s on exit policy; rejecting.", - port); - } - } else if (*endptr || !newe->prt_min) { - log_fn(LOG_WARN, "Malformed port %s on exit policy; rejecting.", - port); - goto policy_read_failed; - } else { - newe->prt_max = newe->prt_min; - } - if (newe->prt_min > newe->prt_max) { - log_fn(LOG_WARN,"Insane port range on exit policy; rejecting."); - goto policy_read_failed; - } - } + in.s_addr = htonl(newe->addr); address = tor_strdup(inet_ntoa(in)); |