From 055597532db52233e80f617b8b015e8caadcb577 Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Thu, 21 Oct 2004 01:29:29 +0000 Subject: [PATCH] 1742. [bug] Deleting all records at a node then adding a previously existing record, in a single UPDATE transaction, failed to leave / regenerate the associated RRSIG records. [RT #12788] --- CHANGES | 9 ++++++--- bin/named/update.c | 23 +++++++++++++++++++---- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/CHANGES b/CHANGES index 4f389e2cf8..0bc83d8c50 100644 --- a/CHANGES +++ b/CHANGES @@ -18,13 +18,16 @@ 1744. [bug] If tuple2msgname() failed to convert a tuple to a name a REQUIRE could be triggered. [RT #12796] -1743. [placeholder] rt12790 - -1742. [bug] If isc_taskmgr_create() was not able to create the +1743. [bug] If isc_taskmgr_create() was not able to create the requested number of worker threads then destruction of the manager would trigger an INSIST() failure. [RT #12790] +1742. [bug] Deleting all records at a node then adding a + previously existing record, in a single UPDATE + transaction, failed to leave / regenerate the + associated RRSIG records. [RT #12788] + 1741. [bug] Deleting all records at a node in a secure zone using a update-policy grant failed. [RT #12787] diff --git a/bin/named/update.c b/bin/named/update.c index f249fc846f..9f9c395cbf 100644 --- a/bin/named/update.c +++ b/bin/named/update.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: update.c,v 1.117 2004/10/12 21:57:57 marka Exp $ */ +/* $Id: update.c,v 1.118 2004/10/21 01:29:29 marka Exp $ */ #include @@ -965,13 +965,27 @@ typedef struct { */ /* - * Return true iff 'update_rr' is neither a SOA nor an NS RR. + * Return true iff 'db_rr' is neither a SOA nor an NS RR nor + * an RRSIG nor a NSEC. */ static isc_boolean_t type_not_soa_nor_ns_p(dns_rdata_t *update_rr, dns_rdata_t *db_rr) { UNUSED(update_rr); return ((db_rr->type != dns_rdatatype_soa && - db_rr->type != dns_rdatatype_ns) ? + db_rr->type != dns_rdatatype_ns && + db_rr->type != dns_rdatatype_rrsig && + db_rr->type != dns_rdatatype_nsec) ? + ISC_TRUE : ISC_FALSE); +} + +/* + * Return true iff 'db_rr' is neither a RRSIG nor a NSEC. + */ +static isc_boolean_t +type_not_dnssec(dns_rdata_t *update_rr, dns_rdata_t *db_rr) { + UNUSED(update_rr); + return ((db_rr->type != dns_rdatatype_rrsig && + db_rr->type != dns_rdatatype_nsec) ? ISC_TRUE : ISC_FALSE); } @@ -2514,7 +2528,8 @@ update_action(isc_task_t *task, isc_event_t *event) { dns_rdatatype_any, 0, &rdata, &diff)); } else { - CHECK(delete_if(true_p, db, ver, name, + CHECK(delete_if(type_not_dnssec, + db, ver, name, dns_rdatatype_any, 0, &rdata, &diff)); }