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/router.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/router.c')
-rw-r--r-- | src/or/router.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/src/or/router.c b/src/or/router.c index c51bb5dc4d..35955f3ee0 100644 --- a/src/or/router.c +++ b/src/or/router.c @@ -1655,6 +1655,7 @@ router_rebuild_descriptor(int force) ei->cache_info.signed_descriptor_len = strlen(ei->cache_info.signed_descriptor_body); router_get_extrainfo_hash(ei->cache_info.signed_descriptor_body, + ei->cache_info.signed_descriptor_len, ei->cache_info.signed_descriptor_digest); } @@ -2359,7 +2360,7 @@ extrainfo_dump_to_string(char **s_out, extrainfo_t *extrainfo, } memset(sig, 0, sizeof(sig)); - if (router_get_extrainfo_hash(s, digest) < 0 || + if (router_get_extrainfo_hash(s, strlen(s), digest) < 0 || router_append_dirobj_signature(sig, sizeof(sig), digest, DIGEST_LEN, ident_key) < 0) { log_warn(LD_BUG, "Could not append signature to extra-info " |