]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
resolved: if dns_packet_append_answer() fails count how many RRs were successfully...
authorLennart Poettering <lennart@poettering.net>
Thu, 5 Nov 2020 08:53:02 +0000 (09:53 +0100)
committerLennart Poettering <lennart@poettering.net>
Tue, 9 Feb 2021 16:53:04 +0000 (17:53 +0100)
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.

src/resolve/resolved-dns-packet.c
src/resolve/resolved-dns-packet.h
src/resolve/resolved-dns-scope.c
src/resolve/resolved-dns-transaction.c

index b75b77760ae9ee2bcb805946b5bfa0811390fb31..59be55a0eb027747f0cc487439c9d17f03d750c8 100644 (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;
index 38b14b92f581d98d431c60d3f20c295ba540c9e5..c63298d823c5597b573aad0bb99bf67f02bed3f9 100644 (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);
index 7db906b0ad7b14cb4115288e3d5e2e802f0447a4..15a3120e1aeb4d240bf151800fdf72ebe7bcce6f 100644 (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);
 
index 8776edb57c7f46eb35f225ab8b6c4c46f77a2ed7..8b3cb7fe1fd8b4c4a854938ce7858bd1c23236bc 100644 (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);