2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-29 13:38:26 +00:00

525. [func] New arguement 'exact' for dns_db_subtractrdataset(),

and dns_rdataslab_subtract() requesting that the RR's
                        must exist prior to deletion.  DNS_R_NOTEXACT is
                        returned if the condition is not met.
This commit is contained in:
Mark Andrews 2000-10-18 23:53:31 +00:00
parent e0425840a8
commit b55c30f2de
10 changed files with 49 additions and 25 deletions

View File

@ -1,3 +1,7 @@
525. [func] New arguement 'exact' for dns_db_subtractrdataset(),
and dns_rdataslab_subtract() requesting that the RR's
must exist prior to deletion. DNS_R_NOTEXACT is
returned if the condition is not met.
524. [func] The 'forward' and 'forwarders' statement in 524. [func] The 'forward' and 'forwarders' statement in
non-forward zones should work now. non-forward zones should work now.

View File

@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $Id: db.c,v 1.57 2000/10/17 07:22:29 marka Exp $ */ /* $Id: db.c,v 1.58 2000/10/18 23:53:21 marka Exp $ */
/*** /***
*** Imports *** Imports
@ -589,7 +589,7 @@ dns_db_addrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
isc_result_t isc_result_t
dns_db_subtractrdataset(dns_db_t *db, dns_dbnode_t *node, dns_db_subtractrdataset(dns_db_t *db, dns_dbnode_t *node,
dns_dbversion_t *version, dns_rdataset_t *rdataset, dns_dbversion_t *version, dns_rdataset_t *rdataset,
dns_rdataset_t *newrdataset) isc_boolean_t exact, dns_rdataset_t *newrdataset)
{ {
/* /*
* Remove any rdata in 'rdataset' from 'node' in version 'version' of * Remove any rdata in 'rdataset' from 'node' in version 'version' of
@ -607,7 +607,7 @@ dns_db_subtractrdataset(dns_db_t *db, dns_dbnode_t *node,
! dns_rdataset_isassociated(newrdataset))); ! dns_rdataset_isassociated(newrdataset)));
return ((db->methods->subtractrdataset)(db, node, version, rdataset, return ((db->methods->subtractrdataset)(db, node, version, rdataset,
newrdataset)); exact, newrdataset));
} }
isc_result_t isc_result_t

View File

@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $Id: db.h,v 1.58 2000/08/31 13:00:57 marka Exp $ */ /* $Id: db.h,v 1.59 2000/10/18 23:53:29 marka Exp $ */
#ifndef DNS_DB_H #ifndef DNS_DB_H
#define DNS_DB_H 1 #define DNS_DB_H 1
@ -134,6 +134,7 @@ typedef struct dns_dbmethods {
isc_result_t (*subtractrdataset)(dns_db_t *db, dns_dbnode_t *node, isc_result_t (*subtractrdataset)(dns_db_t *db, dns_dbnode_t *node,
dns_dbversion_t *version, dns_dbversion_t *version,
dns_rdataset_t *rdataset, dns_rdataset_t *rdataset,
isc_boolean_t exact,
dns_rdataset_t *newrdataset); dns_rdataset_t *newrdataset);
isc_result_t (*deleterdataset)(dns_db_t *db, dns_dbnode_t *node, isc_result_t (*deleterdataset)(dns_db_t *db, dns_dbnode_t *node,
dns_dbversion_t *version, dns_dbversion_t *version,
@ -1047,7 +1048,7 @@ dns_db_addrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
isc_result_t isc_result_t
dns_db_subtractrdataset(dns_db_t *db, dns_dbnode_t *node, dns_db_subtractrdataset(dns_db_t *db, dns_dbnode_t *node,
dns_dbversion_t *version, dns_rdataset_t *rdataset, dns_dbversion_t *version, dns_rdataset_t *rdataset,
dns_rdataset_t *newrdataset); isc_boolean_t exact, dns_rdataset_t *newrdataset);
/* /*
* Remove any rdata in 'rdataset' from 'node' in version 'version' of * Remove any rdata in 'rdataset' from 'node' in version 'version' of
* 'db'. * 'db'.
@ -1067,6 +1068,9 @@ dns_db_subtractrdataset(dns_db_t *db, dns_dbnode_t *node,
* 'rdataset' is a valid, associated rdataset with the same class * 'rdataset' is a valid, associated rdataset with the same class
* as 'db'. * as 'db'.
* *
* 'exact' if ISC_TRUE then all rdata in 'rdataset' must exist
* at 'node'.
*
* 'newrdataset' is NULL, or a valid, unassociated rdataset. * 'newrdataset' is NULL, or a valid, unassociated rdataset.
* *
* The database has zone semantics and 'version' is a valid * The database has zone semantics and 'version' is a valid
@ -1078,6 +1082,8 @@ dns_db_subtractrdataset(dns_db_t *db, dns_dbnode_t *node,
* DNS_R_UNCHANGED The operation did not change anything. * DNS_R_UNCHANGED The operation did not change anything.
* DNS_R_NXRRSET All rdata of the same type as those * DNS_R_NXRRSET All rdata of the same type as those
* in 'rdataset' have been deleted. * in 'rdataset' have been deleted.
* DNS_R_NOTEXACT Some part of 'rdataset' did not
* exist and 'exact' was ISC_TRUE.
* *
* Other results are possible, depending upon the database * Other results are possible, depending upon the database
* implementation used. * implementation used.

View File

@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $Id: rdataslab.h,v 1.15 2000/09/01 01:35:21 bwelling Exp $ */ /* $Id: rdataslab.h,v 1.16 2000/10/18 23:53:30 marka Exp $ */
#ifndef DNS_RDATASLAB_H #ifndef DNS_RDATASLAB_H
#define DNS_RDATASLAB_H 1 #define DNS_RDATASLAB_H 1
@ -107,9 +107,10 @@ isc_result_t
dns_rdataslab_subtract(unsigned char *mslab, unsigned char *sslab, dns_rdataslab_subtract(unsigned char *mslab, unsigned char *sslab,
unsigned int reservelen, isc_mem_t *mctx, unsigned int reservelen, isc_mem_t *mctx,
dns_rdataclass_t rdclass, dns_rdatatype_t type, dns_rdataclass_t rdclass, dns_rdatatype_t type,
unsigned char **tslabp); isc_boolean_t exact, unsigned char **tslabp);
/* /*
* Subtract 'sslab' from 'mslab'. * Subtract 'sslab' from 'mslab'. If 'exact' is true then all elements
* of 'sslab' must exist in 'mslab'.
* *
* XXX * XXX
*/ */

View File

@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $Id: result.h,v 1.69 2000/10/17 07:22:38 marka Exp $ */ /* $Id: result.h,v 1.70 2000/10/18 23:53:31 marka Exp $ */
#ifndef DNS_RESULT_H #ifndef DNS_RESULT_H
#define DNS_RESULT_H 1 #define DNS_RESULT_H 1
@ -71,7 +71,7 @@
#define DNS_R_CNAME (ISC_RESULTCLASS_DNS + 32) #define DNS_R_CNAME (ISC_RESULTCLASS_DNS + 32)
#define DNS_R_BADDB (ISC_RESULTCLASS_DNS + 33) #define DNS_R_BADDB (ISC_RESULTCLASS_DNS + 33)
#define DNS_R_ZONECUT (ISC_RESULTCLASS_DNS + 34) #define DNS_R_ZONECUT (ISC_RESULTCLASS_DNS + 34)
#define DNS_R_BADZONE (ISC_RESULTCLASS_DNS + 35) /* XXX MPA*/ #define DNS_R_BADZONE (ISC_RESULTCLASS_DNS + 35)
#define DNS_R_MOREDATA (ISC_RESULTCLASS_DNS + 36) #define DNS_R_MOREDATA (ISC_RESULTCLASS_DNS + 36)
#define DNS_R_UPTODATE (ISC_RESULTCLASS_DNS + 37) #define DNS_R_UPTODATE (ISC_RESULTCLASS_DNS + 37)
#define DNS_R_TSIGVERIFYFAILURE (ISC_RESULTCLASS_DNS + 38) #define DNS_R_TSIGVERIFYFAILURE (ISC_RESULTCLASS_DNS + 38)
@ -103,8 +103,9 @@
#define DNS_R_UNKNOWNOPT (ISC_RESULTCLASS_DNS + 64) #define DNS_R_UNKNOWNOPT (ISC_RESULTCLASS_DNS + 64)
#define DNS_R_UNEXPECTEDID (ISC_RESULTCLASS_DNS + 65) #define DNS_R_UNEXPECTEDID (ISC_RESULTCLASS_DNS + 65)
#define DNS_R_SEENINCLUDE (ISC_RESULTCLASS_DNS + 66) #define DNS_R_SEENINCLUDE (ISC_RESULTCLASS_DNS + 66)
#define DNS_R_NOTEXACT (ISC_RESULTCLASS_DNS + 67)
#define DNS_R_NRESULTS 67 /* Number of results */ #define DNS_R_NRESULTS 68 /* Number of results */
/* /*
* DNS wire format rcodes. * DNS wire format rcodes.

View File

@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $Id: journal.c,v 1.57 2000/08/01 01:22:25 tale Exp $ */ /* $Id: journal.c,v 1.58 2000/10/18 23:53:22 marka Exp $ */
#include <config.h> #include <config.h>
@ -402,6 +402,7 @@ dns_diff_apply(dns_diff_t *diff, dns_db_t *db, dns_dbversion_t *ver)
} else if (op == DNS_DIFFOP_DEL) { } else if (op == DNS_DIFFOP_DEL) {
result = dns_db_subtractrdataset(db, node, ver, result = dns_db_subtractrdataset(db, node, ver,
&rds, &rds,
ISC_TRUE,
NULL); NULL);
} else { } else {
INSIST(0); INSIST(0);

View File

@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $Id: rbtdb.c,v 1.127 2000/10/13 18:55:10 halley Exp $ */ /* $Id: rbtdb.c,v 1.128 2000/10/18 23:53:23 marka Exp $ */
/* /*
* Principal Author: Bob Halley * Principal Author: Bob Halley
@ -3397,7 +3397,8 @@ addrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
static isc_result_t static isc_result_t
subtractrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version, subtractrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
dns_rdataset_t *rdataset, dns_rdataset_t *newrdataset) dns_rdataset_t *rdataset, isc_boolean_t exact,
dns_rdataset_t *newrdataset)
{ {
dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db;
dns_rbtnode_t *rbtnode = (dns_rbtnode_t *)node; dns_rbtnode_t *rbtnode = (dns_rbtnode_t *)node;
@ -3456,7 +3457,7 @@ subtractrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
rbtdb->common.mctx, rbtdb->common.mctx,
rbtdb->common.rdclass, rbtdb->common.rdclass,
(dns_rdatatype_t)header->type, (dns_rdatatype_t)header->type,
&subresult); exact, &subresult);
if (result == ISC_R_SUCCESS) { if (result == ISC_R_SUCCESS) {
free_rdataset(rbtdb->common.mctx, newheader); free_rdataset(rbtdb->common.mctx, newheader);
newheader = (rdatasetheader_t *)subresult; newheader = (rdatasetheader_t *)subresult;

View File

@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $Id: rdataslab.c,v 1.20 2000/09/23 01:05:03 bwelling Exp $ */ /* $Id: rdataslab.c,v 1.21 2000/10/18 23:53:24 marka Exp $ */
#include <config.h> #include <config.h>
@ -363,12 +363,11 @@ isc_result_t
dns_rdataslab_subtract(unsigned char *mslab, unsigned char *sslab, dns_rdataslab_subtract(unsigned char *mslab, unsigned char *sslab,
unsigned int reservelen, isc_mem_t *mctx, unsigned int reservelen, isc_mem_t *mctx,
dns_rdataclass_t rdclass, dns_rdatatype_t type, dns_rdataclass_t rdclass, dns_rdatatype_t type,
unsigned char **tslabp) isc_boolean_t exact, unsigned char **tslabp)
{ {
unsigned char *mcurrent, *sstart, *scurrent, *tstart, *tcurrent; unsigned char *mcurrent, *sstart, *scurrent, *tstart, *tcurrent;
unsigned int mcount, scount, count, tlength, tcount; unsigned int mcount, scount, rcount ,count, tlength, tcount;
dns_rdata_t srdata, mrdata; dns_rdata_t srdata, mrdata;
isc_boolean_t removed_something = ISC_FALSE;
REQUIRE(tslabp != NULL && *tslabp == NULL); REQUIRE(tslabp != NULL && *tslabp == NULL);
REQUIRE(mslab != NULL && sslab != NULL); REQUIRE(mslab != NULL && sslab != NULL);
@ -391,6 +390,7 @@ dns_rdataslab_subtract(unsigned char *mslab, unsigned char *sslab,
*/ */
tlength = reservelen + 2; tlength = reservelen + 2;
tcount = 0; tcount = 0;
rcount = 0;
/* /*
* Add in the length of rdata in the mslab that aren't in * Add in the length of rdata in the mslab that aren't in
@ -413,10 +413,17 @@ dns_rdataslab_subtract(unsigned char *mslab, unsigned char *sslab,
tlength += mcurrent - mrdatabegin; tlength += mcurrent - mrdatabegin;
tcount++; tcount++;
} else } else
removed_something = ISC_TRUE; rcount++;
mcount--; mcount--;
} while (mcount > 0); } while (mcount > 0);
/*
* Check that all the records originally existed. The numeric
* check only works as rdataslabs do not contain duplicates.
*/
if (exact && (rcount != scount))
return (DNS_R_NOTEXACT);
/* /*
* Don't continue if the new rdataslab would be empty. * Don't continue if the new rdataslab would be empty.
*/ */
@ -426,7 +433,7 @@ dns_rdataslab_subtract(unsigned char *mslab, unsigned char *sslab,
/* /*
* If nothing is going to change, we can stop. * If nothing is going to change, we can stop.
*/ */
if (!removed_something) if (rcount == 0)
return (DNS_R_UNCHANGED); return (DNS_R_UNCHANGED);
/* /*

View File

@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $Id: result.c,v 1.75 2000/10/17 07:22:31 marka Exp $ */ /* $Id: result.c,v 1.76 2000/10/18 23:53:26 marka Exp $ */
#include <config.h> #include <config.h>
@ -105,7 +105,8 @@ static const char *text[DNS_R_NRESULTS] = {
"unknown opt attribute record", /* 64 DNS_R_UNKNOWNOPT */ "unknown opt attribute record", /* 64 DNS_R_UNKNOWNOPT */
"unexpected message id", /* 65 DNS_R_UNEXPECTEDID */ "unexpected message id", /* 65 DNS_R_UNEXPECTEDID */
"seen include file" /* 66 DNS_R_SEENINCLUDE */ "seen include file", /* 66 DNS_R_SEENINCLUDE */
"not exact" /* 67 DNS_R_NOTEXACT */
}; };
static const char *rcode_text[DNS_R_NRCODERESULTS] = { static const char *rcode_text[DNS_R_NRCODERESULTS] = {

View File

@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $Id: sdb.c,v 1.11 2000/10/06 21:20:59 bwelling Exp $ */ /* $Id: sdb.c,v 1.12 2000/10/18 23:53:27 marka Exp $ */
/* NOMINUM_PUBLIC_DELETE */ /* NOMINUM_PUBLIC_DELETE */
@ -1031,12 +1031,14 @@ addrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
static isc_result_t static isc_result_t
subtractrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version, subtractrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
dns_rdataset_t *rdataset, dns_rdataset_t *newrdataset) dns_rdataset_t *rdataset, isc_boolean_t exact,
dns_rdataset_t *newrdataset)
{ {
UNUSED(db); UNUSED(db);
UNUSED(node); UNUSED(node);
UNUSED(version); UNUSED(version);
UNUSED(rdataset); UNUSED(rdataset);
UNUSED(exact);
UNUSED(newrdataset); UNUSED(newrdataset);
return (ISC_R_NOTIMPLEMENTED); return (ISC_R_NOTIMPLEMENTED);