2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-09-04 16:45:24 +00:00

cleanup and simplification

This commit is contained in:
Andreas Gustafsson
2000-09-01 19:59:35 +00:00
parent 321a6df4ff
commit da41917c3f

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.18 2000/09/01 16:39:07 gson Exp $ */ /* $Id: rdataslab.c,v 1.19 2000/09/01 19:59:35 gson Exp $ */
#include <config.h> #include <config.h>
@@ -115,8 +115,8 @@ dns_rdataslab_fromrdataset(dns_rdataset_t *rdataset, isc_mem_t *mctx,
*/ */
rawbuf = isc_mem_get(mctx, buflen); rawbuf = isc_mem_get(mctx, buflen);
if (rawbuf == NULL) { if (rawbuf == NULL) {
isc_mem_put(mctx, rdatas, nalloc * sizeof(dns_rdata_t)); result = ISC_R_NOMEMORY;
return (ISC_R_NOMEMORY); goto free_rdatas;
} }
region->base = rawbuf; region->base = rawbuf;
@@ -134,9 +134,11 @@ dns_rdataslab_fromrdataset(dns_rdataset_t *rdataset, isc_mem_t *mctx,
memcpy(rawbuf, rdatas[i].data, rdatas[i].length); memcpy(rawbuf, rdatas[i].data, rdatas[i].length);
rawbuf += rdatas[i].length; rawbuf += rdatas[i].length;
} }
result = ISC_R_SUCCESS;
free_rdatas:
isc_mem_put(mctx, rdatas, nalloc * sizeof(dns_rdata_t)); isc_mem_put(mctx, rdatas, nalloc * sizeof(dns_rdata_t));
return (ISC_R_SUCCESS); return (result);
} }
unsigned int unsigned int
@@ -159,34 +161,12 @@ dns_rdataslab_size(unsigned char *slab, unsigned int reservelen) {
return ((unsigned int)(current - slab)); return ((unsigned int)(current - slab));
} }
static inline isc_boolean_t /*
rdata_in_slab(unsigned char *slab, unsigned int reservelen, * Make the dns_rdata_t 'rdata' refer to the slab item
dns_rdataclass_t rdclass, dns_rdatatype_t type, * beginning at '*current', which is part of a slab of type
dns_rdata_t *rdata) * 'type' and class 'rdclass', and advance '*current' to
{ * point to the next item in the slab.
unsigned int count, i; */
isc_region_t region;
unsigned char *current;
dns_rdata_t trdata;
current = slab + reservelen;
count = *current++ * 256;
count += *current++;
dns_rdata_init(&trdata);
for (i = 0; i < count; i++) {
region.length = *current++ * 256;
region.length += *current++;
region.base = current;
dns_rdata_fromregion(&trdata, rdclass, type, &region);
current += region.length;
if (dns_rdata_compare(&trdata, rdata) == 0)
return (ISC_TRUE);
}
return (ISC_FALSE);
}
static inline void static inline void
rdata_from_slab(unsigned char **current, rdata_from_slab(unsigned char **current,
dns_rdataclass_t rdclass, dns_rdatatype_t type, dns_rdataclass_t rdclass, dns_rdatatype_t type,
@@ -203,6 +183,34 @@ rdata_from_slab(unsigned char **current,
*current = tcurrent; *current = tcurrent;
} }
/*
* Return true iff 'slab' (slab data of type 'type' and class 'rdclass')
* contains an rdata identical to 'rdata'. This does case insensitive
* comparisons per DNSSEC.
*/
static inline isc_boolean_t
rdata_in_slab(unsigned char *slab, unsigned int reservelen,
dns_rdataclass_t rdclass, dns_rdatatype_t type,
dns_rdata_t *rdata)
{
unsigned int count, i;
unsigned char *current;
dns_rdata_t trdata;
current = slab + reservelen;
count = *current++ * 256;
count += *current++;
dns_rdata_init(&trdata);
for (i = 0; i < count; i++) {
rdata_from_slab(&current, rdclass, type, &trdata);
if (dns_rdata_compare(&trdata, rdata) == 0)
return (ISC_TRUE);
}
return (ISC_FALSE);
}
isc_result_t isc_result_t
dns_rdataslab_merge(unsigned char *oslab, unsigned char *nslab, dns_rdataslab_merge(unsigned char *oslab, unsigned char *nslab,
unsigned int reservelen, isc_mem_t *mctx, unsigned int reservelen, isc_mem_t *mctx,
@@ -218,10 +226,6 @@ dns_rdataslab_merge(unsigned char *oslab, unsigned char *nslab,
unsigned int nadded = 0; unsigned int nadded = 0;
unsigned int nncount = 0; unsigned int nncount = 0;
/*
* Merge 'oslab' and 'nslab'.
*/
/* /*
* XXX Need parameter to allow "delete rdatasets in nslab" merge, * XXX Need parameter to allow "delete rdatasets in nslab" merge,
* or perhaps another merge routine for this purpose. * or perhaps another merge routine for this purpose.
@@ -306,8 +310,8 @@ dns_rdataslab_merge(unsigned char *oslab, unsigned char *nslab,
* Merge the two slabs. * Merge the two slabs.
*/ */
ocurrent = ostart; ocurrent = ostart;
if (ocount > 0) INSIST(ocount != 0);
rdata_from_slab(&ocurrent, rdclass, type, &ordata); rdata_from_slab(&ocurrent, rdclass, type, &ordata);
ncurrent = nslab + reservelen + 2; ncurrent = nslab + reservelen + 2;
if (ncount > 0) { if (ncount > 0) {
@@ -354,6 +358,8 @@ dns_rdataslab_merge(unsigned char *oslab, unsigned char *nslab,
} }
} }
INSIST(tcurrent == tstart + tlength);
*tslabp = tstart; *tslabp = tstart;
return (ISC_R_SUCCESS); return (ISC_R_SUCCESS);
@@ -367,14 +373,9 @@ dns_rdataslab_subtract(unsigned char *mslab, unsigned char *sslab,
{ {
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, count, tlength, tcount;
isc_region_t mregion, sregion;
dns_rdata_t srdata, mrdata; dns_rdata_t srdata, mrdata;
isc_boolean_t removed_something = ISC_FALSE; isc_boolean_t removed_something = ISC_FALSE;
/*
* Subtract 'sslab' from 'mslab'.
*/
REQUIRE(tslabp != NULL && *tslabp == NULL); REQUIRE(tslabp != NULL && *tslabp == NULL);
REQUIRE(mslab != NULL && sslab != NULL); REQUIRE(mslab != NULL && sslab != NULL);
@@ -402,17 +403,11 @@ dns_rdataslab_subtract(unsigned char *mslab, unsigned char *sslab,
* the sslab. * the sslab.
*/ */
do { do {
mregion.length = *mcurrent++ * 256; unsigned char *mrdatabegin = mcurrent;
mregion.length += *mcurrent++; rdata_from_slab(&mcurrent, rdclass, type, &mrdata);
mregion.base = mcurrent;
dns_rdata_fromregion(&mrdata, rdclass, type, &mregion);
scurrent = sstart; scurrent = sstart;
for (count = 0; count < scount; count++) { for (count = 0; count < scount; count++) {
sregion.length = *scurrent++ * 256; rdata_from_slab(&scurrent, rdclass, type, &srdata);
sregion.length += *scurrent++;
sregion.base = scurrent;
dns_rdata_fromregion(&srdata, rdclass, type, &sregion);
scurrent += sregion.length;
if (dns_rdata_compare(&mrdata, &srdata) == 0) if (dns_rdata_compare(&mrdata, &srdata) == 0)
break; break;
} }
@@ -421,11 +416,10 @@ dns_rdataslab_subtract(unsigned char *mslab, unsigned char *sslab,
* This rdata isn't in the sslab, and thus isn't * This rdata isn't in the sslab, and thus isn't
* being subtracted. * being subtracted.
*/ */
tlength += mregion.length + 2; tlength += mcurrent - mrdatabegin;
tcount++; tcount++;
} else } else
removed_something = ISC_TRUE; removed_something = ISC_TRUE;
mcurrent += mregion.length;
mcount--; mcount--;
} while (mcount > 0); } while (mcount > 0);
@@ -463,17 +457,11 @@ dns_rdataslab_subtract(unsigned char *mslab, unsigned char *sslab,
mcount = *mcurrent++ * 256; mcount = *mcurrent++ * 256;
mcount += *mcurrent++; mcount += *mcurrent++;
do { do {
mregion.length = *mcurrent++ * 256; unsigned char *mrdatabegin = mcurrent;
mregion.length += *mcurrent++; rdata_from_slab(&mcurrent, rdclass, type, &mrdata);
mregion.base = mcurrent;
dns_rdata_fromregion(&mrdata, rdclass, type, &mregion);
scurrent = sstart; scurrent = sstart;
for (count = 0; count < scount; count++) { for (count = 0; count < scount; count++) {
sregion.length = *scurrent++ * 256; rdata_from_slab(&scurrent, rdclass, type, &srdata);
sregion.length += *scurrent++;
sregion.base = scurrent;
dns_rdata_fromregion(&srdata, rdclass, type, &sregion);
scurrent += sregion.length;
if (dns_rdata_compare(&mrdata, &srdata) == 0) if (dns_rdata_compare(&mrdata, &srdata) == 0)
break; break;
} }
@@ -482,15 +470,15 @@ dns_rdataslab_subtract(unsigned char *mslab, unsigned char *sslab,
* This rdata isn't in the sslab, and thus should be * This rdata isn't in the sslab, and thus should be
* copied to the tslab. * copied to the tslab.
*/ */
*tcurrent++ = (mregion.length & 0xff00) >> 8; unsigned int length = mcurrent - mrdatabegin;
*tcurrent++ = (mregion.length & 0x00ff); memcpy(tcurrent, mrdatabegin, length);
memcpy(tcurrent, mregion.base, mregion.length); tcurrent += length;
tcurrent += mregion.length;
} }
mcurrent += mregion.length;
mcount--; mcount--;
} while (mcount > 0); } while (mcount > 0);
INSIST(tcurrent == tstart + tlength);
*tslabp = tstart; *tslabp = tstart;
return (ISC_R_SUCCESS); return (ISC_R_SUCCESS);