[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[or-cvs] r10832: Backport candidate: Fix a potential crash bug when we load m (in tor/trunk: . src/or)
Author: arma
Date: 2007-07-15 20:11:03 -0400 (Sun, 15 Jul 2007)
New Revision: 10832
Modified:
tor/trunk/ChangeLog
tor/trunk/src/or/control.c
tor/trunk/src/or/routerlist.c
Log:
Backport candidate:
Fix a potential crash bug when we load many server descriptors at
once and some of them make others of them obsolete. Fixes bug
458. [Bugfix on 0.1.2.x]
Modified: tor/trunk/ChangeLog
===================================================================
--- tor/trunk/ChangeLog 2007-07-15 08:35:28 UTC (rev 10831)
+++ tor/trunk/ChangeLog 2007-07-16 00:11:03 UTC (rev 10832)
@@ -49,6 +49,9 @@
o Minor bugfixes (directory):
- Fix another crash bug related to extra-info caching. (Bug found by
Peter Palfrader.) [Bugfix on 0.2.0.2-alpha]
+ - Fix a potential crash bug when we load many server descriptors at
+ once and some of them make others of them obsolete. Fixes bug
+ 458. [Bugfix on 0.1.2.x]
- Directories no longer return a "304 not modified" when they don't
have the networkstatus the client asked for. Also fix a memory
leak when returning 304 not modified. [Bugfixes on 0.2.0.2-alpha]
Modified: tor/trunk/src/or/control.c
===================================================================
--- tor/trunk/src/or/control.c 2007-07-15 08:35:28 UTC (rev 10831)
+++ tor/trunk/src/or/control.c 2007-07-16 00:11:03 UTC (rev 10832)
@@ -3013,7 +3013,7 @@
/** Called whenever we receive new router descriptors: tell any
* interested control connections. <b>routers</b> is a list of
- * DIGEST_LEN-byte identity digests.
+ * routerinfo_t's.
*/
int
control_event_descriptors_changed(smartlist_t *routers)
Modified: tor/trunk/src/or/routerlist.c
===================================================================
--- tor/trunk/src/or/routerlist.c 2007-07-15 08:35:28 UTC (rev 10831)
+++ tor/trunk/src/or/routerlist.c 2007-07-16 00:11:03 UTC (rev 10832)
@@ -2337,7 +2337,10 @@
/** Add <b>router</b> to the routerlist, if we don't already have it. Replace
* older entries (if any) with the same key. Note: Callers should not hold
* their pointers to <b>router</b> if this function fails; <b>router</b>
- * will either be inserted into the routerlist or freed.
+ * will either be inserted into the routerlist or freed. Similarly, even
+ * if this call succeeds, they should not hold their pointers to
+ * <b>router</b> after subsequent calls with other routerinfo's -- they
+ * might cause the original routerinfo to get freed.
*
* Returns >= 0 if the router was added; less than 0 if it was not.
*
@@ -2863,13 +2866,13 @@
if (purpose != ROUTER_PURPOSE_GENERAL)
ri->cache_info.do_not_cache = 1;
- if (router_add_to_routerlist(ri, &msg, from_cache, !from_cache) >= 0)
+ if (router_add_to_routerlist(ri, &msg, from_cache, !from_cache) >= 0) {
smartlist_add(changed, ri);
+ routerlist_descriptors_added(changed);
+ smartlist_clear(changed);
+ }
});
- if (smartlist_len(changed))
- routerlist_descriptors_added(changed);
-
routerlist_assert_ok(routerlist);
router_rebuild_store(0, 0);