From ea1e31e326a99219a0a6edf28a75845b79b74893 Mon Sep 17 00:00:00 2001 From: ian Date: Mon, 16 Nov 1998 00:58:26 +0000 Subject: [PATCH] Improved error discrimination / set of errors. --- client/adnstest.c | 2 +- src/adns.h | 53 ++++++++++++++++++++++++++++++++-------------- src/general.c | 54 ++++++++++++++++++++++++++++------------------- src/parse.c | 28 ++++++++++++------------ src/query.c | 12 +++++------ src/reply.c | 20 +++++++++--------- src/transmit.c | 22 +++++++++---------- src/types.c | 12 +++++------ 8 files changed, 117 insertions(+), 86 deletions(-) diff --git a/client/adnstest.c b/client/adnstest.c index 6badc22..2c01155 100644 --- a/client/adnstest.c +++ b/client/adnstest.c @@ -109,7 +109,7 @@ int main(int argc, char *const *argv) { for (ti=0; ti"; } if (st) { @@ -172,7 +172,7 @@ adns_status adns_rr_info(adns_rrtype type, adns_status st; typei= adns__findtype(type); - if (!typei) return adns_s_notimplemented; + if (!typei) return adns_s_unknownrrtype; if (rrtname_r) *rrtname_r= typei->rrtname; if (fmtname_r) *fmtname_r= typei->fmtname; @@ -183,7 +183,7 @@ adns_status adns_rr_info(adns_rrtype type, adns__vbuf_init(&vb); st= typei->convstring(&vb,datap); if (st) goto x_freevb; - if (!adns__vbuf_append(&vb,"",1)) { st= adns_s_nolocalmem; goto x_freevb; } + if (!adns__vbuf_append(&vb,"",1)) { st= adns_s_nomemory; goto x_freevb; } assert(strlen(vb.buf) == vb.used-1); *data_r= realloc(vb.buf,vb.used); if (!*data_r) *data_r= vb.buf; @@ -200,25 +200,35 @@ static const struct sinfo { adns_status st; const char *string; } sinfos[]= { - SINFO( ok, "OK" ), - SINFO( timeout, "Timed out" ), - SINFO( nolocalmem, "Out of memory" ), - SINFO( allservfail, "No working nameservers" ), - SINFO( servfail, "Nameserver failure" ), - SINFO( notimplemented, "Query not implemented" ), - SINFO( refused, "Refused by nameserver" ), - SINFO( reasonunknown, "Reason unknown" ), - SINFO( norecurse, "Recursion denied by nameserver" ), - SINFO( serverfaulty, "Nameserver sent bad data" ), - SINFO( unknownreply, "Reply from nameserver not understood" ), - SINFO( invaliddata, "Invalid data" ), - SINFO( inconsistent, "Inconsistent data" ), - SINFO( cname, "RR refers to an alias" ), - SINFO( invalidanswerdomain, "Received syntactically invalid domain" ), - SINFO( nxdomain, "No such domain" ), - SINFO( nodata, "No such data" ), - SINFO( invalidquerydomain, "Query domain invalid" ), - SINFO( domaintoolong, "Domain name too long" ) + SINFO( ok, "OK" ), + + SINFO( nomemory, "Out of memory" ), + SINFO( unknownrrtype, "Query not implemented in DNS library" ), + + SINFO( timeout, "DNS query timed out" ), + SINFO( allservfail, "All nameservers failed" ), + SINFO( norecurse, "Recursion denied by nameserver" ), + SINFO( invalidresponse, "Nameserver sent bad response" ), + SINFO( unknownformat, "Nameserver used unknown format" ), + + SINFO( rcodeservfail, "Nameserver reports failure" ), + SINFO( rcodeformaterror, "Query not understood by nameserver" ), + SINFO( rcodenotimplemented, "Query not implemented by nameserver" ), + SINFO( rcoderefused, "Query refused by nameserver" ), + SINFO( rcodeunknown, "Nameserver sent unknown response code" ), + + SINFO( inconsistent, "Inconsistent resource records in DNS" ), + SINFO( prohibitedcname, "DNS data refers to an alias" ), + SINFO( answerdomaininvalid, "Found syntactically invalid domain name" ), + SINFO( answerdomaintoolong, "Found overly-long domain name" ), + SINFO( invaliddata, "Found invalid DNS data" ), + + SINFO( querydomainwrong, "Domain invalid for particular DNS query type" ), + SINFO( querydomaininvalid, "Domain name is syntactically invalid" ), + SINFO( querydomaintoolong, "Domain name is too long" ), + + SINFO( nxdomain, "No such domain" ), + SINFO( nodata, "No such data" ), }; static int si_compar(const void *key, const void *elem) { diff --git a/src/parse.c b/src/parse.c index 388d09a..04eb302 100644 --- a/src/parse.c +++ b/src/parse.c @@ -72,16 +72,16 @@ adns_status adns__findlabel_next(findlabel_state *fls, dgram= fls->dgram; for (;;) { if (fls->cbyte >= fls->dglen) goto x_truncated; - if (fls->cbyte >= fls->max) goto x_serverfaulty; + if (fls->cbyte >= fls->max) goto x_badresponse; GET_B(fls->cbyte,lablen); if (!(lablen & 0x0c0)) break; - if ((lablen & 0x0c0) != 0x0c0) return adns_s_unknownreply; + if ((lablen & 0x0c0) != 0x0c0) return adns_s_unknownformat; if (jumped++) { adns__diag(fls->ads,fls->serv,fls->qu,"compressed datagram contains loop"); - return adns_s_serverfaulty; + return adns_s_invalidresponse; } if (fls->cbyte >= fls->dglen) goto x_truncated; - if (fls->cbyte >= fls->max) goto x_serverfaulty; + if (fls->cbyte >= fls->max) goto x_badresponse; GET_B(fls->cbyte,jumpto); jumpto |= (lablen&0x3f)<<8; if (fls->dmend_r) *(fls->dmend_r)= fls->cbyte; @@ -92,10 +92,10 @@ adns_status adns__findlabel_next(findlabel_state *fls, if (lablen) { if (fls->namelen) fls->namelen++; fls->namelen+= lablen; - if (fls->namelen > DNS_MAXDOMAIN) return adns_s_domaintoolong; + if (fls->namelen > DNS_MAXDOMAIN) return adns_s_answerdomaintoolong; fls->cbyte+= lablen; if (fls->cbyte > fls->dglen) goto x_truncated; - if (fls->cbyte > fls->max) goto x_serverfaulty; + if (fls->cbyte > fls->max) goto x_badresponse; } else { if (fls->dmend_r) *(fls->dmend_r)= fls->cbyte; } @@ -107,9 +107,9 @@ adns_status adns__findlabel_next(findlabel_state *fls, *lablen_r= -1; return adns_s_ok; - x_serverfaulty: + x_badresponse: adns__diag(fls->ads,fls->serv,fls->qu,"label in domain runs beyond end of domain"); - return adns_s_serverfaulty; + return adns_s_invalidresponse; } adns_status adns__parse_domain(adns_state ads, int serv, adns_query qu, @@ -128,23 +128,23 @@ adns_status adns__parse_domain(adns_state ads, int serv, adns_query qu, if (lablen<0) { vb->used=0; return adns_s_ok; } if (!lablen) break; if (vb->used) - if (!adns__vbuf_append(vb,".",1)) return adns_s_nolocalmem; + if (!adns__vbuf_append(vb,".",1)) return adns_s_nomemory; if (flags & pdf_quoteok) { if (!vbuf__append_quoted1035(vb,dgram+labstart,lablen)) - return adns_s_nolocalmem; + return adns_s_nomemory; } else { ch= dgram[labstart]; - if (!ctype_alpha(ch) && !ctype_digit(ch)) return adns_s_invalidanswerdomain; + if (!ctype_alpha(ch) && !ctype_digit(ch)) return adns_s_answerdomaininvalid; for (i= labstart+1; iused) { qu->query_dgram= malloc(qumsg_vb->used); if (!qu->query_dgram) { - adns__query_fail(qu,adns_s_nolocalmem); + adns__query_fail(qu,adns_s_nomemory); return adns_s_ok; } memcpy(qu->query_dgram,qumsg_vb->buf,qumsg_vb->used); @@ -101,7 +101,7 @@ int adns__internal_submit(adns_state ads, adns_query *query_r, free(qu); x_nomemory: adns__vbuf_free(qumsg_vb); - return adns_s_nolocalmem; + return adns_s_nomemory; } int adns_submit(adns_state ads, @@ -118,7 +118,7 @@ int adns_submit(adns_state ads, struct timeval now; typei= adns__findtype(type); - if (!typei) return adns_s_notimplemented; + if (!typei) return adns_s_unknownrrtype; ctx.ext= context; ctx.callback= 0; @@ -130,7 +130,7 @@ int adns_submit(adns_state ads, adns__vbuf_init(&vb); ol= strlen(owner); - if (ol<=1 || ol>DNS_MAXDOMAIN+1) { stat= adns_s_domaintoolong; goto xit; } + if (ol<=1 || ol>DNS_MAXDOMAIN+1) { stat= adns_s_querydomaintoolong; goto xit; } if (owner[ol-1]=='.' && owner[ol-2]!='\\') { flags &= ~adns_qf_search; ol--; } @@ -281,7 +281,7 @@ static void makefinal_query(adns_query qu) { return; x_nomem: - qu->answer->status= adns_s_nolocalmem; + qu->answer->status= adns_s_nomemory; qu->answer->cname= 0; adns__reset_cnameonly(qu); free_query_allocs(qu); @@ -296,7 +296,7 @@ void adns__query_done(adns_query qu) { if (ans->nrrs && qu->typei->diff_needswap) { if (!adns__vbuf_ensure(&qu->vb,qu->typei->rrsz)) { - adns__query_fail(qu,adns_s_nolocalmem); + adns__query_fail(qu,adns_s_nomemory); return; } adns__isort(ans->rrs.bytes, ans->nrrs, ans->rrsz, diff --git a/src/reply.c b/src/reply.c index 9d11607..6198d07 100644 --- a/src/reply.c +++ b/src/reply.c @@ -111,22 +111,22 @@ void adns__procdgram(adns_state ads, const byte *dgram, int dglen, break; case rcode_formaterror: adns__warn(ads,serv,qu,"server cannot understand our query (Format Error)"); - adns__query_fail(qu,adns_s_serverfaulty); + adns__query_fail(qu,adns_s_rcodeformaterror); return; case rcode_servfail: - adns__query_fail(qu,adns_s_servfail); + adns__query_fail(qu,adns_s_rcodeservfail); return; case rcode_notimp: adns__warn(ads,serv,qu,"server claims not to implement our query"); - adns__query_fail(qu,adns_s_notimplemented); + adns__query_fail(qu,adns_s_rcodenotimplemented); return; case rcode_refused: adns__warn(ads,serv,qu,"server refused our query"); - adns__query_fail(qu,adns_s_refused); + adns__query_fail(qu,adns_s_rcoderefused); return; default: adns__warn(ads,serv,qu,"server gave unknown response code %d",rcode); - adns__query_fail(qu,adns_s_reasonunknown); + adns__query_fail(qu,adns_s_rcodeunknown); return; } @@ -167,7 +167,7 @@ void adns__procdgram(adns_state ads, const byte *dgram, int dglen, if (st) { adns__query_fail(qu,st); return; } l= strlen(qu->vb.buf)+1; qu->answer->cname= adns__alloc_interim(qu,l); - if (!qu->answer->cname) { adns__query_fail(qu,adns_s_nolocalmem); return; } + if (!qu->answer->cname) { adns__query_fail(qu,adns_s_nomemory); return; } qu->cname_dgram= adns__alloc_mine(qu,dglen); memcpy(qu->cname_dgram,dgram,dglen); @@ -246,7 +246,7 @@ void adns__procdgram(adns_state ads, const byte *dgram, int dglen, adns__query_fail(qu,adns_s_norecurse); } else { adns__diag(ads,serv,qu,"server claims to do recursion, but gave us a referral"); - adns__query_fail(qu,adns_s_serverfaulty); + adns__query_fail(qu,adns_s_invalidresponse); } return; } @@ -254,7 +254,7 @@ void adns__procdgram(adns_state ads, const byte *dgram, int dglen, /* Now, we have some RRs which we wanted. */ qu->answer->rrs.untyped= adns__alloc_interim(qu,qu->typei->rrsz*wantedrrs); - if (!qu->answer->rrs.untyped) { adns__query_fail(qu,adns_s_nolocalmem); return; } + if (!qu->answer->rrs.untyped) { adns__query_fail(qu,adns_s_nomemory); return; } typei= qu->typei; cbyte= anstart; @@ -301,7 +301,7 @@ void adns__procdgram(adns_state ads, const byte *dgram, int dglen, if (!flg_tc) { adns__diag(ads,serv,qu,"server sent datagram which points outside itself"); - adns__query_fail(qu,adns_s_serverfaulty); + adns__query_fail(qu,adns_s_invalidresponse); return; } qu->flags |= adns_qf_usevc; @@ -315,7 +315,7 @@ void adns__procdgram(adns_state ads, const byte *dgram, int dglen, if (st) { adns__query_fail(qu,st); return; } newquery= realloc(qu->query_dgram,qu->vb.used); - if (!newquery) { adns__query_fail(qu,adns_s_nolocalmem); return; } + if (!newquery) { adns__query_fail(qu,adns_s_nomemory); return; } qu->query_dgram= newquery; qu->query_dglen= qu->vb.used; diff --git a/src/transmit.c b/src/transmit.c index 3b869fc..ffab58b 100644 --- a/src/transmit.c +++ b/src/transmit.c @@ -37,7 +37,7 @@ static adns_status mkquery_header(adns_state ads, vbuf *vb, int *id_r, int qdlen int id; byte *rqp; - if (!adns__vbuf_ensure(vb,DNS_HDRSIZE+qdlen+4)) return adns_s_nolocalmem; + if (!adns__vbuf_ensure(vb,DNS_HDRSIZE+qdlen+4)) return adns_s_nomemory; *id_r= id= (ads->nextid++) & 0x0ffff; @@ -83,35 +83,35 @@ adns_status adns__mkquery(adns_state ads, vbuf *vb, int *id_r, p= owner; pe= owner+ol; nlabs= 0; - if (!*p) return adns_s_invalidquerydomain; + if (!*p) return adns_s_querydomaininvalid; do { ll= 0; while (p!=pe && (c= *p++)!='.') { if (c=='\\') { - if (!(flags & adns_qf_quoteok_query)) return adns_s_invalidquerydomain; + if (!(flags & adns_qf_quoteok_query)) return adns_s_querydomaininvalid; if (ctype_digit(p[0])) { if (ctype_digit(p[1]) && ctype_digit(p[2])) { c= (*p++ - '0')*100 + (*p++ - '0')*10 + (*p++ - '0'); - if (c >= 256) return adns_s_invalidquerydomain; + if (c >= 256) return adns_s_querydomaininvalid; } else { - return adns_s_invalidquerydomain; + return adns_s_querydomaininvalid; } } else if (!(c= *p++)) { - return adns_s_invalidquerydomain; + return adns_s_querydomaininvalid; } } if (!(flags & adns_qf_quoteok_query)) { if (c == '-') { - if (!ll) return adns_s_invalidquerydomain; + if (!ll) return adns_s_querydomaininvalid; } else if (!ctype_alpha(c) && !ctype_digit(c)) { - return adns_s_invalidquerydomain; + return adns_s_querydomaininvalid; } } - if (ll == sizeof(label)) return adns_s_invalidquerydomain; + if (ll == sizeof(label)) return adns_s_querydomaininvalid; label[ll++]= c; } - if (!ll) return adns_s_invalidquerydomain; - if (nlabs++ > 63) return adns_s_domaintoolong; + if (!ll) return adns_s_querydomaininvalid; + if (nlabs++ > 63) return adns_s_querydomaintoolong; MKQUERY_ADDB(ll); memcpy(rqp,label,ll); rqp+= ll; } while (p!=pe); diff --git a/src/types.c b/src/types.c index 2803d11..e59da80 100644 --- a/src/types.c +++ b/src/types.c @@ -27,7 +27,7 @@ #include "internal.h" -#define R_NOMEM return adns_s_nolocalmem +#define R_NOMEM return adns_s_nomemory #define CSP_ADDSTR(s) if (!adns__vbuf_appendstr(vb,(s))) R_NOMEM; else; /* @@ -650,20 +650,20 @@ static adns_status pa_ptr(const parseinfo *pai, int dmstart, int max, void *data pai->qu->query_dglen, DNS_HDRSIZE, 0); for (i=0; i<4; i++) { st= adns__findlabel_next(&fls,&lablen,&labstart); assert(!st); - if (lablen<=0 || lablen>3) return adns_s_invalidquerydomain; + if (lablen<=0 || lablen>3) return adns_s_querydomainwrong; memcpy(labbuf, pai->qu->query_dgram + labstart, lablen); labbuf[lablen]= 0; - ipv[3-i]= strtoul(labbuf,&ep,10); if (*ep) return adns_s_invalidquerydomain; + ipv[3-i]= strtoul(labbuf,&ep,10); if (*ep) return adns_s_querydomainwrong; if (lablen>1 && pai->qu->query_dgram[labstart]=='0') - return adns_s_invalidquerydomain; + return adns_s_querydomainwrong; } for (i=0; iqu->query_dgram + labstart, expectdomain[i], l)) - return adns_s_invalidquerydomain; + return adns_s_querydomainwrong; } st= adns__findlabel_next(&fls,&lablen,0); assert(!st); - if (lablen) return adns_s_invalidquerydomain; + if (lablen) return adns_s_querydomainwrong; ap->len= sizeof(struct sockaddr_in); memset(&ap->addr,0,sizeof(ap->addr.inet)); -- 2.30.2