Commit 98650c1d8d for bind
commit 98650c1d8dac6c0ef3c4931757aa5935c57c86aa
Author: Evan Hunt <each@isc.org>
Date: Mon Nov 2 19:34:01 2026 -0800
Test DELEG server names with characters that need escaping
Cover the rendering of a DELEG server-name list whose names contain
commas (written as "\\,") to text, and the rejection of a server-name
item longer than 255 bytes with a doubled backslash at the boundary.
diff --git a/bin/tests/system/deleg_escapes/ns1/example.db.j2 b/bin/tests/system/deleg_escapes/ns1/example.db.j2
new file mode 100644
index 0000000000..ac11da9661
--- /dev/null
+++ b/bin/tests/system/deleg_escapes/ns1/example.db.j2
@@ -0,0 +1,8 @@
+{% set deleg = deleg | default("") %}
+$TTL 300
+example. SOA ns1.example. hostmaster.example. 1 300 300 1200 300
+example. NS ns1.example.
+ns1.example. A 10.53.0.1
+{% if deleg %}
+sub.example. DELEG @deleg@
+{% endif %}
diff --git a/bin/tests/system/deleg_escapes/ns1/named.conf.j2 b/bin/tests/system/deleg_escapes/ns1/named.conf.j2
new file mode 100644
index 0000000000..e66e3b43de
--- /dev/null
+++ b/bin/tests/system/deleg_escapes/ns1/named.conf.j2
@@ -0,0 +1,14 @@
+options {
+ {% include_indented "_common/options.conf.j2" %}
+ recursion no;
+ dnssec-validation no;
+};
+
+{% include "_common/controls.conf.j2" %}
+
+zone "example" {
+ type primary;
+ file "example.db";
+ check-names ignore;
+ check-integrity no;
+};
diff --git a/bin/tests/system/deleg_escapes/tests_deleg_escapes.py b/bin/tests/system/deleg_escapes/tests_deleg_escapes.py
new file mode 100644
index 0000000000..199562c411
--- /dev/null
+++ b/bin/tests/system/deleg_escapes/tests_deleg_escapes.py
@@ -0,0 +1,52 @@
+# Copyright (C) Internet Systems Consortium, Inc. ("ISC")
+#
+# SPDX-License-Identifier: MPL-2.0
+#
+# 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 https://mozilla.org/MPL/2.0/.
+#
+# See the COPYRIGHT file distributed with this work for additional
+# information regarding copyright ownership.
+
+"""
+DELEG server names whose text form needs escaping.
+"""
+
+import pytest
+
+import isctest
+
+pytestmark = pytest.mark.extra_artifacts(["ns1/example.db", "ns1/named_dump.db"])
+
+# Three labels of 63 commas: in the DELEG text syntax a comma inside a
+# server name is written as "\\,", so the text form is three times as
+# long as the wire form.
+COMMA_LABEL = "\\\\," * 63
+COMMA_NAME = ".".join([COMMA_LABEL] * 3) + "."
+NAMES = ",".join([COMMA_NAME] * 3)
+
+
+def bootstrap():
+ return {"deleg": f"server-name={NAMES}"}
+
+
+@pytest.mark.requires_zones_loaded("ns1")
+def test_dumpdb_escaped_server_names(ns1):
+ with ns1.watch_log_from_here() as watcher:
+ ns1.rndc("dumpdb -zones")
+ watcher.wait_for_line("dumpdb complete")
+
+ assert f"server-name={NAMES}" in isctest.text.TextFile("ns1/named_dump.db")
+
+
+def test_overlong_server_name_in_zone_file(ns1, templates):
+ # A single server name item longer than 255 bytes is rejected, and
+ # a doubled backslash right at the 255-byte mark must not change that.
+ item = "a" * 255 + "\\\\\\\\" + "a" * 2000
+ templates.render("ns1/example.db", {"deleg": f"server-name={item}"}, newer=True)
+ with ns1.watch_log_from_here() as watcher:
+ ns1.rndc("reload example")
+ watcher.wait_for_line(
+ "zone example/IN: loading from master file example.db failed"
+ )
diff --git a/tests/dns/master_test.c b/tests/dns/master_test.c
index a2370f3c24..014379b6f5 100644
--- a/tests/dns/master_test.c
+++ b/tests/dns/master_test.c
@@ -587,6 +587,63 @@ ISC_RUN_TEST_IMPL(neworigin) {
assert_true(warn_expect_result);
}
+static isc_result_t
+loaddump(const char *testfile) {
+ isc_result_t result;
+ dns_db_t *db = NULL;
+ dns_dbversion_t *version = NULL;
+
+ CHECK(dns_db_create(isc_g_mctx, ZONEDB_DEFAULT, dns_origin,
+ dns_dbtype_zone, dns_rdataclass_in, 0, NULL, &db));
+ assert_int_equal(result, ISC_R_SUCCESS);
+
+ result = setup_master(nullmsg, nullmsg);
+ assert_int_equal(result, ISC_R_SUCCESS);
+
+ result = isc_dir_chdir(SRCDIR);
+ assert_int_equal(result, ISC_R_SUCCESS);
+
+ result = dns_db_load(db, testfile, dns_masterformat_text, 0);
+ assert_int_equal(isc_dir_chdir(BUILDDIR), ISC_R_SUCCESS);
+ CHECK(result);
+
+ dns_db_currentversion(db, &version);
+
+ CHECK(dns_master_dump(isc_g_mctx, db, version,
+ &dns_master_style_default, "test.dump",
+ dns_masterformat_text, NULL));
+ assert_int_equal(result, ISC_R_SUCCESS);
+
+ result = test_master(NULL, "test.dump", dns_masterformat_text, nullmsg,
+ nullmsg);
+ assert_int_equal(result, ISC_R_SUCCESS);
+
+cleanup:
+ unlink("test.dump");
+ if (db != NULL) {
+ if (version != NULL) {
+ dns_db_closeversion(db, &version, false);
+ }
+ dns_db_detach(&db);
+ }
+
+ return result;
+}
+
+ISC_RUN_TEST_IMPL(deleg_escapes) {
+ isc_result_t result;
+
+ UNUSED(state);
+
+ /* load and dump a deleg with embedded backslash at character 255 */
+ result = loaddump(TESTS_DIR "/testdata/master/master19.data");
+ assert_int_equal(result, DNS_R_SYNTAX);
+
+ /* load and dump a deleg with complicated escaped characters */
+ result = loaddump(TESTS_DIR "/testdata/master/master20.data");
+ assert_int_equal(result, ISC_R_SUCCESS);
+}
+
ISC_TEST_LIST_START
ISC_TEST_ENTRY(load)
ISC_TEST_ENTRY(nulbyte)
@@ -608,6 +665,7 @@ ISC_TEST_ENTRY(dumpraw)
ISC_TEST_ENTRY(toobig)
ISC_TEST_ENTRY(maxrdata)
ISC_TEST_ENTRY(neworigin)
+ISC_TEST_ENTRY(deleg_escapes)
ISC_TEST_LIST_END
ISC_TEST_MAIN
diff --git a/tests/dns/rdata_test.c b/tests/dns/rdata_test.c
index af5271dc45..dec8c51633 100644
--- a/tests/dns/rdata_test.c
+++ b/tests/dns/rdata_test.c
@@ -393,7 +393,7 @@ check_text_ok_single(const text_ok_t *text_ok, dns_rdataclass_t rdclass,
dns_rdatatype_t type, size_t structsize) {
unsigned char buf_fromtext[1024], buf_fromwire[1024], buf_towire[1024];
dns_rdata_t rdata = DNS_RDATA_INIT, rdata2 = DNS_RDATA_INIT;
- char buf_totext[1024] = { 0 };
+ char buf_totext[4096] = { 0 };
isc_buffer_t target;
isc_result_t result;
size_t length = 0;
@@ -2891,7 +2891,7 @@ ISC_RUN_TEST_IMPL(sshfp) {
/* good length SHA 1 digest */
TEXT_VALID("1 1 "
"00112233445566778899AABBCCDDEEFF171"
- "81920"),
+ "10240"),
/* good length SHA 256 digest */
TEXT_VALID("4 2 "
"A87F1B687AC0E57D2A081A2F282672334D9"
@@ -3933,6 +3933,93 @@ ISC_RUN_TEST_IMPL(deleg) {
TEXT_VALID_CHANGED(
"server-name=\"part1,part2,part3\\\\,part4\\\\\\\\\"",
"server-name=part1.,part2.,part3\\\\,part4\\\\\\\\."),
+ /* 3 names, 3 labels each, consisting of 63 backslashes */
+ TEXT_VALID("server-name="
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,."
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,."
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,.,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,."
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,."
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,.,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,."
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,."
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,\\\\,"
+ "\\\\,\\\\,\\\\,."),
+ /*
+ * excessively long server-name must be rejected, and a
+ * backslash at exactly 255 characters mustn't interfere
+ * with that.
+ * */
+ TEXT_INVALID("server-name="
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaa\\\\aaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
/* server-name mixed with server addresses */
TEXT_INVALID("server-ipv4=1.2.3.4 server-name=example."),
TEXT_INVALID("server-name=example. server-ipv4=1.2.3.4"),
diff --git a/tests/dns/testdata/master/master19.data b/tests/dns/testdata/master/master19.data
new file mode 100644
index 0000000000..b245a935da
--- /dev/null
+++ b/tests/dns/testdata/master/master19.data
@@ -0,0 +1,12 @@
+$TTL 1000
+@ in soa localhost. postmaster.localhost. (
+ 1993050801 ;serial
+ 3600 ;refresh
+ 1800 ;retry
+ 604800 ;expiration
+ 3600 ) ;minimum
+ in ns ns.vix.com.
+ in ns ns2.vix.com.
+ in ns ns3.vix.com.
+b in a 1.2.3.4
+c in deleg server-name=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/tests/dns/testdata/master/master20.data b/tests/dns/testdata/master/master20.data
new file mode 100644
index 0000000000..2043c09c8d
--- /dev/null
+++ b/tests/dns/testdata/master/master20.data
@@ -0,0 +1,12 @@
+$TTL 1000
+@ in soa localhost. postmaster.localhost. (
+ 1993050801 ;serial
+ 3600 ;refresh
+ 1800 ;retry
+ 604800 ;expiration
+ 3600 ) ;minimum
+ in ns ns.vix.com.
+ in ns ns2.vix.com.
+ in ns ns3.vix.com.
+b in a 1.2.3.4
+c in deleg server-name=\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,.\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,.\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,.,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,.\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,.\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,.,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,.\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,.\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,\\,.