resolved: if dns_packet_append_answer() fails count how many RRs were successfully added

This is useful later when handling the truncation case: if we can't add
all RRs we'd like to add we need to set the TC bit, but still report the
number of RRs we added (and not the number of RRs we would have liked to
add) to the packet.
This commit is contained in:
Lennart Poettering
2021-02-09 17:53:04 +01:00
parent 04617bf83f
commit 6f76e68a3c
4 changed files with 11 additions and 9 deletions
+4 -1
View File
@@ -1215,7 +1215,7 @@ int dns_packet_append_question(DnsPacket *p, DnsQuestion *q) {
return 0;
}
int dns_packet_append_answer(DnsPacket *p, DnsAnswer *a) {
int dns_packet_append_answer(DnsPacket *p, DnsAnswer *a, unsigned *completed) {
DnsResourceRecord *rr;
DnsAnswerFlags flags;
int r;
@@ -1226,6 +1226,9 @@ int dns_packet_append_answer(DnsPacket *p, DnsAnswer *a) {
r = dns_packet_append_rr(p, rr, flags, NULL, NULL);
if (r < 0)
return r;
if (completed)
(*completed)++;
}
return 0;
+1 -1
View File
@@ -203,7 +203,7 @@ int dns_packet_append_key(DnsPacket *p, const DnsResourceKey *key, const DnsAnsw
int dns_packet_append_rr(DnsPacket *p, const DnsResourceRecord *rr, const DnsAnswerFlags flags, size_t *start, size_t *rdata_start);
int dns_packet_append_opt(DnsPacket *p, uint16_t max_udp_size, bool edns0_do, bool include_rfc6975, int rcode, size_t *start);
int dns_packet_append_question(DnsPacket *p, DnsQuestion *q);
int dns_packet_append_answer(DnsPacket *p, DnsAnswer *a);
int dns_packet_append_answer(DnsPacket *p, DnsAnswer *a, unsigned *completed);
int dns_packet_patch_max_udp_size(DnsPacket *p, uint16_t max_udp_size);
int dns_packet_patch_ttls(DnsPacket *p, usec_t timestamp);
+5 -4
View File
@@ -765,6 +765,7 @@ int dns_scope_make_reply_packet(
DnsPacket **ret) {
_cleanup_(dns_packet_unrefp) DnsPacket *p = NULL;
unsigned n_answer = 0, n_soa = 0;
int r;
assert(s);
@@ -796,15 +797,15 @@ int dns_scope_make_reply_packet(
return r;
DNS_PACKET_HEADER(p)->qdcount = htobe16(dns_question_size(q));
r = dns_packet_append_answer(p, answer);
r = dns_packet_append_answer(p, answer, &n_answer);
if (r < 0)
return r;
DNS_PACKET_HEADER(p)->ancount = htobe16(dns_answer_size(answer));
DNS_PACKET_HEADER(p)->ancount = htobe16(n_answer);
r = dns_packet_append_answer(p, soa);
r = dns_packet_append_answer(p, soa, &n_soa);
if (r < 0)
return r;
DNS_PACKET_HEADER(p)->arcount = htobe16(dns_answer_size(soa));
DNS_PACKET_HEADER(p)->arcount = htobe16(n_soa);
*ret = TAKE_PTR(p);
+1 -3
View File
@@ -1583,11 +1583,9 @@ static int dns_transaction_make_packet_mdns(DnsTransaction *t) {
if (r < 0)
return r;
r = dns_packet_append_answer(p, answer);
r = dns_packet_append_answer(p, answer, &nscount);
if (r < 0)
return r;
nscount += dns_answer_size(answer);
}
DNS_PACKET_HEADER(p)->nscount = htobe16(nscount);