From a6069da373d11a198a0f955dcf5794b21e693b68 Mon Sep 17 00:00:00 2001 From: Simon Kelley Date: Sun, 5 Apr 2026 22:50:43 +0100 Subject: [PATCH] Check DNS query via TCP doesn't have QR bit set. --- src/forward.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/forward.c b/src/forward.c index 85a8d08..1a7c586 100644 --- a/src/forward.c +++ b/src/forward.c @@ -2468,18 +2468,18 @@ void tcp_request(int confd, time_t now, struct iovec *bigbuff, !read_write(confd, (unsigned char *)daemon->packet, size, RW_READ)) break; - if (size < (int)sizeof(struct dns_header)) + /* header == query */ + header = (struct dns_header *)daemon->packet; + + if (size < (int)sizeof(struct dns_header) || (header->hb3 & HB3_QR)) continue; /* Make sure we have a buffer big enough for the largest answer. */ expand_buf(bigbuff, 65536 + MAXDNAME + RRFIXEDSZ); out_header = bigbuff->iov_base; - /* header == query */ - header = (struct dns_header *)daemon->packet; - /* Add edns0 pheader to query */ - size = add_edns0_config(header, size, ((unsigned char *) header) + daemon->edns_pktsz, &peer_addr, now, &cacheable); + size = add_edns0_config(header, size, ((unsigned char *) header) + daemon->packet_buff_sz, &peer_addr, now, &cacheable); /* Clear buffer to avoid risk of information disclosure. */ memset(bigbuff->iov_base, 0, bigbuff->iov_len);