diff options
author | Nick Mathewson <nickm@torproject.org> | 2009-05-17 02:01:09 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2009-05-17 02:01:09 -0400 |
commit | c0515b307c4c60d4a17158e47db1033540019b28 (patch) | |
tree | 300e57416f48f5073e91531de45ef39c22ead0c5 /src/or | |
parent | 11b9c839f0c04c943a1e5f587dafb704e068b1aa (diff) | |
download | tor-c0515b307c4c60d4a17158e47db1033540019b28.tar.gz tor-c0515b307c4c60d4a17158e47db1033540019b28.zip |
Fix valgrind error when marking a descriptor as never-downloadable.
When we got a descriptor that we (as an authority) rejected as totally
bad, we were freeing it, then using the digest in its RAM to look up its
download status. Caught by arma with valgrind. Bugfix on 0.2.1.9-alpha.
Diffstat (limited to 'src/or')
-rw-r--r-- | src/or/routerlist.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/src/or/routerlist.c b/src/or/routerlist.c index c6bfca4546..de38e354e0 100644 --- a/src/or/routerlist.c +++ b/src/or/routerlist.c @@ -3513,6 +3513,7 @@ router_load_routers_from_string(const char *s, const char *eos, SMARTLIST_FOREACH_BEGIN(routers, routerinfo_t *, ri) { was_router_added_t r; + char d[DIGEST_LEN]; if (requested_fingerprints) { base16_encode(fp, sizeof(fp), descriptor_digests ? ri->cache_info.signed_descriptor_digest : @@ -3533,6 +3534,7 @@ router_load_routers_from_string(const char *s, const char *eos, } } + memcpy(d, ri->cache_info.signed_descriptor_digest, DIGEST_LEN); r = router_add_to_routerlist(ri, &msg, from_cache, !from_cache); if (WRA_WAS_ADDED(r)) { any_changed++; @@ -3541,11 +3543,10 @@ router_load_routers_from_string(const char *s, const char *eos, smartlist_clear(changed); } else if (WRA_WAS_REJECTED(r)) { download_status_t *dl_status; - dl_status = router_get_dl_status_by_descriptor_digest( - ri->cache_info.signed_descriptor_digest); + dl_status = router_get_dl_status_by_descriptor_digest(d); if (dl_status) { log_info(LD_GENERAL, "Marking router %s as never downloadable", - hex_str(ri->cache_info.signed_descriptor_digest, DIGEST_LEN)); + hex_str(d, DIGEST_LEN)); download_status_mark_impossible(dl_status); } } |