mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-09-05 09:05:40 +00:00
Local compression fixes to use rbt bitstrings.
This commit is contained in:
@@ -15,7 +15,7 @@
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: compress.c,v 1.12 1999/04/14 17:40:22 halley Exp $ */
|
||||
/* $Id: compress.c,v 1.13 1999/04/28 03:03:55 marka Exp $ */
|
||||
|
||||
#include <config.h>
|
||||
#include <string.h>
|
||||
@@ -42,6 +42,12 @@ void compress_add(dns_rbt_t *root, dns_name_t *prefix,
|
||||
dns_name_t *suffix, isc_uint16_t offset,
|
||||
isc_boolean_t global16, isc_mem_t *mctx);
|
||||
|
||||
#undef MPADRC
|
||||
#ifdef MPADRC
|
||||
isc_buffer_t x;
|
||||
char xxxx[1024];
|
||||
#endif
|
||||
|
||||
/***
|
||||
*** Compression
|
||||
***/
|
||||
@@ -87,7 +93,6 @@ dns_compress_localinit(dns_compress_t *cctx, dns_name_t *owner,
|
||||
isc_buffer_t t;
|
||||
isc_region_t region;
|
||||
|
||||
|
||||
REQUIRE(VALID_CCTX(cctx));
|
||||
REQUIRE(cctx->local == NULL);
|
||||
REQUIRE(dns_name_isabsolute(owner) == ISC_TRUE);
|
||||
@@ -124,6 +129,16 @@ dns_compress_localinit(dns_compress_t *cctx, dns_name_t *owner,
|
||||
if (data == NULL)
|
||||
return (DNS_R_SUCCESS);
|
||||
*data = ll;
|
||||
|
||||
#ifdef MPADRC
|
||||
isc_buffer_init(&x, xxxx, sizeof xxxx,
|
||||
ISC_BUFFERTYPE_TEXT);
|
||||
dns_name_totext(&name, ISC_FALSE, &x);
|
||||
fprintf(stdout,
|
||||
"dns_rbt_addname(local, \"%.*s\", %d)\n",
|
||||
(int)x.used, (char*)x.base, *data);
|
||||
#endif
|
||||
|
||||
result = dns_rbt_addname(cctx->local, &name, data);
|
||||
if (result != DNS_R_SUCCESS) {
|
||||
isc_mem_put(cctx->mctx, data, sizeof *data);
|
||||
@@ -151,11 +166,11 @@ dns_compress_localinit(dns_compress_t *cctx, dns_name_t *owner,
|
||||
* Adding 'bits' to 'll' may exceed the maximum logical
|
||||
* offset index. Throw away bits until ll <= 254.
|
||||
*/
|
||||
ll += bits;
|
||||
ll += bits - 1;
|
||||
while (ll > 254 && bits > 0) {
|
||||
/* clear bit */
|
||||
buf[2 + bits / 8] &= ~(1 << (7 - (bits % 8)));
|
||||
bits--;
|
||||
buf[2 + bits / 8] &= ~(1 << (7 - (bits % 8)));
|
||||
ll--;
|
||||
}
|
||||
/*
|
||||
@@ -175,14 +190,25 @@ dns_compress_localinit(dns_compress_t *cctx, dns_name_t *owner,
|
||||
if (data == NULL)
|
||||
return (DNS_R_SUCCESS);
|
||||
*data = ll;
|
||||
|
||||
#ifdef MPADRC
|
||||
isc_buffer_init(&x, xxxx, sizeof xxxx,
|
||||
ISC_BUFFERTYPE_TEXT);
|
||||
dns_name_totext(&name, ISC_FALSE, &x);
|
||||
fprintf(stdout,
|
||||
"dns_rbt_addname(local, \"%.*s\", %d)\n",
|
||||
(int)x.used, (char *)x.base,
|
||||
*data);
|
||||
#endif
|
||||
|
||||
result = dns_rbt_addname(cctx->local, &name, data);
|
||||
if (result != DNS_R_SUCCESS) {
|
||||
isc_mem_put(cctx->mctx, data, sizeof *data);
|
||||
return (DNS_R_SUCCESS);
|
||||
}
|
||||
/* clear bit */
|
||||
buf[2 + bits / 8] &= ~(1 << (7 - (bits % 8)));
|
||||
bits--;
|
||||
buf[2 + bits / 8] &= ~(1 << (7 - (bits % 8)));
|
||||
ll--;
|
||||
} while (bits > 0);
|
||||
wl++;
|
||||
@@ -249,6 +275,15 @@ dns_compress_findglobal(dns_compress_t *cctx, dns_name_t *name,
|
||||
REQUIRE(dns_name_isabsolute(name) == ISC_TRUE);
|
||||
REQUIRE(offset != NULL);
|
||||
|
||||
|
||||
#ifdef MPADRC
|
||||
isc_buffer_init(&x, xxxx, sizeof xxxx,
|
||||
ISC_BUFFERTYPE_TEXT);
|
||||
dns_name_totext(name, ISC_FALSE, &x);
|
||||
fprintf(stdout, "compress_find(global, name \"%.*s\", ...)\n",
|
||||
(int)x.used, (char*)x.base);
|
||||
#endif
|
||||
|
||||
return (compress_find(cctx->global, name, prefix, suffix, offset,
|
||||
workspace));
|
||||
}
|
||||
@@ -264,6 +299,16 @@ dns_compress_findlocal(dns_compress_t *cctx, dns_name_t *name,
|
||||
|
||||
if (cctx->local == NULL)
|
||||
return (ISC_FALSE);
|
||||
|
||||
#ifdef MPADRC
|
||||
isc_buffer_init(&x, xxxx, sizeof xxxx,
|
||||
ISC_BUFFERTYPE_TEXT);
|
||||
dns_name_totext(name, ISC_FALSE, &x);
|
||||
fprintf(stdout, "compress_find(local, name \"%.*s\", ...)\n",
|
||||
(int)x.used, (char*)x.base);
|
||||
#endif
|
||||
|
||||
|
||||
return (compress_find(cctx->local, name, prefix, suffix, offset,
|
||||
workspace));
|
||||
}
|
||||
@@ -279,12 +324,19 @@ dns_compress_add(dns_compress_t *cctx, dns_name_t *prefix,
|
||||
if (cctx->local != NULL && (cctx->allowed & DNS_COMPRESS_LOCAL) != 0) {
|
||||
REQUIRE(cctx->rdata <= offset);
|
||||
localoffset = offset - cctx->rdata + 256;
|
||||
#ifdef MPADRC
|
||||
fprintf(stdout, "compress_add(local, ...)\n");
|
||||
#endif
|
||||
compress_add(cctx->local, prefix, suffix, localoffset, ISC_TRUE,
|
||||
cctx->mctx);
|
||||
}
|
||||
if ((cctx->edns > -1) || !local)
|
||||
if ((cctx->edns > -1) || !local) {
|
||||
#ifdef MPADRC
|
||||
fprintf(stdout, "compress_add(global, ...)\n");
|
||||
#endif
|
||||
compress_add(cctx->global, prefix, suffix, offset,
|
||||
cctx->global16, cctx->mctx);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
@@ -424,6 +476,16 @@ compress_add(dns_rbt_t *root, dns_name_t *prefix, dns_name_t *suffix,
|
||||
if (data == NULL)
|
||||
return;
|
||||
*data = offset;
|
||||
|
||||
#ifdef MPADRC
|
||||
isc_buffer_init(&x, xxxx, sizeof xxxx,
|
||||
ISC_BUFFERTYPE_TEXT);
|
||||
dns_name_totext(&full, ISC_FALSE, &x);
|
||||
fprintf(stdout,
|
||||
"dns_rbt_addname(root, \"%.*s\", %d)\n",
|
||||
(int)x.used, (char*)x.base, *data);
|
||||
#endif
|
||||
|
||||
result = dns_rbt_addname(root, &full, data);
|
||||
if (result != DNS_R_SUCCESS) {
|
||||
isc_mem_put(mctx, data, sizeof *data);
|
||||
@@ -474,10 +536,19 @@ compress_find(dns_rbt_t *root, dns_name_t *name, dns_name_t *prefix,
|
||||
return (ISC_FALSE);
|
||||
if (data == NULL) /* root label */
|
||||
return (ISC_FALSE);
|
||||
|
||||
#ifdef MPADRC
|
||||
isc_buffer_init(&x, xxxx, sizeof xxxx,
|
||||
ISC_BUFFERTYPE_TEXT);
|
||||
dns_name_totext(foundname, ISC_FALSE, &x);
|
||||
fprintf(stdout, "foundname \"%.*s\" %d\n",
|
||||
(int)x.used, (char*)x.base, *data);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Do we have to do bit string processing?
|
||||
*/
|
||||
dns_name_getlabel(dns_fixedname_name(&found), 0, &foundlabel);
|
||||
dns_name_getlabel(foundname, 0, &foundlabel);
|
||||
foundlabels = dns_name_countlabels(foundname);
|
||||
INSIST(foundlabels > 1); /* root labels are not added to tree */
|
||||
namelabels = dns_name_countlabels(name);
|
||||
@@ -499,6 +570,24 @@ compress_find(dns_rbt_t *root, dns_name_t *name, dns_name_t *prefix,
|
||||
dns_name_getlabelsequence(name, 0, prefixlen, prefix);
|
||||
dns_name_getlabelsequence(foundname, 0, foundlabels, suffix);
|
||||
*offset = *data;
|
||||
|
||||
#ifdef MPADRC
|
||||
if (prefixlen != 0) {
|
||||
isc_buffer_init(&x, xxxx, sizeof xxxx,
|
||||
ISC_BUFFERTYPE_TEXT);
|
||||
dns_name_totext(prefix, ISC_FALSE, &x);
|
||||
fprintf(stdout, "prefix \"%.*s\"\n",
|
||||
(int)x.used, (char*)x.base);
|
||||
} else
|
||||
fprintf(stdout, "prefix <EMPTY>\n");
|
||||
|
||||
isc_buffer_init(&x, xxxx, sizeof xxxx,
|
||||
ISC_BUFFERTYPE_TEXT);
|
||||
dns_name_totext(suffix, ISC_FALSE, &x);
|
||||
fprintf(stdout, "suffix \"%.*s\"\n",
|
||||
(int)x.used, (char*)x.base);
|
||||
#endif
|
||||
|
||||
return (ISC_TRUE);
|
||||
}
|
||||
/* XXX MPA needs to be tested */
|
||||
@@ -525,7 +614,6 @@ compress_find(dns_rbt_t *root, dns_name_t *name, dns_name_t *prefix,
|
||||
*/
|
||||
while (j < bits) {
|
||||
bit = dns_label_getbit(&namelabel, foundbits + j);
|
||||
j++;
|
||||
if (bit)
|
||||
buf[2 + j / 8] |= (1 << (7 - (j % 8)));
|
||||
j++;
|
||||
@@ -533,12 +621,27 @@ compress_find(dns_rbt_t *root, dns_name_t *name, dns_name_t *prefix,
|
||||
buf[0] = DNS_LABELTYPE_BITSTRING;
|
||||
buf[1] = j;
|
||||
region.base = buf;
|
||||
region.length = 2 + j / 8;
|
||||
region.length = 2 + (j + 7) / 8;
|
||||
dns_name_fromregion(&tmpsuffix, ®ion);
|
||||
result = dns_name_concatenate(&tmpprefix, &tmpsuffix, prefix,
|
||||
workspace);
|
||||
if (result != DNS_R_SUCCESS)
|
||||
return (ISC_FALSE);
|
||||
*offset = *data;
|
||||
|
||||
#ifdef MPADRC
|
||||
isc_buffer_init(&x, xxxx, sizeof xxxx,
|
||||
ISC_BUFFERTYPE_TEXT);
|
||||
dns_name_totext(prefix, ISC_FALSE, &x);
|
||||
fprintf(stdout, "prefix \"%.*s\"\n",
|
||||
(int)x.used, (char*)x.base);
|
||||
|
||||
isc_buffer_init(&x, xxxx, sizeof xxxx,
|
||||
ISC_BUFFERTYPE_TEXT);
|
||||
dns_name_totext(suffix, ISC_FALSE, &x);
|
||||
fprintf(stdout, "suffix \"%.*s\"\n",
|
||||
(int)x.used, (char*)x.base);
|
||||
#endif
|
||||
|
||||
return (ISC_TRUE);
|
||||
}
|
||||
|
Reference in New Issue
Block a user