aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2007-09-18 15:38:00 +0000
committerNick Mathewson <nickm@torproject.org>2007-09-18 15:38:00 +0000
commiteee8d750b6a78d389453a2813bf77f94b94d2871 (patch)
tree92480068b513b5e4f5ea1a4889ced0ee08aac2c9 /src
parent8f75defd337961f221c939f3914c96b3b683e4cf (diff)
downloadtor-eee8d750b6a78d389453a2813bf77f94b94d2871.tar.gz
tor-eee8d750b6a78d389453a2813bf77f94b94d2871.zip
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
Diffstat (limited to 'src')
-rw-r--r--src/or/routerparse.c38
1 files changed, 17 insertions, 21 deletions
diff --git a/src/or/routerparse.c b/src/or/routerparse.c
index 29d9fddf2b..032b97f8c3 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;
}