/* Pick the TTL as the minimum of the RR's TTL, the
* RR's original TTL according to the RRSIG and the
* RRSIG's own TTL, see RFC 4035, Section 5.3.3 */
- rr->ttl = MIN3(rr->ttl, rrsig->rrsig.original_ttl, rrsig->ttl);
+ uint32_t ttl = MIN3(rr->ttl, rrsig->rrsig.original_ttl, rrsig->ttl);
+ if (ttl != rr->ttl) {
+ rr->ttl = ttl;
+ dns_resource_record_clear_wire_format(rr);
+ }
+
rr->expiry = rrsig->rrsig.expiration * USEC_PER_SEC;
/* Copy over information about the signer and wildcard source of synthesis */
* ================================================================ */
TEST(dns_resource_record_clamp_ttl_in_place) {
+ _cleanup_free_ void *wire_format = NULL;
DnsResourceRecord *rr = NULL, *orig = NULL;
+ size_t wire_format_size;
rr = dns_resource_record_new_full(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
ASSERT_NOT_NULL(rr);
orig = rr;
rr->ttl = 3600;
+ rr->a.in_addr.s_addr = htobe32(0xc0a8017f);
ASSERT_FALSE(dns_resource_record_clamp_ttl(&rr, 4800));
ASSERT_EQ(rr->ttl, 3600u);
+ ASSERT_OK(dns_resource_record_to_wire_format(rr, false));
+ ASSERT_NOT_NULL(rr->wire_format);
+ wire_format_size = rr->wire_format_size;
+ ASSERT_NOT_NULL(wire_format = memdup(rr->wire_format, wire_format_size));
+
ASSERT_TRUE(dns_resource_record_clamp_ttl(&rr, 2400));
ASSERT_EQ(rr->ttl, 2400u);
+ ASSERT_OK(dns_resource_record_to_wire_format(rr, false));
+ ASSERT_EQ(rr->wire_format_size, wire_format_size);
+ ASSERT_NE(memcmp(rr->wire_format, wire_format, wire_format_size), 0);
ASSERT_TRUE(rr == orig);
return 0;
}
+void dns_resource_record_clear_wire_format(DnsResourceRecord *rr) {
+ assert(rr);
+
+ rr->wire_format = mfree(rr->wire_format);
+ rr->wire_format_size = 0;
+ rr->wire_format_rdata_offset = 0;
+ rr->wire_format_canonical = false;
+}
+
int dns_resource_record_signer(DnsResourceRecord *rr, const char **ret) {
const char *n;
int r;
if (old_rr->n_ref == 1) {
/* Patch in place */
old_rr->ttl = new_ttl;
+ dns_resource_record_clear_wire_format(old_rr);
return 1;
}
DnsResourceRecord *dns_resource_record_copy(DnsResourceRecord *rr);
DEFINE_TRIVIAL_CLEANUP_FUNC(DnsResourceRecord*, dns_resource_record_unref);
+void dns_resource_record_clear_wire_format(DnsResourceRecord *rr);
int dns_resource_record_to_wire_format(DnsResourceRecord *rr, bool canonical);
int dns_resource_record_signer(DnsResourceRecord *rr, const char **ret);