r12553@catbus: nickm | 2007-04-30 01:32:54 -0400

Backport candidate:  Add asserts to dirserv_remove_invalid, and fix a bug in dirserv_remove_invalid that could mess with pointers in a freed routerinfo right after it was freed.


svn:r10052
This commit is contained in:
Nick Mathewson 2007-04-30 05:32:57 +00:00
parent 743a8cf0eb
commit f7acc3cfa0
3 changed files with 9 additions and 1 deletions

View File

@ -86,6 +86,9 @@ Changes in version 0.2.0.1-alpha - 2007-??-??
we restart. we restart.
- Correctly enforce that elements of directory objects do not appear - Correctly enforce that elements of directory objects do not appear
more often than they are allowed to appear. more often than they are allowed to appear.
- Fix a bug in dirserv_remove_invalid() that would cause authorities to
corrupt memory under some really unlikely scenarios.
- Add even more asserts to hunt down bug 417.
o Minor bugfixes (controller), reported by daejees: o Minor bugfixes (controller), reported by daejees:
- Make 'getinfo fingerprint' return a 551 error if we're not a - Make 'getinfo fingerprint' return a 551 error if we're not a

View File

@ -621,6 +621,8 @@ directory_remove_invalid(void)
int changed = 0; int changed = 0;
routerlist_t *rl = router_get_routerlist(); routerlist_t *rl = router_get_routerlist();
routerlist_assert_ok(rl);
for (i = 0; i < smartlist_len(rl->routers); ++i) { for (i = 0; i < smartlist_len(rl->routers); ++i) {
const char *msg; const char *msg;
routerinfo_t *ent = smartlist_get(rl->routers, i); routerinfo_t *ent = smartlist_get(rl->routers, i);
@ -630,6 +632,7 @@ directory_remove_invalid(void)
ent->nickname, msg?msg:""); ent->nickname, msg?msg:"");
routerlist_remove(rl, ent, i--, 0); routerlist_remove(rl, ent, i--, 0);
changed = 1; changed = 1;
continue;
} }
if (bool_neq((r & FP_NAMED), ent->is_named)) { if (bool_neq((r & FP_NAMED), ent->is_named)) {
log_info(LD_DIRSERV, log_info(LD_DIRSERV,
@ -653,6 +656,8 @@ directory_remove_invalid(void)
} }
if (changed) if (changed)
directory_set_dirty(); directory_set_dirty();
routerlist_assert_ok(rl);
} }
/** Write a list of unregistered descriptors into a newly allocated /** Write a list of unregistered descriptors into a newly allocated

View File

@ -4674,7 +4674,7 @@ routerlist_assert_ok(routerlist_t *rl)
digestmap_iter_t *iter; digestmap_iter_t *iter;
routerinfo_t *r2; routerinfo_t *r2;
signed_descriptor_t *sd2; signed_descriptor_t *sd2;
if (!routerlist) if (!rl);
return; return;
SMARTLIST_FOREACH(rl->routers, routerinfo_t *, r, SMARTLIST_FOREACH(rl->routers, routerinfo_t *, r,
{ {