- qdcount = EXTRACT_16BITS(&np->qdcount);
- ancount = EXTRACT_16BITS(&np->ancount);
- nscount = EXTRACT_16BITS(&np->nscount);
- arcount = EXTRACT_16BITS(&np->arcount);
+ qdcount = GET_BE_U_2(np->qdcount);
+ ancount = GET_BE_U_2(np->ancount);
+ nscount = GET_BE_U_2(np->nscount);
+ arcount = GET_BE_U_2(np->arcount);
+
+ /* find the opt record to extract extended rcode */
+ cp = (const u_char *)(np + 1);
+ rcode = DNS_RCODE(flags);
+ for (i = 0; i < qdcount; i++) {
+ if ((cp = ns_nskip(ndo, cp)) == NULL)
+ goto print;
+ cp += 4; /* skip QTYPE and QCLASS */
+ if (cp >= ndo->ndo_snapend)
+ goto print;
+ }
+ for (i = 0; i < ancount + nscount; i++) {
+ if ((cp = ns_nskip(ndo, cp)) == NULL)
+ goto print;
+ cp += 8; /* skip TYPE, CLASS and TTL */
+ if (cp + 2 > ndo->ndo_snapend)
+ goto print;
+ rdlen = GET_BE_U_2(cp);
+ cp += 2 + rdlen;
+ if (cp >= ndo->ndo_snapend)
+ goto print;
+ }
+ for (i = 0; i < arcount; i++) {
+ if ((cp = ns_nskip(ndo, cp)) == NULL)
+ goto print;
+ if (cp + 2 > ndo->ndo_snapend)
+ goto print;
+ type = GET_BE_U_2(cp);
+ cp += 4; /* skip TYPE and CLASS */
+ if (cp + 1 > ndo->ndo_snapend)
+ goto print;
+ if (type == T_OPT) {
+ rcode |= (*cp << 4);
+ goto print;
+ }
+ cp += 4;
+ if (cp + 2 > ndo->ndo_snapend)
+ goto print;
+ rdlen = GET_BE_U_2(cp);
+ cp += 2 + rdlen;
+ if (cp >= ndo->ndo_snapend)
+ goto print;
+ }