X-Git-Url: https://git.distorted.org.uk/~mdw/adns/blobdiff_plain/5f8085b735dac86cc516b40bf5b8bc57763ab360..14c634e049bf7680c203b9755c349d5f575f2527:/src/query.c diff --git a/src/query.c b/src/query.c index 31adfc4..708120f 100644 --- a/src/query.c +++ b/src/query.c @@ -83,7 +83,7 @@ static adns_query query_alloc(adns_state ads, qu->answer->expires= -1; qu->answer->nrrs= 0; qu->answer->rrs.untyped= 0; - qu->answer->rrsz= typei->rrsz; + qu->answer->rrsz= typei->getrrsz ? typei->getrrsz(type) : typei->rrsz; return qu; } @@ -105,27 +105,71 @@ static void query_submit(adns_state ads, adns_query qu, qu->query_dglen= qu->vb.used; memcpy(qu->query_dgram,qu->vb.buf,qu->vb.used); - if (typei->query_send && !(qu->flags & adns__qf_senddirect)) - typei->query_send(qu,now); - else - adns__query_send(qu, now); + if (typei->query_send) typei->query_send(qu,now); + else adns__query_send(qu, now); +} + +adns_status adns__ckl_hostname(adns_state ads, adns_queryflags flags, + union checklabel_state *css, + qcontext *ctx, int labnum, + const char *label, int lablen) +{ + int i, c; + + if (flags & adns_qf_quoteok_query) return adns_s_ok; + for (i=0; i= 0); + err= typei->checklabel(ads,flags, &css,ctx, + labnum++, dgram+labstart,lablen); + if (err) return err; + } while (lablen); + return adns_s_ok; } adns_status adns__internal_submit(adns_state ads, adns_query *query_r, const typeinfo *typei, adns_rrtype type, vbuf *qumsg_vb, int id, adns_queryflags flags, struct timeval now, - const qcontext *ctx) { + qcontext *ctx) { adns_query qu; + adns_status err; + err= check_domain_name(ads, flags,ctx,typei, qumsg_vb->buf,qumsg_vb->used); + if (err) goto x_err; qu= query_alloc(ads,typei,type,flags,now); - if (!qu) { adns__vbuf_free(qumsg_vb); return adns_s_nomemory; } + if (!qu) { err = adns_s_nomemory; goto x_err; } *query_r= qu; memcpy(&qu->ctx,ctx,sizeof(qu->ctx)); query_submit(ads,qu, typei,qumsg_vb,id,flags,now); return adns_s_ok; + +x_err: + adns__vbuf_free(qumsg_vb); + return err; } static void query_simple(adns_state ads, adns_query qu, @@ -148,6 +192,9 @@ static void query_simple(adns_state ads, adns_query qu, } } + stat= check_domain_name(ads, flags,&qu->ctx,typei, qu->vb.buf,qu->vb.used); + if (stat) { adns__query_fail(qu,stat); return; } + vb_new= qu->vb; adns__vbuf_init(&qu->vb); query_submit(ads,qu, typei,&vb_new,id, flags,now); @@ -225,9 +272,6 @@ int adns_submit(adns_state ads, adns__consistency(ads,0,cc_entex); - if (!(type & adns__qtf_bigaddr) || !(type & adns__qtf_manyaf)) - flags = (flags & ~adns__qf_afmask) | adns_qf_ipv4_only; - typei= adns__findtype(type); if (!typei) return ENOSYS; @@ -236,7 +280,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; @@ -280,8 +325,6 @@ int adns_submit(adns_state ads, return r; } -static const char *default_zone = ""; - int adns_submit_reverse_any(adns_state ads, const struct sockaddr *addr, const char *zone, @@ -299,11 +342,11 @@ int adns_submit_reverse_any(adns_state ads, switch (addr->sa_family) { case AF_INET: ai = &adns__inet_afinfo; - if (zone == default_zone) zone = "in-addr.arpa"; + if (!zone) zone = "in-addr.arpa"; break; case AF_INET6: ai = &adns__inet6_afinfo; - if (zone == default_zone) zone = "ip6.arpa"; + if (!zone) zone = "ip6.arpa"; break; default: return ENOSYS; @@ -335,8 +378,7 @@ int adns_submit_reverse(adns_state ads, void *context, adns_query *query_r) { if (type != adns_r_ptr && type != adns_r_ptr_raw) return EINVAL; - return adns_submit_reverse_any(ads,addr,default_zone, - type,flags,context,query_r); + return adns_submit_reverse_any(ads,addr,0,type,flags,context,query_r); } int adns_synchronous(adns_state ads, @@ -388,13 +430,22 @@ void *adns__alloc_preserved(adns_query qu, size_t sz) { return rv; } -void adns__free_interim(adns_query qu, void *p) { +static allocnode *alloc_info(adns_query qu, void *p, size_t *sz_r) +{ allocnode *an; - size_t sz; - if (!p) return; + if (!p || p == qu) { *sz_r = 0; return 0; } an = (allocnode *)((byte *)p - MEM_ROUND(sizeof(allocnode))); - sz = MEM_ROUND(an->sz); + *sz_r = MEM_ROUND(an->sz); + return an; +} + +void adns__free_interim(adns_query qu, void *p) { + size_t sz; + allocnode *an = alloc_info(qu, p, &sz); + + if (!an) return; + assert(!qu->final_allocspace); LIST_UNLINK(qu->allocations, an); free(an); qu->interim_allocd -= sz; @@ -404,12 +455,11 @@ void *adns__alloc_mine(adns_query qu, size_t sz) { return alloc_common(qu,MEM_ROUND(sz)); } -void adns__transfer_interim(adns_query from, adns_query to, - void *block, size_t sz) { - allocnode *an; +void adns__transfer_interim(adns_query from, adns_query to, void *block) { + size_t sz; + allocnode *an = alloc_info(from, block, &sz); - if (!block) return; - an= (void*)((byte*)block - MEM_ROUND(sizeof(*an))); + if (!an) return; assert(!to->final_allocspace); assert(!from->final_allocspace); @@ -417,7 +467,6 @@ void adns__transfer_interim(adns_query from, adns_query to, LIST_UNLINK(from->allocations,an); LIST_LINK_TAIL(to->allocations,an); - sz= MEM_ROUND(sz); from->interim_allocd -= sz; to->interim_allocd += sz;