lightly tested by me Tests, OKs?
diff --git Makefile.in Makefile.in index 3391cd0d4b2..495160c0826 100644 --- Makefile.in +++ Makefile.in @@ -169,8 +169,11 @@ cutest: $(CUTEST_OBJ) $(LIBOBJS) udb-inspect: udb-inspect.o $(COMMON_OBJ) $(LIBOBJS) $(LINK) -o $@ udb-inspect.o $(COMMON_OBJ) $(LIBOBJS) $(LIBS) +xfr-inspect: xfr-inspect.o $(COMMON_OBJ) $(LIBOBJS) + $(LINK) -o $@ xfr-inspect.o $(COMMON_OBJ) $(LIBOBJS) $(LIBS) + clean: - rm -f *.o $(TARGETS) $(MANUALS) cutest udb-inspect nsd-mem + rm -f *.o $(TARGETS) $(MANUALS) cutest udb-inspect xfr-inspect nsd-mem realclean: clean rm -f Makefile config.h config.log config.status @@ -283,6 +286,9 @@ qtest.o: $(srcdir)/tpkg/cutest/qtest.c udb-inspect.o: $(srcdir)/tpkg/cutest/udb-inspect.c $(COMPILE) -c $(srcdir)/tpkg/cutest/udb-inspect.c +xfr-inspect.o: $(srcdir)/tpkg/cutest/xfr-inspect.c + $(COMPILE) -c $(srcdir)/tpkg/cutest/xfr-inspect.c + zlexer.c: $(srcdir)/zlexer.lex if test "$(LEX)" != ":"; then rm -f $@ ;\ echo '#include "config.h"' > $@ ;\ @@ -366,7 +372,8 @@ dname.o: $(srcdir)/dname.c config.h $(srcdir)/dns.h $(srcdir)/dname.h $(srcdir)/ $(srcdir)/util.h $(srcdir)/query.h $(srcdir)/namedb.h $(srcdir)/radtree.h $(srcdir)/rbtree.h $(srcdir)/nsd.h $(srcdir)/edns.h $(srcdir)/packet.h $(srcdir)/tsig.h dns.o: $(srcdir)/dns.c config.h $(srcdir)/dns.h $(srcdir)/zonec.h $(srcdir)/namedb.h $(srcdir)/dname.h $(srcdir)/buffer.h \ $(srcdir)/region-allocator.h $(srcdir)/util.h $(srcdir)/radtree.h $(srcdir)/rbtree.h zparser.h -edns.o: $(srcdir)/edns.c config.h $(srcdir)/dns.h $(srcdir)/edns.h $(srcdir)/buffer.h $(srcdir)/region-allocator.h $(srcdir)/util.h +edns.o: $(srcdir)/edns.c config.h $(srcdir)/dns.h $(srcdir)/edns.h $(srcdir)/buffer.h $(srcdir)/region-allocator.h $(srcdir)/util.h \ + $(srcdir)/nsd.h $(srcdir)/query.h $(srcdir)/namedb.h $(srcdir)/dname.h $(srcdir)/radtree.h $(srcdir)/rbtree.h $(srcdir)/packet.h $(srcdir)/tsig.h ipc.o: $(srcdir)/ipc.c config.h $(srcdir)/ipc.h $(srcdir)/netio.h $(srcdir)/region-allocator.h $(srcdir)/buffer.h $(srcdir)/util.h \ $(srcdir)/xfrd-tcp.h $(srcdir)/xfrd.h $(srcdir)/rbtree.h $(srcdir)/namedb.h $(srcdir)/dname.h $(srcdir)/dns.h $(srcdir)/radtree.h $(srcdir)/options.h \ $(srcdir)/tsig.h $(srcdir)/nsd.h $(srcdir)/edns.h $(srcdir)/xfrd-notify.h $(srcdir)/difffile.h $(srcdir)/udb.h @@ -509,3 +516,7 @@ udb-inspect.o: $(srcdir)/tpkg/cutest/udb-inspect.c config.h $(srcdir)/udb.h $(sr $(srcdir)/udb.h $(srcdir)/udbzone.h $(srcdir)/dns.h $(srcdir)/udbradtree.h $(srcdir)/util.h $(srcdir)/buffer.h $(srcdir)/region-allocator.h \ $(srcdir)/util.h $(srcdir)/packet.h $(srcdir)/namedb.h $(srcdir)/dname.h $(srcdir)/buffer.h $(srcdir)/radtree.h $(srcdir)/rbtree.h $(srcdir)/rdata.h \ $(srcdir)/namedb.h $(srcdir)/difffile.h $(srcdir)/options.h config.h +xfr-inspect.o: $(srcdir)/tpkg/cutest/xfr-inspect.c config.h $(srcdir)/udbzone.h $(srcdir)/udb.h $(srcdir)/dns.h \ + $(srcdir)/udbradtree.h $(srcdir)/util.h $(srcdir)/buffer.h $(srcdir)/region-allocator.h $(srcdir)/util.h $(srcdir)/packet.h $(srcdir)/namedb.h \ + $(srcdir)/dname.h $(srcdir)/buffer.h $(srcdir)/radtree.h $(srcdir)/rbtree.h $(srcdir)/rdata.h $(srcdir)/namedb.h $(srcdir)/difffile.h \ + $(srcdir)/options.h config.h diff --git configure configure index f7a3001de55..15ceae2b292 100644 --- configure +++ configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for NSD 4.1.16. +# Generated by GNU Autoconf 2.69 for NSD 4.1.17. # # Report bugs to <nsd-b...@nlnetlabs.nl>. # @@ -580,8 +580,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='NSD' PACKAGE_TARNAME='nsd' -PACKAGE_VERSION='4.1.16' -PACKAGE_STRING='NSD 4.1.16' +PACKAGE_VERSION='4.1.17' +PACKAGE_STRING='NSD 4.1.17' PACKAGE_BUGREPORT='nsd-b...@nlnetlabs.nl' PACKAGE_URL='' @@ -1284,7 +1284,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures NSD 4.1.16 to adapt to many kinds of systems. +\`configure' configures NSD 4.1.17 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1345,7 +1345,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of NSD 4.1.16:";; + short | recursive ) echo "Configuration of NSD 4.1.17:";; esac cat <<\_ACEOF @@ -1491,7 +1491,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -NSD configure 4.1.16 +NSD configure 4.1.17 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2200,7 +2200,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by NSD $as_me 4.1.16, which was +It was created by NSD $as_me 4.1.17, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -9717,7 +9717,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by NSD $as_me 4.1.16, which was +This file was extended by NSD $as_me 4.1.17, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -9779,7 +9779,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -NSD config.status 4.1.16 +NSD config.status 4.1.17 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git configure.ac configure.ac index e9cba15c44a..89d69d88ebe 100644 --- configure.ac +++ configure.ac @@ -4,7 +4,7 @@ dnl sinclude(acx_nlnetlabs.m4) -AC_INIT(NSD,4.1.16,nsd-b...@nlnetlabs.nl) +AC_INIT(NSD,4.1.17,nsd-b...@nlnetlabs.nl) AC_CONFIG_HEADER([config.h]) CFLAGS="$CFLAGS" diff --git dns.c dns.c index c50fbe78bfe..9d8ac8a545c 100644 --- dns.c +++ dns.c @@ -739,6 +739,10 @@ static rrtype_descriptor_type rrtype_descriptors[(RRTYPE_DESCRIPTORS_LENGTH+1)] { TYPE_CAA, "CAA", T_CAA, 3, 3, { RDATA_WF_BYTE, RDATA_WF_TEXT, RDATA_WF_LONG_TEXT }, { RDATA_ZF_BYTE, RDATA_ZF_TAG, RDATA_ZF_LONG_TEXT } }, + /* 258 - AVC */ + { TYPE_AVC, "AVC", T_AVC, 1, 1, + { RDATA_WF_TEXTS }, + { RDATA_ZF_TEXTS } }, /* 32768 - TA */ /* 32769 */ diff --git dns.h dns.h index 5fc35046c40..54dddefbfd9 100644 --- dns.h +++ dns.h @@ -158,6 +158,7 @@ typedef enum nsd_rc nsd_rc_type; #define TYPE_ANY 255 /* any type (wildcard) */ #define TYPE_URI 256 /* RFC 7553 */ #define TYPE_CAA 257 /* RFC 6844 */ +#define TYPE_AVC 258 #define TYPE_DLV 32769 /* RFC 4431 */ #define PSEUDO_TYPE_DLV RRTYPE_DESCRIPTORS_LENGTH @@ -260,9 +261,9 @@ typedef struct rrtype_descriptor rrtype_descriptor_type; * Indexed by type. The special type "0" can be used to get a * descriptor for unknown types (with one binary rdata). * - * CAA + 1 + * AVC + 1 */ -#define RRTYPE_DESCRIPTORS_LENGTH (TYPE_CAA + 1) +#define RRTYPE_DESCRIPTORS_LENGTH (TYPE_AVC + 1) rrtype_descriptor_type *rrtype_descriptor_by_name(const char *name); rrtype_descriptor_type *rrtype_descriptor_by_type(uint16_t type); diff --git namedb.c namedb.c index f59f0b76fa3..bcc41aad926 100644 --- namedb.c +++ namedb.c @@ -305,6 +305,7 @@ void zone_add_domain_in_hash_tree(region_type* region, rbtree_type** tree, { if(!*tree) *tree = rbtree_create(region, cmpf); + if(node->key) return; memset(node, 0, sizeof(rbnode_type)); node->key = domain; rbtree_insert(*tree, node); diff --git rdata.c rdata.c index 3368e69fa7c..68d03ce82e2 100644 --- rdata.c +++ rdata.c @@ -396,8 +396,11 @@ rdata_base64_to_string(buffer_type *output, rdata_atom_type rdata, { int length; size_t size = rdata_atom_size(rdata); - if(size == 0) + if(size == 0) { + /* single zero represents empty buffer */ + buffer_write(output, "0", 1); return 1; + } buffer_reserve(output, size * 2 + 1); length = __b64_ntop(rdata_atom_data(rdata), size, (char *) buffer_current(output), size * 2); @@ -428,7 +431,12 @@ static int rdata_hex_to_string(buffer_type *output, rdata_atom_type rdata, rr_type* ATTR_UNUSED(rr)) { - hex_to_string(output, rdata_atom_data(rdata), rdata_atom_size(rdata)); + if(rdata_atom_size(rdata) == 0) { + /* single zero represents empty buffer, such as CDS deletes */ + buffer_printf(output, "0"); + } else { + hex_to_string(output, rdata_atom_data(rdata), rdata_atom_size(rdata)); + } return 1; } diff --git xfrd-tcp.c xfrd-tcp.c index 70eef515b58..2715689439f 100644 --- xfrd-tcp.c +++ xfrd-tcp.c @@ -642,9 +642,18 @@ int conn_write(struct xfrd_tcp* tcp) if(tcp->total_bytes < sizeof(tcp->msglen)) { uint16_t sendlen = htons(tcp->msglen); +#ifdef HAVE_WRITEV + struct iovec iov[2]; + iov[0].iov_base = (uint8_t*)&sendlen + tcp->total_bytes; + iov[0].iov_len = sizeof(sendlen) - tcp->total_bytes; + iov[1].iov_base = buffer_begin(tcp->packet); + iov[1].iov_len = buffer_limit(tcp->packet); + sent = writev(tcp->fd, iov, 2); +#else /* HAVE_WRITEV */ sent = write(tcp->fd, (const char*)&sendlen + tcp->total_bytes, sizeof(tcp->msglen) - tcp->total_bytes); +#endif /* HAVE_WRITEV */ if(sent == -1) { if(errno == EAGAIN || errno == EINTR) { @@ -656,11 +665,19 @@ int conn_write(struct xfrd_tcp* tcp) } tcp->total_bytes += sent; + if(sent > (ssize_t)sizeof(tcp->msglen)) + buffer_skip(tcp->packet, sent-sizeof(tcp->msglen)); if(tcp->total_bytes < sizeof(tcp->msglen)) { /* incomplete write, resume later */ return 0; } - assert(tcp->total_bytes == sizeof(tcp->msglen)); +#ifdef HAVE_WRITEV + if(tcp->total_bytes == tcp->msglen + sizeof(tcp->msglen)) { + /* packet done */ + return 1; + } +#endif + assert(tcp->total_bytes >= sizeof(tcp->msglen)); } assert(tcp->total_bytes < tcp->msglen + sizeof(tcp->msglen)); diff --git zonec.c zonec.c index 02e1a056b83..1b20b84d90f 100644 --- zonec.c +++ zonec.c @@ -89,6 +89,10 @@ zparser_conv_hex(region_type *region, const char *hex, size_t len) uint8_t *t; int i; + if(len == 1 && hex[0] == '0') { + /* single 0 represents empty buffer */ + return alloc_rdata(region, 0); + } if (len % 2 != 0) { zc_error_prev_line("number of hex digits must be a multiple of 2"); } else if (len > MAX_RDLENGTH * 2) { @@ -639,6 +643,10 @@ zparser_conv_b64(region_type *region, const char *b64) uint16_t *r = NULL; int i; + if(strcmp(b64, "0") == 0) { + /* single 0 represents empty buffer */ + return alloc_rdata(region, 0); + } i = __b64_pton(b64, buffer, B64BUFSIZE); if (i == -1) { zc_error_prev_line("invalid base64 data"); diff --git zparser.y zparser.y index a2e6fcd7a9d..542142ea6d5 100644 --- zparser.y +++ zparser.y @@ -68,7 +68,7 @@ nsec3_add_params(const char* hash_algo_str, const char* flag_str, %token <type> T_AXFR T_MAILB T_MAILA T_DS T_DLV T_SSHFP T_RRSIG T_NSEC T_DNSKEY %token <type> T_SPF T_NSEC3 T_IPSECKEY T_DHCID T_NSEC3PARAM T_TLSA T_URI %token <type> T_NID T_L32 T_L64 T_LP T_EUI48 T_EUI64 T_CAA T_CDS T_CDNSKEY -%token <type> T_OPENPGPKEY T_CSYNC +%token <type> T_OPENPGPKEY T_CSYNC T_AVC /* other tokens */ %token DOLLAR_TTL DOLLAR_ORIGIN NL SP @@ -556,6 +556,8 @@ type_and_rdata: | T_TXT sp rdata_unknown { $$ = $1; parse_unknown_rdata($1, $3); } | T_SPF sp rdata_txt | T_SPF sp rdata_unknown { $$ = $1; parse_unknown_rdata($1, $3); } + | T_AVC sp rdata_txt + | T_AVC sp rdata_unknown { $$ = $1; parse_unknown_rdata($1, $3); } | T_RP sp rdata_rp /* RFC 1183 */ | T_RP sp rdata_unknown { $$ = $1; parse_unknown_rdata($1, $3); } | T_AFSDB sp rdata_afsdb /* RFC 1183 */ -- I'm not entirely sure you are real.