From 6d1edd8d32afe25ac280db8bfbcfee6629e3bc5e Mon Sep 17 00:00:00 2001 From: Simon Kelley Date: Mon, 21 Jun 2021 15:59:07 +0100 Subject: [PATCH] Use correct packet-size limit in make_local_answer() --- src/dnsmasq.h | 2 +- src/domain-match.c | 6 +++--- src/forward.c | 5 +++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/dnsmasq.h b/src/dnsmasq.h index 66fc988..b21fc17 100644 --- a/src/dnsmasq.h +++ b/src/dnsmasq.h @@ -1749,7 +1749,7 @@ int lookup_domain(char *qdomain, int flags, int *lowout, int *highout); int filter_servers(int seed, int flags, int *lowout, int *highout); int is_local_answer(time_t now, int first, char *name); size_t make_local_answer(int flags, int gotname, size_t size, struct dns_header *header, - char *name, int first, int last); + char *name, char *limit, int first, int last); int server_samegroup(struct server *a, struct server *b); #ifdef HAVE_DNSSEC int dnssec_server(struct server *server, char *keyname, int *firstp, int *lastp); diff --git a/src/domain-match.c b/src/domain-match.c index 834daf5..ee457c0 100644 --- a/src/domain-match.c +++ b/src/domain-match.c @@ -335,7 +335,7 @@ int is_local_answer(time_t now, int first, char *name) return rc; } -size_t make_local_answer(int flags, int gotname, size_t size, struct dns_header *header, char *name, int first, int last) +size_t make_local_answer(int flags, int gotname, size_t size, struct dns_header *header, char *name, char *limit, int first, int last) { int trunc = 0; unsigned char *p; @@ -361,7 +361,7 @@ size_t make_local_answer(int flags, int gotname, size_t size, struct dns_header addr.addr4 = srv->addr; header->ancount = htons(ntohs(header->ancount) + 1); - add_resource_record(header, ((char *)header) + 65536, &trunc, sizeof(struct dns_header), &p, daemon->local_ttl, NULL, T_A, C_IN, "4", &addr); + add_resource_record(header, limit, &trunc, sizeof(struct dns_header), &p, daemon->local_ttl, NULL, T_A, C_IN, "4", &addr); log_query((flags | F_CONFIG | F_FORWARD) & ~F_IPV6, name, (union all_addr *)&addr, NULL); } @@ -376,7 +376,7 @@ size_t make_local_answer(int flags, int gotname, size_t size, struct dns_header addr.addr6 = srv->addr; header->ancount = htons(ntohs(header->ancount) + 1); - add_resource_record(header, ((char *)header) + 65536, &trunc, sizeof(struct dns_header), &p, daemon->local_ttl, NULL, T_AAAA, C_IN, "6", &addr); + add_resource_record(header, limit, &trunc, sizeof(struct dns_header), &p, daemon->local_ttl, NULL, T_AAAA, C_IN, "6", &addr); log_query((flags | F_CONFIG | F_FORWARD) & ~F_IPV4, name, (union all_addr *)&addr, NULL); } diff --git a/src/forward.c b/src/forward.c index 458f554..8ab6c4a 100644 --- a/src/forward.c +++ b/src/forward.c @@ -525,7 +525,7 @@ static int forward_query(int udpfd, union mysockaddr *udpaddr, reply: if (udpfd != -1) { - if (!(plen = make_local_answer(flags, gotname, plen, header, daemon->namebuff, first, last))) + if (!(plen = make_local_answer(flags, gotname, plen, header, daemon->namebuff, limit, first, last))) return 0; if (oph) @@ -2080,7 +2080,8 @@ unsigned char *tcp_request(int confd, time_t now, /* In case of local answer or no connections made. */ if (m == 0) { - if (!(m = make_local_answer(flags, gotname, size, header, daemon->namebuff, first, last))) + if (!(m = make_local_answer(flags, gotname, size, header, daemon->namebuff, + ((char *) header) + 65536, first, last))) break; if (have_pseudoheader)