chiark / gitweb /
consistency check: Tolerate done children on intdone
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 8 Dec 2016 18:45:48 +0000 (18:45 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Tue, 26 May 2020 19:23:40 +0000 (20:23 +0100)
This can happen temporarily (for example, during globalsystemfailure
or during adns__query_fail's recursion through queries).

There is no problem unless it persists as we leave adns.

Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/check.c

index fcf1995e31db188566c90d22e5791907f2fe4485..c773508d722d63d4fb6a4e2d371cb2b0210132d3 100644 (file)
@@ -136,14 +136,19 @@ static void checkc_queue_tcpw(adns_state ads) {
 }
 
 static void checkc_queue_childw(adns_state ads) {
-  adns_query parent, child;
+  adns_query parent, child, search;
 
   DLIST_CHECK(ads->childw, parent, , {
     assert(parent->state == query_childw);
     assert(parent->children.head);
     DLIST_CHECK(parent->children, child, siblings., {
       assert(child->parent == parent);
-      assert(child->state != query_done);
+      if (child->state == query_done) {
+       for (search= ads->intdone.head; search; search= search->next)
+         if (search==child) goto child_done_ok;
+       assert(!"done child not on intdone");
+      child_done_ok:;
+      }
     });
     checkc_query(ads,parent);
     checkc_query_alloc(ads,parent);