diff --git a/bin/named/wire_debug.c b/bin/named/wire_debug.c index 3a90ee390b..4b0cea27e3 100644 --- a/bin/named/wire_debug.c +++ b/bin/named/wire_debug.c @@ -75,6 +75,7 @@ dump_packet(unsigned char *buf, u_int len) dns_message_t message; dns_result_t result; isc_buffer_t source, target; + unsigned int i; rdcount = 0; rlcount = 0; @@ -83,6 +84,17 @@ dump_packet(unsigned char *buf, u_int len) dctx.allowed = DNS_COMPRESS_GLOBAL14; dns_name_init(&dctx.owner_name, NULL); + for (i = 0 ; i < len ; /* */ ) { + fprintf(stdout, "%02x", buf[i]); + if ((++i % 20) == 0) + fputs("\n", stdout); + else + if (i == len) + fputs("\n", stdout); + else + fputs(" ", stdout); + } + isc_buffer_init(&source, buf, len, ISC_BUFFERTYPE_BINARY); isc_buffer_add(&source, len); isc_buffer_init(&target, t, sizeof(t), ISC_BUFFERTYPE_BINARY); @@ -144,8 +156,9 @@ resolve_packet(dns_db_t *db, isc_buffer_t *source, isc_buffer_t *target) dctx.allowed = DNS_COMPRESS_GLOBAL14; dns_name_init(&dctx.owner_name, NULL); - cctx.allowed = DNS_COMPRESS_GLOBAL14; - dns_name_init(&cctx.owner_name, NULL); + result = dns_compress_init(&cctx, -1, db->mctx); + if (result != DNS_R_SUCCESS) + return (result); /* * Expand the name requested into buffer (tbuf) @@ -244,6 +257,7 @@ resolve_packet(dns_db_t *db, isc_buffer_t *source, isc_buffer_t *target) target->used = oldused; } } + dns_compress_invalidate(&cctx); return (DNS_R_SUCCESS); } diff --git a/bin/tests/rdata_test.c b/bin/tests/rdata_test.c index ea6d0b1aac..ace8dfd329 100644 --- a/bin/tests/rdata_test.c +++ b/bin/tests/rdata_test.c @@ -98,8 +98,8 @@ main(int argc, char *argv[]) { } } - memset(&cctx, '0', sizeof cctx); memset(&dctx, '0', sizeof dctx); + dctx.allowed = DNS_COMPRESS_ALL; RUNTIME_CHECK(isc_mem_create(0, 0, &mctx) == ISC_R_SUCCESS); RUNTIME_CHECK(isc_lex_create(mctx, 256, &lex) == ISC_R_SUCCESS); @@ -187,6 +187,7 @@ main(int argc, char *argv[]) { dns_rdata_init(&rdata); isc_buffer_init(&dbuf, inbuf, sizeof(inbuf), ISC_BUFFERTYPE_BINARY); + RUNTIME_CHECK(dns_compress_init(&cctx, -1, mctx) == DNS_R_SUCCESS); result = dns_rdata_fromtext(&rdata, class, type, lex, NULL, ISC_FALSE, &dbuf, NULL); if (result != DNS_R_SUCCESS) { @@ -194,6 +195,7 @@ main(int argc, char *argv[]) { "dns_rdata_fromtext returned %s(%d)\n", dns_result_totext(result), result); fflush(stdout); + dns_compress_invalidate(&cctx); continue; } if (raw) { @@ -219,6 +221,7 @@ main(int argc, char *argv[]) { fprintf(stdout, "dns_rdata_towire returned %s(%d)\n", dns_result_totext(result), result); + dns_compress_invalidate(&cctx); continue; } len = wbuf.used - wbuf.current; @@ -257,6 +260,7 @@ main(int argc, char *argv[]) { "dns_rdata_fromwire returned %s(%d)\n", dns_result_totext(result), result); fflush(stdout); + dns_compress_invalidate(&cctx); continue; } } @@ -285,6 +289,7 @@ main(int argc, char *argv[]) { fprintf(stdout, "\"%.*s\"\n", (int)tbuf.used, (char*)tbuf.base); fflush(stdout); + dns_compress_invalidate(&cctx); if (lasttype == type) { fprintf(stdout, "dns_rdata_compare = %d\n", dns_rdata_compare(&rdata, &last)); diff --git a/doc/design/compression b/doc/design/compression index 259f2690d2..bb6a71dca8 100644 --- a/doc/design/compression +++ b/doc/design/compression @@ -5,7 +5,7 @@ Overview. BIND 4.x and BIND 8.x only had one methods of compression to deal with 14 bit compression. BIND 9 has 3 methods of compression - to deal with 14 bit, 16 bit and local compression. + to deal with 14 bit, 16 bit and local compression (14 and 16 bit). In addition to this the allowed compression methods vary across types and across client revisions thanks to EDNS. @@ -59,20 +59,17 @@ Implementation: We only need to maintain one global RBT as 16 bit compression pointers are either valid or invalid for the whole message. -Functions: - unsigned int - dns_compress_allowed(dns_rdatatype_t type, int edns, - isc_boolean_t isowner); + dns_rdata_towire() will set the allowed methods based on the + edns version. - Returns allowed compression methods based on type, edns, and whether - we are about to compress a owner name. +Functions: dns_result_t - dns_compress_init(dns_compress_t *cctx, isc_boolean_t global16, - isc_mem_t *mctx); + dns_compress_init(dns_compress_t *cctx, int edns, isc_mem_t *mctx); Initalises cctx to empty and sets whether 16 bit global - compression targets are to be added to the global RBT. + compression targets are to be added to the global RBT based on the + edns value. dns_result_t dns_compress_localinit(dns_compress_t *cctx, dns_name_t *owner, @@ -85,12 +82,19 @@ Functions: Free any RBT's and make empty. + dns_compress_localinvalidate(dns_compress_t *cctx); + + Free the local RBT. + void dns_compress_setmethods(dns_compress_t *cctx, unsigned int allowed); unsigned int dns_compress_getmethods(dns_compress_t *cctx); + int + dns_compress_getedns(dns_compress_t *cctx); + dns_result_t dns_name_towire(dns_name_t *name, dns_compress_t *cctx, isc_buffer_t *target); @@ -109,6 +113,33 @@ Functions: isc_mem_t *mctx; /* Required by RBT */ }; + sets allowed based on the value of edns. + + isc_boolean_t + dns_compress_findglobal(dns_compress_t *cctx, dns_name_t *name, + dns_name_t *prefix, dns_name_t *suffix, + isc_uint16_t *offset, isc_buffer_t *workspace); + + isc_boolean_t + dns_compress_findlocal(dns_compress_t *cctx, dns_name_t *name, + dns_name_t *prefix, dns_name_t *suffix, + isc_uint16_t *offset, isc_buffer_t *workspace); + + Find the best best match in the global / local RBT. Returns prefix, + suffix and offset of the bestmatch. Findglobal(), findlocal() + requires as workspace as it may be neccessary to spit a bit stream + label. The result prefix will be such that it can be added to the + wire format followed by a compression pointer pointing to offset. + Suffix is returned so that it is possible to add the compression + pointers via dns_compress_add(). + + void + dns_compress_add(dns_compress_t *cctx, dns_name_t *prefix, + dns_name_t *suffix, isc_uint16_t offset); + + Add compression pointers pointing to lebels (if any) in prefix. + The offset to the first label is passed in offset. + Dependancy: Requires RBT deepest match. diff --git a/doc/dev/rdata.html b/doc/dev/rdata.html index c2a1208875..7cc9ea7024 100644 --- a/doc/dev/rdata.html +++ b/doc/dev/rdata.html @@ -265,6 +265,16 @@ towire_typename(dns_rdata_t *rdata, dns_compress_t *cctx, towire_classname_typename(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target); +

+towire_classname_typename() is required to set the +allowed name compression methods based on EDNS version if there is a +domain name in the rdata. +

+if (dns_compress_getedns(cctx) >= #)
+	dns_compress_setmethods(cctx, DNS_COMPRESS_ALL);
+else
+	dns_compress_setmethods(cctx, DNS_COMPRESS_LOCAL);
+
rdata
diff --git a/lib/dns/compress.c b/lib/dns/compress.c new file mode 100644 index 0000000000..7c63ec9514 --- /dev/null +++ b/lib/dns/compress.c @@ -0,0 +1,439 @@ +/* + * Copyright (C) 1999 Internet Software Consortium. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS + * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE + * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS + * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + */ + + /* $Id: compress.c,v 1.1 1999/02/22 07:23:54 marka Exp $ */ + +#include + +#include +#include +#include + +#include + +#define CCTX_MAGIC 0x43435458U +#define VALID_CCTX(x) ((x) != NULL && (x)->magic == CCTX_MAGIC) + +static void free_offset(void *offset, void *mctx); +isc_boolean_t compress_find(dns_rbt_t *root, dns_name_t *name, + dns_name_t *prefix, dns_name_t *suffix, + isc_uint16_t *offset, + isc_buffer_t *workspace); +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); + + +dns_result_t +dns_compress_init(dns_compress_t *cctx, int edns, isc_mem_t *mctx) +{ + dns_result_t result; + + REQUIRE(cctx != NULL); + REQUIRE(mctx != NULL); + + cctx->allowed = 0; + cctx->rdata = 0; + cctx->global16 = (edns >= 1) ? ISC_TRUE : ISC_FALSE; + cctx->edns = edns; + cctx->local = NULL; + cctx->global = NULL; + result = dns_rbt_create(mctx, free_offset, mctx, &cctx->global); + if (result != DNS_R_SUCCESS) + return (result); + cctx->mctx = mctx; + cctx->magic = CCTX_MAGIC; + return (DNS_R_SUCCESS); +} + +dns_result_t +dns_compress_localinit(dns_compress_t *cctx, dns_name_t *owner, + isc_buffer_t *target) +{ + dns_result_t result; + unsigned int labels; + unsigned int ll, wl; + unsigned int bits; + dns_name_t name; + dns_name_t prefix; + dns_name_t suffix; + dns_label_t label; + isc_uint16_t *data; + unsigned char buf[34]; + unsigned char namebuf[255]; + isc_buffer_t t; + isc_region_t region; + + + REQUIRE(VALID_CCTX(cctx)); + REQUIRE(cctx->local == NULL); + REQUIRE(dns_name_isabsolute(owner) == ISC_TRUE); + REQUIRE(target != NULL); + + result = dns_rbt_create(cctx->mctx, free_offset, cctx->mctx, + &cctx->local); + if (result != DNS_R_SUCCESS) + return (result); + + /* + * Errors from here on are not passed back up. + */ + cctx->rdata = target->used; /* XXX layer violation */ + labels = dns_name_countlabels(owner); + ll = 0; + wl = 0; + dns_name_init(&name, NULL); + dns_name_init(&prefix, NULL); + dns_name_init(&suffix, NULL); + /* + * XXX we should be adding all the logical label in a + * bit stream as well. + * See also compress_add(). + */ + while (labels > 0) { + dns_name_getlabelsequence(owner, wl, labels, &name); + data = isc_mem_get(cctx->mctx, sizeof *data); + if (data != NULL) + return (DNS_R_SUCCESS); + *data = ll; + 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); + } + labels --; + wl++; + ll++; + if (ll > 255) + return (DNS_R_SUCCESS); + dns_name_getlabel(&name, 0, &label); + if (dns_label_type(&label) != dns_labeltype_bitstring) + continue; + bits = dns_label_countbits(&label); + if (bits == 1) + continue; + INSIST(label.length < sizeof buf); + memcpy(buf, label.base, label.length); + region.base = buf; + dns_name_getlabelsequence(owner, wl, labels, &suffix); + do { + /* clear bit */ + buf[2 + bits / 8] &= ~(1 << (7 - (bits % 8))); + bits--; + region.length = 2 + (bits + 7) / 8; + buf[1] = bits; + dns_name_fromregion(&prefix, ®ion); + isc_buffer_init(&t, namebuf, sizeof namebuf, + ISC_BUFFERTYPE_BINARY); + result = dns_name_cat(&prefix, &suffix, &name, &t); + if (result != DNS_R_SUCCESS) + return (DNS_R_SUCCESS); + data = isc_mem_get(cctx->mctx, sizeof *data); + if (data != NULL) + return (DNS_R_SUCCESS); + *data = ll; + 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); + } + ll++; + if (ll > 255) + return (DNS_R_SUCCESS); + } while (bits > 1); + } + return (DNS_R_SUCCESS); +} + +void +dns_compress_invalidate(dns_compress_t *cctx) { + + REQUIRE(VALID_CCTX(cctx)); + + cctx->magic = 0; + if (cctx->global != NULL) + dns_rbt_destroy(&cctx->global); + if (cctx->local != NULL) + dns_rbt_destroy(&cctx->local); + cctx->allowed = 0; + cctx->rdata = 0; + cctx->global16 = ISC_FALSE; + cctx->edns = -1; +} + +void +dns_compress_localinvalidate(dns_compress_t *cctx) { + + REQUIRE(VALID_CCTX(cctx)); + + if (cctx->local != NULL) + dns_rbt_destroy(&cctx->local); +} + +void +dns_compress_setmethods(dns_compress_t *cctx, unsigned int allowed) { + REQUIRE(VALID_CCTX(cctx)); + + if (cctx->edns >= 1 && (allowed & DNS_COMPRESS_GLOBAL14) != 0) + allowed |= DNS_COMPRESS_GLOBAL16; + cctx->allowed = allowed; +} + +unsigned int +dns_compress_getmethods(dns_compress_t *cctx) { + REQUIRE(VALID_CCTX(cctx)); + return (cctx->allowed); +} + +int +dns_compress_getedns(dns_compress_t *cctx) { + REQUIRE(VALID_CCTX(cctx)); + return (cctx->edns); +} + +isc_boolean_t +dns_compress_findglobal(dns_compress_t *cctx, dns_name_t *name, + dns_name_t *prefix, dns_name_t *suffix, + isc_uint16_t *offset, isc_buffer_t *workspace) +{ + REQUIRE(VALID_CCTX(cctx)); + REQUIRE(dns_name_isabsolute(name) == ISC_TRUE); + REQUIRE(offset != NULL); + + return (compress_find(cctx->global, name, prefix, suffix, offset, + workspace)); +} + +isc_boolean_t +dns_compress_findlocal(dns_compress_t *cctx, dns_name_t *name, + dns_name_t *prefix, dns_name_t *suffix, + isc_uint16_t *offset, isc_buffer_t *workspace) +{ + REQUIRE(VALID_CCTX(cctx)); + REQUIRE(dns_name_isabsolute(name) == ISC_TRUE); + REQUIRE(offset != NULL); + + if (cctx->local == NULL) + return (ISC_FALSE); + return (compress_find(cctx->local, name, prefix, suffix, offset, + workspace)); +} + +void +dns_compress_add(dns_compress_t *cctx, dns_name_t *prefix, + dns_name_t *suffix, isc_uint16_t offset) +{ + isc_uint16_t local; + REQUIRE(VALID_CCTX(cctx)); + + if (cctx->local != NULL && (cctx->allowed & DNS_COMPRESS_LOCAL) != 0) { + REQUIRE(cctx->rdata <= offset); + local = offset - cctx->rdata + 256; + compress_add(cctx->local, prefix, suffix, local, ISC_TRUE, + cctx->mctx); + } + compress_add(cctx->global, prefix, suffix, offset, cctx->global16, + cctx->mctx); +} + +void +dns_compress_backout(dns_compress_t *cctx, isc_uint16_t offset) { + REQUIRE(VALID_CCTX(cctx)); + + /* XXX need tree walking code */ +} + +/*** + *** Private + ***/ + +static void +free_offset(void *offset, void *mctx) { + REQUIRE(offset != NULL); + REQUIRE(mctx != NULL); + isc_mem_put(mctx, offset, sizeof(isc_uint16_t)); +} + +/* + * Add the labels in prefix to RBT. + */ +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) +{ + + dns_name_t name; + dns_name_t full; + dns_label_t label; + unsigned int count; + unsigned int start; + unsigned int limit; + isc_uint16_t *data; + dns_result_t result; + unsigned char buffer[255]; + isc_buffer_t target; + dns_offsets_t offsets; + + count = dns_name_countlabels(prefix); + limit = dns_name_isabsolute(prefix) ? 1 : 0; + start = 0; + dns_name_init(&full, offsets); + dns_name_init(&name, NULL); + while (count > limit) { + if (offset >= 16384 && !global16) + break; + dns_name_getlabelsequence(prefix, start, count, &name); + isc_buffer_init(&target, buffer, sizeof buffer, + ISC_BUFFERTYPE_BINARY); + result = dns_name_cat(&name, suffix, &full, &target); + if (result != DNS_R_SUCCESS) + return; + data = isc_mem_get(mctx, sizeof *data); + if (data == NULL) + return; + *data = offset; + result = dns_rbt_addname(root, &full, data); + if (result != DNS_R_SUCCESS) { + isc_mem_put(mctx, data, sizeof *data); + return; + } + dns_name_getlabel(&name, 0, &label); + offset += label.length; + start++; + count--; + } +} + +/* + * Find the loggest match of name in root. + * If match is found return ISC_TRUE. prefix, suffix and offset + * are updated. + * If no match is found return ISC_FALSE. + * XXX should used dns_rbt_findlongestmatch() when written. + */ + +isc_boolean_t +compress_find(dns_rbt_t *root, dns_name_t *name, dns_name_t *prefix, + dns_name_t *suffix, isc_uint16_t *offset, + isc_buffer_t *workspace) +{ + unsigned int count; + unsigned int labels; + unsigned int start; + unsigned int bits; + isc_uint16_t *data; + dns_name_t tmpname; + dns_name_t tmpprefix; + dns_name_t tmpsuffix; + isc_region_t region; + unsigned char buf[255]; + dns_label_t label; + unsigned int i, j; + dns_result_t result; + dns_bitlabel_t bit; + + labels = count = dns_name_countlabels(name); + start = 0; + data = NULL; + bits = 0; + + dns_name_init(&tmpname, NULL); + dns_name_init(&tmpsuffix, NULL); + dns_name_init(&tmpprefix, NULL); + /* Don't look for the root label (count == 1). */ + while (count > 1) { + dns_name_getlabelsequence(name, start, count, &tmpname); + data = dns_rbt_findname(root, &tmpname); + if (data != NULL) + break; + count--; + start++; + if (workspace == NULL) + continue; + dns_name_getlabel(&tmpname, 0, &label); + if (dns_label_type(&label) != dns_labeltype_bitstring) + continue; + bits = dns_label_countbits(&label); + if (bits == 1) { + bits = 0; + continue; + } + INSIST(label.length < sizeof buf); + memcpy(buf, label.base, label.length); + region.base = buf; + dns_name_getlabelsequence(name, start, count, &tmpsuffix); + do { + /* clear lsb */ + buf[2 + bits / 8] &= ~(1 << (7 - (bits % 8))); + bits--; + region.length = 2 + (bits + 7) / 8; + buf[1] = bits; + dns_name_fromregion(&tmpprefix, ®ion); + isc_buffer_clear(workspace); + result = dns_name_cat(&tmpprefix, &tmpsuffix, + &tmpname, workspace); + if (result != DNS_R_SUCCESS) + continue; + data = dns_rbt_findname(root, &tmpname); + if (data != NULL) + break; + if (bits == 1) + bits = 0; + } while (bits > 1); + if (data != NULL) + break; + } + if (data == NULL) + return (ISC_FALSE); + if (bits == 0) { + if (start != 0) + dns_name_getlabelsequence(name, 0, start, prefix); + dns_name_getlabelsequence(name, start, count, suffix); + *offset = *data; + return (ISC_TRUE); + } + *suffix = tmpname; + i = dns_label_countbits(&label); + j = 0; + while (bits < i) { + bit = dns_label_getbit(&label, bits); + bits++; + if (bit) + buf[2 + j / 8] |= (1 << (7 - (j % 8))); + else + buf[2 + j / 8] &= ~(1 << (7 - (j % 8))); + j++; + } + buf[1] = j; + while ((j % 8) != 0) { + buf[2 + j / 8] &= ~(1 << (7 - (j % 8))); + j++; + } + region.base = buf; + region.length = 2 + j / 8; + dns_name_fromregion(&tmpsuffix, ®ion); + if (start == 1) + tmpprefix = *dns_rootname; + else + dns_name_getlabelsequence(name, 0, start - 1, &tmpprefix); + result = dns_name_cat(&tmpprefix, &tmpsuffix, &tmpname, workspace); + if (result != DNS_R_SUCCESS) + return (ISC_FALSE); + dns_name_getlabelsequence(&tmpname, 0, start, prefix); + *offset = *data; + return (ISC_TRUE); +} diff --git a/lib/dns/include/dns/compress.h b/lib/dns/include/dns/compress.h index fd0e957bb2..299ca44cb2 100644 --- a/lib/dns/include/dns/compress.h +++ b/lib/dns/include/dns/compress.h @@ -21,10 +21,14 @@ #include #include +#include +#define DNS_COMPRESS_NONE 0x00 /* no compression */ #define DNS_COMPRESS_GLOBAL14 0x01 /* "normal" compression. */ #define DNS_COMPRESS_GLOBAL16 0x02 /* 16-bit global comp. */ -#define DNS_COMPRESS_LOCAL 0x04 /* Local compression. */ +#define DNS_COMPRESS_GLOBAL 0x03 /* all global comp. */ +#define DNS_COMPRESS_LOCAL 0x04 /* local compression. */ +#define DNS_COMPRESS_ALL 0x07 /* all compression. */ /* * XXX An API for manipulating these structures will be forthcoming. @@ -33,9 +37,14 @@ */ struct dns_compress { - unsigned int allowed; /* Allowed methods. */ - dns_name_t owner_name; /* For local compression. */ - /* XXX compression table here */ + unsigned int magic; /* Magic number. */ + unsigned int allowed; /* Allowed methods. */ + unsigned int rdata; /* Start of local rdata. */ + isc_boolean_t global16; /* 16 bit offsets allowed. */ + int edns; /* Edns version or -1. */ + dns_rbt_t *local; /* Local RBT. */ + dns_rbt_t *global; /* Global RBT. */ + isc_mem_t *mctx; /* Memeory context. */ }; struct dns_decompress { @@ -43,4 +52,172 @@ struct dns_decompress { dns_name_t owner_name; /* For local compression. */ }; +dns_result_t dns_compress_init(dns_compress_t *cctx, int edns, + isc_mem_t *mctx); +/* + * Inialise the compression context structure pointed to by 'cctx'. + * + * Requires: + * 'cctx' is a valid dns_compress_t structure. + * 'mctx' is a initalised memory context. + * Ensures: + * cctx->global is initalised. + * + * Returns: + * DNS_R_SUCCESS + * failures from dns_rbt_create() + */ + +dns_result_t +dns_compress_localinit(dns_compress_t *cctx, dns_name_t *owner, + isc_buffer_t *target); + +/* + * Initalise 'cctx->local'. + * All compression pointers pointing to logical labels in owner. + * Record start of rdata 'target->used'. + * + * Ensures: + * 'cctx->local' is valid. + * + * Requires: + * 'cctx' initaliased + * 'cctx->local' be NULL + * 'owner' is a absolute name + * 'target' is a valid buffer + * + * Returns: + * DNS_R_SUCCESS + * failures from dns_rbt_create() + */ + +void +dns_compress_invalidate(dns_compress_t *cctx); + +/* + * Invalidate the compression structure pointed to by cctx. + * Destroys 'cctx->glocal' and 'cctx->local' RBT. + * + * Requires: + * 'cctx' to be initalised. + */ + +void +dns_compress_localinvalidate(dns_compress_t *cctx); + +/* + * Destroys 'cctx->local'. + * + * Requires: + * 'cctx' to be initalised. + */ + +void +dns_compress_setmethods(dns_compress_t *cctx, unsigned int allowed); + +/* + * Sets allowed compression methods. + * + * Requires: + * 'cctx' to be initalised. + */ + +unsigned int +dns_compress_getmethods(dns_compress_t *cctx); + +/* + * Gets allowed compression methods. + * + * Requires: + * 'cctx' to be initalised. + * + * Returns: + * allowed compression bitmap. + */ + +int +dns_compress_getedns(dns_compress_t *cctx); + +/* + * Gets edns value. + * + * Requires: + * 'cctx' to be initalised. + * + * Returns: + * -1 .. 255 + */ + +isc_boolean_t +dns_compress_findglobal(dns_compress_t *cctx, dns_name_t *name, + dns_name_t *prefix, dns_name_t *suffix, + isc_uint16_t *offset, isc_buffer_t *workspace); +/* + * Finds longest possible match of 'name' in the global compression + * RBT. Workspace needs to be large enough to hold 'name' when split + * in two (length->name + 3). + * + * Requires: + * 'cctx' to be initalised. + * 'name' to be a absolute name. + * 'prefix' to be initalised. + * 'suffix' to be initalised. + * 'offset' to point it a isc_uint16_t. + * 'workspace' to be initalised. + * + * Ensures: + * 'prefix', 'suffix' and 'offset' are valid is ISC_TRUE is + * returned. + * + * Returns: + * ISC_TRUE / ISC_FALSE + */ + +isc_boolean_t +dns_compress_findlocal(dns_compress_t *cctx, dns_name_t *name, + dns_name_t *prefix, dns_name_t *suffix, + isc_uint16_t *offset, isc_buffer_t *workspace); + +/* + * Finds longest possible match of 'name' in the local compression + * RBT. Workspace needs to be large enough to hold 'name' when split + * in two (length->name + 3). + * + * Requires: + * 'cctx' to be initalised. + * 'name' to be a absolute name. + * 'prefix' to be initalised. + * 'suffix' to be initalised. + * 'offset' to point it a isc_uint16_t. + * 'workspace' to be initalised. + * + * Ensures: + * 'prefix', 'suffix' and 'offset' are valid is ISC_TRUE is + * returned. + * + * Returns: + * ISC_TRUE / ISC_FALSE + */ + +void +dns_compress_add(dns_compress_t *cctx, dns_name_t *prefix, + dns_name_t *suffix, isc_uint16_t offset); +/* + * Add compression pointers for labels in prefix to RBT's. + * + * Requires: + * 'cctx' initalised + * 'prefix' to be initalised + */ + +void +dns_compress_backout(dns_compress_t *cctx, isc_uint16_t offset); + +/* + * Remove any compression pointers from global RBT >= offset. + * + * Requires: + * 'cctx' is initalised. + */ + #endif /* DNS_COMPRESS_H */ diff --git a/lib/dns/include/dns/name.h b/lib/dns/include/dns/name.h index d013636ee7..ff38454399 100644 --- a/lib/dns/include/dns/name.h +++ b/lib/dns/include/dns/name.h @@ -663,4 +663,13 @@ dns_result_t dns_name_totext(dns_name_t *name, * DNS_R_NOSPACE */ +dns_result_t dns_name_cat(dns_name_t *prefix, dns_name_t *suffix, + dns_name_t *name, isc_buffer_t *target); +/* + * Concatenate 'prefix' & 'suffix' and return the result in 'name'. + * + * Returns: + * DNS_R_SUCCESS + * DNS_R_NOSPACE + */ #endif /* DNS_NAME_H */ diff --git a/lib/dns/include/dns/rdata.h b/lib/dns/include/dns/rdata.h index 6f02692baf..3f247b4ae1 100644 --- a/lib/dns/include/dns/rdata.h +++ b/lib/dns/include/dns/rdata.h @@ -96,6 +96,7 @@ #include #include #include +#include /***** ***** RData diff --git a/lib/dns/name.c b/lib/dns/name.c index dd9cdc549e..f7d0cce0e0 100644 --- a/lib/dns/name.c +++ b/lib/dns/name.c @@ -1863,6 +1863,19 @@ dns_result_t dns_name_towire(dns_name_t *name, dns_compress_t *cctx, isc_buffer_t *target) { + unsigned int methods; + unsigned int offset; + dns_name_t gp, gs; + dns_name_t lp, ls; + isc_boolean_t gf; + isc_boolean_t lf; + isc_int16_t go; + isc_int16_t lo; + unsigned char gb[257]; + unsigned char lb[257]; + isc_buffer_t gws; + isc_buffer_t lws; + /* * Convert 'name' into wire format, compressing it as specified by the * compression context 'cctx', and storing the result in 'target'. @@ -1872,17 +1885,153 @@ dns_name_towire(dns_name_t *name, dns_compress_t *cctx, REQUIRE(cctx != NULL); REQUIRE(isc_buffer_type(target) == ISC_BUFFERTYPE_BINARY); - /* - * XXX We don't try to compress the name; we just copy the - * uncompressed version into the target buffer. - */ + dns_name_init(&lp, NULL); + dns_name_init(&gp, NULL); + dns_name_init(&ls, NULL); + dns_name_init(&gs, NULL); + isc_buffer_init(&gws, gb, sizeof gb, ISC_BUFFERTYPE_BINARY); + isc_buffer_init(&lws, lb, sizeof lb, ISC_BUFFERTYPE_BINARY); - if (target->length - target->used < name->length) - return (DNS_R_NOSPACE); - (void)memcpy((unsigned char *)target->base + target->used, - name->ndata, (size_t)name->length); + offset = target->used; /*XXX*/ - isc_buffer_add(target, name->length); + methods = dns_compress_getmethods(cctx); + if ((methods & DNS_COMPRESS_GLOBAL) != 0) + gf = dns_compress_findglobal(cctx, name, &gp, &gs, &go, &gws); + else + gf = ISC_FALSE; + + if ((methods & DNS_COMPRESS_LOCAL) != 0) + lf = dns_compress_findlocal(cctx, name, &lp, &ls, &lo, &lws); + else + lf = ISC_FALSE; + + /* find the best compression */ + if (lf && gf) { + if (lp.length < gp.length) + gf = ISC_FALSE; + else + lf = ISC_FALSE; + } + + if (gf) { + if (target->length - target->used < gp.length) + return (DNS_R_NOSPACE); + (void)memcpy((unsigned char *)target->base + target->used, + gp.ndata, (size_t)gp.length); + isc_buffer_add(target, gp.length); + if (go < 16384) { + go |= 0xc000; + if (target->length - target->used < 2) + return (DNS_R_NOSPACE); + isc_buffer_putuint16(target, go); + } else { + if (target->length - target->used < 3) + return (DNS_R_NOSPACE); + *((unsigned char*)target->base + target->used) = + DNS_LABELTYPE_GLOBALCOMP16; + isc_buffer_add(target, 1); + isc_buffer_putuint16(target, go); + } + if (gp.length != 0) + dns_compress_add(cctx, &gp, &gs, offset); + } else if (lf) { + if (target->length - target->used < lp.length) + return (DNS_R_NOSPACE); + (void)memcpy((unsigned char *)target->base + target->used, + lp.ndata, (size_t)lp.length); + isc_buffer_add(target, lp.length); + if (lo < 16384) { + lo |= 0x8000; + if (target->length - target->used < 2) + return (DNS_R_NOSPACE); + isc_buffer_putuint16(target, lo); + } else { + if (target->length - target->used < 3) + return (DNS_R_NOSPACE); + *((unsigned char*)target->base + target->used) = + DNS_LABELTYPE_LOCALCOMP; + isc_buffer_add(target, 1); + isc_buffer_putuint16(target, lo); + } + if (lp.length != 0) + dns_compress_add(cctx, &lp, &ls, offset); + } else { + if (target->length - target->used < name->length) + return (DNS_R_NOSPACE); + (void)memcpy((unsigned char *)target->base + target->used, + name->ndata, (size_t)name->length); + isc_buffer_add(target, name->length); + dns_compress_add(cctx, name, NULL, offset); + } + return (DNS_R_SUCCESS); +} + +dns_result_t +dns_name_cat(dns_name_t *prefix, dns_name_t *suffix, dns_name_t *name, + isc_buffer_t *target) +{ + unsigned char *ndata; + unsigned char *offsets; + dns_offsets_t odata; + unsigned int nrem; + unsigned int labels; + unsigned int count; + + REQUIRE(VALID_NAME(name)); + REQUIRE(VALID_NAME(prefix)); + if (suffix != NULL) + REQUIRE(VALID_NAME(suffix)); + REQUIRE(isc_buffer_type(target) == ISC_BUFFERTYPE_BINARY); + REQUIRE((name->attributes & DNS_NAMEATTR_READONLY) == 0); + + nrem = target->length - target->used; + ndata = (unsigned char *)target->base + target->used; + if (nrem > 255) + nrem = 255; + if (dns_name_isabsolute(prefix)) { + count = prefix->length - 1; + labels = prefix->labels - 1; + } else { + count = prefix->length; + labels = prefix->labels; + } + if (count > nrem) + return (DNS_R_NOSPACE); + memcpy(ndata, prefix->ndata, count); + nrem -= count; + ndata += count; + + /* append suffix */ + if (suffix != NULL) { + if (dns_name_isabsolute(suffix)) { + count = suffix->length - 1; + labels += suffix->labels - 1; + } else { + count = suffix->length; + labels += suffix->labels; + } + if (count > nrem) + return (DNS_R_NOSPACE); + memcpy(ndata, suffix->ndata, count); + ndata += count; + } + + /* root label */ + if (nrem < 1) + return (DNS_R_NOSPACE); + *ndata++ = 0; + labels++; + + name->ndata = (unsigned char *)target->base + target->used; + name->labels = labels; + name->length = ndata - name->ndata; + name->attributes |= DNS_NAMEATTR_ABSOLUTE; + + INIT_OFFSETS(name, offsets, odata); + set_offsets(name, offsets, ISC_FALSE, ISC_FALSE, ISC_FALSE); + compact(name, offsets); + + isc_buffer_add(target, name->length); return (DNS_R_SUCCESS); } diff --git a/lib/dns/rbt.c b/lib/dns/rbt.c index 5c9a90a191..af14d8d0ec 100644 --- a/lib/dns/rbt.c +++ b/lib/dns/rbt.c @@ -253,7 +253,7 @@ dns_rbt_addnode(dns_rbt_t *rbt, dns_name_t *name, dns_rbtnode_t **nodep) { int compared, add_labels, current_labels, keep_labels, start_label; dns_result_t result; dns_rbtnodechain_t chain; - dns_offsets_t o1, o2; + dns_offsets_t o1, o2, new_offset; isc_region_t r; REQUIRE(VALID_RBT(rbt)); @@ -410,7 +410,7 @@ dns_rbt_addnode(dns_rbt_t *rbt, dns_name_t *name, dns_rbtnode_t **nodep) { start_label = 0; keep_labels = current_labels - compared; - dns_name_init(&new_name, NULL); + dns_name_init(&new_name, new_offset); dns_name_getlabelsequence(¤t_name, start_label, keep_labels, diff --git a/lib/dns/rdata.c b/lib/dns/rdata.c index 9e77caa7fb..e66150e045 100644 --- a/lib/dns/rdata.c +++ b/lib/dns/rdata.c @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: rdata.c,v 1.35 1999/02/16 22:42:23 marka Exp $ */ + /* $Id: rdata.c,v 1.36 1999/02/22 07:23:57 marka Exp $ */ #include @@ -296,9 +296,11 @@ dns_rdata_towire(dns_rdata_t *rdata, dns_compress_t *cctx, dns_result_t result = DNS_R_NOTIMPLEMENTED; isc_boolean_t use_default = ISC_FALSE; isc_region_t tr; + isc_buffer_t st; REQUIRE(rdata != NULL); REQUIRE(isc_buffer_type(target) == ISC_BUFFERTYPE_BINARY); + st = *target; TOWIRESWITCH @@ -310,6 +312,10 @@ dns_rdata_towire(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_add(target, rdata->length); return (DNS_R_SUCCESS); } + if (result != DNS_R_SUCCESS) { + *target = st; + dns_compress_backout(cctx, target->used); + } return (result); } diff --git a/lib/dns/rdata/any_255/tsig_250.c b/lib/dns/rdata/any_255/tsig_250.c index a6b9409896..60e8fba979 100644 --- a/lib/dns/rdata/any_255/tsig_250.c +++ b/lib/dns/rdata/any_255/tsig_250.c @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: tsig_250.c,v 1.5 1999/02/16 22:42:23 marka Exp $ */ + /* $Id: tsig_250.c,v 1.6 1999/02/22 07:23:59 marka Exp $ */ /* draft-ietf-dnsind-tsig-07.txt */ @@ -234,7 +234,10 @@ towire_any_tsig(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) REQUIRE(rdata->type == 250); REQUIRE(rdata->class == 255); - cctx = cctx; /*unused*/ + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_NONE); dns_rdata_toregion(rdata, &sr); dns_name_init(&name, NULL); diff --git a/lib/dns/rdata/any_255/tsig_250.h b/lib/dns/rdata/any_255/tsig_250.h index d057a4c975..1ddbf309cc 100644 --- a/lib/dns/rdata/any_255/tsig_250.h +++ b/lib/dns/rdata/any_255/tsig_250.h @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: tsig_250.h,v 1.5 1999/02/16 22:42:23 marka Exp $ */ + /* $Id: tsig_250.h,v 1.6 1999/02/22 07:23:59 marka Exp $ */ /* draft-ietf-dnsind-tsig-07.txt */ @@ -234,7 +234,10 @@ towire_any_tsig(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) REQUIRE(rdata->type == 250); REQUIRE(rdata->class == 255); - cctx = cctx; /*unused*/ + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_NONE); dns_rdata_toregion(rdata, &sr); dns_name_init(&name, NULL); diff --git a/lib/dns/rdata/generic/afsdb_18.c b/lib/dns/rdata/generic/afsdb_18.c index 2744983eeb..5df369f670 100644 --- a/lib/dns/rdata/generic/afsdb_18.c +++ b/lib/dns/rdata/generic/afsdb_18.c @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: afsdb_18.c,v 1.3 1999/02/16 22:42:23 marka Exp $ */ + /* $Id: afsdb_18.c,v 1.4 1999/02/22 07:23:59 marka Exp $ */ /* RFC 1183 */ @@ -108,6 +108,11 @@ towire_afsdb(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 18); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_NONE); + isc_buffer_available(target, &tr); dns_rdata_toregion(rdata, &sr); if (tr.length < 2) diff --git a/lib/dns/rdata/generic/afsdb_18.h b/lib/dns/rdata/generic/afsdb_18.h index afaf0c53f8..d8f778f438 100644 --- a/lib/dns/rdata/generic/afsdb_18.h +++ b/lib/dns/rdata/generic/afsdb_18.h @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: afsdb_18.h,v 1.3 1999/02/16 22:42:23 marka Exp $ */ + /* $Id: afsdb_18.h,v 1.4 1999/02/22 07:23:59 marka Exp $ */ /* RFC 1183 */ @@ -108,6 +108,11 @@ towire_afsdb(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 18); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_NONE); + isc_buffer_available(target, &tr); dns_rdata_toregion(rdata, &sr); if (tr.length < 2) diff --git a/lib/dns/rdata/generic/cname_5.c b/lib/dns/rdata/generic/cname_5.c index 174b29889b..3ba4d9c70d 100644 --- a/lib/dns/rdata/generic/cname_5.c +++ b/lib/dns/rdata/generic/cname_5.c @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: cname_5.c,v 1.9 1999/02/16 22:51:17 marka Exp $ */ + /* $Id: cname_5.c,v 1.10 1999/02/22 07:23:59 marka Exp $ */ #ifndef RDATA_GENERIC_CNAME_5_H #define RDATA_GENERIC_CNAME_5_H @@ -84,6 +84,11 @@ towire_cname(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 5); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14); + dns_name_init(&name, NULL); dns_rdata_toregion(rdata, ®ion); dns_name_fromregion(&name, ®ion); diff --git a/lib/dns/rdata/generic/cname_5.h b/lib/dns/rdata/generic/cname_5.h index 8dff940d4d..d0325099f3 100644 --- a/lib/dns/rdata/generic/cname_5.h +++ b/lib/dns/rdata/generic/cname_5.h @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: cname_5.h,v 1.9 1999/02/16 22:51:17 marka Exp $ */ + /* $Id: cname_5.h,v 1.10 1999/02/22 07:23:59 marka Exp $ */ #ifndef RDATA_GENERIC_CNAME_5_H #define RDATA_GENERIC_CNAME_5_H @@ -84,6 +84,11 @@ towire_cname(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 5); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14); + dns_name_init(&name, NULL); dns_rdata_toregion(rdata, ®ion); dns_name_fromregion(&name, ®ion); diff --git a/lib/dns/rdata/generic/dname_39.c b/lib/dns/rdata/generic/dname_39.c index 1e8c3a13ea..db1fccbb42 100644 --- a/lib/dns/rdata/generic/dname_39.c +++ b/lib/dns/rdata/generic/dname_39.c @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: dname_39.c,v 1.2 1999/02/15 05:44:16 marka Exp $ */ + /* $Id: dname_39.c,v 1.3 1999/02/22 07:24:00 marka Exp $ */ /* draft-ietf-dnsind-dname-02.txt */ @@ -84,6 +84,11 @@ towire_dname(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 39); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_NONE); + dns_name_init(&name, NULL); dns_rdata_toregion(rdata, ®ion); dns_name_fromregion(&name, ®ion); diff --git a/lib/dns/rdata/generic/dname_39.h b/lib/dns/rdata/generic/dname_39.h index 3433400166..a7dac412d5 100644 --- a/lib/dns/rdata/generic/dname_39.h +++ b/lib/dns/rdata/generic/dname_39.h @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: dname_39.h,v 1.2 1999/02/15 05:44:16 marka Exp $ */ + /* $Id: dname_39.h,v 1.3 1999/02/22 07:24:00 marka Exp $ */ /* draft-ietf-dnsind-dname-02.txt */ @@ -84,6 +84,11 @@ towire_dname(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 39); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_NONE); + dns_name_init(&name, NULL); dns_rdata_toregion(rdata, ®ion); dns_name_fromregion(&name, ®ion); diff --git a/lib/dns/rdata/generic/mb_7.c b/lib/dns/rdata/generic/mb_7.c index 352c9b8d1f..dbe4a2fae8 100644 --- a/lib/dns/rdata/generic/mb_7.c +++ b/lib/dns/rdata/generic/mb_7.c @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: mb_7.c,v 1.9 1999/02/16 22:51:18 marka Exp $ */ + /* $Id: mb_7.c,v 1.10 1999/02/22 07:24:00 marka Exp $ */ #ifndef RDATA_GENERIC_MB_7_H #define RDATA_GENERIC_MB_7_H @@ -84,6 +84,11 @@ towire_mb(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 7); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14); + dns_name_init(&name, NULL); dns_rdata_toregion(rdata, ®ion); dns_name_fromregion(&name, ®ion); diff --git a/lib/dns/rdata/generic/mb_7.h b/lib/dns/rdata/generic/mb_7.h index acf09bc5bd..6fdb08589c 100644 --- a/lib/dns/rdata/generic/mb_7.h +++ b/lib/dns/rdata/generic/mb_7.h @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: mb_7.h,v 1.9 1999/02/16 22:51:18 marka Exp $ */ + /* $Id: mb_7.h,v 1.10 1999/02/22 07:24:00 marka Exp $ */ #ifndef RDATA_GENERIC_MB_7_H #define RDATA_GENERIC_MB_7_H @@ -84,6 +84,11 @@ towire_mb(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 7); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14); + dns_name_init(&name, NULL); dns_rdata_toregion(rdata, ®ion); dns_name_fromregion(&name, ®ion); diff --git a/lib/dns/rdata/generic/md_3.c b/lib/dns/rdata/generic/md_3.c index b15b3ffc93..3a7c983670 100644 --- a/lib/dns/rdata/generic/md_3.c +++ b/lib/dns/rdata/generic/md_3.c @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: md_3.c,v 1.9 1999/02/16 22:51:18 marka Exp $ */ + /* $Id: md_3.c,v 1.10 1999/02/22 07:24:00 marka Exp $ */ #ifndef RDATA_GENERIC_MD_3_H #define RDATA_GENERIC_MD_3_H @@ -82,6 +82,11 @@ towire_md(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 3); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14); + dns_name_init(&name, NULL); dns_rdata_toregion(rdata, ®ion); dns_name_fromregion(&name, ®ion); diff --git a/lib/dns/rdata/generic/md_3.h b/lib/dns/rdata/generic/md_3.h index 2d652e11cf..1992bfb375 100644 --- a/lib/dns/rdata/generic/md_3.h +++ b/lib/dns/rdata/generic/md_3.h @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: md_3.h,v 1.9 1999/02/16 22:51:18 marka Exp $ */ + /* $Id: md_3.h,v 1.10 1999/02/22 07:24:00 marka Exp $ */ #ifndef RDATA_GENERIC_MD_3_H #define RDATA_GENERIC_MD_3_H @@ -82,6 +82,11 @@ towire_md(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 3); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14); + dns_name_init(&name, NULL); dns_rdata_toregion(rdata, ®ion); dns_name_fromregion(&name, ®ion); diff --git a/lib/dns/rdata/generic/mf_4.c b/lib/dns/rdata/generic/mf_4.c index ff25680004..82f256a609 100644 --- a/lib/dns/rdata/generic/mf_4.c +++ b/lib/dns/rdata/generic/mf_4.c @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: mf_4.c,v 1.8 1999/02/16 22:42:26 marka Exp $ */ + /* $Id: mf_4.c,v 1.9 1999/02/22 07:24:00 marka Exp $ */ #ifndef RDATA_GENERIC_MF_4_H #define RDATA_GENERIC_MF_4_H @@ -82,6 +82,11 @@ towire_mf(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 4); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14); + dns_name_init(&name, NULL); dns_rdata_toregion(rdata, ®ion); dns_name_fromregion(&name, ®ion); diff --git a/lib/dns/rdata/generic/mf_4.h b/lib/dns/rdata/generic/mf_4.h index c13f16b654..7aa95d296f 100644 --- a/lib/dns/rdata/generic/mf_4.h +++ b/lib/dns/rdata/generic/mf_4.h @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: mf_4.h,v 1.8 1999/02/16 22:42:26 marka Exp $ */ + /* $Id: mf_4.h,v 1.9 1999/02/22 07:24:00 marka Exp $ */ #ifndef RDATA_GENERIC_MF_4_H #define RDATA_GENERIC_MF_4_H @@ -82,6 +82,11 @@ towire_mf(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 4); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14); + dns_name_init(&name, NULL); dns_rdata_toregion(rdata, ®ion); dns_name_fromregion(&name, ®ion); diff --git a/lib/dns/rdata/generic/mg_8.c b/lib/dns/rdata/generic/mg_8.c index c015120602..43b417a31a 100644 --- a/lib/dns/rdata/generic/mg_8.c +++ b/lib/dns/rdata/generic/mg_8.c @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: mg_8.c,v 1.8 1999/02/16 22:42:27 marka Exp $ */ + /* $Id: mg_8.c,v 1.9 1999/02/22 07:24:01 marka Exp $ */ #ifndef RDATA_GENERIC_MG_8_H #define RDATA_GENERIC_MG_8_H @@ -84,6 +84,11 @@ towire_mg(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 8); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14); + dns_name_init(&name, NULL); dns_rdata_toregion(rdata, ®ion); dns_name_fromregion(&name, ®ion); diff --git a/lib/dns/rdata/generic/mg_8.h b/lib/dns/rdata/generic/mg_8.h index 418d0ac801..6bf85b1b2f 100644 --- a/lib/dns/rdata/generic/mg_8.h +++ b/lib/dns/rdata/generic/mg_8.h @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: mg_8.h,v 1.8 1999/02/16 22:42:27 marka Exp $ */ + /* $Id: mg_8.h,v 1.9 1999/02/22 07:24:01 marka Exp $ */ #ifndef RDATA_GENERIC_MG_8_H #define RDATA_GENERIC_MG_8_H @@ -84,6 +84,11 @@ towire_mg(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 8); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14); + dns_name_init(&name, NULL); dns_rdata_toregion(rdata, ®ion); dns_name_fromregion(&name, ®ion); diff --git a/lib/dns/rdata/generic/minfo_14.c b/lib/dns/rdata/generic/minfo_14.c index 2ac7a03ab7..4e878e9e7d 100644 --- a/lib/dns/rdata/generic/minfo_14.c +++ b/lib/dns/rdata/generic/minfo_14.c @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: minfo_14.c,v 1.9 1999/02/16 22:42:27 marka Exp $ */ + /* $Id: minfo_14.c,v 1.10 1999/02/22 07:24:01 marka Exp $ */ #ifndef RDATA_GENERIC_MINFO_14_H #define RDATA_GENERIC_MINFO_14_H @@ -106,6 +106,11 @@ towire_minfo(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 14); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14); + dns_name_init(&rmail, NULL); dns_name_init(&email, NULL); diff --git a/lib/dns/rdata/generic/minfo_14.h b/lib/dns/rdata/generic/minfo_14.h index b5b1a81197..244a333f99 100644 --- a/lib/dns/rdata/generic/minfo_14.h +++ b/lib/dns/rdata/generic/minfo_14.h @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: minfo_14.h,v 1.9 1999/02/16 22:42:27 marka Exp $ */ + /* $Id: minfo_14.h,v 1.10 1999/02/22 07:24:01 marka Exp $ */ #ifndef RDATA_GENERIC_MINFO_14_H #define RDATA_GENERIC_MINFO_14_H @@ -106,6 +106,11 @@ towire_minfo(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 14); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14); + dns_name_init(&rmail, NULL); dns_name_init(&email, NULL); diff --git a/lib/dns/rdata/generic/mr_9.c b/lib/dns/rdata/generic/mr_9.c index 65a4f3b0c1..f2e28b2302 100644 --- a/lib/dns/rdata/generic/mr_9.c +++ b/lib/dns/rdata/generic/mr_9.c @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: mr_9.c,v 1.8 1999/02/16 22:42:27 marka Exp $ */ + /* $Id: mr_9.c,v 1.9 1999/02/22 07:24:01 marka Exp $ */ #ifndef RDATA_GENERIC_MR_9_H #define RDATA_GENERIC_MR_9_H @@ -84,6 +84,11 @@ towire_mr(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 9); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14); + dns_name_init(&name, NULL); dns_rdata_toregion(rdata, ®ion); dns_name_fromregion(&name, ®ion); diff --git a/lib/dns/rdata/generic/mr_9.h b/lib/dns/rdata/generic/mr_9.h index 18ebb1ab20..19a7acf24e 100644 --- a/lib/dns/rdata/generic/mr_9.h +++ b/lib/dns/rdata/generic/mr_9.h @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: mr_9.h,v 1.8 1999/02/16 22:42:27 marka Exp $ */ + /* $Id: mr_9.h,v 1.9 1999/02/22 07:24:01 marka Exp $ */ #ifndef RDATA_GENERIC_MR_9_H #define RDATA_GENERIC_MR_9_H @@ -84,6 +84,11 @@ towire_mr(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 9); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14); + dns_name_init(&name, NULL); dns_rdata_toregion(rdata, ®ion); dns_name_fromregion(&name, ®ion); diff --git a/lib/dns/rdata/generic/mx_15.c b/lib/dns/rdata/generic/mx_15.c index 18184c3048..49a440640c 100644 --- a/lib/dns/rdata/generic/mx_15.c +++ b/lib/dns/rdata/generic/mx_15.c @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: mx_15.c,v 1.11 1999/02/16 22:42:28 marka Exp $ */ + /* $Id: mx_15.c,v 1.12 1999/02/22 07:24:01 marka Exp $ */ #ifndef RDATA_GENERIC_MX_15_H #define RDATA_GENERIC_MX_15_H @@ -105,6 +105,11 @@ towire_mx(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 15); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14); + isc_buffer_available(target, &tr); dns_rdata_toregion(rdata, ®ion); if (tr.length < 2) diff --git a/lib/dns/rdata/generic/mx_15.h b/lib/dns/rdata/generic/mx_15.h index 59e6eb76f0..dc93db7fd4 100644 --- a/lib/dns/rdata/generic/mx_15.h +++ b/lib/dns/rdata/generic/mx_15.h @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: mx_15.h,v 1.11 1999/02/16 22:42:28 marka Exp $ */ + /* $Id: mx_15.h,v 1.12 1999/02/22 07:24:01 marka Exp $ */ #ifndef RDATA_GENERIC_MX_15_H #define RDATA_GENERIC_MX_15_H @@ -105,6 +105,11 @@ towire_mx(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 15); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14); + isc_buffer_available(target, &tr); dns_rdata_toregion(rdata, ®ion); if (tr.length < 2) diff --git a/lib/dns/rdata/generic/ns_2.c b/lib/dns/rdata/generic/ns_2.c index 74b49e3f64..4fc123e019 100644 --- a/lib/dns/rdata/generic/ns_2.c +++ b/lib/dns/rdata/generic/ns_2.c @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: ns_2.c,v 1.8 1999/02/16 22:42:28 marka Exp $ */ + /* $Id: ns_2.c,v 1.9 1999/02/22 07:24:02 marka Exp $ */ #ifndef RDATA_GENERIC_NS_2_H #define RDATA_GENERIC_NS_2_H @@ -84,6 +84,11 @@ towire_ns(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 2); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14); + dns_name_init(&name, NULL); dns_rdata_toregion(rdata, ®ion); dns_name_fromregion(&name, ®ion); diff --git a/lib/dns/rdata/generic/ns_2.h b/lib/dns/rdata/generic/ns_2.h index 7a22b60ace..71edd2ea2e 100644 --- a/lib/dns/rdata/generic/ns_2.h +++ b/lib/dns/rdata/generic/ns_2.h @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: ns_2.h,v 1.8 1999/02/16 22:42:28 marka Exp $ */ + /* $Id: ns_2.h,v 1.9 1999/02/22 07:24:02 marka Exp $ */ #ifndef RDATA_GENERIC_NS_2_H #define RDATA_GENERIC_NS_2_H @@ -84,6 +84,11 @@ towire_ns(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 2); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14); + dns_name_init(&name, NULL); dns_rdata_toregion(rdata, ®ion); dns_name_fromregion(&name, ®ion); diff --git a/lib/dns/rdata/generic/nxt_30.c b/lib/dns/rdata/generic/nxt_30.c index 7c64504ab4..ee55a3e680 100644 --- a/lib/dns/rdata/generic/nxt_30.c +++ b/lib/dns/rdata/generic/nxt_30.c @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: nxt_30.c,v 1.5 1999/02/16 22:42:28 marka Exp $ */ + /* $Id: nxt_30.c,v 1.6 1999/02/22 07:24:02 marka Exp $ */ /* RFC 2065 */ @@ -146,6 +146,11 @@ towire_nxt(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 30); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_NONE); + dns_name_init(&name, NULL); dns_rdata_toregion(rdata, &sr); dns_name_fromregion(&name, &sr); diff --git a/lib/dns/rdata/generic/nxt_30.h b/lib/dns/rdata/generic/nxt_30.h index f96e2d69af..0c5842938c 100644 --- a/lib/dns/rdata/generic/nxt_30.h +++ b/lib/dns/rdata/generic/nxt_30.h @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: nxt_30.h,v 1.5 1999/02/16 22:42:28 marka Exp $ */ + /* $Id: nxt_30.h,v 1.6 1999/02/22 07:24:02 marka Exp $ */ /* RFC 2065 */ @@ -146,6 +146,11 @@ towire_nxt(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 30); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_NONE); + dns_name_init(&name, NULL); dns_rdata_toregion(rdata, &sr); dns_name_fromregion(&name, &sr); diff --git a/lib/dns/rdata/generic/proforma.c b/lib/dns/rdata/generic/proforma.c index 83d55012b5..930b553ddd 100644 --- a/lib/dns/rdata/generic/proforma.c +++ b/lib/dns/rdata/generic/proforma.c @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: proforma.c,v 1.6 1999/02/16 22:51:19 marka Exp $ */ + /* $Id: proforma.c,v 1.7 1999/02/22 07:24:02 marka Exp $ */ #ifndef RDATA_GENERIC_#_#_H #define RDATA_GENERIC_#_#_H @@ -60,6 +60,11 @@ towire_#(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == #); REQUIRE(rdata->class == #); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL): + else + dns_compress_setmethods(cctx, DNS_COMPRESS_LOCAL); + return (DNS_R_NOTIMPLEMENTED); } diff --git a/lib/dns/rdata/generic/proforma.h b/lib/dns/rdata/generic/proforma.h index 9f787a5137..ad4449ba56 100644 --- a/lib/dns/rdata/generic/proforma.h +++ b/lib/dns/rdata/generic/proforma.h @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: proforma.h,v 1.6 1999/02/16 22:51:19 marka Exp $ */ + /* $Id: proforma.h,v 1.7 1999/02/22 07:24:02 marka Exp $ */ #ifndef RDATA_GENERIC_#_#_H #define RDATA_GENERIC_#_#_H @@ -60,6 +60,11 @@ towire_#(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == #); REQUIRE(rdata->class == #); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL): + else + dns_compress_setmethods(cctx, DNS_COMPRESS_LOCAL); + return (DNS_R_NOTIMPLEMENTED); } diff --git a/lib/dns/rdata/generic/ptr_12.c b/lib/dns/rdata/generic/ptr_12.c index 3548d58f03..d772476c03 100644 --- a/lib/dns/rdata/generic/ptr_12.c +++ b/lib/dns/rdata/generic/ptr_12.c @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: ptr_12.c,v 1.9 1999/02/16 22:51:19 marka Exp $ */ + /* $Id: ptr_12.c,v 1.10 1999/02/22 07:24:02 marka Exp $ */ #ifndef RDATA_GENERIC_PTR_12_H #define RDATA_GENERIC_PTR_12_H @@ -84,6 +84,11 @@ towire_ptr(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 12); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14); + dns_name_init(&name, NULL); dns_rdata_toregion(rdata, ®ion); dns_name_fromregion(&name, ®ion); diff --git a/lib/dns/rdata/generic/ptr_12.h b/lib/dns/rdata/generic/ptr_12.h index a373ea87ee..164c88c7a8 100644 --- a/lib/dns/rdata/generic/ptr_12.h +++ b/lib/dns/rdata/generic/ptr_12.h @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: ptr_12.h,v 1.9 1999/02/16 22:51:19 marka Exp $ */ + /* $Id: ptr_12.h,v 1.10 1999/02/22 07:24:02 marka Exp $ */ #ifndef RDATA_GENERIC_PTR_12_H #define RDATA_GENERIC_PTR_12_H @@ -84,6 +84,11 @@ towire_ptr(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 12); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14); + dns_name_init(&name, NULL); dns_rdata_toregion(rdata, ®ion); dns_name_fromregion(&name, ®ion); diff --git a/lib/dns/rdata/generic/rp_17.c b/lib/dns/rdata/generic/rp_17.c index 21361376ce..651d1b95e2 100644 --- a/lib/dns/rdata/generic/rp_17.c +++ b/lib/dns/rdata/generic/rp_17.c @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: rp_17.c,v 1.3 1999/02/16 22:42:29 marka Exp $ */ + /* $Id: rp_17.c,v 1.4 1999/02/22 07:24:03 marka Exp $ */ /* RFC 1183 */ @@ -108,6 +108,11 @@ towire_rp(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 17); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_NONE); + dns_name_init(&rmail, NULL); dns_name_init(&email, NULL); diff --git a/lib/dns/rdata/generic/rp_17.h b/lib/dns/rdata/generic/rp_17.h index 42b2b1fa5a..3d470a42c4 100644 --- a/lib/dns/rdata/generic/rp_17.h +++ b/lib/dns/rdata/generic/rp_17.h @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: rp_17.h,v 1.3 1999/02/16 22:42:29 marka Exp $ */ + /* $Id: rp_17.h,v 1.4 1999/02/22 07:24:03 marka Exp $ */ /* RFC 1183 */ @@ -108,6 +108,11 @@ towire_rp(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 17); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_NONE); + dns_name_init(&rmail, NULL); dns_name_init(&email, NULL); diff --git a/lib/dns/rdata/generic/rt_21.c b/lib/dns/rdata/generic/rt_21.c index 7a0900d53a..a462a87b68 100644 --- a/lib/dns/rdata/generic/rt_21.c +++ b/lib/dns/rdata/generic/rt_21.c @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: rt_21.c,v 1.3 1999/02/16 22:42:29 marka Exp $ */ + /* $Id: rt_21.c,v 1.4 1999/02/22 07:24:03 marka Exp $ */ /* RFC 1183 */ @@ -107,6 +107,11 @@ towire_rt(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 21); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_NONE); + isc_buffer_available(target, &tr); dns_rdata_toregion(rdata, ®ion); if (tr.length < 2) diff --git a/lib/dns/rdata/generic/rt_21.h b/lib/dns/rdata/generic/rt_21.h index cbc1ae95bd..099a18d985 100644 --- a/lib/dns/rdata/generic/rt_21.h +++ b/lib/dns/rdata/generic/rt_21.h @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: rt_21.h,v 1.3 1999/02/16 22:42:29 marka Exp $ */ + /* $Id: rt_21.h,v 1.4 1999/02/22 07:24:03 marka Exp $ */ /* RFC 1183 */ @@ -107,6 +107,11 @@ towire_rt(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 21); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_NONE); + isc_buffer_available(target, &tr); dns_rdata_toregion(rdata, ®ion); if (tr.length < 2) diff --git a/lib/dns/rdata/generic/sig_24.c b/lib/dns/rdata/generic/sig_24.c index 45165cf4b4..3f3b3eebfb 100644 --- a/lib/dns/rdata/generic/sig_24.c +++ b/lib/dns/rdata/generic/sig_24.c @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: sig_24.c,v 1.7 1999/02/16 22:42:29 marka Exp $ */ + /* $Id: sig_24.c,v 1.8 1999/02/22 07:24:03 marka Exp $ */ /* RFC 2065 */ @@ -216,6 +216,11 @@ towire_sig(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 24); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_NONE); + dns_rdata_toregion(rdata, &sr); /* * type covered: 2 diff --git a/lib/dns/rdata/generic/sig_24.h b/lib/dns/rdata/generic/sig_24.h index 25e429569b..09323e3b0f 100644 --- a/lib/dns/rdata/generic/sig_24.h +++ b/lib/dns/rdata/generic/sig_24.h @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: sig_24.h,v 1.7 1999/02/16 22:42:29 marka Exp $ */ + /* $Id: sig_24.h,v 1.8 1999/02/22 07:24:03 marka Exp $ */ /* RFC 2065 */ @@ -216,6 +216,11 @@ towire_sig(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 24); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_NONE); + dns_rdata_toregion(rdata, &sr); /* * type covered: 2 diff --git a/lib/dns/rdata/generic/soa_6.c b/lib/dns/rdata/generic/soa_6.c index 640722ce35..84ceedbad6 100644 --- a/lib/dns/rdata/generic/soa_6.c +++ b/lib/dns/rdata/generic/soa_6.c @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: soa_6.c,v 1.12 1999/02/16 22:51:19 marka Exp $ */ + /* $Id: soa_6.c,v 1.13 1999/02/22 07:24:04 marka Exp $ */ #ifndef RDATA_GENERIC_SOA_6_H #define RDATA_GENERIC_SOA_6_H @@ -142,6 +142,11 @@ towire_soa(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 6); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14); + dns_name_init(&mname, NULL); dns_name_init(&rname, NULL); diff --git a/lib/dns/rdata/generic/soa_6.h b/lib/dns/rdata/generic/soa_6.h index e8a418af93..4f6287b94e 100644 --- a/lib/dns/rdata/generic/soa_6.h +++ b/lib/dns/rdata/generic/soa_6.h @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: soa_6.h,v 1.12 1999/02/16 22:51:19 marka Exp $ */ + /* $Id: soa_6.h,v 1.13 1999/02/22 07:24:04 marka Exp $ */ #ifndef RDATA_GENERIC_SOA_6_H #define RDATA_GENERIC_SOA_6_H @@ -142,6 +142,11 @@ towire_soa(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 6); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14); + dns_name_init(&mname, NULL); dns_name_init(&rname, NULL); diff --git a/lib/dns/rdata/generic/tkey_249.c b/lib/dns/rdata/generic/tkey_249.c index cf10a9b2fb..f56ae9f7fd 100644 --- a/lib/dns/rdata/generic/tkey_249.c +++ b/lib/dns/rdata/generic/tkey_249.c @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: tkey_249.c,v 1.5 1999/02/15 05:44:20 marka Exp $ */ + /* $Id: tkey_249.c,v 1.6 1999/02/22 07:24:04 marka Exp $ */ /* draft-ietf-dnssec-tkey-01.txt */ @@ -224,6 +224,11 @@ towire_tkey(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 249); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_NONE); + /* Algorithm */ dns_rdata_toregion(rdata, &sr); dns_name_init(&name, NULL); diff --git a/lib/dns/rdata/generic/tkey_249.h b/lib/dns/rdata/generic/tkey_249.h index c95231ae07..be591e2a74 100644 --- a/lib/dns/rdata/generic/tkey_249.h +++ b/lib/dns/rdata/generic/tkey_249.h @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: tkey_249.h,v 1.5 1999/02/15 05:44:20 marka Exp $ */ + /* $Id: tkey_249.h,v 1.6 1999/02/22 07:24:04 marka Exp $ */ /* draft-ietf-dnssec-tkey-01.txt */ @@ -224,6 +224,11 @@ towire_tkey(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 249); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_NONE); + /* Algorithm */ dns_rdata_toregion(rdata, &sr); dns_name_init(&name, NULL); diff --git a/lib/dns/rdata/in_1/a6_38.c b/lib/dns/rdata/in_1/a6_38.c index 2386cef295..6a7a7f6f46 100644 --- a/lib/dns/rdata/in_1/a6_38.c +++ b/lib/dns/rdata/in_1/a6_38.c @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: a6_38.c,v 1.5 1999/02/16 22:42:31 marka Exp $ */ + /* $Id: a6_38.c,v 1.6 1999/02/22 07:24:04 marka Exp $ */ /* draft-ietf-ipngwg-dns-lookups-03.txt */ @@ -188,6 +188,11 @@ towire_in_a6(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 38); REQUIRE(rdata->class == 1); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_NONE); + dns_rdata_toregion(rdata, &sr); prefixlen = sr.base[0]; INSIST(prefixlen <= 128); diff --git a/lib/dns/rdata/in_1/a6_38.h b/lib/dns/rdata/in_1/a6_38.h index c9a2be37bd..2b7ef2df93 100644 --- a/lib/dns/rdata/in_1/a6_38.h +++ b/lib/dns/rdata/in_1/a6_38.h @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: a6_38.h,v 1.5 1999/02/16 22:42:31 marka Exp $ */ + /* $Id: a6_38.h,v 1.6 1999/02/22 07:24:04 marka Exp $ */ /* draft-ietf-ipngwg-dns-lookups-03.txt */ @@ -188,6 +188,11 @@ towire_in_a6(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 38); REQUIRE(rdata->class == 1); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_NONE); + dns_rdata_toregion(rdata, &sr); prefixlen = sr.base[0]; INSIST(prefixlen <= 128); diff --git a/lib/dns/rdata/in_1/kx_36.c b/lib/dns/rdata/in_1/kx_36.c index 64e7de70bf..2ed40b820a 100644 --- a/lib/dns/rdata/in_1/kx_36.c +++ b/lib/dns/rdata/in_1/kx_36.c @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: kx_36.c,v 1.3 1999/02/16 22:42:32 marka Exp $ */ + /* $Id: kx_36.c,v 1.4 1999/02/22 07:24:04 marka Exp $ */ /* RFC 2230 */ @@ -101,6 +101,11 @@ towire_in_kx(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 36); REQUIRE(rdata->class == 1); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_NONE); + dns_rdata_toregion(rdata, ®ion); RETERR(mem_tobuffer(target, region.base, 2)); isc_region_consume(®ion, 2); diff --git a/lib/dns/rdata/in_1/kx_36.h b/lib/dns/rdata/in_1/kx_36.h index 06aa79b883..caed89be18 100644 --- a/lib/dns/rdata/in_1/kx_36.h +++ b/lib/dns/rdata/in_1/kx_36.h @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: kx_36.h,v 1.3 1999/02/16 22:42:32 marka Exp $ */ + /* $Id: kx_36.h,v 1.4 1999/02/22 07:24:04 marka Exp $ */ /* RFC 2230 */ @@ -101,6 +101,11 @@ towire_in_kx(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 36); REQUIRE(rdata->class == 1); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_NONE); + dns_rdata_toregion(rdata, ®ion); RETERR(mem_tobuffer(target, region.base, 2)); isc_region_consume(®ion, 2); diff --git a/lib/dns/rdata/in_1/naptr_35.c b/lib/dns/rdata/in_1/naptr_35.c index 77c977e2ff..38f6717536 100644 --- a/lib/dns/rdata/in_1/naptr_35.c +++ b/lib/dns/rdata/in_1/naptr_35.c @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: naptr_35.c,v 1.3 1999/02/16 22:42:32 marka Exp $ */ + /* $Id: naptr_35.c,v 1.4 1999/02/22 07:24:05 marka Exp $ */ /* RFC 2168 */ @@ -152,6 +152,11 @@ towire_in_naptr(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) REQUIRE(rdata->type == 35); REQUIRE(rdata->class == 1); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_NONE); + /* priority, weight */ dns_rdata_toregion(rdata, &sr); RETERR(mem_tobuffer(target, sr.base, 4)); diff --git a/lib/dns/rdata/in_1/naptr_35.h b/lib/dns/rdata/in_1/naptr_35.h index c2fd677db7..764cea4c63 100644 --- a/lib/dns/rdata/in_1/naptr_35.h +++ b/lib/dns/rdata/in_1/naptr_35.h @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: naptr_35.h,v 1.3 1999/02/16 22:42:32 marka Exp $ */ + /* $Id: naptr_35.h,v 1.4 1999/02/22 07:24:05 marka Exp $ */ /* RFC 2168 */ @@ -152,6 +152,11 @@ towire_in_naptr(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) REQUIRE(rdata->type == 35); REQUIRE(rdata->class == 1); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_NONE); + /* priority, weight */ dns_rdata_toregion(rdata, &sr); RETERR(mem_tobuffer(target, sr.base, 4)); diff --git a/lib/dns/rdata/in_1/nsap-ptr_23.c b/lib/dns/rdata/in_1/nsap-ptr_23.c index 2b9044411f..b286fbbb73 100644 --- a/lib/dns/rdata/in_1/nsap-ptr_23.c +++ b/lib/dns/rdata/in_1/nsap-ptr_23.c @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: nsap-ptr_23.c,v 1.2 1999/02/15 05:44:21 marka Exp $ */ + /* $Id: nsap-ptr_23.c,v 1.3 1999/02/22 07:24:05 marka Exp $ */ /* RFC 1348 */ @@ -90,6 +90,11 @@ towire_in_nsap_ptr(dns_rdata_t *rdata, dns_compress_t *cctx, REQUIRE(rdata->type == 23); REQUIRE(rdata->class == 1); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_NONE); + dns_name_init(&name, NULL); dns_rdata_toregion(rdata, ®ion); dns_name_fromregion(&name, ®ion); diff --git a/lib/dns/rdata/in_1/nsap-ptr_23.h b/lib/dns/rdata/in_1/nsap-ptr_23.h index 9fb71bea96..a3a7ae36ee 100644 --- a/lib/dns/rdata/in_1/nsap-ptr_23.h +++ b/lib/dns/rdata/in_1/nsap-ptr_23.h @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: nsap-ptr_23.h,v 1.2 1999/02/15 05:44:21 marka Exp $ */ + /* $Id: nsap-ptr_23.h,v 1.3 1999/02/22 07:24:05 marka Exp $ */ /* RFC 1348 */ @@ -90,6 +90,11 @@ towire_in_nsap_ptr(dns_rdata_t *rdata, dns_compress_t *cctx, REQUIRE(rdata->type == 23); REQUIRE(rdata->class == 1); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_NONE); + dns_name_init(&name, NULL); dns_rdata_toregion(rdata, ®ion); dns_name_fromregion(&name, ®ion); diff --git a/lib/dns/rdata/in_1/px_26.c b/lib/dns/rdata/in_1/px_26.c index 523baf4557..7c0f8042e8 100644 --- a/lib/dns/rdata/in_1/px_26.c +++ b/lib/dns/rdata/in_1/px_26.c @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: px_26.c,v 1.2 1999/02/15 05:44:22 marka Exp $ */ + /* $Id: px_26.c,v 1.3 1999/02/22 07:24:05 marka Exp $ */ /* RFC 2163 */ @@ -126,6 +126,11 @@ towire_in_px(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 26); REQUIRE(rdata->class == 1); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_NONE); + /* preference */ dns_rdata_toregion(rdata, ®ion); RETERR(mem_tobuffer(target, region.base, 2)); diff --git a/lib/dns/rdata/in_1/px_26.h b/lib/dns/rdata/in_1/px_26.h index e2227edf19..eeb0f11143 100644 --- a/lib/dns/rdata/in_1/px_26.h +++ b/lib/dns/rdata/in_1/px_26.h @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: px_26.h,v 1.2 1999/02/15 05:44:22 marka Exp $ */ + /* $Id: px_26.h,v 1.3 1999/02/22 07:24:05 marka Exp $ */ /* RFC 2163 */ @@ -126,6 +126,11 @@ towire_in_px(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 26); REQUIRE(rdata->class == 1); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_NONE); + /* preference */ dns_rdata_toregion(rdata, ®ion); RETERR(mem_tobuffer(target, region.base, 2)); diff --git a/lib/dns/rdata/in_1/srv_33.c b/lib/dns/rdata/in_1/srv_33.c index 75d8f5c117..4a53f55734 100644 --- a/lib/dns/rdata/in_1/srv_33.c +++ b/lib/dns/rdata/in_1/srv_33.c @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: srv_33.c,v 1.2 1999/02/15 05:44:22 marka Exp $ */ + /* $Id: srv_33.c,v 1.3 1999/02/22 07:24:05 marka Exp $ */ /* RFC 2052 bis */ @@ -129,6 +129,11 @@ towire_in_srv(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 33); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_NONE); + /* priority, weight, port */ dns_rdata_toregion(rdata, &sr); RETERR(mem_tobuffer(target, sr.base, 6)); diff --git a/lib/dns/rdata/in_1/srv_33.h b/lib/dns/rdata/in_1/srv_33.h index fc48f1b9e7..d73fdea28e 100644 --- a/lib/dns/rdata/in_1/srv_33.h +++ b/lib/dns/rdata/in_1/srv_33.h @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: srv_33.h,v 1.2 1999/02/15 05:44:22 marka Exp $ */ + /* $Id: srv_33.h,v 1.3 1999/02/22 07:24:05 marka Exp $ */ /* RFC 2052 bis */ @@ -129,6 +129,11 @@ towire_in_srv(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { REQUIRE(rdata->type == 33); + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_ALL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_NONE); + /* priority, weight, port */ dns_rdata_toregion(rdata, &sr); RETERR(mem_tobuffer(target, sr.base, 6)); diff --git a/lib/dns/rdataset.c b/lib/dns/rdataset.c index cd81755353..2eb681be10 100644 --- a/lib/dns/rdataset.c +++ b/lib/dns/rdataset.c @@ -26,6 +26,7 @@ #include #include #include +#include void dns_rdataset_init(dns_rdataset_t *rdataset) { @@ -272,6 +273,8 @@ dns_rdataset_towire(dns_rdataset_t *rdataset, isc_region_t r; dns_result_t result; unsigned int count; + isc_buffer_t st; + isc_buffer_t rdlen; /* * Convert 'rdataset' to wire format, compressing names as specified @@ -288,31 +291,54 @@ dns_rdataset_towire(dns_rdataset_t *rdataset, /* * copy out the name, type, class, ttl. */ + if (dns_compress_getedns(cctx) >= 1) + dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL); + else + dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14); + st = *target; result = dns_name_towire(owner_name, cctx, target); - if (result != DNS_R_SUCCESS) + if (result != DNS_R_SUCCESS) { + dns_compress_backout(cctx, st.used); + *target = st; return (result); + } isc_buffer_available(target, &r); if (r.length < (sizeof(dns_rdataclass_t) + sizeof(dns_rdatatype_t) + sizeof(dns_ttl_t) - + 2)) /* XXX 2? it's for the rdata length */ + + 2)) { /* XXX 2? it's for the rdata length */ + dns_compress_backout(cctx, st.used); + *target = st; return (DNS_R_NOSPACE); + } isc_buffer_putuint16(target, rdataset->type); isc_buffer_putuint16(target, rdataset->class); isc_buffer_putuint32(target, rdataset->ttl); /* - * copy out the rdata length + * Save space for rdlen. */ - dns_rdataset_current(rdataset, &rdata); - isc_buffer_putuint16(target, rdata.length); + rdlen = *target; + isc_buffer_add(target, 2); /* * copy out the rdata */ - result = dns_rdata_towire(&rdata, cctx, target); - if (result != DNS_R_SUCCESS) + dns_rdataset_current(rdataset, &rdata); + result = dns_compress_localinit(cctx, owner_name, target); + if (result != DNS_R_SUCCESS) { + dns_compress_backout(cctx, st.used); + *target = st; return (result); + } + result = dns_rdata_towire(&rdata, cctx, target); + dns_compress_localinvalidate(cctx); + if (result != DNS_R_SUCCESS) { + dns_compress_backout(cctx, st.used); + *target = st; + return (result); + } + isc_buffer_putuint16(&rdlen, target->used - rdlen.used - 2); count++;