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

index 93632733e979ef51f7daebfe01a844f4036df4c1..f528cc7ab4af6dd63a72f8d7db5da4e15bec1bf7 100644 (file)
@@ -189,16 +189,11 @@ int dns_answer_add(
 
                 /* Entry already exists, keep the entry with the higher TTL. */
                 if (rr->ttl > exist->rr->ttl) {
-                        dns_resource_record_ref(rr);
-                        dns_resource_record_unref(exist->rr);
-                        exist->rr = rr;
+                        DNS_RR_REPLACE(exist->rr, dns_resource_record_ref(rr));
 
                         /* Update RRSIG and RR at the same time */
-                        if (rrsig) {
-                                dns_resource_record_ref(rrsig);
-                                dns_resource_record_unref(exist->rrsig);
-                                exist->rrsig = rrsig;
-                        }
+                        if (rrsig)
+                                DNS_RR_REPLACE(exist->rrsig, dns_resource_record_ref(rrsig));
                 }
 
                 exist->flags |= flags;
index 08d9dd3e24e3c20842394af23304f5a5af755910..7a1aea08007d9b46f757a8a120445d4b8404e1c2 100644 (file)
@@ -378,9 +378,7 @@ static void dns_cache_item_update_positive(
 
                 assert_se(hashmap_replace(c->by_key, rr->key, i) >= 0);
 
-        dns_resource_record_ref(rr);
-        dns_resource_record_unref(i->rr);
-        i->rr = rr;
+        DNS_RR_REPLACE(i->rr, dns_resource_record_ref(rr));
 
         dns_resource_key_unref(i->key);
         i->key = dns_resource_key_ref(rr->key);
index 50785a682389e40b853180057655419d273b91e1..d6fb4880b0c966c1ce59b93e09510f7495f2cb5c 100644 (file)
@@ -2359,8 +2359,7 @@ static int dns_packet_extract_answer(DnsPacket *p, DnsAnswer **ret_answer) {
                 /* Remember this RR, so that we can potentially merge its ->key object with the
                  * next RR. Note that we only do this if we actually decided to keep the RR around.
                  */
-                dns_resource_record_unref(previous);
-                previous = dns_resource_record_ref(rr);
+                DNS_RR_REPLACE(previous, dns_resource_record_ref(rr));
         }
 
         if (bad_opt) {
index ff271486d7c19b60620f10f16adacb7cf7905828..33bf0b67a18149e393954afd19face42931afba2 100644 (file)
@@ -1708,9 +1708,7 @@ int dns_resource_record_clamp_ttl(DnsResourceRecord **rr, uint32_t max_ttl) {
 
         new_rr->ttl = new_ttl;
 
-        dns_resource_record_unref(*rr);
-        *rr = new_rr;
-
+        DNS_RR_REPLACE(*rr, new_rr);
         return 1;
 }
 
index 66aa10b82cf54bf64f26bee69c2ac81c48009c7b..6404c4bcd4873ffea2e620fed1e8695ba5a770a6 100644 (file)
@@ -319,6 +319,15 @@ DnsResourceRecord* dns_resource_record_new(DnsResourceKey *key);
 DnsResourceRecord* dns_resource_record_new_full(uint16_t class, uint16_t type, const char *name);
 DnsResourceRecord* dns_resource_record_ref(DnsResourceRecord *rr);
 DnsResourceRecord* dns_resource_record_unref(DnsResourceRecord *rr);
+
+#define DNS_RR_REPLACE(a, b)                    \
+        do {                                    \
+                typeof(a)* _a = &(a);           \
+                typeof(b) _b = (b);             \
+                dns_resource_record_unref(*_a); \
+                *_a = _b;                       \
+        } while(0)
+
 int dns_resource_record_new_reverse(DnsResourceRecord **ret, int family, const union in_addr_union *address, const char *name);
 int dns_resource_record_new_address(DnsResourceRecord **ret, int family, const union in_addr_union *address, const char *name);
 int dns_resource_record_equal(const DnsResourceRecord *a, const DnsResourceRecord *b);