+4439. [bug] Address race conditions getting ownernames of nodes.
+ [RT #43005]
+
4438. [func] Use LIFO rather than FIFO when processing startup
notify and refresh queries. [RT #42825]
findnodeext,
findext,
setcachestats,
- hashsize
+ hashsize,
+ NULL
};
/* Auxiliary driver functions. */
return (ISC_R_NOTFOUND);
}
+
+isc_result_t
+dns_db_nodefullname(dns_db_t *db, dns_dbnode_t *node, dns_name_t *name) {
+ REQUIRE(db != NULL);
+ REQUIRE(node != NULL);
+ REQUIRE(name != NULL);
+
+ if (db->methods->nodefullname == NULL)
+ return (ISC_R_NOTIMPLEMENTED);
+ return ((db->methods->nodefullname)(db, node, name));
+}
NULL, /* findnodeext */
NULL, /* findext */
NULL, /* setcachestats */
- NULL /* hashsize */
+ NULL, /* hashsize */
+ NULL /* nodefullname */
};
static isc_result_t
dns_rdataset_t *sigrdataset);
isc_result_t (*setcachestats)(dns_db_t *db, isc_stats_t *stats);
size_t (*hashsize)(dns_db_t *db);
+ isc_result_t (*nodefullname)(dns_db_t *db, dns_dbnode_t *node,
+ dns_name_t *name);
} dns_dbmethods_t;
typedef isc_result_t
*
*/
+isc_result_t
+dns_db_nodefullname(dns_db_t *db, dns_dbnode_t *node, dns_name_t *name);
+/*%<
+ * Get the name associated with a database node.
+ *
+ * Requires:
+ *
+ * \li 'db' is a valid database
+ * \li 'node' and 'name' are not NULL
+ */
ISC_LANG_ENDDECLS
#endif /* DNS_DB_H */
#define new_reference new_reference64
#define newversion newversion64
#define nodecount nodecount64
+#define nodefullname nodefullname64
#define overmem overmem64
#define previous_closest_nsec previous_closest_nsec64
#define printnode printnode64
dns_fixedname_init(&fixed);
name = dns_fixedname_name(&fixed);
+ RWLOCK(&rbtdb->tree_lock, isc_rwlocktype_read);
dns_rbt_fullnamefromnode(node, name);
+ RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_read);
dns_rdataset_getownercase(rdataset, name);
newheader = (rdatasetheader_t *)region.base;
return (rbtdb->rrsetstats);
}
+static isc_result_t
+nodefullname(dns_db_t *db, dns_dbnode_t *node, dns_name_t *name) {
+ dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db;
+ dns_rbtnode_t *rbtnode = (dns_rbtnode_t *)node;
+ isc_result_t result;
+
+ REQUIRE(VALID_RBTDB(rbtdb));
+ REQUIRE(node != NULL);
+ REQUIRE(name != NULL);
+
+ RWLOCK(&rbtdb->tree_lock, isc_rwlocktype_read);
+ result = dns_rbt_fullnamefromnode(rbtnode, name);
+ RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_read);
+
+ return (result);
+}
+
static dns_dbmethods_t zone_methods = {
attach,
detach,
NULL,
NULL,
NULL,
- hashsize
+ hashsize,
+ nodefullname
};
static dns_dbmethods_t cache_methods = {
NULL,
NULL,
setcachestats,
- hashsize
+ hashsize,
+ nodefullname
};
isc_result_t
findnodeext,
findext,
NULL, /* setcachestats */
- NULL /* hashsize */
+ NULL, /* hashsize */
+ NULL /* nodefullname */
};
static isc_result_t
findnodeext,
findext,
NULL, /* setcachestats */
- NULL /* hashsize */
+ NULL, /* hashsize */
+ NULL /* nodefullname */
};
/*
dns_db_load3
dns_db_newversion
dns_db_nodecount
+dns_db_nodefullname
dns_db_ondestroy
dns_db_origin
dns_db_overmem
#include <dns/nsec3.h>
#include <dns/peer.h>
#include <dns/private.h>
-#include <dns/rbt.h>
#include <dns/rcode.h>
#include <dns/rdata.h>
#include <dns/rdataclass.h>
dns_rdataset_init(&temprdataset);
result = dns_rdatalist_tordataset(&temprdatalist, &temprdataset);
RUNTIME_CHECK(result == ISC_R_SUCCESS);
+
dns_fixedname_init(&fixed);
name = dns_fixedname_name(&fixed);
- dns_rbtnode_nodename(node, name);
+ result = dns_db_nodefullname(db, node, name);
+ RUNTIME_CHECK(result == ISC_R_SUCCESS);
dns_rdataset_getownercase(rdataset, name);
dns_rdataset_setownercase(&temprdataset, name);
return (dns_db_addrdataset(db, node, version, 0, &temprdataset,