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
This commit is contained in:
Nick Mathewson 2007-09-18 15:38:00 +00:00
parent 8f75defd33
commit eee8d750b6
3 changed files with 19 additions and 22 deletions

View File

@ -53,6 +53,7 @@ Changes in version 0.2.0.7-alpha - 2007-??-??
- Turn "descriptor store" into a full-fledged type. - Turn "descriptor store" into a full-fledged type.
- Move all NT services code into a separate source file. - Move all NT services code into a separate source file.
- Unify all code that computes medians, percentile elements, etc. - 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 Changes in version 0.1.2.17 - 2007-08-30

View File

@ -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. o Detect whether votes are really all for the same period.
. Push/pull documents as appropriate. . Push/pull documents as appropriate.
- Pull votes and signatures if we don't get them. - 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 o Code to keep consensus docs in limbo if they don't have
have enough signatures. have enough signatures.
o Have clients know which authorities are v3 authorities, and what o Have clients know which authorities are v3 authorities, and what

View File

@ -2232,29 +2232,26 @@ addr_policy_t *
router_parse_addr_policy_from_string(const char *s, int assume_action) router_parse_addr_policy_from_string(const char *s, int assume_action)
{ {
directory_token_t *tok = NULL; directory_token_t *tok = NULL;
const char *cp; const char *cp, *eos;
char *tmp = NULL; /* 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; 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. */ s = eat_whitespace(s);
len = strlen(s); if ((*s == '*' || TOR_ISDIGIT(*s)) && assume_action >= 0) {
cp = tmp = tor_malloc(len+2); if (tor_snprintf(line, sizeof(line), "%s %s",
for (idx = 0; idx < len; ++idx) { assume_action == ADDR_POLICY_ACCEPT?"accept":"reject", s)<0) {
tmp[idx] = TOR_TOLOWER(s[idx]); log_warn(LD_DIR, "Policy %s is too long.", escaped(s));
} return NULL;
tmp[len]='\n'; }
tmp[len+1]='\0'; cp = line;
while (TOR_ISSPACE(*cp)) } else { /* assume an already well-formed address policy line */
++cp; cp = s;
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;
} }
tor_strlower(line);
eos = cp + strlen(cp); eos = cp + strlen(cp);
tok = get_next_token(&cp, eos, routerdesc_token_table); tok = get_next_token(&cp, eos, routerdesc_token_table);
if (tok->tp == _ERR) { if (tok->tp == _ERR) {
@ -2272,7 +2269,6 @@ router_parse_addr_policy_from_string(const char *s, int assume_action)
err: err:
r = NULL; r = NULL;
done: done:
tor_free(tmp);
token_free(tok); token_free(tok);
return r; return r;
} }