chiark / gitweb /
Don't use adns__must_gettimeofday in callbacks.
authorMark Wooding <mdw@distorted.org.uk>
Sat, 17 May 2014 12:34:46 +0000 (13:34 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Sat, 17 May 2014 12:34:46 +0000 (13:34 +0100)
There's potential re-entrancy and it's very bad.  Instead, call
gettimeofday(2) directly and cope with the fallout locally.

src/types.c

index c0183c91507c5610088f4ff568f8f3130bfa1ae4..e69e2f4782aeff160da6a87fb0400bf4d4652db3 100644 (file)
@@ -636,9 +636,8 @@ static void icb_addr(adns_query parent, adns_query child)
 {
   adns_state ads = parent->ads;
   adns_answer *pans = parent->answer, *cans = child->answer;
-  struct timeval tvbuf;
+  struct timeval now;
   adns_status err;
-  const struct timeval *now = 0;
   int id;
 
   if (!(child->flags & adns__qf_addr_cname) &&
@@ -678,8 +677,8 @@ static void icb_addr(adns_query parent, adns_query child)
      * settled on.
      */
     adns__cancel_children(parent);
-    adns__must_gettimeofday(ads, &now, &tvbuf);
-    if (now) addr_subqueries(parent, *now, child->vb.buf, child->vb.used);
+    if (gettimeofday(&now, 0)) goto x_gtod;
+    addr_subqueries(parent, now, child->vb.buf, child->vb.used);
     return;
   }
 
@@ -698,8 +697,8 @@ static void icb_addr(adns_query parent, adns_query child)
     adns__cancel_children(parent);
     adns__free_interim(parent, pans->rrs.bytes);
     pans->rrs.bytes = 0; pans->nrrs = 0;
-    adns__must_gettimeofday(ads, &now, &tvbuf);
-    if (now) adns__search_next(ads, parent, *now);
+    if (gettimeofday(&now, 0)) goto x_gtod;
+    adns__search_next(ads, parent, now);
     return;
   }
 
@@ -719,6 +718,11 @@ static void icb_addr(adns_query parent, adns_query child)
   parent->flags |= adns__qf_addr_answer;
   return;
 
+x_gtod:
+  adns__diag(ads, -1, parent, "gettimeofday failed: %s", strerror(errno));
+  err = adns_s_systemfail;
+  goto x_err;
+
 x_err:
   adns__query_fail(parent, err);
 }