From 64aae7c863f6e38cecc3cd6d5054f272e13852e8 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sun, 12 Oct 2014 22:10:14 +0100 Subject: [PATCH] Reentrancy: Introduce adns__cancel We need a version of adns_cancel which does not call adns_returning, for internal call sites who want to avoid reentrancy hazards. Signed-off-by: Ian Jackson --- src/internal.h | 1 + src/query.c | 15 ++++++++++++--- src/setup.c | 8 ++++---- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/internal.h b/src/internal.h index 13740b2..d53ea5f 100644 --- a/src/internal.h +++ b/src/internal.h @@ -704,6 +704,7 @@ void adns__reset_preserved(adns_query qu); * in a datagram and discover that we need to retry the query. */ +void adns__cancel(adns_query qu); void adns__query_done(adns_query qu); void adns__query_fail(adns_query qu, adns_status stat); void adns__cancel_children(adns_query qu); diff --git a/src/query.c b/src/query.c index 3e93fc2..0808534 100644 --- a/src/query.c +++ b/src/query.c @@ -472,7 +472,7 @@ void adns__cancel_children(adns_query qu) { for (cqu= qu->children.head; cqu; cqu= ncqu) { ncqu= cqu->siblings.next; - adns_cancel(cqu); + adns__cancel(cqu); } } @@ -500,11 +500,11 @@ void adns__returning(adns_state ads, adns_query qu_for_caller) { adns__consistency(ads,qu_for_caller,cc_entex); } -void adns_cancel(adns_query qu) { +void adns__cancel(adns_query qu) { adns_state ads; ads= qu->ads; - adns__consistency(ads,qu,cc_entex); + adns__consistency(ads,qu,cc_freq); if (qu->parent) LIST_UNLINK_PART(qu->parent->children,qu,siblings.); switch (qu->state) { case query_tosend: @@ -525,6 +525,15 @@ void adns_cancel(adns_query qu) { free_query_allocs(qu); free(qu->answer); free(qu); +} + +void adns_cancel(adns_query qu) { + adns_state ads; + + assert(!qu->parent); + ads= qu->ads; + adns__consistency(ads,qu,cc_entex); + adns__cancel(qu); adns__returning(ads,0); } diff --git a/src/setup.c b/src/setup.c index 54d2d0f..3419cd6 100644 --- a/src/setup.c +++ b/src/setup.c @@ -725,10 +725,10 @@ void adns_finish(adns_state ads) { int i; adns__consistency(ads,0,cc_entex); 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); + 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 break; } for (i=0; inudp; i++) close(ads->udpsocket[i].fd); -- 2.30.2