summaryrefslogtreecommitdiff
path: root/src/or/router.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2012-05-10 17:27:16 -0400
committerRoger Dingledine <arma@torproject.org>2012-05-10 17:41:31 -0400
commit02a650786b21e4f3c255d686a3b5df875b2d66b5 (patch)
treea313aa8848622dfa7fcb3bdd6fc7630002b48ae5 /src/or/router.c
parent62f8e3926d62ff4aaefedfe89355f04f3a8d74fa (diff)
downloadtor-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.c3
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 "