Correct the bulletproofing of routerlist_insert()

The original code updated some variables, but forgot to remove a
replaced old-routerdesc from rl->old_routers.

Related to bug 1776.
This commit is contained in:
Nick Mathewson 2012-05-16 10:51:02 -04:00
parent 8e07798284
commit 3ed4c5dc05
2 changed files with 12 additions and 0 deletions

View File

@ -0,0 +1,5 @@
o Minor bugfixes:
- If we hit the error case where routerlist_insert() replaces an
existing (old) server descriptor, make sure to remove that
server descriptor from the old_routers list. Fix related to bug
1776. Bugfix on 0.2.2.18-alpha.

View File

@ -2815,6 +2815,13 @@ routerlist_insert(routerlist_t *rl, routerinfo_t *ri)
ri->cache_info.signed_descriptor_digest,
&(ri->cache_info));
if (sd_old) {
int idx = sd_old->routerlist_index;
sd_old->routerlist_index = -1;
smartlist_del(rl->old_routers, idx);
if (idx < smartlist_len(rl->old_routers)) {
signed_descriptor_t *d = smartlist_get(rl->old_routers, idx);
d->routerlist_index = idx;
}
rl->desc_store.bytes_dropped += sd_old->signed_descriptor_len;
sdmap_remove(rl->desc_by_eid_map, sd_old->extra_info_digest);
signed_descriptor_free(sd_old);