]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
scan-build: Have clear_pending_onions walk the lists more obviously
authorNick Mathewson <nickm@torproject.org>
Sat, 19 Apr 2014 01:17:40 +0000 (21:17 -0400)
committerNick Mathewson <nickm@torproject.org>
Sat, 19 Apr 2014 01:17:40 +0000 (21:17 -0400)
As it stands, it relies on the fact that onion_queue_entry_remove
will magically remove each onionskin from the right list.  This
patch changes the logic to be more resilient to possible bugs in
onion_queue_entry_remove, and less confusing to static analysis tools.

src/or/onion.c

index 30b983d91ec4301c00789f3a36594d4e98f3b6be..72571b7bd989cde448dd9a8552ceeeeda1eab05a 100644 (file)
@@ -329,12 +329,14 @@ onion_queue_entry_remove(onion_queue_t *victim)
 void
 clear_pending_onions(void)
 {
-  onion_queue_t *victim;
+  onion_queue_t *victim, *next;
   int i;
   for (i=0; i<=MAX_ONION_HANDSHAKE_TYPE; i++) {
-    while ((victim = TOR_TAILQ_FIRST(&ol_list[i]))) {
+    for (victim = TOR_TAILQ_FIRST(&ol_list[i]); victim; victim = next) {
+      next = TOR_TAILQ_NEXT(victim,next);
       onion_queue_entry_remove(victim);
     }
+    tor_assert(TOR_TAILQ_EMPTY(&ol_list[i]));
   }
   memset(ol_entries, 0, sizeof(ol_entries));
 }