diff --git a/bin/tests/rdata_test.c b/bin/tests/rdata_test.c index 78bd9e73ac..d4be244352 100644 --- a/bin/tests/rdata_test.c +++ b/bin/tests/rdata_test.c @@ -45,9 +45,9 @@ main(int argc, char *argv[]) { unsigned int options = 0; unsigned int parens = 0; dns_rdatatype_t type; - char outbuf[1024]; - char inbuf[1024]; - char wirebuf[1024]; + char outbuf[16*1024]; + char inbuf[16*1024]; + char wirebuf[16*1024]; isc_buffer_t dbuf; isc_buffer_t tbuf; isc_buffer_t wbuf; @@ -151,6 +151,7 @@ main(int argc, char *argv[]) { "dns_rdatatype_fromtext returned %s(%d)\n", dns_result_totext(result), result); fflush(stdout); + need_eol = 1; continue; } fprintf(stdout, "type = %.*s(%d)\n", diff --git a/lib/dns/include/dns/result.h b/lib/dns/include/dns/result.h index 70ea0b60fa..59343b8aed 100644 --- a/lib/dns/include/dns/result.h +++ b/lib/dns/include/dns/result.h @@ -40,8 +40,9 @@ typedef unsigned int dns_result_t; #define DNS_R_EXTRATOKEN 17 #define DNS_R_EXTRADATA 18 #define DNS_R_TEXTTOLONG 19 +#define DNS_R_RANGE 20 -#define DNS_R_LASTENTRY 19 /* Last entry on list. */ +#define DNS_R_LASTENTRY 20 /* Last entry on list. */ #define DNS_R_UNEXPECTED 0xFFFFFFFFL diff --git a/lib/dns/rdata.c b/lib/dns/rdata.c index 8ff266e8df..b75d947bf4 100644 --- a/lib/dns/rdata.c +++ b/lib/dns/rdata.c @@ -15,7 +15,7 @@ * SOFTWARE. */ - /* $Id: rdata.c,v 1.7 1999/01/20 22:49:34 marka Exp $ */ + /* $Id: rdata.c,v 1.8 1999/01/21 06:02:13 marka Exp $ */ #include #include @@ -41,12 +41,17 @@ static isc_boolean_t buffer_empty(isc_buffer_t *source); static void buffer_fromregion(isc_buffer_t *buffer, isc_region_t *region, unsigned int type); -static isc_result_t uint32_fromtext(unsigned long value, +static isc_result_t uint32_tobuffer(unsigned long value, isc_buffer_t *target); -static isc_result_t uint16_fromtext(unsigned long value, +static isc_result_t uint16_tobuffer(unsigned long value, isc_buffer_t *target); static unsigned long uint32_fromregion(isc_region_t *region); static unsigned short uint16_fromregion(isc_region_t *region); +static dns_result_t gettoken(isc_lex_t *lexer, isc_token_t *token, + isc_tokentype_t expect, isc_boolean_t eol); +static dns_result_t mem_tobuffer(isc_buffer_t *target, void *base, + unsigned int length); +static int compare_region(isc_region_t *r1, isc_region_t *r2); #include "code.h" @@ -101,7 +106,6 @@ dns_rdata_init(dns_rdata_t *rdata) { int dns_rdata_compare(dns_rdata_t *rdata1, dns_rdata_t *rdata2) { int result = 0; - int l; isc_boolean_t use_default = ISC_FALSE; REQUIRE(rdata1 != NULL); @@ -118,12 +122,12 @@ dns_rdata_compare(dns_rdata_t *rdata1, dns_rdata_t *rdata2) { COMPARESWITCH if (use_default) { - l = (rdata1->length > rdata2->length) ? - rdata1->length : rdata2->length; - if ((result = memcmp(rdata1->data, rdata2->data, l)) == 0) - result = (result < 0) ? -1 : 1; - else - result = (rdata1->length < rdata2->length) ? -1 : 1; + isc_region_t r1; + isc_region_t r2; + + dns_rdata_toregion(rdata1, &r1); + dns_rdata_toregion(rdata2, &r2); + result = compare_region(&r1, &r2); } return (result); } @@ -541,7 +545,7 @@ buffer_fromregion(isc_buffer_t *buffer, isc_region_t *region, } static isc_result_t -uint32_fromtext(unsigned long value, isc_buffer_t *target) { +uint32_tobuffer(unsigned long value, isc_buffer_t *target) { isc_region_t region; isc_buffer_available(target, ®ion); @@ -556,7 +560,7 @@ uint32_fromtext(unsigned long value, isc_buffer_t *target) { } static isc_result_t -uint16_fromtext(unsigned long value, isc_buffer_t *target) { +uint16_tobuffer(unsigned long value, isc_buffer_t *target) { isc_region_t region; isc_buffer_available(target, ®ion); @@ -587,3 +591,50 @@ uint16_fromregion(isc_region_t *region) { return ((region->base[0] << 8) | region->base[1]); } + +static dns_result_t +gettoken(isc_lex_t *lexer, isc_token_t *token, isc_tokentype_t expect, + isc_boolean_t eol) { + unsigned int options = ISC_LEXOPT_EOL | ISC_LEXOPT_EOF; + + if (expect == isc_tokentype_number) + options |= ISC_LEXOPT_NUMBER; + if (isc_lex_gettoken(lexer, options, token) != ISC_R_SUCCESS) + return (DNS_R_UNEXPECTED); + if (eol && ((token->type == isc_tokentype_eol) || + (token->type == isc_tokentype_eof))) + return (DNS_R_SUCCESS); + if (token->type != expect) { + isc_lex_ungettoken(lexer, token); + if (token->type == isc_tokentype_eol || + token->type == isc_tokentype_eof) + return(DNS_R_UNEXPECTEDEND); + return (DNS_R_UNEXPECTED); + } + return (DNS_R_SUCCESS); +} + +static dns_result_t +mem_tobuffer(isc_buffer_t *target, void *base, unsigned int length) { + isc_region_t tr; + + isc_buffer_available(target, &tr); + if (length > tr.length) + return (DNS_R_NOSPACE); + memcpy(tr.base, base, length); + isc_buffer_add(target, length); + return (DNS_R_SUCCESS); +} + +static int +compare_region(isc_region_t *r1, isc_region_t *r2) { + unsigned int l; + int result; + + l = (r1->length < r2->length) ? r1->length : r2->length; + + if ((result = memcmp(r1->base, r2->base, l)) != 0) + return ((result < 0) ? -1 : 1); + else + return ((r1->length < r2->length) ? -1 : 1); +} diff --git a/lib/dns/rdata/generic/mx_15.c b/lib/dns/rdata/generic/mx_15.c index 6e01629d38..c0dff1e646 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.6 1999/01/20 05:20:22 marka Exp $ */ + /* $Id: mx_15.c,v 1.7 1999/01/21 06:02:14 marka Exp $ */ #ifndef RDATA_GENERIC_MX_15_H #define RDATA_GENERIC_MX_15_H @@ -45,7 +45,7 @@ fromtext_mx(dns_rdataclass_t class, dns_rdatatype_t type, return (DNS_R_UNEXPECTED); } - result = uint16_fromtext(token.value.as_ulong, target); + result = uint16_tobuffer(token.value.as_ulong, target); if (result != DNS_R_SUCCESS) return (result); diff --git a/lib/dns/rdata/generic/mx_15.h b/lib/dns/rdata/generic/mx_15.h index a073b8a804..cb7f6fa91e 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.6 1999/01/20 05:20:22 marka Exp $ */ + /* $Id: mx_15.h,v 1.7 1999/01/21 06:02:14 marka Exp $ */ #ifndef RDATA_GENERIC_MX_15_H #define RDATA_GENERIC_MX_15_H @@ -45,7 +45,7 @@ fromtext_mx(dns_rdataclass_t class, dns_rdatatype_t type, return (DNS_R_UNEXPECTED); } - result = uint16_fromtext(token.value.as_ulong, target); + result = uint16_tobuffer(token.value.as_ulong, target); if (result != DNS_R_SUCCESS) return (result); diff --git a/lib/dns/rdata/generic/soa_6.c b/lib/dns/rdata/generic/soa_6.c index d3fd1ebf36..3ef8696e87 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.6 1999/01/20 05:20:23 marka Exp $ */ + /* $Id: soa_6.c,v 1.7 1999/01/21 06:02:14 marka Exp $ */ #ifndef RDATA_GENERIC_SOA_6_H #define RDATA_GENERIC_SOA_6_H @@ -83,7 +83,7 @@ fromtext_soa(dns_rdataclass_t class, dns_rdatatype_t type, return (DNS_R_UNEXPECTED); } - result = uint32_fromtext(token.value.as_ulong, target); + result = uint32_tobuffer(token.value.as_ulong, target); if (result != DNS_R_SUCCESS) return (result); } diff --git a/lib/dns/rdata/generic/soa_6.h b/lib/dns/rdata/generic/soa_6.h index 9b30bd6cc6..fce614c8e7 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.6 1999/01/20 05:20:23 marka Exp $ */ + /* $Id: soa_6.h,v 1.7 1999/01/21 06:02:14 marka Exp $ */ #ifndef RDATA_GENERIC_SOA_6_H #define RDATA_GENERIC_SOA_6_H @@ -83,7 +83,7 @@ fromtext_soa(dns_rdataclass_t class, dns_rdatatype_t type, return (DNS_R_UNEXPECTED); } - result = uint32_fromtext(token.value.as_ulong, target); + result = uint32_tobuffer(token.value.as_ulong, target); if (result != DNS_R_SUCCESS) return (result); } diff --git a/lib/dns/rdata/in_1/wks_11.c b/lib/dns/rdata/in_1/wks_11.c new file mode 100644 index 0000000000..2a0112d311 --- /dev/null +++ b/lib/dns/rdata/in_1/wks_11.c @@ -0,0 +1,250 @@ +/* + * Copyright (C) 1998 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: wks_11.c,v 1.1 1999/01/21 06:02:15 marka Exp $ */ + +#ifndef RDATA_IN_1_WKS_11_H +#define RDATA_IN_1_WKS_11_H + +#include +#include +#include +#include +#include +#include +#include +#include + + + +static dns_result_t +fromtext_in_wks(dns_rdataclass_t class, dns_rdatatype_t type, + isc_lex_t *lexer, dns_name_t *origin, + isc_boolean_t downcase, isc_buffer_t *target) { + isc_token_t token; + dns_result_t result; + isc_region_t region; + struct in_addr addr; + struct protoent *pe; + struct servent *se; + char *e; + long proto; + unsigned char bm[8*1024]; + long port; + long maxport = -1; + char *ps = NULL; + unsigned int n; + + REQUIRE(type == 11); + REQUIRE(class == 1); + + origin = origin; /*unused*/ + downcase = downcase; /*unused*/ + + /* IPv4 dotted quad */ + result = gettoken(lexer, &token, isc_tokentype_string, ISC_FALSE); + if (result != DNS_R_SUCCESS) + return (result); + + isc_buffer_available(target, ®ion); + if (inet_aton(token.value.as_pointer , &addr) != 1) + return (DNS_R_BADDOTTEDQUAD); + if (region.length < 4) + return (DNS_R_NOSPACE); + memcpy(region.base, &addr, 4); + isc_buffer_add(target, 4); + + /* protocol */ + result = gettoken(lexer, &token, isc_tokentype_string, ISC_FALSE); + if (result != DNS_R_SUCCESS) + return (result); + + proto = strtol(token.value.as_pointer, &e, 10); + if (*e == '\0') + (void)NULL; + else if ((pe = getprotobyname(token.value.as_pointer)) != NULL) + proto = pe->p_proto; + else + return (DNS_R_UNEXPECTED); + if (proto < 0 || proto > 0xffff) + return (DNS_R_RANGE); + + if (proto == IPPROTO_TCP) + ps = "tcp"; + else if (proto == IPPROTO_UDP) + ps = "udp"; + + result = uint16_tobuffer(proto, target); + + memset(bm, 0, sizeof bm); + while (1) { + result = gettoken(lexer, &token, isc_tokentype_string, + ISC_TRUE); + if (result != DNS_R_SUCCESS) + return (result); + if (token.type == isc_tokentype_eol || + token.type == isc_tokentype_eof) + break; + port = strtol(token.value.as_pointer, &e, 10); + if (*e == '\0') + (void) NULL; + else if ((se = getservbyname(token.value.as_pointer, ps)) + != NULL) + port = ntohs(se->s_port); + else + return (DNS_R_UNEXPECTED); + if (port < 0 || port > 0xffff) + return (DNS_R_RANGE); + if (port > maxport) + maxport = port; + bm[port/8] |= (0x80>>(port%8)); + } + isc_lex_ungettoken(lexer, &token); + n = (maxport + 8) / 8; + return (mem_tobuffer(target, bm, n)); +} + +static dns_result_t +totext_in_wks(dns_rdata_t *rdata, dns_name_t *origin, isc_buffer_t *target) { + isc_region_t sr; + isc_region_t tr; + unsigned short proto; + char buf[sizeof "65535"]; + dns_result_t result; + unsigned int i, j; + + REQUIRE(rdata->type == 11); + REQUIRE(rdata->class == 1); + + origin = origin; + dns_rdata_toregion(rdata, &sr); + isc_buffer_available(target, &tr); + if (inet_ntop(AF_INET, sr.base, tr.base, tr.length) == NULL) + return (DNS_R_NOSPACE); + isc_buffer_add(target, strlen(tr.base)); + isc_region_consume(&sr, 4); + + proto = uint16_fromregion(&sr); + sprintf(buf, "%u", proto); + result = str_totext(" ", target); + if (result != DNS_R_SUCCESS) + return (result); + result = str_totext(buf, target); + if (result != DNS_R_SUCCESS) + return (result); + isc_region_consume(&sr, 2); + result = str_totext(" (", target); + if (result != DNS_R_SUCCESS) + return (result); + for (i = 0 ; i < sr.length ; i++) { + if (sr.base[i] != 0) + for (j = 0; j < 8; j++) + if ((sr.base[i] & (0x80>>j)) != 0) { + sprintf(buf, "%u", i * 8 + j); + result = str_totext(" ", target); + if (result != DNS_R_SUCCESS) + return (result); + result = str_totext(buf, target); + if (result != DNS_R_SUCCESS) + return (result); + } + } + result = str_totext(" )", target); + return (DNS_R_SUCCESS); +} + +static dns_result_t +fromwire_in_wks(dns_rdataclass_t class, dns_rdatatype_t type, + isc_buffer_t *source, dns_decompress_t *dctx, + isc_boolean_t downcase, isc_buffer_t *target) { + isc_region_t sr; + isc_region_t tr; + + REQUIRE(type == 11); + REQUIRE(class == 1); + + dctx = dctx; /*unused*/ + downcase = downcase; /*unused*/ + + isc_buffer_active(source, &sr); + isc_buffer_available(target, &tr); + + if (sr.length < 6) + return (DNS_R_UNEXPECTEDEND); + if (sr.length > 8 * 1024 + 6) + return (DNS_R_EXTRADATA); + if (tr.length < sr.length) + return (DNS_R_NOSPACE); + + memcpy(tr.base, sr.base, sr.length); + isc_buffer_add(target, sr.length); + isc_buffer_forward(source, sr.length); + return (DNS_R_SUCCESS); +} + +static dns_result_t +towire_in_wks(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { + isc_region_t sr; + + REQUIRE(rdata->type == 11); + REQUIRE(rdata->class == 1); + + cctx = cctx; /*unused*/ + + dns_rdata_toregion(rdata, &sr); + return (mem_tobuffer(target, sr.base, sr.length)); +} + +static int +compare_in_wks(dns_rdata_t *rdata1, dns_rdata_t *rdata2) { + isc_region_t r1; + isc_region_t r2; + + REQUIRE(rdata1->type == rdata2->type); + REQUIRE(rdata1->class == rdata2->class); + REQUIRE(rdata1->type == 11); + REQUIRE(rdata1->class == 1); + + dns_rdata_toregion(rdata1, &r1); + dns_rdata_toregion(rdata2, &r2); + return (compare_region(&r1, &r2)); +} + +static dns_result_t +fromstruct_in_wks(dns_rdataclass_t class, dns_rdatatype_t type, void *source, + isc_buffer_t *target) { + + REQUIRE(type == 11); + REQUIRE(class == 1); + + source = source; + target = target; + + return (DNS_R_NOTIMPLEMENTED); +} + +static dns_result_t +tostruct_in_wks(dns_rdata_t *rdata, void *target) { + + REQUIRE(rdata->type == 11); + REQUIRE(rdata->class == 1); + + target = target; + + return (DNS_R_NOTIMPLEMENTED); +} +#endif /* RDATA_IN_1_WKS_11_H */ diff --git a/lib/dns/rdata/in_1/wks_11.h b/lib/dns/rdata/in_1/wks_11.h new file mode 100644 index 0000000000..a8b0868c85 --- /dev/null +++ b/lib/dns/rdata/in_1/wks_11.h @@ -0,0 +1,250 @@ +/* + * Copyright (C) 1998 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: wks_11.h,v 1.1 1999/01/21 06:02:15 marka Exp $ */ + +#ifndef RDATA_IN_1_WKS_11_H +#define RDATA_IN_1_WKS_11_H + +#include +#include +#include +#include +#include +#include +#include +#include + + + +static dns_result_t +fromtext_in_wks(dns_rdataclass_t class, dns_rdatatype_t type, + isc_lex_t *lexer, dns_name_t *origin, + isc_boolean_t downcase, isc_buffer_t *target) { + isc_token_t token; + dns_result_t result; + isc_region_t region; + struct in_addr addr; + struct protoent *pe; + struct servent *se; + char *e; + long proto; + unsigned char bm[8*1024]; + long port; + long maxport = -1; + char *ps = NULL; + unsigned int n; + + REQUIRE(type == 11); + REQUIRE(class == 1); + + origin = origin; /*unused*/ + downcase = downcase; /*unused*/ + + /* IPv4 dotted quad */ + result = gettoken(lexer, &token, isc_tokentype_string, ISC_FALSE); + if (result != DNS_R_SUCCESS) + return (result); + + isc_buffer_available(target, ®ion); + if (inet_aton(token.value.as_pointer , &addr) != 1) + return (DNS_R_BADDOTTEDQUAD); + if (region.length < 4) + return (DNS_R_NOSPACE); + memcpy(region.base, &addr, 4); + isc_buffer_add(target, 4); + + /* protocol */ + result = gettoken(lexer, &token, isc_tokentype_string, ISC_FALSE); + if (result != DNS_R_SUCCESS) + return (result); + + proto = strtol(token.value.as_pointer, &e, 10); + if (*e == '\0') + (void)NULL; + else if ((pe = getprotobyname(token.value.as_pointer)) != NULL) + proto = pe->p_proto; + else + return (DNS_R_UNEXPECTED); + if (proto < 0 || proto > 0xffff) + return (DNS_R_RANGE); + + if (proto == IPPROTO_TCP) + ps = "tcp"; + else if (proto == IPPROTO_UDP) + ps = "udp"; + + result = uint16_tobuffer(proto, target); + + memset(bm, 0, sizeof bm); + while (1) { + result = gettoken(lexer, &token, isc_tokentype_string, + ISC_TRUE); + if (result != DNS_R_SUCCESS) + return (result); + if (token.type == isc_tokentype_eol || + token.type == isc_tokentype_eof) + break; + port = strtol(token.value.as_pointer, &e, 10); + if (*e == '\0') + (void) NULL; + else if ((se = getservbyname(token.value.as_pointer, ps)) + != NULL) + port = ntohs(se->s_port); + else + return (DNS_R_UNEXPECTED); + if (port < 0 || port > 0xffff) + return (DNS_R_RANGE); + if (port > maxport) + maxport = port; + bm[port/8] |= (0x80>>(port%8)); + } + isc_lex_ungettoken(lexer, &token); + n = (maxport + 8) / 8; + return (mem_tobuffer(target, bm, n)); +} + +static dns_result_t +totext_in_wks(dns_rdata_t *rdata, dns_name_t *origin, isc_buffer_t *target) { + isc_region_t sr; + isc_region_t tr; + unsigned short proto; + char buf[sizeof "65535"]; + dns_result_t result; + unsigned int i, j; + + REQUIRE(rdata->type == 11); + REQUIRE(rdata->class == 1); + + origin = origin; + dns_rdata_toregion(rdata, &sr); + isc_buffer_available(target, &tr); + if (inet_ntop(AF_INET, sr.base, tr.base, tr.length) == NULL) + return (DNS_R_NOSPACE); + isc_buffer_add(target, strlen(tr.base)); + isc_region_consume(&sr, 4); + + proto = uint16_fromregion(&sr); + sprintf(buf, "%u", proto); + result = str_totext(" ", target); + if (result != DNS_R_SUCCESS) + return (result); + result = str_totext(buf, target); + if (result != DNS_R_SUCCESS) + return (result); + isc_region_consume(&sr, 2); + result = str_totext(" (", target); + if (result != DNS_R_SUCCESS) + return (result); + for (i = 0 ; i < sr.length ; i++) { + if (sr.base[i] != 0) + for (j = 0; j < 8; j++) + if ((sr.base[i] & (0x80>>j)) != 0) { + sprintf(buf, "%u", i * 8 + j); + result = str_totext(" ", target); + if (result != DNS_R_SUCCESS) + return (result); + result = str_totext(buf, target); + if (result != DNS_R_SUCCESS) + return (result); + } + } + result = str_totext(" )", target); + return (DNS_R_SUCCESS); +} + +static dns_result_t +fromwire_in_wks(dns_rdataclass_t class, dns_rdatatype_t type, + isc_buffer_t *source, dns_decompress_t *dctx, + isc_boolean_t downcase, isc_buffer_t *target) { + isc_region_t sr; + isc_region_t tr; + + REQUIRE(type == 11); + REQUIRE(class == 1); + + dctx = dctx; /*unused*/ + downcase = downcase; /*unused*/ + + isc_buffer_active(source, &sr); + isc_buffer_available(target, &tr); + + if (sr.length < 6) + return (DNS_R_UNEXPECTEDEND); + if (sr.length > 8 * 1024 + 6) + return (DNS_R_EXTRADATA); + if (tr.length < sr.length) + return (DNS_R_NOSPACE); + + memcpy(tr.base, sr.base, sr.length); + isc_buffer_add(target, sr.length); + isc_buffer_forward(source, sr.length); + return (DNS_R_SUCCESS); +} + +static dns_result_t +towire_in_wks(dns_rdata_t *rdata, dns_compress_t *cctx, isc_buffer_t *target) { + isc_region_t sr; + + REQUIRE(rdata->type == 11); + REQUIRE(rdata->class == 1); + + cctx = cctx; /*unused*/ + + dns_rdata_toregion(rdata, &sr); + return (mem_tobuffer(target, sr.base, sr.length)); +} + +static int +compare_in_wks(dns_rdata_t *rdata1, dns_rdata_t *rdata2) { + isc_region_t r1; + isc_region_t r2; + + REQUIRE(rdata1->type == rdata2->type); + REQUIRE(rdata1->class == rdata2->class); + REQUIRE(rdata1->type == 11); + REQUIRE(rdata1->class == 1); + + dns_rdata_toregion(rdata1, &r1); + dns_rdata_toregion(rdata2, &r2); + return (compare_region(&r1, &r2)); +} + +static dns_result_t +fromstruct_in_wks(dns_rdataclass_t class, dns_rdatatype_t type, void *source, + isc_buffer_t *target) { + + REQUIRE(type == 11); + REQUIRE(class == 1); + + source = source; + target = target; + + return (DNS_R_NOTIMPLEMENTED); +} + +static dns_result_t +tostruct_in_wks(dns_rdata_t *rdata, void *target) { + + REQUIRE(rdata->type == 11); + REQUIRE(rdata->class == 1); + + target = target; + + return (DNS_R_NOTIMPLEMENTED); +} +#endif /* RDATA_IN_1_WKS_11_H */ diff --git a/lib/dns/result.c b/lib/dns/result.c index b4c91c8070..c38158dd13 100644 --- a/lib/dns/result.c +++ b/lib/dns/result.c @@ -40,6 +40,7 @@ static char *text_table[DNS_R_LASTENTRY + 1] = { "extra input text", /* 17 */ "extra input data", /* 18 */ "text too long", /* 19 */ + "out of range", /* 20 */ }; char * diff --git a/lib/isc/lex.c b/lib/isc/lex.c index bbb732bd0d..50a1aaebb7 100644 --- a/lib/isc/lex.c +++ b/lib/isc/lex.c @@ -73,7 +73,7 @@ isc_lex_create(isc_mem_t *mctx, size_t max_token, isc_lex_t **lexp) { lex = isc_mem_get(mctx, sizeof *lex); if (lex == NULL) return (ISC_R_NOMEMORY); - lex->data = isc_mem_get(mctx, max_token); + lex->data = isc_mem_get(mctx, max_token + 1); if (lex->data == NULL) { isc_mem_put(mctx, lex, sizeof *lex); return (ISC_R_NOMEMORY); @@ -107,7 +107,7 @@ isc_lex_destroy(isc_lex_t **lexp) { while (!EMPTY(lex->sources)) isc_lex_close(lex); if (lex->data != NULL) - isc_mem_put(lex->mctx, lex->data, lex->max_token); + isc_mem_put(lex->mctx, lex->data, lex->max_token + 1); isc_mem_put(lex->mctx, lex, sizeof *lex); lex->magic = 0; @@ -449,6 +449,7 @@ isc_lex_gettoken(isc_lex_t *lex, unsigned int options, isc_token_t *tokenp) { } if (remaining > 0) { *curr++ = c; + *curr = '\0'; remaining--; } else return (ISC_R_NOSPACE); @@ -467,6 +468,7 @@ isc_lex_gettoken(isc_lex_t *lex, unsigned int options, isc_token_t *tokenp) { } if (remaining > 0) { *curr++ = c; + *curr = 0; remaining--; } else return (ISC_R_NOSPACE); @@ -547,6 +549,7 @@ isc_lex_gettoken(isc_lex_t *lex, unsigned int options, isc_token_t *tokenp) { if (remaining > 0) { prev = curr; *curr++ = c; + *curr = 0; remaining--; } else return (ISC_R_NOSPACE);