From: Mark Wooding Date: Sun, 25 May 2014 15:57:41 +0000 (+0100) Subject: src/: Separate context state into parts for the type itself and its parent. X-Git-Tag: make-bug.2014-07-26~47 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=adns.git;a=commitdiff_plain;h=0ea82d760348fe9153dfd2adc10335a50f59628b src/: Separate context state into parts for the type itself and its parent. The `qcontext.info' union has two distinct uses. A PTR query uses it to store the initial query address, against which it compares the answer to its child A query. On the other hand, `pap_hostaddr' uses this space in each child query it makes, to keep track of where to put the socket addresses when the answers come back. These two kinds of uses are incompatible, so split `qcontext.info' into two pieces: one for the internal use of a query type, and one for the use of a child query's parent -- and specifically for its completion callback. Signed-off-by: Mark Wooding --- diff --git a/src/internal.h b/src/internal.h index 9df4da5..512a2b1 100644 --- a/src/internal.h +++ b/src/internal.h @@ -181,10 +181,15 @@ union maxalign { typedef struct { void *ext; void (*callback)(adns_query parent, adns_query child); + + union { + adns_rr_addr ptr_addr; + } tinfo; /* type-specific state for the query itself: zero-init if you + * don't know better. */ + union { - adns_rr_addr ptr_parent_addr; adns_rr_hostaddr *hostaddr; - } info; + } pinfo; /* state for use by parent's callback function */ } qcontext; struct adns__query { diff --git a/src/query.c b/src/query.c index d09702e..2b36d04 100644 --- a/src/query.c +++ b/src/query.c @@ -230,7 +230,8 @@ int adns_submit(adns_state ads, qu->ctx.ext= context; qu->ctx.callback= 0; - memset(&qu->ctx.info,0,sizeof(qu->ctx.info)); + memset(&qu->ctx.pinfo,0,sizeof(qu->ctx.pinfo)); + memset(&qu->ctx.tinfo,0,sizeof(qu->ctx.tinfo)); *query_r= qu; diff --git a/src/types.c b/src/types.c index b920136..8bc7155 100644 --- a/src/types.c +++ b/src/types.c @@ -456,7 +456,7 @@ static adns_status pap_findaddrs(const parseinfo *pai, adns_rr_hostaddr *ha, static void icb_hostaddr(adns_query parent, adns_query child) { adns_answer *cans= child->answer; - adns_rr_hostaddr *rrp= child->ctx.info.hostaddr; + adns_rr_hostaddr *rrp= child->ctx.pinfo.hostaddr; adns_state ads= parent->ads; adns_status st; @@ -510,7 +510,8 @@ static adns_status pap_hostaddr(const parseinfo *pai, int *cbyte_io, ctx.ext= 0; ctx.callback= icb_hostaddr; - ctx.info.hostaddr= rrp; + ctx.pinfo.hostaddr= rrp; + memset(&ctx.tinfo, 0, sizeof(ctx.tinfo)); nflags= adns_qf_quoteok_query; if (!(pai->qu->flags & adns_qf_cname_loose)) nflags |= adns_qf_cname_forbid; @@ -720,7 +721,7 @@ static void icb_ptr(adns_query parent, adns_query child) { return; } - queried= &parent->ctx.info.ptr_parent_addr; + queried= &parent->ctx.tinfo.ptr_addr; for (i=0, found=cans->rrs.addr; inrrs; i++, found++) { if (queried->len == found->len && !memcmp(&queried->addr,&found->addr,queried->len)) { @@ -758,7 +759,7 @@ static adns_status pa_ptr(const parseinfo *pai, int dmstart, if (st) return st; if (cbyte != max) return adns_s_invaliddata; - ap= &pai->qu->ctx.info.ptr_parent_addr; + ap= &pai->qu->ctx.tinfo.ptr_addr; if (!ap->len) { adns__findlabel_start(&fls, pai->ads, -1, pai->qu, pai->qu->query_dgram, pai->qu->query_dglen, @@ -797,7 +798,8 @@ static adns_status pa_ptr(const parseinfo *pai, int dmstart, ctx.ext= 0; ctx.callback= icb_ptr; - memset(&ctx.info,0,sizeof(ctx.info)); + memset(&ctx.pinfo,0,sizeof(ctx.pinfo)); + memset(&ctx.tinfo,0,sizeof(ctx.tinfo)); st= adns__internal_submit(pai->ads, &nqu, adns__findtype(adns_r_addr), &pai->qu->vb, id, adns_qf_quoteok_query, pai->now, &ctx);