if (r < 0)
return r;
- dns_answer_unref(*a);
- *a = merged;
-
+ DNS_ANSWER_REPLACE(*a, merged);
return 0;
}
if (r < 0)
return r;
- dns_answer_unref(*a);
- *a = TAKE_PTR(n);
+ DNS_ANSWER_REPLACE(*a, TAKE_PTR(n));
return 0;
}
DnsAnswer *dns_answer_ref(DnsAnswer *a);
DnsAnswer *dns_answer_unref(DnsAnswer *a);
+#define DNS_ANSWER_REPLACE(a, b) \
+ do { \
+ typeof(a)* _a = &(a); \
+ typeof(b) _b = (b); \
+ dns_answer_unref(*_a); \
+ *_a = _b; \
+ } while(0)
+
int dns_answer_add(DnsAnswer *a, DnsResourceRecord *rr, int ifindex, DnsAnswerFlags flags, DnsResourceRecord *rrsig);
int dns_answer_add_extend(DnsAnswer **a, DnsResourceRecord *rr, int ifindex, DnsAnswerFlags flags, DnsResourceRecord *rrsig);
int dns_answer_add_soa(DnsAnswer *a, const char *name, uint32_t ttl, int ifindex);
dns_resource_key_unref(i->key);
i->key = dns_resource_key_ref(rr->key);
- dns_answer_ref(answer);
- dns_answer_unref(i->answer);
- i->answer = answer;
+ DNS_ANSWER_REPLACE(i->answer, dns_answer_ref(answer));
dns_packet_ref(full_packet);
dns_packet_unref(i->full_packet);
q->answer_query_flags |= dns_transaction_source_to_query_flags(t->answer_source);
} else {
/* Override non-successful previous answers */
- dns_answer_unref(q->answer);
- q->answer = dns_answer_ref(t->answer);
-
+ DNS_ANSWER_REPLACE(q->answer, dns_answer_ref(t->answer));
q->answer_query_flags = dns_transaction_source_to_query_flags(t->answer_source);
}
!FLAGS_SET(t->answer_query_flags, SD_RESOLVED_AUTHENTICATED))
continue;
- dns_answer_unref(q->answer);
- q->answer = dns_answer_ref(t->answer);
+ DNS_ANSWER_REPLACE(q->answer, dns_answer_ref(t->answer));
q->answer_rcode = t->answer_rcode;
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);
* field is later replaced by the DNSSEC validated subset. The 'answer_auxiliary' field carries the
* original complete record set, including RRSIG and friends. We use this when passing data to
* clients that ask for DNSSEC metadata. */
- dns_answer_unref(t->answer);
- t->answer = dns_answer_ref(p->answer);
+ DNS_ANSWER_REPLACE(t->answer, dns_answer_ref(p->answer));
t->answer_rcode = DNS_PACKET_RCODE(p);
t->answer_dnssec_result = _DNSSEC_RESULT_INVALID;
SET_FLAG(t->answer_query_flags, SD_RESOLVED_AUTHENTICATED, false);
break;
}
- dns_answer_unref(t->answer);
- t->answer = TAKE_PTR(validated);
+ DNS_ANSWER_REPLACE(t->answer, TAKE_PTR(validated));
/* At this point the answer only contains validated
* RRsets. Now, let's see if it actually answers the question