diff --git a/src/auth.c b/src/auth.c index d84a23e..3d17e66 100644 --- a/src/auth.c +++ b/src/auth.c @@ -868,7 +868,12 @@ size_t answer_auth(struct dns_header *header, char *limit, size_t qlen, time_t n /* truncation */ if (trunc) - header->hb3 |= HB3_TC; + { + header->hb3 |= HB3_TC; + if (!(ansp = skip_questions(header, qlen))) + return 0; /* bad packet */ + anscount = authcount = 0; + } if ((auth || local_query) && nxdomain) SET_RCODE(header, NXDOMAIN); diff --git a/src/domain-match.c b/src/domain-match.c index e286b2d..a647fe8 100644 --- a/src/domain-match.c +++ b/src/domain-match.c @@ -444,7 +444,13 @@ size_t make_local_answer(int flags, int gotname, size_t size, struct dns_header } if (trunc) - header->hb3 |= HB3_TC; + { + header->hb3 |= HB3_TC; + if (!(p = skip_questions(header, size))) + return 0; /* bad packet */ + anscount = 0; + } + header->ancount = htons(anscount); return p - (unsigned char *)header; diff --git a/src/rfc1035.c b/src/rfc1035.c index 478e6d0..9c784e2 100644 --- a/src/rfc1035.c +++ b/src/rfc1035.c @@ -2327,14 +2327,20 @@ size_t answer_request(struct dns_header *header, char *limit, size_t qlen, /* truncation */ if (trunc) - header->hb3 |= HB3_TC; - + { + header->hb3 |= HB3_TC; + if (!(ansp = skip_questions(header, qlen))) + return 0; /* bad packet */ + anscount = nscount = addncount = 0; + } + if (nxdomain) SET_RCODE(header, NXDOMAIN); else if (notimp) SET_RCODE(header, NOTIMP); else SET_RCODE(header, NOERROR); /* no error */ + header->ancount = htons(anscount); header->nscount = htons(nscount); header->arcount = htons(addncount);