*/
unsigned int
-dns_rdataslab_size(unsigned char *slab, unsigned int reservelen);
+dns_rdataslab_size(dns_slabheader_t *header);
/*%<
- * Return the total size of an rdataslab.
+ * Return the total size of the rdataslab following 'header'.
*
* Requires:
- *\li 'slab' points to a slab.
+ *\li 'header' points to a slabheader with an rdataslab following it.
*
* Returns:
- *\li The number of bytes in the slab, including the reservelen.
+ *\li The number of bytes in the slab, plus the header.
*/
unsigned int
-dns_rdataslab_rdatasize(unsigned char *slab, unsigned int reservelen);
+dns_rdataslab_sizeraw(unsigned char *slab);
/*%<
- * Return the size of the rdata in an rdataslab.
+ * Return the total size of the raw rdataslab 'slab'.
*
* Requires:
- *\li 'slab' points to a slab.
+ *\li 'slab' points to a raw slab.
+ *
+ * Returns:
+ *\li The number of bytes in the slab.
*/
unsigned int
-dns_rdataslab_count(unsigned char *slab, unsigned int reservelen);
+dns_rdataslab_count(dns_slabheader_t *header);
/*%<
- * Return the number of records in the rdataslab
+ * Return the number of records in the rdataslab following 'header'.
*
* Requires:
- *\li 'slab' points to a slab.
+ *\li 'header' points to a slabheader with an rdataslab following it.
*
* Returns:
*\li The number of records in the slab.
*/
isc_result_t
-dns_rdataslab_merge(unsigned char *oslab, unsigned char *nslab,
- unsigned int reservelen, isc_mem_t *mctx,
- dns_rdataclass_t rdclass, dns_rdatatype_t type,
- unsigned int flags, uint32_t maxrrperset,
- unsigned char **tslabp);
+dns_rdataslab_merge(dns_slabheader_t *oheader, dns_slabheader_t *nheader,
+ isc_mem_t *mctx, dns_rdataclass_t rdclass,
+ dns_rdatatype_t type, unsigned int flags,
+ uint32_t maxrrperset, dns_slabheader_t **theaderp);
/*%<
- * Merge 'oslab' and 'nslab'.
+ * Merge the slabs following 'oheader' and 'nheader'.
*/
isc_result_t
-dns_rdataslab_subtract(unsigned char *mslab, unsigned char *sslab,
- unsigned int reservelen, isc_mem_t *mctx,
- dns_rdataclass_t rdclass, dns_rdatatype_t type,
- unsigned int flags, unsigned char **tslabp);
+dns_rdataslab_subtract(dns_slabheader_t *mheader, dns_slabheader_t *sheader,
+ isc_mem_t *mctx, dns_rdataclass_t rdclass,
+ dns_rdatatype_t type, unsigned int flags,
+ dns_slabheader_t **theaderp);
/*%<
- * Subtract 'sslab' from 'mslab'. If 'exact' is true then all elements
- * of 'sslab' must exist in 'mslab'.
+ * Subtract the slab following 'sheader' from the one following 'mheader'.
+ * If 'exact' is true then all elements from the 'sheader' slab must exist
+ * in the 'mheader' slab.
*
* XXX
* valid flags are DNS_RDATASLAB_EXACT
*/
bool
-dns_rdataslab_equal(dns_slabheader_t *slab1, dns_slabheader_t *slab2);
+dns_rdataslab_equal(dns_slabheader_t *header1, dns_slabheader_t *header2);
/*%<
* Compare two rdataslabs for equality. This does _not_ do a full
* DNSSEC comparison.
*
* Requires:
- *\li 'slab1' and 'slab2' point to slabs.
+ *\li 'header1' and 'header1' point to slab headers followed by slabs.
*
* Returns:
*\li true if the slabs are equal, false otherwise.
*/
bool
-dns_rdataslab_equalx(dns_slabheader_t *slab1, dns_slabheader_t *slab2,
+dns_rdataslab_equalx(dns_slabheader_t *header1, dns_slabheader_t *header2,
dns_rdataclass_t rdclass, dns_rdatatype_t type);
/*%<
* Compare two rdataslabs for DNSSEC equality.
*
* Requires:
- *\li 'slab1' and 'slab2' point to slabs.
+ *\li 'header1' and 'header2' point to slab headers followed by slabs.
*
* Returns:
*\li true if the slabs are equal, #false otherwise.
static uint64_t
recordsize(dns_slabheader_t *header, unsigned int namelen) {
- return dns_rdataslab_rdatasize((unsigned char *)header,
- sizeof(*header)) +
- sizeof(dns_ttl_t) + sizeof(dns_rdatatype_t) +
- sizeof(dns_rdataclass_t) + namelen;
+ return dns_rdataslab_size(header) + sizeof(dns_ttl_t) +
+ sizeof(dns_rdatatype_t) + sizeof(dns_rdataclass_t) + namelen;
}
static void
maybe_update_recordsandsize(bool add, qpz_version_t *version,
dns_slabheader_t *header, unsigned int namelen) {
- unsigned char *hdr = (unsigned char *)header;
- size_t hdrsize = sizeof(*header);
-
if (NONEXISTENT(header)) {
return;
}
RWLOCK(&version->rwlock, isc_rwlocktype_write);
if (add) {
- version->records += dns_rdataslab_count(hdr, hdrsize);
+ version->records += dns_rdataslab_count(header);
version->xfrsize += recordsize(header, namelen);
} else {
- version->records -= dns_rdataslab_count(hdr, hdrsize);
+ version->records -= dns_rdataslab_count(header);
version->xfrsize -= recordsize(header, namelen);
}
RWUNLOCK(&version->rwlock, isc_rwlocktype_write);
dns_slabheader_t *topheader = NULL, *topheader_prev = NULL;
dns_slabheader_t *prioheader = NULL;
dns_slabheader_t *header = NULL;
- unsigned char *merged = NULL;
+ dns_slabheader_t *merged = NULL;
isc_result_t result;
bool merge = false;
uint32_t ntypes;
}
if (result == ISC_R_SUCCESS) {
result = dns_rdataslab_merge(
- (unsigned char *)header,
- (unsigned char *)newheader,
- (unsigned int)(sizeof(*newheader)),
- qpdb->common.mctx, qpdb->common.rdclass,
+ header, newheader, qpdb->common.mctx,
+ qpdb->common.rdclass,
(dns_rdatatype_t)header->type, flags,
qpdb->maxrrperset, &merged);
}
* clean_zone_node() runs.
*/
dns_slabheader_destroy(&newheader);
- newheader = (dns_slabheader_t *)merged;
+ newheader = merged;
dns_slabheader_reset(newheader,
(dns_db_t *)qpdb,
(dns_dbnode_t *)node);
dns_name_t *nodename = dns_fixedname_initname(&fname);
dns_slabheader_t *topheader = NULL, *topheader_prev = NULL;
dns_slabheader_t *header = NULL, *newheader = NULL;
- unsigned char *subresult = NULL;
+ dns_slabheader_t *subresult = NULL;
isc_region_t region;
isc_result_t result;
qpz_changed_t *changed = NULL;
}
if (result == ISC_R_SUCCESS) {
result = dns_rdataslab_subtract(
- (unsigned char *)header,
- (unsigned char *)newheader,
- (unsigned int)(sizeof(*newheader)),
- qpdb->common.mctx, qpdb->common.rdclass,
+ header, newheader, qpdb->common.mctx,
+ qpdb->common.rdclass,
(dns_rdatatype_t)header->type, flags,
&subresult);
}
if (result == ISC_R_SUCCESS) {
dns_slabheader_destroy(&newheader);
- newheader = (dns_slabheader_t *)subresult;
+ newheader = subresult;
dns_slabheader_reset(newheader, db,
(dns_dbnode_t *)node);
dns_slabheader_copycase(newheader, header);
}
unsigned int
-dns_rdataslab_size(unsigned char *slab, unsigned int reservelen) {
+dns_rdataslab_sizeraw(unsigned char *slab) {
REQUIRE(slab != NULL);
- unsigned char *current = slab + reservelen;
+ unsigned char *current = slab;
uint16_t count = get_uint16(current);
while (count-- > 0) {
}
unsigned int
-dns_rdataslab_rdatasize(unsigned char *slab, unsigned int reservelen) {
- REQUIRE(slab != NULL);
-
- uint16_t rdatalen = 0;
- unsigned char *current = slab + reservelen;
- uint16_t count = get_uint16(current);
-
- while (count-- > 0) {
- uint16_t length = get_uint16(current);
- rdatalen += length;
- current += length;
- }
+dns_rdataslab_size(dns_slabheader_t *header) {
+ REQUIRE(header != NULL);
- return rdatalen;
+ unsigned char *s = (unsigned char *)header + sizeof(dns_slabheader_t);
+ return dns_rdataslab_sizeraw(s) + sizeof(dns_slabheader_t);
}
unsigned int
-dns_rdataslab_count(unsigned char *slab, unsigned int reservelen) {
- REQUIRE(slab != NULL);
+dns_rdataslab_count(dns_slabheader_t *header) {
+ REQUIRE(header != NULL);
- unsigned char *current = slab + reservelen;
+ unsigned char *current = (unsigned char *)header + sizeof(*header);
uint16_t count = get_uint16(current);
return count;
}
isc_result_t
-dns_rdataslab_merge(unsigned char *oslab, unsigned char *nslab,
- unsigned int reservelen, isc_mem_t *mctx,
- dns_rdataclass_t rdclass, dns_rdatatype_t type,
- unsigned int flags, uint32_t maxrrperset,
- unsigned char **tslabp) {
+dns_rdataslab_merge(dns_slabheader_t *oheader, dns_slabheader_t *nheader,
+ isc_mem_t *mctx, dns_rdataclass_t rdclass,
+ dns_rdatatype_t type, unsigned int flags,
+ uint32_t maxrrperset, dns_slabheader_t **theaderp) {
+ unsigned char *oslab = (unsigned char *)oheader;
+ unsigned char *nslab = (unsigned char *)nheader;
unsigned char *ocurrent = NULL, *ostart = NULL, *ncurrent = NULL;
unsigned char *tstart = NULL, *tcurrent = NULL, *data = NULL;
unsigned int ocount, ncount, count, olength, tlength, tcount, length;
* or perhaps another merge routine for this purpose.
*/
- REQUIRE(tslabp != NULL && *tslabp == NULL);
+ REQUIRE(theaderp != NULL && *theaderp == NULL);
REQUIRE(oslab != NULL && nslab != NULL);
- ocurrent = oslab + reservelen;
+ ocurrent = oslab + sizeof(dns_slabheader_t);
ocount = get_uint16(ocurrent);
ostart = ocurrent;
- ncurrent = nslab + reservelen;
+ ncurrent = nslab + sizeof(dns_slabheader_t);
ncount = get_uint16(ncurrent);
INSIST(ocount > 0 && ncount > 0);
/*
* Start figuring out the target length and count.
*/
- tlength = reservelen + 2 + olength;
+ tlength = sizeof(dns_slabheader_t) + 2 + olength;
tcount = ocount;
/*
do {
dns_rdata_init(&nrdata);
rdata_from_slab(&ncurrent, rdclass, type, &nrdata);
- if (!rdata_in_slab(oslab, reservelen, rdclass, type, &nrdata)) {
+ if (!rdata_in_slab(oslab, sizeof(dns_slabheader_t), rdclass,
+ type, &nrdata))
+ {
/*
* This rdata isn't in the old slab.
*/
* Copy the reserved area from the new slab.
*/
tstart = isc_mem_get(mctx, tlength);
- memmove(tstart, nslab, reservelen);
- tcurrent = tstart + reservelen;
+ memmove(tstart, nslab, sizeof(dns_slabheader_t));
+ tcurrent = tstart + sizeof(dns_slabheader_t);
/*
* Write the new count.
INSIST(ocount != 0);
rdata_from_slab(&ocurrent, rdclass, type, &ordata);
- ncurrent = nslab + reservelen + 2;
+ ncurrent = nslab + sizeof(dns_slabheader_t) + 2;
if (ncount > 0) {
do {
dns_rdata_reset(&nrdata);
rdata_from_slab(&ncurrent, rdclass, type, &nrdata);
- } while (rdata_in_slab(oslab, reservelen, rdclass, type,
- &nrdata));
+ } while (rdata_in_slab(oslab, sizeof(dns_slabheader_t), rdclass,
+ type, &nrdata));
}
while (oadded < ocount || nadded < ncount) {
dns_rdata_reset(&nrdata);
rdata_from_slab(&ncurrent, rdclass,
type, &nrdata);
- } while (rdata_in_slab(oslab, reservelen,
+ } while (rdata_in_slab(oslab,
+ sizeof(dns_slabheader_t),
rdclass, type, &nrdata));
}
}
INSIST(tcurrent == tstart + tlength);
- *tslabp = tstart;
+ *theaderp = (dns_slabheader_t *)tstart;
return ISC_R_SUCCESS;
}
isc_result_t
-dns_rdataslab_subtract(unsigned char *mslab, unsigned char *sslab,
- unsigned int reservelen, isc_mem_t *mctx,
- dns_rdataclass_t rdclass, dns_rdatatype_t type,
- unsigned int flags, unsigned char **tslabp) {
+dns_rdataslab_subtract(dns_slabheader_t *mheader, dns_slabheader_t *sheader,
+ isc_mem_t *mctx, dns_rdataclass_t rdclass,
+ dns_rdatatype_t type, unsigned int flags,
+ dns_slabheader_t **theaderp) {
+ unsigned char *mslab = (unsigned char *)mheader;
+ unsigned char *sslab = (unsigned char *)sheader;
unsigned char *mcurrent = NULL, *sstart = NULL, *scurrent = NULL;
unsigned char *tstart = NULL, *tcurrent = NULL;
unsigned int mcount, scount, rcount, count, tlength, tcount, i;
dns_rdata_t srdata = DNS_RDATA_INIT;
dns_rdata_t mrdata = DNS_RDATA_INIT;
- REQUIRE(tslabp != NULL && *tslabp == NULL);
+ REQUIRE(theaderp != NULL && *theaderp == NULL);
REQUIRE(mslab != NULL && sslab != NULL);
- mcurrent = mslab + reservelen;
+ mcurrent = mslab + sizeof(dns_slabheader_t);
mcount = get_uint16(mcurrent);
- scurrent = sslab + reservelen;
+ scurrent = sslab + sizeof(dns_slabheader_t);
scount = get_uint16(scurrent);
INSIST(mcount > 0 && scount > 0);
/*
* Start figuring out the target length and count.
*/
- tlength = reservelen + 2;
+ tlength = sizeof(dns_slabheader_t) + 2;
tcount = 0;
rcount = 0;
* Copy the reserved area from the mslab.
*/
tstart = isc_mem_get(mctx, tlength);
- memmove(tstart, mslab, reservelen);
- tcurrent = tstart + reservelen;
+ memmove(tstart, mslab, sizeof(dns_slabheader_t));
+ tcurrent = tstart + sizeof(dns_slabheader_t);
/*
* Write the new count.
/*
* Copy the parts of mslab not in sslab.
*/
- mcurrent = mslab + reservelen;
+ mcurrent = mslab + sizeof(dns_slabheader_t);
mcount = get_uint16(mcurrent);
for (i = 0; i < mcount; i++) {
unsigned char *mrdatabegin = mcurrent;
INSIST(tcurrent == tstart + tlength);
- *tslabp = tstart;
+ *theaderp = (dns_slabheader_t *)tstart;
return ISC_R_SUCCESS;
}
dns_rdataslab_equal(dns_slabheader_t *slab1, dns_slabheader_t *slab2) {
unsigned char *current1 = NULL, *current2 = NULL;
unsigned int count1, count2;
- unsigned int length1, length2;
current1 = (unsigned char *)slab1 + sizeof(dns_slabheader_t);
count1 = get_uint16(current1);
}
while (count1-- > 0) {
- length1 = get_uint16(current1);
- length2 = get_uint16(current2);
+ unsigned int length1 = get_uint16(current1);
+ unsigned int length2 = get_uint16(current2);
if (length1 != length2 ||
memcmp(current1, current2, length1) != 0)
dns_rdataclass_t rdclass, dns_rdatatype_t type) {
unsigned char *current1 = NULL, *current2 = NULL;
unsigned int count1, count2;
- dns_rdata_t rdata1 = DNS_RDATA_INIT;
- dns_rdata_t rdata2 = DNS_RDATA_INIT;
current1 = (unsigned char *)slab1 + sizeof(dns_slabheader_t);
count1 = get_uint16(current1);
}
while (count1-- > 0) {
+ dns_rdata_t rdata1 = DNS_RDATA_INIT;
+ dns_rdata_t rdata2 = DNS_RDATA_INIT;
+
rdata_from_slab(¤t1, rdclass, type, &rdata1);
rdata_from_slab(¤t2, rdclass, type, &rdata2);
if (dns_rdata_compare(&rdata1, &rdata2) != 0) {
return false;
}
- dns_rdata_reset(&rdata1);
- dns_rdata_reset(&rdata2);
}
return true;
}
if (NONEXISTENT(header)) {
size = sizeof(*header);
} else {
- size = dns_rdataslab_size((unsigned char *)header,
- sizeof(*header));
+ size = dns_rdataslab_size(header);
}
isc_mem_put(mctx, header, size);
}
if ((*proof)->neg != NULL) {
isc_mem_put(mctx, (*proof)->neg,
- dns_rdataslab_size((*proof)->neg, 0));
+ dns_rdataslab_sizeraw((*proof)->neg));
}
if ((*proof)->negsig != NULL) {
isc_mem_put(mctx, (*proof)->negsig,
- dns_rdataslab_size((*proof)->negsig, 0));
+ dns_rdataslab_sizeraw((*proof)->negsig));
}
isc_mem_put(mctx, *proof, sizeof(**proof));
*proof = NULL;