]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
resolved: add DNS_PACKET_REPLACE 23361/head
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Thu, 12 May 2022 15:12:59 +0000 (17:12 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Thu, 12 May 2022 15:15:51 +0000 (17:15 +0200)
src/resolve/resolved-dns-cache.c
src/resolve/resolved-dns-packet.h
src/resolve/resolved-dns-query.c
src/resolve/resolved-dns-transaction.c

index 90d23434cb195be569217b4dd98d9ac8bb0a95e4..e7ab4e556937c10cc58bbfab6ce4b59f099946e8 100644 (file)
@@ -384,9 +384,7 @@ static void dns_cache_item_update_positive(
 
         DNS_ANSWER_REPLACE(i->answer, dns_answer_ref(answer));
 
-        dns_packet_ref(full_packet);
-        dns_packet_unref(i->full_packet);
-        i->full_packet = full_packet;
+        DNS_PACKET_REPLACE(i->full_packet, dns_packet_ref(full_packet));
 
         i->until = calculate_until(rr, min_ttl, UINT32_MAX, timestamp, false);
         i->query_flags = query_flags & CACHEABLE_QUERY_FLAGS;
index 0b797ecb1a12549695f8b840167dde544ee05a7a..95b0b506ea6e6c2f2b1977855ab4d8e0665a9c78 100644 (file)
@@ -201,6 +201,14 @@ DnsPacket *dns_packet_unref(DnsPacket *p);
 
 DEFINE_TRIVIAL_CLEANUP_FUNC(DnsPacket*, dns_packet_unref);
 
+#define DNS_PACKET_REPLACE(a, b)                \
+        do {                                    \
+                typeof(a)* _a = &(a);           \
+                typeof(b) _b = (b);             \
+                dns_packet_unref(*_a);          \
+                *_a = _b;                       \
+        } while(0)
+
 int dns_packet_validate(DnsPacket *p);
 int dns_packet_validate_reply(DnsPacket *p);
 int dns_packet_validate_query(DnsPacket *p);
index 3285917471618fec2e635e20976278844702596a..175fbe22961eeed57ea9a9fe039414b064c5c14f 100644 (file)
@@ -857,8 +857,7 @@ static void dns_query_accept(DnsQuery *q, DnsQueryCandidate *c) {
                         q->answer_rcode = t->answer_rcode;
                         q->answer_errno = 0;
 
-                        dns_packet_unref(q->answer_full_packet);
-                        q->answer_full_packet = dns_packet_ref(t->received);
+                        DNS_PACKET_REPLACE(q->answer_full_packet, dns_packet_ref(t->received));
 
                         if (FLAGS_SET(t->answer_query_flags, SD_RESOLVED_AUTHENTICATED)) {
                                 has_authenticated = true;
@@ -899,8 +898,7 @@ static void dns_query_accept(DnsQuery *q, DnsQueryCandidate *c) {
                         q->answer_dnssec_result = t->answer_dnssec_result;
                         q->answer_query_flags = t->answer_query_flags | dns_transaction_source_to_query_flags(t->answer_source);
                         q->answer_errno = t->answer_errno;
-                        dns_packet_unref(q->answer_full_packet);
-                        q->answer_full_packet = dns_packet_ref(t->received);
+                        DNS_PACKET_REPLACE(q->answer_full_packet, dns_packet_ref(t->received));
 
                         state = t->state;
                         break;
index 55626d06e3952400f1b65fe4af63f71aac4dd185..c9ef11592773cb7cb9bf2437c6f955f48834dfcf 100644 (file)
@@ -1096,10 +1096,8 @@ void dns_transaction_process_reply(DnsTransaction *t, DnsPacket *p, bool encrypt
                 assert_not_reached();
         }
 
-        if (t->received != p) {
-                dns_packet_unref(t->received);
-                t->received = dns_packet_ref(p);
-        }
+        if (t->received != p)
+                DNS_PACKET_REPLACE(t->received, dns_packet_ref(p));
 
         t->answer_source = DNS_TRANSACTION_NETWORK;