X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fquery.c;h=dd2a47a6b0851001771f05e599860cd8709424b6;hb=b7be0042881e59f45a4c553db770abbbeb4871d9;hp=d09702e3702f555d8fc1c85b1c8a129d911ce55a;hpb=15480be436960212fd31b8963516766a68adcdd5;p=adns.git diff --git a/src/query.c b/src/query.c index d09702e..dd2a47a 100644 --- a/src/query.c +++ b/src/query.c @@ -108,21 +108,67 @@ static void query_submit(adns_state ads, adns_query qu, adns__query_send(qu,now); } +adns_status adns__ckl_hostname(adns_state ads, adns_queryflags flags, + union checklabel_state *cls, + 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, &cls,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, 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,typei->typekey,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, @@ -145,6 +191,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); @@ -230,7 +279,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; @@ -244,7 +294,17 @@ int adns_submit(adns_state ads, ol--; } +/* temporary hack */ +#define CHECK_PTR do { \ + if (type == adns_r_ptr && (ol < 5 || \ + strncmp(owner + ol - 5, ".arpa", 5))) { \ + ads->nextid++; adns__autosys(ads,now); \ + stat= adns_s_querydomainwrong; goto x_adnsfail; \ + } \ +} while (0) + if (flags & adns_qf_search) { + CHECK_PTR; r= adns__vbuf_append(&qu->search_vb,owner,ol); if (!r) { stat= adns_s_nomemory; goto x_adnsfail; } @@ -256,12 +316,15 @@ int adns_submit(adns_state ads, if (flags & adns_qf_owner) { if (!save_owner(qu,owner,ol)) { stat= adns_s_nomemory; goto x_adnsfail; } } + CHECK_PTR; query_simple(ads,qu, owner,ol, typei,flags, now); } adns__autosys(ads,now); adns__consistency(ads,qu,cc_entex); return 0; +#undef CHECK_PTR + x_adnsfail: adns__query_fail(qu,stat); adns__consistency(ads,qu,cc_entex);