[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);