From 70d1b1b5db6d3a0f71d4ca76699d4645a4a167a9 Mon Sep 17 00:00:00 2001 Message-Id: <70d1b1b5db6d3a0f71d4ca76699d4645a4a167a9.1716251604.git.mdw@distorted.org.uk> From: Mark Wooding Date: Sat, 17 May 2014 13:34:46 +0100 Subject: [PATCH] Don't use adns__must_gettimeofday in callbacks. Organization: Straylight/Edgeware From: Mark Wooding There's potential re-entrancy and it's very bad. Instead, call gettimeofday(2) directly and cope with the fallout locally. --- src/types.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/types.c b/src/types.c index c0183c9..e69e2f4 100644 --- a/src/types.c +++ b/src/types.c @@ -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); } -- [mdw]