summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorThomas Markwalder <tmark@isc.org>2019-11-22 13:39:45 -0500
committerThomas Markwalder <tmark@isc.org>2019-11-22 13:39:45 -0500
commit0cd94b5ef4a078097fc2bd1dc72f5e80c2cf1844 (patch)
treee4dfe9a92d676a49b18ab547d781fb3fb10c8e6a /common
parent97c155273c0df0c8518f226e2b5e338e3ad63e87 (diff)
downloadisc-dhcp-0cd94b5ef4a078097fc2bd1dc72f5e80c2cf1844.tar.gz
[#64,!35] Restored work
Restored cummulative work.
Diffstat (limited to 'common')
-rw-r--r--common/Makefile.in187
-rw-r--r--common/dns.c7
-rw-r--r--common/execute.c11
-rw-r--r--common/ns_name.c35
-rw-r--r--common/options.c101
-rw-r--r--common/parse.c52
-rw-r--r--common/socket.c8
-rw-r--r--common/tests/Kyuafile1
-rw-r--r--common/tests/Makefile.am11
-rw-r--r--common/tests/Makefile.in113
-rw-r--r--common/tests/domain_name_test.c100
11 files changed, 516 insertions, 110 deletions
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
@@ -48,6 +48,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.
* return:
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 "<error>";
+ }
+ 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 "<error>";
+ }
+ 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;
@@ -4284,6 +4315,56 @@ pretty_text(char **dst, char *dend, const unsigned char **src,
}
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 <config.h>
+#include <atf-c.h>
+#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, "<error>")) {
+ atf_tc_fail("pretty_print_option did not return \"<error>\"");
+ }
+
+ /* 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());
+}