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.
This commit is contained in:
Nick Mathewson 2009-05-17 02:01:09 -04:00
parent 11b9c839f0
commit c0515b307c
2 changed files with 6 additions and 3 deletions

View File

@ -21,6 +21,8 @@ Changes in version 0.2.1.15??? - ????-??-??
- Stop using malloc_usable_size() to use more area than we had
actually allocated: it was safe, but made valgrind really
unhappy. Bugfix on 0.2.0.x.
- Fix use of freed memory when deciding to mark a non-addable
descriptor as never-downloadable. Bugfix on 0.2.1.9-alpha.
Changes in version 0.2.1.14-rc - 2009-04-12

View File

@ -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);
}
}