From 0cd94b5ef4a078097fc2bd1dc72f5e80c2cf1844 Mon Sep 17 00:00:00 2001 From: Thomas Markwalder Date: Fri, 22 Nov 2019 13:39:45 -0500 Subject: [#64,!35] Restored work Restored cummulative work. --- common/Makefile.in | 187 ++++++++++++++++++++++++++++------------ common/dns.c | 7 +- common/execute.c | 11 ++- common/ns_name.c | 35 +++++++- common/options.c | 101 ++++++++++++++++++++-- common/parse.c | 52 +++++++++-- common/socket.c | 8 +- common/tests/Kyuafile | 1 + common/tests/Makefile.am | 11 ++- common/tests/Makefile.in | 113 +++++++++++++++++------- common/tests/domain_name_test.c | 100 +++++++++++++++++++++ 11 files changed, 516 insertions(+), 110 deletions(-) create mode 100644 common/tests/domain_name_test.c (limited to 'common') diff --git a/common/Makefile.in b/common/Makefile.in index 630de997..ca801bdc 100644 --- a/common/Makefile.in +++ b/common/Makefile.in @@ -1,7 +1,7 @@ -# Makefile.in generated by automake 1.15 from Makefile.am. +# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2014 Free Software Foundation, Inc. +# Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -159,7 +159,20 @@ am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/includes depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/alloc.Po ./$(DEPDIR)/bpf.Po \ + ./$(DEPDIR)/comapi.Po ./$(DEPDIR)/conflex.Po \ + ./$(DEPDIR)/ctrace.Po ./$(DEPDIR)/dhcp4o6.Po \ + ./$(DEPDIR)/discover.Po ./$(DEPDIR)/dispatch.Po \ + ./$(DEPDIR)/dlpi.Po ./$(DEPDIR)/dns.Po ./$(DEPDIR)/ethernet.Po \ + ./$(DEPDIR)/execute.Po ./$(DEPDIR)/fddi.Po ./$(DEPDIR)/icmp.Po \ + ./$(DEPDIR)/inet.Po ./$(DEPDIR)/lpf.Po ./$(DEPDIR)/memory.Po \ + ./$(DEPDIR)/nit.Po ./$(DEPDIR)/ns_name.Po \ + ./$(DEPDIR)/options.Po ./$(DEPDIR)/packet.Po \ + ./$(DEPDIR)/parse.Po ./$(DEPDIR)/print.Po ./$(DEPDIR)/raw.Po \ + ./$(DEPDIR)/resolv.Po ./$(DEPDIR)/socket.Po \ + ./$(DEPDIR)/tables.Po ./$(DEPDIR)/tr.Po ./$(DEPDIR)/tree.Po \ + ./$(DEPDIR)/upf.Po am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) @@ -198,7 +211,7 @@ am__recursive_targets = \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ - distdir + distdir distdir-am am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is @@ -408,8 +421,8 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) @@ -465,36 +478,42 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alloc.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bpf.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/comapi.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/conflex.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctrace.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dhcp4o6.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/discover.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dispatch.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlpi.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dns.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ethernet.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/execute.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fddi.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/icmp.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inet.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lpf.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memory.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nit.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ns_name.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/options.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/packet.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/raw.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resolv.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/socket.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tables.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tr.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tree.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upf.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alloc.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bpf.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/comapi.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/conflex.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctrace.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dhcp4o6.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/discover.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dispatch.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dlpi.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dns.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ethernet.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/execute.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fddi.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/icmp.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inet.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lpf.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memory.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nit.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ns_name.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/options.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/packet.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/raw.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resolv.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/socket.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tables.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tr.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tree.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upf.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @@ -652,7 +671,10 @@ cscopelist-am: $(am__tagged_files) distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -distdir: $(DISTFILES) +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -750,7 +772,36 @@ clean: clean-recursive clean-am: clean-generic clean-libLIBRARIES mostlyclean-am distclean: distclean-recursive - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/alloc.Po + -rm -f ./$(DEPDIR)/bpf.Po + -rm -f ./$(DEPDIR)/comapi.Po + -rm -f ./$(DEPDIR)/conflex.Po + -rm -f ./$(DEPDIR)/ctrace.Po + -rm -f ./$(DEPDIR)/dhcp4o6.Po + -rm -f ./$(DEPDIR)/discover.Po + -rm -f ./$(DEPDIR)/dispatch.Po + -rm -f ./$(DEPDIR)/dlpi.Po + -rm -f ./$(DEPDIR)/dns.Po + -rm -f ./$(DEPDIR)/ethernet.Po + -rm -f ./$(DEPDIR)/execute.Po + -rm -f ./$(DEPDIR)/fddi.Po + -rm -f ./$(DEPDIR)/icmp.Po + -rm -f ./$(DEPDIR)/inet.Po + -rm -f ./$(DEPDIR)/lpf.Po + -rm -f ./$(DEPDIR)/memory.Po + -rm -f ./$(DEPDIR)/nit.Po + -rm -f ./$(DEPDIR)/ns_name.Po + -rm -f ./$(DEPDIR)/options.Po + -rm -f ./$(DEPDIR)/packet.Po + -rm -f ./$(DEPDIR)/parse.Po + -rm -f ./$(DEPDIR)/print.Po + -rm -f ./$(DEPDIR)/raw.Po + -rm -f ./$(DEPDIR)/resolv.Po + -rm -f ./$(DEPDIR)/socket.Po + -rm -f ./$(DEPDIR)/tables.Po + -rm -f ./$(DEPDIR)/tr.Po + -rm -f ./$(DEPDIR)/tree.Po + -rm -f ./$(DEPDIR)/upf.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags @@ -796,7 +847,36 @@ install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/alloc.Po + -rm -f ./$(DEPDIR)/bpf.Po + -rm -f ./$(DEPDIR)/comapi.Po + -rm -f ./$(DEPDIR)/conflex.Po + -rm -f ./$(DEPDIR)/ctrace.Po + -rm -f ./$(DEPDIR)/dhcp4o6.Po + -rm -f ./$(DEPDIR)/discover.Po + -rm -f ./$(DEPDIR)/dispatch.Po + -rm -f ./$(DEPDIR)/dlpi.Po + -rm -f ./$(DEPDIR)/dns.Po + -rm -f ./$(DEPDIR)/ethernet.Po + -rm -f ./$(DEPDIR)/execute.Po + -rm -f ./$(DEPDIR)/fddi.Po + -rm -f ./$(DEPDIR)/icmp.Po + -rm -f ./$(DEPDIR)/inet.Po + -rm -f ./$(DEPDIR)/lpf.Po + -rm -f ./$(DEPDIR)/memory.Po + -rm -f ./$(DEPDIR)/nit.Po + -rm -f ./$(DEPDIR)/ns_name.Po + -rm -f ./$(DEPDIR)/options.Po + -rm -f ./$(DEPDIR)/packet.Po + -rm -f ./$(DEPDIR)/parse.Po + -rm -f ./$(DEPDIR)/print.Po + -rm -f ./$(DEPDIR)/raw.Po + -rm -f ./$(DEPDIR)/resolv.Po + -rm -f ./$(DEPDIR)/socket.Po + -rm -f ./$(DEPDIR)/tables.Po + -rm -f ./$(DEPDIR)/tr.Po + -rm -f ./$(DEPDIR)/tree.Po + -rm -f ./$(DEPDIR)/upf.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -818,20 +898,21 @@ uninstall-man: uninstall-man5 .MAKE: $(am__recursive_targets) install-am install-strip -.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ - check-am clean clean-generic clean-libLIBRARIES cscopelist-am \ - ctags ctags-am distclean distclean-compile distclean-generic \ - distclean-tags distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am \ - install-libLIBRARIES install-man install-man5 install-pdf \ - install-pdf-am install-ps install-ps-am install-strip \ - installcheck installcheck-am installdirs installdirs-am \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ - tags tags-am uninstall uninstall-am uninstall-libLIBRARIES \ - uninstall-man uninstall-man5 +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ + am--depfiles check check-am clean clean-generic \ + clean-libLIBRARIES cscopelist-am ctags ctags-am distclean \ + distclean-compile distclean-generic distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-libLIBRARIES install-man \ + install-man5 install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am uninstall-libLIBRARIES uninstall-man \ + uninstall-man5 .PRECIOUS: Makefile diff --git a/common/dns.c b/common/dns.c index 5b097b69..bdd8af46 100644 --- a/common/dns.c +++ b/common/dns.c @@ -1246,7 +1246,7 @@ find_cached_zone(dhcp_ddns_cb_t *ddns_cb, int direction) } /* Make sure the zone name will fit. */ - if (strlen(zone->name) > sizeof(ddns_cb->zone_name)) { + if (strlen(zone->name) >= sizeof(ddns_cb->zone_name)) { dns_zone_dereference(&zone, MDL); return (ISC_R_NOSPACE); } @@ -1374,8 +1374,9 @@ void cache_found_zone(dhcp_ddns_ns_t *ns_cb) /* See if there's already such a zone. */ if (dns_zone_lookup(&zone, ns_cb->zname) == ISC_R_SUCCESS) { /* If it's not a dynamic zone, leave it alone. */ - if (zone->timeout == 0) - return; + if (zone->timeout == 0) { + goto cleanup; + } /* Remove any old addresses in case they've changed */ if (zone->primary) diff --git a/common/execute.c b/common/execute.c index a33cec85..aad8067d 100644 --- a/common/execute.c +++ b/common/execute.c @@ -75,8 +75,10 @@ int execute_statements (result, packet, lease, client_state, #if defined (DEBUG_EXPRESSIONS) log_debug ("exec: statements returns %d", status); #endif - if (!status) + if (!status) { + executable_statement_dereference (&r, MDL); return 0; + } break; case on_statement: @@ -147,6 +149,8 @@ int execute_statements (result, packet, lease, client_state, on_star))) { executable_statement_dereference (&e, MDL); + executable_statement_dereference + (&r, MDL); return 0; } executable_statement_dereference (&e, MDL); @@ -176,8 +180,10 @@ int execute_statements (result, packet, lease, client_state, (result, packet, lease, client_state, in_options, out_options, scope, rc ? r->data.ie.tc : r->data.ie.fc, - on_star)) + on_star)) { + executable_statement_dereference (&r, MDL); return 0; + } break; case eval_statement: @@ -298,6 +304,7 @@ int execute_statements (result, packet, lease, client_state, #if defined (DEBUG_EXPRESSIONS) log_debug ("exec: break"); #endif + executable_statement_dereference (&r, MDL); return 1; case supersede_option_statement: diff --git a/common/ns_name.c b/common/ns_name.c index be035f6f..f5198219 100644 --- a/common/ns_name.c +++ b/common/ns_name.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004-2017 by Internet Systems Consortium, Inc. ("ISC") + * Copyright (c) 2004-2019 by Internet Systems Consortium, Inc. ("ISC") * Copyright (c) 1996-2003 by Internet Software Consortium * * This Source Code Form is subject to the terms of the Mozilla Public @@ -47,6 +47,39 @@ static int dn_find(const u_char *, const u_char *, /* Public. */ +/* + * MRns_name_len(eom, src) + * Compute the length of encoded uncompressed domain name. + * return: + * -1 if it fails, or to be consumed octets if it succeeds. + */ +int +MRns_name_len(const u_char *eom, const u_char *src) +{ + const u_char *srcp; + unsigned n; + int len; + + len = -1; + srcp = src; + if (srcp >= eom) { + errno = EMSGSIZE; + return (-1); + } + /* Fetch next label in domain name. */ + while ((n = *srcp++) != 0) { + /* Limit checks. */ + if (srcp + n >= eom) { + errno = EMSGSIZE; + return (-1); + } + srcp += n; + } + if (len < 0) + len = srcp - src; + return (len); +} + /* * MRns_name_ntop(src, dst, dstsiz) * Convert an encoded domain name to printable ascii as per RFC1035. diff --git a/common/options.c b/common/options.c index fc0e0889..405f7049 100644 --- a/common/options.c +++ b/common/options.c @@ -35,6 +35,8 @@ struct option *vendor_cfg_option; static int pretty_text(char **, char *, const unsigned char **, const unsigned char *, int); +static int pretty_dname(char **, char *, const unsigned char *, + const unsigned char *); static int pretty_domain(char **, char *, const unsigned char **, const unsigned char *); static int prepare_option_buffer(struct universe *universe, struct buffer *bp, @@ -223,6 +225,7 @@ int parse_option_buffer (options, buffer, length, universe) log_error("parse_option_buffer: " "save_option_buffer failed"); buffer_dereference(&bp, MDL); + option_dereference(&option, MDL); return (0); } } else if (universe->concat_duplicates) { @@ -234,6 +237,7 @@ int parse_option_buffer (options, buffer, length, universe) MDL)) { log_error("parse_option_buffer: No memory."); buffer_dereference(&bp, MDL); + option_dereference(&option, MDL); return (0); } /* Copy old option to new data object. */ @@ -258,6 +262,7 @@ int parse_option_buffer (options, buffer, length, universe) if (!option_cache_allocate(&nop, MDL)) { log_error("parse_option_buffer: No memory."); buffer_dereference(&bp, MDL); + option_dereference(&option, MDL); return (0); } @@ -1403,8 +1408,9 @@ store_options(int *ocount, (option_space_encapsulate (&encapsulation, packet, lease, client_state, in_options, cfg_options, scope, &name)); - data_string_forget (&name, MDL); } + + data_string_forget (&name, MDL); } } @@ -1624,7 +1630,6 @@ format_has_text(format) p = format; while (*p != '\0') { switch (*p++) { - case 'd': case 't': return 1; @@ -1638,6 +1643,7 @@ format_has_text(format) case 'X': case 'x': case 'D': + case 'd': return 0; case 'c': @@ -1880,8 +1886,23 @@ const char *pretty_print_option (option, data, len, emit_commas, emit_quotes) numhunk = -2; break; case 'd': - fmtbuf[l] = 't'; - /* Fall Through ! */ + /* Should not be optional, array or compressed */ + if ((option->format[i+1] == 'o') || + (option->format[i+1] == 'a') || + (option->format[i+1] == 'A') || + (option->format[i+1] == 'c')) { + log_error("%s: Illegal use of domain name: %s", + option->name, + &(option->format[i-1])); + fmtbuf[l + 1] = 0; + } + k = MRns_name_len(data + len, data + hunksize); + if (k == -1) { + log_error("Invalid domain name."); + return ""; + } + hunksize += k; + break; case 't': fmtbuf[l + 1] = 0; numhunk = -2; @@ -2035,6 +2056,18 @@ const char *pretty_print_option (option, data, len, emit_commas, emit_quotes) } *op = 0; break; + case 'd': /* RFC1035 format name */ + k = MRns_name_len(data + len, dp); + /* Already tested... */ + if (k == -1) { + log_error("invalid domain name."); + return ""; + } + pretty_dname(&op, endbuf-1, dp, data + len); + /* pretty_dname does not add the nul */ + *op = '\0'; + dp += k; + break; case 'D': /* RFC1035 format name list */ for( ; dp < (data + len) ; dp += k) { unsigned char nbuff[NS_MAXCDNAME]; @@ -3434,8 +3467,7 @@ int fqdn_option_space_encapsulate (result, packet, lease, client_state, } exit: for (i = 1; i <= FQDN_SUBOPTION_COUNT; i++) { - if (results [i].len) - data_string_forget (&results [i], MDL); + data_string_forget (&results[i], MDL); } buffer_dereference (&bp, MDL); if (!status) @@ -3594,8 +3626,7 @@ fqdn6_option_space_encapsulate(struct data_string *result, exit: for (i = 1 ; i <= FQDN_SUBOPTION_COUNT ; i++) { - if (results[i].len) - data_string_forget(&results[i], MDL); + data_string_forget(&results[i], MDL); } return rval; @@ -4283,6 +4314,56 @@ pretty_text(char **dst, char *dend, const unsigned char **src, return count; } +static int +pretty_dname(char **dst, char *dend, const unsigned char *src, + const unsigned char *send) +{ + const unsigned char *tend; + const unsigned char *srcp = src; + int count = 0; + int tsiz, status; + + if (dst == NULL || dend == NULL || src == NULL || send == NULL || + *dst == NULL || ((*dst + 1) > dend) || (src >= send)) + return -1; + + do { + /* Continue loop until end of src buffer. */ + if (srcp >= send) + break; + + /* Consume tag size. */ + tsiz = *srcp; + srcp++; + + /* At root, finis. */ + if (tsiz == 0) + break; + + tend = srcp + tsiz; + + /* If the tag exceeds the source buffer, it's illegal. + * This should also trap compression pointers (which should + * not be in these buffers). + */ + if (tend > send) + return -1; + + /* dend-1 leaves room for a trailing dot and quote. */ + status = pretty_escape(dst, dend-1, &srcp, tend); + + if ((status == -1) || ((*dst + 1) > dend)) + return -1; + + **dst = '.'; + (*dst)++; + count += status + 1; + } + while(1); + + return count; +} + static int pretty_domain(char **dst, char *dend, const unsigned char **src, const unsigned char *send) @@ -4495,8 +4576,10 @@ void parse_vendor_option(packet, lease, client_state, in_options, in_options, out_options, scope, oc, MDL); /* No name, all done */ - if (name.len == 0) + if (name.len == 0) { + data_string_forget(&name, MDL); return; + } /* Get any vendor option information from the request */ oc = lookup_option(&dhcp_universe, in_options, code); diff --git a/common/parse.c b/common/parse.c index c0fa4050..8619f852 100644 --- a/common/parse.c +++ b/common/parse.c @@ -5031,15 +5031,13 @@ int parse_option_token (rv, cfile, fmt, expr, uniform, lookups) break; case 'd': /* Domain name... */ - val = parse_host_name (cfile); - if (!val) { - parse_warn (cfile, "not a valid domain name."); - skip_to_semi (cfile); + t = parse_domain_name(cfile); + if (!t) { + parse_warn(cfile, "not a valid domain name."); + skip_to_semi(cfile); return 0; } - len = strlen (val); - freeval = ISC_TRUE; - goto make_string; + break; case 't': /* Text string... */ token = next_token (&val, &len, cfile); @@ -5051,7 +5049,6 @@ int parse_option_token (rv, cfile, fmt, expr, uniform, lookups) } return 0; } - make_string: if (!make_const_data (&t, (const unsigned char *)val, len, 1, 1, MDL)) log_fatal ("No memory for concatenation"); @@ -5703,3 +5700,42 @@ parse_domain_list(struct parse *cfile, int compress) return t; } +struct expression * +parse_domain_name(struct parse *cfile) +{ + const char *val; + struct expression *t = NULL; + unsigned len; + int result; + unsigned char buf[NS_MAXCDNAME]; + + val = parse_host_name(cfile); + if (!val) { + return NULL; + } + result = MRns_name_pton(val, buf, sizeof(buf)); + /* No longer need val */ + dfree((char *)val, MDL); + + /* result == 1 means the input was fully qualified. + * result == 0 means the input wasn't. + * result == -1 means bad things. + */ + if (result < 0) { + parse_warn(cfile, "Error assembling domain name: %m"); + return NULL; + } + + /* Compute the used length */ + len = 0; + while (buf[len] != 0) { + len += buf[len] + 1; + } + /* Count the last label (0). */ + len++; + + if (!make_const_data(&t, buf, len, 1, 1, MDL)) + log_fatal("No memory for domain name object."); + + return t; +} diff --git a/common/socket.c b/common/socket.c index 483eb9c3..90a971a5 100644 --- a/common/socket.c +++ b/common/socket.c @@ -3,7 +3,7 @@ BSD socket interface code... */ /* - * Copyright (c) 2004-2017 by Internet Systems Consortium, Inc. ("ISC") + * Copyright (c) 2004-2019 by Internet Systems Consortium, Inc. ("ISC") * Copyright (c) 1995-2003 by Internet Software Consortium * * This Source Code Form is subject to the terms of the Mozilla Public @@ -877,7 +877,13 @@ ssize_t send_packet6(struct interface_info *interface, m.msg_name = &dst; m.msg_namelen = sizeof(dst); ifindex = if_nametoindex(interface->name); + +// Per OpenBSD patch-common_socket_c,v 1.7 2018/03/06 08:37:39 sthen Exp +// always set the scope id. We'll leave the test for no global socket +// in place for all others. +#ifndef __OpenBSD__ if (no_global_v6_socket) +#endif dst.sin6_scope_id = ifindex; /* diff --git a/common/tests/Kyuafile b/common/tests/Kyuafile index f3c352db..4952b549 100644 --- a/common/tests/Kyuafile +++ b/common/tests/Kyuafile @@ -3,6 +3,7 @@ test_suite('isc-dhcp') atf_test_program{name='alloc_unittest'} atf_test_program{name='dns_unittest'} +atf_test_program{name='domain_name_unittest'} atf_test_program{name='misc_unittest'} atf_test_program{name='ns_name_unittest'} atf_test_program{name='option_unittest'} diff --git a/common/tests/Makefile.am b/common/tests/Makefile.am index 322f77e8..a5152653 100644 --- a/common/tests/Makefile.am +++ b/common/tests/Makefile.am @@ -9,7 +9,7 @@ ATF_TESTS = if HAVE_ATF ATF_TESTS += alloc_unittest dns_unittest misc_unittest ns_name_unittest \ - option_unittest + option_unittest domain_name_unittest alloc_unittest_SOURCES = test_alloc.c $(top_srcdir)/tests/t_api_dhcp.c alloc_unittest_LDADD = $(ATF_LDFLAGS) @@ -51,6 +51,15 @@ option_unittest_LDADD += ../libdhcp.@A@ ../../omapip/libomapi.@A@ \ @BINDLIBISCCFGDIR@/libisccfg.@A@ \ @BINDLIBISCDIR@/libisc.@A@ +domain_name_unittest_SOURCES = domain_name_test.c \ + $(top_srcdir)/tests/t_api_dhcp.c +domain_name_unittest_LDADD = $(ATF_LDFLAGS) +domain_name_unittest_LDADD += ../libdhcp.@A@ ../../omapip/libomapi.@A@ \ + @BINDLIBIRSDIR@/libirs.@A@ \ + @BINDLIBDNSDIR@/libdns.@A@ \ + @BINDLIBISCCFGDIR@/libisccfg.@A@ \ + @BINDLIBISCDIR@/libisc.@A@ + check: $(ATF_TESTS) @if test $(top_srcdir) != ${top_builddir}; then \ cp $(top_srcdir)/common/tests/Atffile Atffile; \ diff --git a/common/tests/Makefile.in b/common/tests/Makefile.in index 89ca98d7..b0d92063 100644 --- a/common/tests/Makefile.in +++ b/common/tests/Makefile.in @@ -1,7 +1,7 @@ -# Makefile.in generated by automake 1.15 from Makefile.am. +# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2014 Free Software Foundation, Inc. +# Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -88,7 +88,7 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @HAVE_ATF_TRUE@am__append_1 = alloc_unittest dns_unittest misc_unittest ns_name_unittest \ -@HAVE_ATF_TRUE@ option_unittest +@HAVE_ATF_TRUE@ option_unittest domain_name_unittest check_PROGRAMS = $(am__EXEEXT_2) subdir = common/tests @@ -104,7 +104,8 @@ CONFIG_CLEAN_VPATH_FILES = @HAVE_ATF_TRUE@am__EXEEXT_1 = alloc_unittest$(EXEEXT) \ @HAVE_ATF_TRUE@ dns_unittest$(EXEEXT) misc_unittest$(EXEEXT) \ @HAVE_ATF_TRUE@ ns_name_unittest$(EXEEXT) \ -@HAVE_ATF_TRUE@ option_unittest$(EXEEXT) +@HAVE_ATF_TRUE@ option_unittest$(EXEEXT) \ +@HAVE_ATF_TRUE@ domain_name_unittest$(EXEEXT) am__EXEEXT_2 = $(am__EXEEXT_1) am__alloc_unittest_SOURCES_DIST = test_alloc.c \ $(top_srcdir)/tests/t_api_dhcp.c @@ -121,6 +122,14 @@ am__dns_unittest_SOURCES_DIST = dns_unittest.c \ dns_unittest_OBJECTS = $(am_dns_unittest_OBJECTS) @HAVE_ATF_TRUE@dns_unittest_DEPENDENCIES = $(am__DEPENDENCIES_1) \ @HAVE_ATF_TRUE@ ../libdhcp.@A@ ../../omapip/libomapi.@A@ +am__domain_name_unittest_SOURCES_DIST = domain_name_test.c \ + $(top_srcdir)/tests/t_api_dhcp.c +@HAVE_ATF_TRUE@am_domain_name_unittest_OBJECTS = \ +@HAVE_ATF_TRUE@ domain_name_test.$(OBJEXT) t_api_dhcp.$(OBJEXT) +domain_name_unittest_OBJECTS = $(am_domain_name_unittest_OBJECTS) +@HAVE_ATF_TRUE@domain_name_unittest_DEPENDENCIES = \ +@HAVE_ATF_TRUE@ $(am__DEPENDENCIES_1) ../libdhcp.@A@ \ +@HAVE_ATF_TRUE@ ../../omapip/libomapi.@A@ am__misc_unittest_SOURCES_DIST = misc_unittest.c \ $(top_srcdir)/tests/t_api_dhcp.c @HAVE_ATF_TRUE@am_misc_unittest_OBJECTS = misc_unittest.$(OBJEXT) \ @@ -156,7 +165,11 @@ am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/includes depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/dns_unittest.Po \ + ./$(DEPDIR)/domain_name_test.Po ./$(DEPDIR)/misc_unittest.Po \ + ./$(DEPDIR)/ns_name_test.Po ./$(DEPDIR)/option_unittest.Po \ + ./$(DEPDIR)/t_api_dhcp.Po ./$(DEPDIR)/test_alloc.Po am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) @@ -175,10 +188,11 @@ am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(alloc_unittest_SOURCES) $(dns_unittest_SOURCES) \ - $(misc_unittest_SOURCES) $(ns_name_unittest_SOURCES) \ - $(option_unittest_SOURCES) + $(domain_name_unittest_SOURCES) $(misc_unittest_SOURCES) \ + $(ns_name_unittest_SOURCES) $(option_unittest_SOURCES) DIST_SOURCES = $(am__alloc_unittest_SOURCES_DIST) \ $(am__dns_unittest_SOURCES_DIST) \ + $(am__domain_name_unittest_SOURCES_DIST) \ $(am__misc_unittest_SOURCES_DIST) \ $(am__ns_name_unittest_SOURCES_DIST) \ $(am__option_unittest_SOURCES_DIST) @@ -202,7 +216,7 @@ am__recursive_targets = \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ - distdir + distdir distdir-am am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is @@ -412,6 +426,15 @@ ATF_TESTS = $(am__append_1) @HAVE_ATF_TRUE@ @BINDLIBDNSDIR@/libdns.@A@ \ @HAVE_ATF_TRUE@ @BINDLIBISCCFGDIR@/libisccfg.@A@ \ @HAVE_ATF_TRUE@ @BINDLIBISCDIR@/libisc.@A@ +@HAVE_ATF_TRUE@domain_name_unittest_SOURCES = domain_name_test.c \ +@HAVE_ATF_TRUE@ $(top_srcdir)/tests/t_api_dhcp.c + +@HAVE_ATF_TRUE@domain_name_unittest_LDADD = $(ATF_LDFLAGS) \ +@HAVE_ATF_TRUE@ ../libdhcp.@A@ ../../omapip/libomapi.@A@ \ +@HAVE_ATF_TRUE@ @BINDLIBIRSDIR@/libirs.@A@ \ +@HAVE_ATF_TRUE@ @BINDLIBDNSDIR@/libdns.@A@ \ +@HAVE_ATF_TRUE@ @BINDLIBISCCFGDIR@/libisccfg.@A@ \ +@HAVE_ATF_TRUE@ @BINDLIBISCDIR@/libisc.@A@ all: all-recursive .SUFFIXES: @@ -433,8 +456,8 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) @@ -457,6 +480,10 @@ dns_unittest$(EXEEXT): $(dns_unittest_OBJECTS) $(dns_unittest_DEPENDENCIES) $(EX @rm -f dns_unittest$(EXEEXT) $(AM_V_CCLD)$(LINK) $(dns_unittest_OBJECTS) $(dns_unittest_LDADD) $(LIBS) +domain_name_unittest$(EXEEXT): $(domain_name_unittest_OBJECTS) $(domain_name_unittest_DEPENDENCIES) $(EXTRA_domain_name_unittest_DEPENDENCIES) + @rm -f domain_name_unittest$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(domain_name_unittest_OBJECTS) $(domain_name_unittest_LDADD) $(LIBS) + misc_unittest$(EXEEXT): $(misc_unittest_OBJECTS) $(misc_unittest_DEPENDENCIES) $(EXTRA_misc_unittest_DEPENDENCIES) @rm -f misc_unittest$(EXEEXT) $(AM_V_CCLD)$(LINK) $(misc_unittest_OBJECTS) $(misc_unittest_LDADD) $(LIBS) @@ -475,12 +502,19 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dns_unittest.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/misc_unittest.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ns_name_test.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/option_unittest.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t_api_dhcp.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_alloc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dns_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/domain_name_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/misc_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ns_name_test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/option_unittest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t_api_dhcp.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_alloc.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @@ -609,7 +643,10 @@ cscopelist-am: $(am__tagged_files) distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -distdir: $(DISTFILES) +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -706,7 +743,13 @@ clean: clean-recursive clean-am: clean-checkPROGRAMS clean-generic mostlyclean-am distclean: distclean-recursive - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/dns_unittest.Po + -rm -f ./$(DEPDIR)/domain_name_test.Po + -rm -f ./$(DEPDIR)/misc_unittest.Po + -rm -f ./$(DEPDIR)/ns_name_test.Po + -rm -f ./$(DEPDIR)/option_unittest.Po + -rm -f ./$(DEPDIR)/t_api_dhcp.Po + -rm -f ./$(DEPDIR)/test_alloc.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-local distclean-tags @@ -752,7 +795,13 @@ install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/dns_unittest.Po + -rm -f ./$(DEPDIR)/domain_name_test.Po + -rm -f ./$(DEPDIR)/misc_unittest.Po + -rm -f ./$(DEPDIR)/ns_name_test.Po + -rm -f ./$(DEPDIR)/option_unittest.Po + -rm -f ./$(DEPDIR)/t_api_dhcp.Po + -rm -f ./$(DEPDIR)/test_alloc.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -772,19 +821,19 @@ uninstall-am: .MAKE: $(am__recursive_targets) check-am install-am install-strip -.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ - check-am clean clean-checkPROGRAMS clean-generic cscopelist-am \ - ctags ctags-am distclean distclean-compile distclean-generic \ - distclean-local distclean-tags distdir dvi dvi-am html html-am \ - info info-am install install-am install-data install-data-am \ - install-dvi install-dvi-am install-exec install-exec-am \ - install-html install-html-am install-info install-info-am \ - install-man install-pdf install-pdf-am install-ps \ - install-ps-am install-strip installcheck installcheck-am \ - installdirs installdirs-am maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-compile \ - mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ - uninstall-am +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ + am--depfiles check check-am clean clean-checkPROGRAMS \ + clean-generic cscopelist-am ctags ctags-am distclean \ + distclean-compile distclean-generic distclean-local \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \ + ps ps-am tags tags-am uninstall uninstall-am .PRECIOUS: Makefile diff --git a/common/tests/domain_name_test.c b/common/tests/domain_name_test.c new file mode 100644 index 00000000..8bd70aa2 --- /dev/null +++ b/common/tests/domain_name_test.c @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2019 Internet Systems Consortium, Inc. ("ISC") + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS. IN NO EVENT SHALL ISC 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. + */ + +#include +#include +#include "dhcpd.h" + +ATF_TC(pretty_print_domain_name); + +ATF_TC_HEAD(pretty_print_domain_name, tc) +{ + atf_tc_set_md_var(tc, "descr", + "Verify pretty_print_option can render a domain name."); +} + +/* + * This test verifies that pretty_print_option() correctly render a + * domain name. + * + */ +ATF_TC_BODY(pretty_print_domain_name, tc) +{ + struct option *option; + unsigned code; + unsigned char good_data[] = + { 0x05, 0x62, 0x6f, 0x6f, 0x79, 0x61, 0x03, 0x63, 0x6f, 0x6d, 0x00 }; + unsigned char short_data[] = + { 0x05, 0x62, 0x6f, 0x6f, 0x79, 0x61, 0x03, 0x63, 0x6f, 0x6d }; + unsigned char long_data[] = + { 0x05, 0x62, 0x6f, 0x6f, 0x79, 0x61, 0x03, 0x63, 0x6f, 0x6d, 0x00, + 0x01, 0x02 }; + const char *output_buf; + + initialize_common_option_spaces(); + + /* We'll use v4-lost because it happens to be format d */ + code = 137; + option = NULL; + if (!option_code_hash_lookup(&option, dhcp_universe.code_hash, + &code, 0, MDL)) { + atf_tc_fail("can't find option %d", code); + } + + if (option == NULL) { + atf_tc_fail("option is NULL"); + } + + /* First we will try a good value we know should fit. */ + output_buf = pretty_print_option(option, good_data, sizeof(good_data), 0, + 0); + + /* Make sure we get what we expect */ + if (!output_buf || strcmp(output_buf, "booya.com.")) { + atf_tc_fail("pretty_print_option did not return 'booya.com.'"); + } + + fprintf(stderr, "good!\n"); + + /* Now we'll try a data value that's too short */ + output_buf = pretty_print_option(option, short_data, sizeof(short_data), + 0, 0); + + /* Make sure we safely get an error */ + if (!output_buf || strcmp(output_buf, "")) { + atf_tc_fail("pretty_print_option did not return \"\""); + } + + /* Now we'll try a data value that's too large */ + output_buf = pretty_print_option(option, long_data, sizeof(long_data), 0, + 0); + + /* This logs but does not return an error */ + if (!output_buf || strcmp(output_buf, "booya.com.")) { + atf_tc_fail("pretty_print_option did not return 'booya.com.' (large)"); + } +} + + +/* This macro defines main() method that will call specified + test cases. tp and simple_test_case names can be whatever you want + as long as it is a valid variable identifier. */ +ATF_TP_ADD_TCS(tp) +{ + ATF_TP_ADD_TC(tp, pretty_print_domain_name); + + return (atf_no_error()); +} -- cgit v1.2.1