chiark / gitweb /
adns_finish: Cancel parent queries first
authorIan Jackson <ian.jackson@eu.citrix.com>
Fri, 16 Dec 2016 19:26:34 +0000 (19:26 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Tue, 26 May 2020 19:24:04 +0000 (20:24 +0100)
Here, we should not cancel a query with a parent, because that leaves
the parent in a silly state (childw, but no children) which
adns__consistency complains about.

Instead, search upwards for a parent to cancel.

Signed-off-by: Ian Jackson <Ian.Jackson@eu.citrix.com>
src/setup.c

index 26338e8b392494d3a4a5acb9c6987e11d68e3ef6..41c0e67d3fdf345c133607fe5cb6e33cac8358d9 100644 (file)
@@ -792,15 +792,20 @@ int adns_init_logfn(adns_state *newstate_r, adns_initflags flags,
     return init_files(newstate_r, flags, logfn, logfndata);
 }
 
+static void cancel_all(adns_query qu) {
+  if (!qu->parent) adns__cancel(qu);
+  else cancel_all(qu->parent);
+}
+
 void adns_finish(adns_state ads) {
   int i;
   adns__consistency(ads,0,cc_enter);
   for (;;) {
-    if (ads->udpw.head) adns__cancel(ads->udpw.head);
-    else if (ads->tcpw.head) adns__cancel(ads->tcpw.head);
-    else if (ads->childw.head) adns__cancel(ads->childw.head);
-    else if (ads->output.head) adns__cancel(ads->output.head);
-    else if (ads->intdone.head) adns__cancel(ads->output.head);
+    if (ads->udpw.head) cancel_all(ads->udpw.head);
+    else if (ads->tcpw.head) cancel_all(ads->tcpw.head);
+    else if (ads->childw.head) cancel_all(ads->childw.head);
+    else if (ads->output.head) cancel_all(ads->output.head);
+    else if (ads->intdone.head) cancel_all(ads->output.head);
     else break;
   }
   for (i=0; i<ads->nudpsockets; i++) close(ads->udpsockets[i].fd);