diff options
author | dougb <dougb@FreeBSD.org> | 2012-06-04 22:06:29 +0000 |
---|---|---|
committer | dougb <dougb@FreeBSD.org> | 2012-06-04 22:06:29 +0000 |
commit | ea90afcf927db1d8e7cf9775414b82ca13dff8b3 (patch) | |
tree | d529b50a61c8994f1bfeebf8220f6832f3a76810 /lib/dns/rdataslab.c | |
parent | 28648ebad5d82231050fad98edaea0139041dab5 (diff) | |
download | FreeBSD-src-ea90afcf927db1d8e7cf9775414b82ca13dff8b3.zip FreeBSD-src-ea90afcf927db1d8e7cf9775414b82ca13dff8b3.tar.gz |
Vendor import of BIND 9.8.3-P1
Diffstat (limited to 'lib/dns/rdataslab.c')
-rw-r--r-- | lib/dns/rdataslab.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/lib/dns/rdataslab.c b/lib/dns/rdataslab.c index 150d9b8..6fbfdd7 100644 --- a/lib/dns/rdataslab.c +++ b/lib/dns/rdataslab.c @@ -126,6 +126,11 @@ isc_result_t dns_rdataslab_fromrdataset(dns_rdataset_t *rdataset, isc_mem_t *mctx, isc_region_t *region, unsigned int reservelen) { + /* + * Use &removed as a sentinal pointer for duplicate + * rdata as rdata.data == NULL is valid. + */ + static unsigned char removed; struct xrdata *x; unsigned char *rawbuf; #if DNS_RDATASET_FIXED @@ -169,6 +174,7 @@ dns_rdataslab_fromrdataset(dns_rdataset_t *rdataset, isc_mem_t *mctx, INSIST(result == ISC_R_SUCCESS); dns_rdata_init(&x[i].rdata); dns_rdataset_current(rdataset, &x[i].rdata); + INSIST(x[i].rdata.data != &removed); #if DNS_RDATASET_FIXED x[i].order = i; #endif @@ -201,8 +207,7 @@ dns_rdataslab_fromrdataset(dns_rdataset_t *rdataset, isc_mem_t *mctx, */ for (i = 1; i < nalloc; i++) { if (compare_rdata(&x[i-1].rdata, &x[i].rdata) == 0) { - x[i-1].rdata.data = NULL; - x[i-1].rdata.length = 0; + x[i-1].rdata.data = &removed; #if DNS_RDATASET_FIXED /* * Preserve the least order so A, B, A -> A, B @@ -292,7 +297,7 @@ dns_rdataslab_fromrdataset(dns_rdataset_t *rdataset, isc_mem_t *mctx, #endif for (i = 0; i < nalloc; i++) { - if (x[i].rdata.data == NULL) + if (x[i].rdata.data == &removed) continue; #if DNS_RDATASET_FIXED offsettable[x[i].order] = rawbuf - offsetbase; |