diff options
author | Nick Mathewson <nickm@torproject.org> | 2012-05-10 17:27:16 -0400 |
---|---|---|
committer | Roger Dingledine <arma@torproject.org> | 2012-05-10 17:41:31 -0400 |
commit | 02a650786b21e4f3c255d686a3b5df875b2d66b5 (patch) | |
tree | a313aa8848622dfa7fcb3bdd6fc7630002b48ae5 /src/or/routerparse.c | |
parent | 62f8e3926d62ff4aaefedfe89355f04f3a8d74fa (diff) | |
download | tor-02a650786b21e4f3c255d686a3b5df875b2d66b5.tar.gz tor-02a650786b21e4f3c255d686a3b5df875b2d66b5.zip |
Fix O(n^2) performance when parsing a big pile of extrainfos
We were doing an O(n) strlen in router_get_extrainfo_hash() for
every one we tried to parse. Instead, have
router_get_extrainfo_hash() take the length of the extrainfo as an
argument, so that when it's called from
extrainfo_parse_from_string(), it doesn't do a strlen() over the
whole pile of extrainfos.
Diffstat (limited to 'src/or/routerparse.c')
-rw-r--r-- | src/or/routerparse.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/src/or/routerparse.c b/src/or/routerparse.c index c5ce174911..781c57897d 100644 --- a/src/or/routerparse.c +++ b/src/or/routerparse.c @@ -682,12 +682,12 @@ router_get_networkstatus_v3_hash(const char *s, char *digest, ' ', alg); } -/** Set <b>digest</b> to the SHA-1 digest of the hash of the extrainfo - * string in <b>s</b>. Return 0 on success, -1 on failure. */ +/** Set <b>digest</b> to the SHA-1 digest of the hash of the <b>s_len</b>-byte + * extrainfo string at <b>s</b>. Return 0 on success, -1 on failure. */ int -router_get_extrainfo_hash(const char *s, char *digest) +router_get_extrainfo_hash(const char *s, size_t s_len, char *digest) { - return router_get_hash_impl(s, strlen(s), digest, "extra-info", + return router_get_hash_impl(s, s_len, digest, "extra-info", "\nrouter-signature",'\n', DIGEST_SHA1); } @@ -1643,7 +1643,7 @@ extrainfo_parse_entry_from_string(const char *s, const char *end, while (end > s+2 && *(end-1) == '\n' && *(end-2) == '\n') --end; - if (router_get_extrainfo_hash(s, digest) < 0) { + if (router_get_extrainfo_hash(s, end-s, digest) < 0) { log_warn(LD_DIR, "Couldn't compute router hash."); goto err; } |