summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Kelley <simon@thekelleys.org.uk>2021-10-05 23:38:20 +0100
committerSimon Kelley <simon@thekelleys.org.uk>2021-10-05 23:38:20 +0100
commitd2ad5dc073aaacaf22b117f16106282a73586803 (patch)
tree48fc955a41d8abffc1f3afffeaefb8a436f128d7
parent68ab5127affb269afec0bc60d8aa25d81b53403d (diff)
downloaddnsmasq-d2ad5dc073aaacaf22b117f16106282a73586803.tar.gz
Fix truncation logic in make_local_answer()
add_resource_record() returns 1 if the record was added. Only increment anscount of so. Thanks to Petr Menšík for spotting the problem.
-rw-r--r--src/domain-match.c9
1 files changed, 4 insertions, 5 deletions
diff --git a/src/domain-match.c b/src/domain-match.c
index 3f1cc74..d280e83 100644
--- a/src/domain-match.c
+++ b/src/domain-match.c
@@ -418,9 +418,8 @@ size_t make_local_answer(int flags, int gotname, size_t size, struct dns_header
else
addr.addr4 = srv->addr;
- header->ancount = htons(ntohs(header->ancount) + 1);
- if (!add_resource_record(header, limit, &trunc, sizeof(struct dns_header), &p, daemon->local_ttl, NULL, T_A, C_IN, "4", &addr))
- return 0;
+ if (add_resource_record(header, limit, &trunc, sizeof(struct dns_header), &p, daemon->local_ttl, NULL, T_A, C_IN, "4", &addr))
+ header->ancount = htons(ntohs(header->ancount) + 1);
log_query((flags | F_CONFIG | F_FORWARD) & ~F_IPV6, name, (union all_addr *)&addr, NULL, 0);
}
@@ -434,8 +433,8 @@ size_t make_local_answer(int flags, int gotname, size_t size, struct dns_header
else
addr.addr6 = srv->addr;
- header->ancount = htons(ntohs(header->ancount) + 1);
- add_resource_record(header, limit, &trunc, sizeof(struct dns_header), &p, daemon->local_ttl, NULL, T_AAAA, C_IN, "6", &addr);
+ if (add_resource_record(header, limit, &trunc, sizeof(struct dns_header), &p, daemon->local_ttl, NULL, T_AAAA, C_IN, "6", &addr))
+ header->ancount = htons(ntohs(header->ancount) + 1);
log_query((flags | F_CONFIG | F_FORWARD) & ~F_IPV4, name, (union all_addr *)&addr, NULL, 0);
}