diff options
author | Nick Mathewson <nickm@torproject.org> | 2007-09-18 15:38:00 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2007-09-18 15:38:00 +0000 |
commit | eee8d750b6a78d389453a2813bf77f94b94d2871 (patch) | |
tree | 92480068b513b5e4f5ea1a4889ced0ee08aac2c9 | |
parent | 8f75defd337961f221c939f3914c96b3b683e4cf (diff) | |
download | tor-eee8d750b6a78d389453a2813bf77f94b94d2871.tar tor-eee8d750b6a78d389453a2813bf77f94b94d2871.tar.gz |
r15140@catbus: nickm | 2007-09-18 11:34:54 -0400
Get rid of a needless malloc() when parsing address policies. Original patch from "Some guy on #tor", via arma. Altered to have a sufficiently large buffer, and not use the buffer so much, and to save a strlcpy.
svn:r11480
-rw-r--r-- | ChangeLog | 1 | ||||
-rw-r--r-- | doc/TODO | 2 | ||||
-rw-r--r-- | src/or/routerparse.c | 38 |
3 files changed, 19 insertions, 22 deletions
@@ -53,6 +53,7 @@ Changes in version 0.2.0.7-alpha - 2007-??-?? - Turn "descriptor store" into a full-fledged type. - Move all NT services code into a separate source file. - Unify all code that computes medians, percentile elements, etc. + - Get rid of a needless malloc when parsing address policies. Changes in version 0.1.2.17 - 2007-08-30 @@ -59,7 +59,7 @@ Things we'd like to do in 0.2.0.x: o Detect whether votes are really all for the same period. . Push/pull documents as appropriate. - Pull votes and signatures if we don't get them. - - Cache votes and signatures on disk. + - Cache votes and signatures on disk? o Code to keep consensus docs in limbo if they don't have have enough signatures. o Have clients know which authorities are v3 authorities, and what diff --git a/src/or/routerparse.c b/src/or/routerparse.c index 29d9fddf2..032b97f8c 100644 --- a/src/or/routerparse.c +++ b/src/or/routerparse.c @@ -2232,29 +2232,26 @@ addr_policy_t * router_parse_addr_policy_from_string(const char *s, int assume_action) { directory_token_t *tok = NULL; - const char *cp; - char *tmp = NULL; + const char *cp, *eos; + /* Longest possible policy is "accept ffff:ffff:..255/ffff:...255:0-65535". + * But note that there can be an arbitrary amount of space between the + * accept and the address:mask/port element. */ + char line[TOR_ADDR_BUF_LEN*2 + 32]; addr_policy_t *r; - size_t len, idx; - const char *eos; - /* *s might not end with \n, so we need to extend it with one. */ - len = strlen(s); - cp = tmp = tor_malloc(len+2); - for (idx = 0; idx < len; ++idx) { - tmp[idx] = TOR_TOLOWER(s[idx]); - } - tmp[len]='\n'; - tmp[len+1]='\0'; - while (TOR_ISSPACE(*cp)) - ++cp; - if ((*cp == '*' || TOR_ISDIGIT(*cp)) && assume_action >= 0) { - char *new_str = tor_malloc(len+10); - tor_snprintf(new_str, len+10, "%s %s\n", - assume_action == ADDR_POLICY_ACCEPT?"accept":"reject", cp); - tor_free(tmp); - cp = tmp = new_str; + s = eat_whitespace(s); + if ((*s == '*' || TOR_ISDIGIT(*s)) && assume_action >= 0) { + if (tor_snprintf(line, sizeof(line), "%s %s", + assume_action == ADDR_POLICY_ACCEPT?"accept":"reject", s)<0) { + log_warn(LD_DIR, "Policy %s is too long.", escaped(s)); + return NULL; + } + cp = line; + } else { /* assume an already well-formed address policy line */ + cp = s; } + tor_strlower(line); + eos = cp + strlen(cp); tok = get_next_token(&cp, eos, routerdesc_token_table); if (tok->tp == _ERR) { @@ -2272,7 +2269,6 @@ router_parse_addr_policy_from_string(const char *s, int assume_action) err: r = NULL; done: - tor_free(tmp); token_free(tok); return r; } |