mirror of
https://github.com/isc-projects/bind9.git
synced 2026-06-03 13:59:27 -04:00
allow db adds to be forced
This commit is contained in:
parent
a790a11730
commit
64e829fffb
3 changed files with 42 additions and 28 deletions
|
|
@ -514,7 +514,7 @@ dns_db_allrdatasets(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
|
|||
isc_result_t
|
||||
dns_db_addrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
|
||||
isc_stdtime_t now, dns_rdataset_t *rdataset,
|
||||
isc_boolean_t merge, dns_rdataset_t *addedrdataset)
|
||||
unsigned int options, dns_rdataset_t *addedrdataset)
|
||||
{
|
||||
/*
|
||||
* Add 'rdataset' to 'node' in version 'version' of 'db'.
|
||||
|
|
@ -524,7 +524,7 @@ dns_db_addrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
|
|||
REQUIRE(node != NULL);
|
||||
REQUIRE(((db->attributes & DNS_DBATTR_CACHE) == 0 && version != NULL)||
|
||||
((db->attributes & DNS_DBATTR_CACHE) != 0 &&
|
||||
version == NULL && !merge));
|
||||
version == NULL && (options & DNS_DBADD_MERGE) == 0));
|
||||
REQUIRE(DNS_RDATASET_VALID(rdataset));
|
||||
REQUIRE(rdataset->methods != NULL);
|
||||
REQUIRE(rdataset->rdclass == db->rdclass);
|
||||
|
|
@ -533,7 +533,7 @@ dns_db_addrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
|
|||
addedrdataset->methods == NULL));
|
||||
|
||||
return ((db->methods->addrdataset)(db, node, version, now, rdataset,
|
||||
merge, addedrdataset));
|
||||
options, addedrdataset));
|
||||
}
|
||||
|
||||
isc_result_t
|
||||
|
|
|
|||
|
|
@ -131,7 +131,7 @@ typedef struct dns_dbmethods {
|
|||
dns_dbversion_t *version,
|
||||
isc_stdtime_t now,
|
||||
dns_rdataset_t *rdataset,
|
||||
isc_boolean_t merge,
|
||||
unsigned int options,
|
||||
dns_rdataset_t *addedrdataset);
|
||||
isc_result_t (*subtractrdataset)(dns_db_t *db, dns_dbnode_t *node,
|
||||
dns_dbversion_t *version,
|
||||
|
|
@ -177,9 +177,10 @@ struct dns_db {
|
|||
#define DNS_DBFIND_PENDINGOK 0x08
|
||||
|
||||
/*
|
||||
* Options that can be specified for dns_db_findzonecut().
|
||||
* Options that can be specified for dns_db_addrdataset().
|
||||
*/
|
||||
#define DNS_DBFIND_ONLYANCESTORS 0x08
|
||||
#define DNS_DBADD_MERGE 0x01
|
||||
#define DNS_DBADD_FORCE 0x02
|
||||
|
||||
/*****
|
||||
***** Methods
|
||||
|
|
@ -969,24 +970,29 @@ dns_db_allrdatasets(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
|
|||
isc_result_t
|
||||
dns_db_addrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
|
||||
isc_stdtime_t now, dns_rdataset_t *rdataset,
|
||||
isc_boolean_t merge, dns_rdataset_t *addedrdataset);
|
||||
unsigned int options, dns_rdataset_t *addedrdataset);
|
||||
/*
|
||||
* Add 'rdataset' to 'node' in version 'version' of 'db'.
|
||||
*
|
||||
* Notes:
|
||||
*
|
||||
* If the database has zone semantics, 'merge' is ISC_TRUE, and an
|
||||
* rdataset of the same type as 'rdataset' already exists at 'node',
|
||||
* then the contents of 'rdataset' will be merged with the existing
|
||||
* rdataset. If merge is ISC_FALSE, then rdataset will replace any
|
||||
* existing rdataset of the same type.
|
||||
* If the database has zone semantics, the DNS_DBADD_MERGE option is set,
|
||||
* and an rdataset of the same type as 'rdataset' already exists at
|
||||
* 'node' then the contents of 'rdataset' will be merged with the existing
|
||||
* rdataset. If the option is not set, then rdataset will replace any
|
||||
* existing rdataset of the same type. If not merging and the
|
||||
* DNS_DBADD_FORCE option is set, then the data will update the database
|
||||
* without regard to trust levels. If not forcing the data, then the
|
||||
* rdataset will only be added if its trust level is >= the trust level of
|
||||
* any existing rdataset. Forcing is only meaningful for cache databases.
|
||||
*
|
||||
* The 'now' field is ignored if 'db' is a zone database. If 'db' is
|
||||
* a cache database, then the added rdataset will expire no later than
|
||||
* now + rdataset->ttl.
|
||||
*
|
||||
* If 'addedrdataset' is not NULL, then it will be attached to the
|
||||
* resulting new rdataset in the database.
|
||||
* resulting new rdataset in the database, or to the existing data if
|
||||
* the existing data was better.
|
||||
*
|
||||
* Requires:
|
||||
*
|
||||
|
|
@ -1003,7 +1009,8 @@ dns_db_addrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
|
|||
* read-write version, or the database has cache semantics
|
||||
* and version is NULL.
|
||||
*
|
||||
* If the database has cache semantics, 'merge' must be ISC_FALSE.
|
||||
* If the database has cache semantics, the DNS_DBADD_MERGE option must
|
||||
* not be set.
|
||||
*
|
||||
* Returns:
|
||||
*
|
||||
|
|
|
|||
|
|
@ -2524,8 +2524,7 @@ cache_findzonecut(dns_db_t *db, dns_name_t *name, unsigned int options,
|
|||
result = dns_rbt_findnode(search.rbtdb->tree, name, foundname, &node,
|
||||
&search.chain, ISC_TRUE, NULL, &search);
|
||||
|
||||
if (result == DNS_R_PARTIALMATCH ||
|
||||
((options & DNS_DBFIND_ONLYANCESTORS) != 0)) {
|
||||
if (result == DNS_R_PARTIALMATCH) {
|
||||
find_ns:
|
||||
result = find_deepest_zonecut(&search, node, nodep, foundname,
|
||||
rdataset, sigrdataset);
|
||||
|
|
@ -2988,7 +2987,7 @@ allrdatasets(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
|
|||
|
||||
static isc_result_t
|
||||
add(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion,
|
||||
rdatasetheader_t *newheader, isc_boolean_t merge, isc_boolean_t loading,
|
||||
rdatasetheader_t *newheader, unsigned int options, isc_boolean_t loading,
|
||||
dns_rdataset_t *addedrdataset, isc_stdtime_t now)
|
||||
{
|
||||
rbtdb_changed_t *changed = NULL;
|
||||
|
|
@ -2998,7 +2997,9 @@ add(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion,
|
|||
isc_boolean_t force = ISC_FALSE;
|
||||
isc_boolean_t header_nx;
|
||||
isc_boolean_t newheader_nx;
|
||||
isc_boolean_t merge;
|
||||
dns_rdatatype_t nxtype, rdtype, covers;
|
||||
dns_trust_t trust;
|
||||
|
||||
/*
|
||||
* Add an rdatasetheader_t to a node.
|
||||
|
|
@ -3008,6 +3009,16 @@ add(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion,
|
|||
* Caller must be holding the node lock.
|
||||
*/
|
||||
|
||||
if ((options & DNS_DBADD_MERGE) != 0)
|
||||
merge = ISC_TRUE;
|
||||
else
|
||||
merge = ISC_FALSE;
|
||||
|
||||
if ((options & DNS_DBADD_FORCE) != 0)
|
||||
trust = dns_trust_authsecure;
|
||||
else
|
||||
trust = newheader->trust;
|
||||
|
||||
if (rbtversion != NULL && !loading) {
|
||||
/*
|
||||
* We always add a changed record, even if no changes end up
|
||||
|
|
@ -3070,7 +3081,7 @@ add(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion,
|
|||
/*
|
||||
* Found one.
|
||||
*/
|
||||
if (newheader->trust < topheader->trust) {
|
||||
if (trust < topheader->trust) {
|
||||
/*
|
||||
* The NXDOMAIN is more trusted.
|
||||
*/
|
||||
|
|
@ -3129,7 +3140,7 @@ add(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion,
|
|||
* Trying to add an rdataset with lower trust to a cache DB
|
||||
* has no effect, provided that the cache data isn't stale.
|
||||
*/
|
||||
if (rbtversion == NULL && newheader->trust < header->trust &&
|
||||
if (rbtversion == NULL && trust < header->trust &&
|
||||
(header->ttl > now || header_nx)) {
|
||||
free_rdataset(rbtdb->common.mctx, newheader);
|
||||
if (addedrdataset != NULL)
|
||||
|
|
@ -3158,10 +3169,6 @@ add(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion,
|
|||
merged = NULL;
|
||||
if (newheader->ttl != header->ttl)
|
||||
force = ISC_TRUE;
|
||||
/*
|
||||
* XXXRTH we're going to have to deal with signatures
|
||||
* somehow here...
|
||||
*/
|
||||
result = dns_rdataslab_merge(
|
||||
(unsigned char *)header,
|
||||
(unsigned char *)newheader,
|
||||
|
|
@ -3279,7 +3286,7 @@ delegating_type(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node,
|
|||
|
||||
static isc_result_t
|
||||
addrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
|
||||
isc_stdtime_t now, dns_rdataset_t *rdataset, isc_boolean_t merge,
|
||||
isc_stdtime_t now, dns_rdataset_t *rdataset, unsigned int options,
|
||||
dns_rdataset_t *addedrdataset)
|
||||
{
|
||||
dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db;
|
||||
|
|
@ -3332,7 +3339,7 @@ addrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
|
|||
|
||||
LOCK(&rbtdb->node_locks[rbtnode->locknum].lock);
|
||||
|
||||
result = add(rbtdb, rbtnode, rbtversion, newheader, merge, ISC_FALSE,
|
||||
result = add(rbtdb, rbtnode, rbtversion, newheader, options, ISC_FALSE,
|
||||
addedrdataset, now);
|
||||
if (result == DNS_R_SUCCESS && delegating)
|
||||
rbtnode->find_callback = 1;
|
||||
|
|
@ -3499,7 +3506,7 @@ deleterdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
|
|||
|
||||
LOCK(&rbtdb->node_locks[rbtnode->locknum].lock);
|
||||
|
||||
result = add(rbtdb, rbtnode, rbtversion, newheader, ISC_FALSE,
|
||||
result = add(rbtdb, rbtnode, rbtversion, newheader, 0,
|
||||
ISC_FALSE, NULL, 0);
|
||||
|
||||
UNLOCK(&rbtdb->node_locks[rbtnode->locknum].lock);
|
||||
|
|
@ -3573,8 +3580,8 @@ loading_addrdataset(void *arg, dns_name_t *name, dns_rdataset_t *rdataset) {
|
|||
newheader->trust = rdataset->trust;
|
||||
newheader->serial = 1;
|
||||
|
||||
result = add(rbtdb, node, rbtdb->current_version, newheader, ISC_TRUE,
|
||||
ISC_TRUE, NULL, 0);
|
||||
result = add(rbtdb, node, rbtdb->current_version, newheader,
|
||||
DNS_DBADD_MERGE, ISC_TRUE, NULL, 0);
|
||||
if (result == DNS_R_SUCCESS &&
|
||||
delegating_type(rbtdb, node, rdataset->type))
|
||||
node->find_callback = 1;
|
||||
|
|
|
|||
Loading…
Reference in a new issue