isc_result_t
dns_rdataslab_fromrdataset(dns_rdataset_t *rdataset, isc_mem_t *mctx,
isc_region_t *region, uint32_t limit);
-isc_result_t
-dns_rdataslab_raw_fromrdataset(dns_rdataset_t *rdataset, isc_mem_t *mctx,
- isc_region_t *region, uint32_t limit);
/*%<
* Allocate space for a slab to hold the data in rdataset, and copy the
* data into it. The resulting slab will be returned in 'region'.
*
- * The dns_rdataslab_raw_fromrdataset() function allocates and fills only
- * the memory needed for a raw slab. dns_rdataslab_fromrdataset() also
- * allocates space for a dns_slabheader object, and partially initializes
+ * dns_rdataslab_fromrdataset() allocates space for a dns_slabheader object
+ * and the memory needed for a raw slab, and partially initializes
* it, setting the type, trust, and TTL fields to match rdataset->type,
* rdataset->covers, rdataset->trust, and rdataset->ttl. (Note that the
* last field needs to be overridden when used in the cache database,
*\li The number of bytes in the slab, plus the header.
*/
-unsigned int
-dns_rdataslab_sizeraw(unsigned char *slab);
-/*%<
- * Return the total size of the raw rdataslab 'slab'.
- *
- * Requires:
- *\li 'slab' points to a raw slab.
- *
- * Returns:
- *\li The number of bytes in the slab.
- */
-
unsigned int
dns_rdataslab_count(dns_slabheader_t *header);
/*%<
result = dns_rdataset_getnoqname(rdataset, &name, &neg, &negsig);
RUNTIME_CHECK(result == ISC_R_SUCCESS);
- result = dns_rdataslab_raw_fromrdataset(&neg, mctx, &r1, maxrrperset);
+ result = dns_rdataslab_fromrdataset(&neg, mctx, &r1, maxrrperset);
if (result != ISC_R_SUCCESS) {
goto cleanup;
}
- result = dns_rdataslab_raw_fromrdataset(&negsig, mctx, &r2,
- maxrrperset);
+ result = dns_rdataslab_fromrdataset(&negsig, mctx, &r2, maxrrperset);
if (result != ISC_R_SUCCESS) {
goto cleanup;
}
noqname = isc_mem_get(mctx, sizeof(*noqname));
*noqname = (dns_slabheader_proof_t){
- .neg = r1.base,
- .negsig = r2.base,
+ .neg = dns_slabheader_raw((dns_slabheader_t *)r1.base),
+ .negsig = dns_slabheader_raw((dns_slabheader_t *)r2.base),
.type = neg.type,
.name = DNS_NAME_INITEMPTY,
};
result = dns_rdataset_getclosest(rdataset, &name, &neg, &negsig);
RUNTIME_CHECK(result == ISC_R_SUCCESS);
- result = dns_rdataslab_raw_fromrdataset(&neg, mctx, &r1, maxrrperset);
+ result = dns_rdataslab_fromrdataset(&neg, mctx, &r1, maxrrperset);
if (result != ISC_R_SUCCESS) {
goto cleanup;
}
- result = dns_rdataslab_raw_fromrdataset(&negsig, mctx, &r2,
- maxrrperset);
+ result = dns_rdataslab_fromrdataset(&negsig, mctx, &r2, maxrrperset);
if (result != ISC_R_SUCCESS) {
goto cleanup;
}
closest = isc_mem_get(mctx, sizeof(*closest));
*closest = (dns_slabheader_proof_t){
- .neg = r1.base,
- .negsig = r2.base,
+ .neg = dns_slabheader_raw((dns_slabheader_t *)r1.base),
+ .negsig = dns_slabheader_raw((dns_slabheader_t *)r2.base),
.name = DNS_NAME_INITEMPTY,
.type = neg.type,
};
static isc_result_t
makeslab(dns_rdataset_t *rdataset, isc_mem_t *mctx, isc_region_t *region,
- uint32_t maxrrperset, bool raw) {
+ uint32_t maxrrperset) {
/*
* Use &removed as a sentinel pointer for duplicate
* rdata as rdata.data == NULL is valid.
static unsigned char removed;
dns_rdata_t *rdata = NULL;
unsigned char *rawbuf = NULL;
- unsigned int headerlen = raw ? 0 : sizeof(dns_slabheader_t);
+ unsigned int headerlen = sizeof(dns_slabheader_t);
unsigned int buflen;
isc_result_t result;
unsigned int nitems;
unsigned int nalloc;
unsigned int length;
- unsigned int i;
+ size_t i;
+ size_t rdatasize;
buflen = headerlen + 2;
* Remember the original number of items.
*/
nalloc = nitems;
- rdata = isc_mem_cget(mctx, nalloc, sizeof(rdata[0]));
+
+ RUNTIME_CHECK(!ISC_OVERFLOW_MUL(nalloc, sizeof(rdata[0]), &rdatasize));
+ rdata = isc_mem_get(mctx, rdatasize);
/*
* Save all of the rdata members into an array.
* Allocate the memory, set up a buffer, start copying in
* data.
*/
- rawbuf = isc_mem_cget(mctx, 1, buflen);
+ rawbuf = isc_mem_get(mctx, buflen);
region->base = rawbuf;
region->length = buflen;
result = ISC_R_SUCCESS;
free_rdatas:
- isc_mem_cput(mctx, rdata, nalloc, sizeof(rdata[0]));
+ isc_mem_put(mctx, rdata, rdatasize);
return result;
}
isc_region_t *region, uint32_t maxrrperset) {
isc_result_t result;
- result = makeslab(rdataset, mctx, region, maxrrperset, false);
+ result = makeslab(rdataset, mctx, region, maxrrperset);
if (result == ISC_R_SUCCESS) {
dns_slabheader_t *new = (dns_slabheader_t *)region->base;
return result;
}
-isc_result_t
-dns_rdataslab_raw_fromrdataset(dns_rdataset_t *rdataset, isc_mem_t *mctx,
- isc_region_t *region, uint32_t maxrrperset) {
- return makeslab(rdataset, mctx, region, maxrrperset, true);
-}
-
unsigned int
-dns_rdataslab_sizeraw(unsigned char *slab) {
- REQUIRE(slab != NULL);
+dns_rdataslab_size(dns_slabheader_t *header) {
+ REQUIRE(header != NULL);
+
+ unsigned char *slab = (unsigned char *)header +
+ sizeof(dns_slabheader_t);
+ INSIST(slab != NULL);
unsigned char *current = slab;
uint16_t count = get_uint16(current);
current += length;
}
- return (unsigned int)(current - slab);
-}
-
-unsigned int
-dns_rdataslab_size(dns_slabheader_t *header) {
- REQUIRE(header != NULL);
-
- unsigned char *s = (unsigned char *)header + sizeof(dns_slabheader_t);
- return dns_rdataslab_sizeraw(s) + sizeof(dns_slabheader_t);
+ return (unsigned int)(current - slab) + sizeof(dns_slabheader_t);
}
unsigned int
}
void
-dns_slabheader_freeproof(isc_mem_t *mctx, dns_slabheader_proof_t **proof) {
- if (dns_name_dynamic(&(*proof)->name)) {
- dns_name_free(&(*proof)->name, mctx);
+dns_slabheader_freeproof(isc_mem_t *mctx, dns_slabheader_proof_t **proofp) {
+ unsigned int buflen;
+ uint8_t *rawbuf;
+ dns_slabheader_proof_t *proof = *proofp;
+ *proofp = NULL;
+
+ if (dns_name_dynamic(&proof->name)) {
+ dns_name_free(&proof->name, mctx);
}
- if ((*proof)->neg != NULL) {
- isc_mem_put(mctx, (*proof)->neg,
- dns_rdataslab_sizeraw((*proof)->neg));
+ if (proof->neg != NULL) {
+ rawbuf = proof->neg;
+ rawbuf -= sizeof(dns_slabheader_t);
+ buflen = dns_rdataslab_size((dns_slabheader_t *)rawbuf);
+
+ isc_mem_put(mctx, rawbuf, buflen);
}
- if ((*proof)->negsig != NULL) {
- isc_mem_put(mctx, (*proof)->negsig,
- dns_rdataslab_sizeraw((*proof)->negsig));
+ if (proof->negsig != NULL) {
+ rawbuf = proof->negsig;
+ rawbuf -= sizeof(dns_slabheader_t);
+ buflen = dns_rdataslab_size((dns_slabheader_t *)rawbuf);
+
+ isc_mem_put(mctx, rawbuf, buflen);
}
- isc_mem_put(mctx, *proof, sizeof(**proof));
- *proof = NULL;
+ isc_mem_put(mctx, proof, sizeof(*proof));
}
dns_slabheader_t *
const dns_slabheader_proof_t *noqname = rdataset->slab.noqname;
/*
- * Usually, rdataset->slab.raw refers the data following a
- * dns_slabheader, but in this case it points to a bare
- * rdataslab belonging to the dns_slabheader's `noqname` field.
- * The DNS_RDATASETATTR_NOHEADER attribute is set so that
- * dns_rdataset_getheader() will return NULL, and the _KEEPCASE
- * attribute is set to prevent setownercase and getownercase
- * methods from affecting the case of NSEC/NSEC3 owner names.
+ * The _KEEPCASE attribute is set to prevent setownercase and
+ * getownercase methods from affecting the case of NSEC/NSEC3
+ * owner names.
*/
dns__db_attachnode(db, node,
&(dns_dbnode_t *){ NULL } DNS__DB_FLARG_PASS);
.slab.raw = noqname->neg,
.link = nsec->link,
.count = nsec->count,
- .attributes = nsec->attributes | DNS_RDATASETATTR_KEEPCASE |
- DNS_RDATASETATTR_NOHEADER,
+ .attributes = nsec->attributes | DNS_RDATASETATTR_KEEPCASE,
.magic = nsec->magic,
};
.slab.raw = noqname->negsig,
.link = nsecsig->link,
.count = nsecsig->count,
- .attributes = nsecsig->attributes | DNS_RDATASETATTR_KEEPCASE |
- DNS_RDATASETATTR_NOHEADER,
+ .attributes = nsecsig->attributes | DNS_RDATASETATTR_KEEPCASE,
.magic = nsecsig->magic,
};
.slab.raw = closest->neg,
.link = nsec->link,
.count = nsec->count,
- .attributes = nsec->attributes | DNS_RDATASETATTR_KEEPCASE |
- DNS_RDATASETATTR_NOHEADER,
+ .attributes = nsec->attributes | DNS_RDATASETATTR_KEEPCASE,
.magic = nsec->magic,
};
.slab.raw = closest->negsig,
.link = nsecsig->link,
.count = nsecsig->count,
- .attributes = nsecsig->attributes | DNS_RDATASETATTR_KEEPCASE |
- DNS_RDATASETATTR_NOHEADER,
+ .attributes = nsecsig->attributes | DNS_RDATASETATTR_KEEPCASE,
.magic = nsecsig->magic,
};