* Create the node if it doesn't exist and hold
* a reference to it until we have added the NSEC3.
*/
- CHECK(dns_db_findnsec3node(db, hashname, true, &newnode));
+ result = dns_db_findnsec3node(db, hashname, false, &newnode);
+ if (result != ISC_R_SUCCESS) {
+ isc_result_t tresult;
+
+ CHECK(dns_db_createiterator(db, DNS_DB_NSEC3ONLY, &dbit));
+ tresult = dns_dbiterator_seek3(dbit, hashname);
+ CHECK(dns_dbiterator_pause(dbit));
+
+ if (tresult != ISC_R_SUCCESS) {
+ /* Nothing in the NSEC3 space yet. */
+ if (!unsecure) {
+ goto addnsec3;
+ }
+ goto cleanup;
+ }
+
+ goto find_previous;
+ }
/*
* Seek the iterator to the 'newnode'.
}
}
+find_previous:
/*
* Find the previous NSEC3 (if any) and update it if required.
*/
/*
* Create the NSEC3 RDATA.
*/
+ if (newnode == NULL) {
+ CHECK(dns_db_findnsec3node(db, hashname, true, &newnode));
+ }
+
CHECK(dns_db_findnode(db, name, false, &node));
CHECK(dns_nsec3_buildrdata(db, version, node, hash, flags, iterations,
salt, salt_length, nexthash, next_length,