- nlabs= 0;
- if (!*p) return adns_s_invalidquerydomain;
- do {
- ll= 0;
- while (p!=pe && (c= *p++)!='.') {
- if (c=='\\') {
- if (!(flags & adns_qf_quoteok_query)) return adns_s_invalidquerydomain;
- 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;
- } else {
- return adns_s_invalidquerydomain;
- }
- } else if (!(c= *p++)) {
- return adns_s_invalidquerydomain;
- }
- }
- if (!(flags & adns_qf_quoteok_query)) {
- if (c == '-') {
- if (!ll) return adns_s_invalidquerydomain;
- } else if (!ctype_alpha(c) && !ctype_digit(c)) {
- return adns_s_invalidquerydomain;
- }
- }
- if (ll == sizeof(label)) return adns_s_invalidquerydomain;
- label[ll++]= c;
- }
- if (!ll) return adns_s_invalidquerydomain;
- if (nlabs++ > 63) return adns_s_domaintoolong;
+ nbytes= 0;
+ while (p!=pe) {
+ ll= sizeof(label);
+ st= qdparselabel(ads, &p,pe, label, &ll, flags);
+ if (st) return st;
+ if (!ll) return adns_s_querydomaininvalid;
+ if (ll > DNS_MAXLABEL) return adns_s_querydomaintoolong;
+ nbytes+= ll+1;
+ if (nbytes >= DNS_MAXDOMAIN) return adns_s_querydomaintoolong;