2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-31 06:25:31 +00:00

4341. [bug] 'rndc flushtree' could fail to clean the tree if there

wasn't a node at the specified name. [RT #41846]
This commit is contained in:
Mark Andrews
2016-03-24 11:31:25 +11:00
parent a63461cc4b
commit 6214c3c93a
6 changed files with 31 additions and 19 deletions

View File

@@ -1,3 +1,6 @@
4341. [bug] 'rndc flushtree' could fail to clean the tree if there
wasn't a node at the specified name. [RT #41846]
--- 9.11.0a1 released ---
4341. [bug] Correct the handling of ECS options with

View File

@@ -190,6 +190,22 @@ nrecords=`grep flushtest.example ns2/named_dump.db | grep -v '^;' | egrep '(TXT|
if [ $ret != 0 ]; then echo "I:failed"; fi
status=`expr $status + $ret`
echo "I:check the check that flushname of a partial match works."
ret=0
in_cache txt second2.top1.flushtest.example || ret=1
$RNDC $RNDCOPTS flushtree example
in_cache txt second2.top1.flushtest.example && ret=1
if [ $ret != 0 ]; then echo "I:failed"; fi
status=`expr $status + $ret`
echo "I:check the number of cached records remaining"
ret=0
dump_cache
nrecords=`grep flushtest.example ns2/named_dump.db | grep -v '^;' | egrep '(TXT|ANY)' | wc -l`
[ $nrecords -eq 1 ] || { ret=1; echo "I: found $nrecords records expected 1"; }
if [ $ret != 0 ]; then echo "I:failed"; fi
status=`expr $status + $ret`
echo "I:check flushtree clears adb correctly"
ret=0
load_cache

View File

@@ -1228,6 +1228,8 @@ cleartree(dns_db_t *db, dns_name_t *name) {
goto cleanup;
result = dns_dbiterator_seek(iter, name);
if (result == DNS_R_PARTIALMATCH)
result = dns_dbiterator_next(iter);
if (result != ISC_R_SUCCESS)
goto cleanup;
@@ -1279,7 +1281,7 @@ dns_cache_flushnode(dns_cache_t *cache, dns_name_t *name,
dns_dbnode_t *node = NULL;
dns_db_t *db = NULL;
if (dns_name_equal(name, dns_rootname))
if (tree && dns_name_equal(name, dns_rootname))
return (dns_cache_flush(cache));
LOCK(&cache->lock);

View File

@@ -166,6 +166,8 @@ dns_dbiterator_seek(dns_dbiterator_t *iterator, dns_name_t *name);
* Returns:
*\li #ISC_R_SUCCESS
*\li #ISC_R_NOTFOUND
*\li #DNS_R_PARTIALMATCH
* (node is at name above requested named when name has children)
*
*\li Other results are possible, depending on the DB implementation.
*/

View File

@@ -9204,23 +9204,7 @@ dbiterator_seek(dns_dbiterator_t *iterator, dns_name_t *name) {
}
}
#if 1
if (result == ISC_R_SUCCESS) {
result = dns_rbtnodechain_current(rbtdbiter->current, iname,
origin, NULL);
if (result == ISC_R_SUCCESS) {
rbtdbiter->new_origin = ISC_TRUE;
reference_iter_node(rbtdbiter);
}
} else if (result == DNS_R_PARTIALMATCH) {
result = ISC_R_NOTFOUND;
rbtdbiter->node = NULL;
}
rbtdbiter->result = result;
#else
if (result == ISC_R_SUCCESS || result == DNS_R_PARTIALMATCH) {
isc_result_t tresult;
tresult = dns_rbtnodechain_current(rbtdbiter->current, iname,
origin, NULL);
if (tresult == ISC_R_SUCCESS) {
@@ -9235,7 +9219,6 @@ dbiterator_seek(dns_dbiterator_t *iterator, dns_name_t *name) {
rbtdbiter->result = (result == DNS_R_PARTIALMATCH) ?
ISC_R_SUCCESS : result;
#endif
return (result);
}

View File

@@ -318,7 +318,7 @@ static void test_seek_empty(const atf_tc_t *tc) {
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
result = dns_dbiterator_seek(iter, seekname);
ATF_CHECK_EQ(result, ISC_R_NOTFOUND);
ATF_CHECK_EQ(result, DNS_R_PARTIALMATCH);
dns_dbiterator_destroy(&iter);
dns_db_detach(&db);
@@ -374,6 +374,12 @@ static void test_seek_nx(const atf_tc_t *tc) {
result = make_name("nonexistent." TEST_ORIGIN, seekname);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
result = dns_dbiterator_seek(iter, seekname);
ATF_CHECK_EQ(result, DNS_R_PARTIALMATCH);
result = make_name("nonexistent.", seekname);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
result = dns_dbiterator_seek(iter, seekname);
ATF_CHECK_EQ(result, ISC_R_NOTFOUND);