From: Zbigniew Jędrzejewski-Szmek Date: Thu, 12 May 2022 15:03:07 +0000 (+0200) Subject: resolved: add DNS_RR_REPLACE X-Git-Tag: v251-rc3~8^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7daeec3e6c8dc1b6ba917e9cc344a6e40221da4a;p=thirdparty%2Fsystemd.git resolved: add DNS_RR_REPLACE --- diff --git a/src/resolve/resolved-dns-answer.c b/src/resolve/resolved-dns-answer.c index 93632733e97..f528cc7ab4a 100644 --- a/src/resolve/resolved-dns-answer.c +++ b/src/resolve/resolved-dns-answer.c @@ -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; diff --git a/src/resolve/resolved-dns-cache.c b/src/resolve/resolved-dns-cache.c index 08d9dd3e24e..7a1aea08007 100644 --- a/src/resolve/resolved-dns-cache.c +++ b/src/resolve/resolved-dns-cache.c @@ -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); diff --git a/src/resolve/resolved-dns-packet.c b/src/resolve/resolved-dns-packet.c index 50785a68238..d6fb4880b0c 100644 --- a/src/resolve/resolved-dns-packet.c +++ b/src/resolve/resolved-dns-packet.c @@ -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) { diff --git a/src/resolve/resolved-dns-rr.c b/src/resolve/resolved-dns-rr.c index ff271486d7c..33bf0b67a18 100644 --- a/src/resolve/resolved-dns-rr.c +++ b/src/resolve/resolved-dns-rr.c @@ -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; } diff --git a/src/resolve/resolved-dns-rr.h b/src/resolve/resolved-dns-rr.h index 66aa10b82cf..6404c4bcd48 100644 --- a/src/resolve/resolved-dns-rr.h +++ b/src/resolve/resolved-dns-rr.h @@ -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);