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:
@@ -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, ®ion);
|
|
||||||
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(¤t, 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);
|
||||||
|
Reference in New Issue
Block a user