]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
resolved: add DNS_RESOURCE_KEY_REPLACE
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Thu, 12 May 2022 15:12:46 +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-answer.c
src/resolve/resolved-dns-cache.c
src/resolve/resolved-dns-rr.c
src/resolve/resolved-dns-rr.h

index f528cc7ab4af6dd63a72f8d7db5da4e15bec1bf7..08520d94247b1825c61ed991382ce676bfb0a6a7 100644 (file)
@@ -568,8 +568,7 @@ int dns_answer_remove_by_answer_keys(DnsAnswer **a, DnsAnswer *b) {
 
                 /* Let's remember this entry's RR key, to optimize the loop a bit: if we have an RRset with
                  * more than one item then we don't need to remove the key multiple times */
-                dns_resource_key_unref(prev);
-                prev = dns_resource_key_ref(item->rr->key);
+                DNS_RESOURCE_KEY_REPLACE(prev, dns_resource_key_ref(item->rr->key));
         }
 
         return 0;
index 7a1aea08007d9b46f757a8a120445d4b8404e1c2..90d23434cb195be569217b4dd98d9ac8bb0a95e4 100644 (file)
@@ -380,8 +380,7 @@ static void dns_cache_item_update_positive(
 
         DNS_RR_REPLACE(i->rr, dns_resource_record_ref(rr));
 
-        dns_resource_key_unref(i->key);
-        i->key = dns_resource_key_ref(rr->key);
+        DNS_RESOURCE_KEY_REPLACE(i->key, dns_resource_key_ref(rr->key));
 
         DNS_ANSWER_REPLACE(i->answer, dns_answer_ref(answer));
 
index 33bf0b67a18149e393954afd19face42931afba2..92245770bc20a9f428c2797ed390ccc40b24ad51 100644 (file)
@@ -360,13 +360,10 @@ bool dns_resource_key_reduce(DnsResourceKey **a, DnsResourceKey **b) {
                 return false;
 
         /* Keep the one which already has more references. */
-        if ((*a)->n_ref > (*b)->n_ref) {
-                dns_resource_key_unref(*b);
-                *b = dns_resource_key_ref(*a);
-        } else {
-                dns_resource_key_unref(*a);
-                *a = dns_resource_key_ref(*b);
-        }
+        if ((*a)->n_ref > (*b)->n_ref)
+                DNS_RESOURCE_KEY_REPLACE(*b, dns_resource_key_ref(*a));
+        else
+                DNS_RESOURCE_KEY_REPLACE(*a, dns_resource_key_ref(*b));
 
         return true;
 }
index 6404c4bcd4873ffea2e620fed1e8695ba5a770a6..91b1276f72db5ba56f2a3115a8a02fe8a9916d3b 100644 (file)
@@ -292,6 +292,15 @@ int dns_resource_key_new_append_suffix(DnsResourceKey **ret, DnsResourceKey *key
 DnsResourceKey* dns_resource_key_new_consume(uint16_t class, uint16_t type, char *name);
 DnsResourceKey* dns_resource_key_ref(DnsResourceKey *key);
 DnsResourceKey* dns_resource_key_unref(DnsResourceKey *key);
+
+#define DNS_RESOURCE_KEY_REPLACE(a, b)          \
+        do {                                    \
+                typeof(a)* _a = &(a);           \
+                typeof(b) _b = (b);             \
+                dns_resource_key_unref(*_a);    \
+                *_a = _b;                       \
+        } while(0)
+
 const char* dns_resource_key_name(const DnsResourceKey *key);
 bool dns_resource_key_is_address(const DnsResourceKey *key);
 bool dns_resource_key_is_dnssd_ptr(const DnsResourceKey *key);