It required minor resync of other auxiliary files in fuzz/ directory.
/*.dSYM/
-dns_name_fromtext_target
-dns_rdata_fromwire_text
/*.out/
+/dns_master_load
+/dns_message_checksig
+/dns_message_parse
+/dns_name_fromtext_target
+/dns_rdata_fromtext
+/dns_rdata_fromwire_text
+/isc_lex_getmastertoken
+/isc_lex_gettoken
* non-fuzzing - the test just runs over all input located in `<test_name>.in/`
directory by compiling with mock main.c that walks through the directory and
runs `LLVMFuzzerTestOneInput()` over the input files
-* AFL - `./configure --with-fuzzing=afl` will either feed the stdin to
+* AFL - `./configure --enable-fuzzing=afl` will either feed the stdin to
`LLVMFuzzerTestOneInput()` or run the `__AFL_LOOP(10000)` if compiled with
- `afl-clang-fast`
-* LibFuzzer - `./configure --with-fuzzing=libfuzzer` will disable `main.c`
+ `afl-clang-fast`. You have to compile using `CC=afl-<gcc|clang>`.
+* LibFuzzer - `./configure --enable-fuzzing=libfuzzer` will disable `main.c`
completely and it uses the standard LibFuzzer mechanims to feed
`LLVMFuzzerTestOneInput` with the fuzzer
--- /dev/null
+include $(top_srcdir)/Makefile.top
+
+AM_CFLAGS += \
+ $(TEST_CFLAGS)
+
+AM_CPPFLAGS += \
+ $(LIBISC_CFLAGS) \
+ $(LIBDNS_CFLAGS) \
+ -DFUZZDIR=\"$(abs_srcdir)\"
+
+AM_LDFLAGS += \
+ $(FUZZ_LDFLAGS)
+
+LDADD += \
+ libfuzzmain.la \
+ $(LIBISC_LIBS) \
+ $(LIBDNS_LIBS)
+
+check_LTLIBRARIES = libfuzzmain.la
+libfuzzmain_la_SOURCES = \
+ fuzz.h \
+ main.c
+
+check_PROGRAMS = \
+ dns_master_load \
+ dns_message_checksig \
+ dns_message_parse \
+ dns_name_fromtext_target \
+ dns_rdata_fromtext \
+ dns_rdata_fromwire_text \
+ isc_lex_getmastertoken \
+ isc_lex_gettoken
+
+EXTRA_DIST = \
+ dns_master_load.in \
+ dns_message_checksig.in \
+ dns_message_parse.in \
+ dns_name_fromtext_target.in \
+ dns_rdata_fromtext.in \
+ dns_rdata_fromwire_text.in \
+ isc_lex_getmastertoken.in \
+ isc_lex_gettoken.in
+
+TESTS = $(check_PROGRAMS)
+
+if HAVE_FUZZ_LOG_COMPILER
+LOG_COMPILER = $(srcdir)/$(FUZZ_LOG_COMPILER)
+AM_LOG_FLAGS = $(srcdir)
+endif HAVE_FUZZ_LOG_COMPILER
+
+unit-local: check
LIBS = @LIBS@
OBJS = main.@O@
-SRCS = main.c dns_name_fromtext_target.c dns_rdata_fromwire_text.c
+SRCS = main.c dns_master_load.c dns_message_checksig.c dns_message_parse.c dns_name_fromtext_target.c dns_rdata_fromtext.c dns_rdata_fromwire_text.c isc_lex_getmastertoken.c isc_lex_gettoken.c
SUBDIRS =
-TARGETS = dns_name_fromtext_target@EXEEXT@ \
- dns_rdata_fromwire_text@EXEEXT@
+TARGETS = dns_master_load@EXEEXT@ \
+ dns_message_checksig@EXEEXT@ \
+ dns_message_parse@EXEEXT@ \
+ dns_name_fromtext_target@EXEEXT@ \
+ dns_rdata_fromtext@EXEEXT@ \
+ dns_rdata_fromwire_text@EXEEXT@ \
+ isc_lex_getmastertoken@EXEEXT@ \
+ isc_lex_gettoken@EXEEXT@
@BIND9_MAKE_RULES@
+dns_master_load@EXEEXT@: dns_master_load.@O@ main.@O@ ${ISCDEPLIBS} ${DNSDEPLIBS}
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+ dns_master_load.@O@ main.@O@ ${DNSLIBS} ${ISCLIBS} ${LIBS}
+
+dns_message_checksig@EXEEXT@: dns_message_checksig.@O@ main.@O@ ${ISCDEPLIBS} ${DNSDEPLIBS}
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+ dns_message_checksig.@O@ main.@O@ ${DNSLIBS} ${ISCLIBS} ${LIBS}
+
+dns_message_parse@EXEEXT@: dns_message_parse.@O@ main.@O@ ${ISCDEPLIBS} ${DNSDEPLIBS}
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+ dns_message_parse.@O@ main.@O@ ${DNSLIBS} ${ISCLIBS} ${LIBS}
+
dns_name_fromtext_target@EXEEXT@: dns_name_fromtext_target.@O@ main.@O@ ${ISCDEPLIBS} ${DNSDEPLIBS}
${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
dns_name_fromtext_target.@O@ main.@O@ ${DNSLIBS} ${ISCLIBS} ${LIBS}
+dns_rdata_fromtext@EXEEXT@: dns_rdata_fromtext.@O@ main.@O@ ${ISCDEPLIBS} ${DNSDEPLIBS}
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+ dns_rdata_fromtext.@O@ main.@O@ ${DNSLIBS} ${ISCLIBS} ${LIBS}
+
dns_rdata_fromwire_text@EXEEXT@: dns_rdata_fromwire_text.@O@ main.@O@ ${ISCDEPLIBS} ${DNSDEPLIBS}
${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
dns_rdata_fromwire_text.@O@ main.@O@ ${DNSLIBS} ${ISCLIBS} ${LIBS}
+isc_lex_getmastertoken@EXEEXT@: isc_lex_getmastertoken.@O@ main.@O@ ${ISCDEPLIBS} ${DNSDEPLIBS}
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+ isc_lex_getmastertoken.@O@ main.@O@ ${DNSLIBS} ${ISCLIBS} ${LIBS}
+
+isc_lex_gettoken@EXEEXT@: isc_lex_gettoken.@O@ main.@O@ ${ISCDEPLIBS} ${DNSDEPLIBS}
+ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+ isc_lex_gettoken.@O@ main.@O@ ${DNSLIBS} ${ISCLIBS} ${LIBS}
+
check: ${TARGETS}
for fuzzer in ${TARGETS}; do \
./$${fuzzer} ; \
--- /dev/null
+#!/bin/sh
+
+# 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.
+
+echo "The AFL log compiler is not implemented yet."
+
+exit 1
--- /dev/null
+/*
+ * 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.
+ */
+
+#include <stdbool.h>
+#include <stdlib.h>
+
+#include <isc/buffer.h>
+#include <isc/mem.h>
+#include <isc/util.h>
+
+#include <dns/callbacks.h>
+#include <dns/db.h>
+#include <dns/master.h>
+#include <dns/types.h>
+
+#include "fuzz.h"
+
+bool debug = false;
+
+int
+LLVMFuzzerInitialize(int *argc, char ***argv) {
+ UNUSED(argc);
+ UNUSED(argv);
+ return (0);
+}
+
+int
+LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+ isc_buffer_t buf;
+ isc_result_t result;
+ isc_mem_t *mctx = NULL;
+
+ isc_buffer_constinit(&buf, data, size);
+ isc_buffer_add(&buf, size);
+ isc_buffer_setactive(&buf, size);
+
+ dns_rdatacallbacks_t callbacks;
+ dns_rdatacallbacks_init(&callbacks);
+ dns_db_t *db = NULL;
+
+ isc_mem_create(&mctx);
+ result = dns_db_create(mctx, "rbt", dns_rootname, dns_dbtype_zone,
+ dns_rdataclass_in, 0, NULL, &db);
+ if (result != ISC_R_SUCCESS) {
+ return 0;
+ }
+
+ result = dns_db_beginload(db, &callbacks);
+ if (result != ISC_R_SUCCESS) {
+ goto end;
+ }
+
+ result = dns_master_loadbuffer(&buf, &db->origin, &db->origin,
+ db->rdclass, DNS_MASTER_ZONE, &callbacks,
+ db->mctx);
+ if (debug) {
+ fprintf(stderr, "loadbuffer: %s\n", isc_result_totext(result));
+ }
+ result = dns_db_endload(db, &callbacks);
+ if (debug) {
+ fprintf(stderr, "endload: %s\n", isc_result_totext(result));
+ }
+
+end:
+ dns_db_detach(&db);
+ isc_mem_destroy(&mctx);
+ return (0);
+}
--- /dev/null
+$TTL 300 ; 5 minutes
+@ SOA mname1. . (
+ 2000062101 ; serial
+ 20 ; refresh (20 seconds)
+ 20 ; retry (20 seconds)
+ 1814400 ; expire (3 weeks)
+ 3600 ; minimum (1 hour)
+ )
+ NS a1
+$DATE 20210101000000
+
+a1 123 A \# 4 0A000001
+a2 456 A \# 4 0A000001
+
+txt1 TXT \# 6 0568656C6C6F
+txt2 TXT "hello"
+txt3 TXT \# 6 0568656C6C6F
+txt4 TXT "hello"
+
+unk1 TYPE123 \# 1 00
+unk2 TYPE123 \# 1 00
--- /dev/null
+$ORIGIN .
+$TTL 120
+@ SOA tld4. hostmaster.ns.tld4. ( 1 3600 1200 604800 60 )
+ NS ns
+ns A 10.53.0.2
+$GENERATE 11-18 all$.a9 A 192.0.2.8
+$GENERATE 1-2 @ PTR SERVER$.EXAMPLE.
+$GENERATE 1-7 $ CNAME $.0
+$GENERATE 17-27 HOST-$ A 1.2.3.$
+$GENERATE 277-288 HOST-$ MX "0 ."
--- /dev/null
+$ORIGIN .
+$TTL 120
+@ SOA tld4. hostmaster.ns.tld4. ( 1 3600 1200 604800 60 )
+ NS ns
+ns A 10.53.0.2
+$INCLUDE withoutorigin
+$INCLUDE withoutorigin origin
+
--- /dev/null
+. SOA ns1. hostmaster.warn.example. (
+ 1 3600 1200 604800 3600 )
+ NS ns1.
+ns1. 555 IN A 10.53.0.1
--- /dev/null
+/*
+ * 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.
+ */
+
+#include <inttypes.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <isc/buffer.h>
+#include <isc/commandline.h>
+#include <isc/file.h>
+#include <isc/mem.h>
+#include <isc/print.h>
+#include <isc/result.h>
+#include <isc/string.h>
+#include <isc/util.h>
+
+#include <dns/fixedname.h>
+#include <dns/message.h>
+#include <dns/name.h>
+#include <dns/rcode.h>
+#include <dns/tsig.h>
+#include <dns/view.h>
+#include <dns/zone.h>
+
+#include "fuzz.h"
+
+bool debug = false;
+
+static isc_mem_t *mctx = NULL;
+
+/*
+ * Packet dumps of validily signed request ./IN/SOA
+ * requests.
+ *
+ * TSIG:
+ *
+ * 0x0000: 600b 0900 006a 1140 0000 0000 0000 0000
+ * 0x0010: 0000 0000 0000 0001 0000 0000 0000 0000
+ * 0x0020: 0000 0000 0000 0001 cc88 0035 006a 007d
+ * 0x0030: 1dfa 0000 0001 0000 0000 0001 0000 0600
+ * 0x0040: 0108 7473 6967 2d6b 6579 0000 fa00 ff00
+ * 0x0050: 0000 0000 3d0b 686d 6163 2d73 6861 3235
+ * 0x0060: 3600 0000 622a cce1 012c 0020 224d 5807
+ * 0x0070: 648d 1400 9d8e fc1c d049 55e9 cc90 2187
+ * 0x0080: 3b5f af5c 8899 dc27 c8df b34b 1dfa 0000
+ * 0x0090: 0000
+ *
+ * SIG(0):
+ *
+ * 0x0000: 6004 0e00 013f 1140 0000 0000 0000 0000
+ * 0x0010: 0000 0000 0000 0001 0000 0000 0000 0000
+ * 0x0020: 0000 0000 0000 0001 c0a7 0035 013f 0152
+ * 0x0030: 0000 0000 0001 0000 0000 0001 0000 0600
+ * 0x0040: 0100 0018 00ff 0000 0000 011b 0000 0800
+ * 0x0050: 0000 0000 622a ce0d 622a cbb5 da71 0773
+ * 0x0060: 6967 306b 6579 0068 988b 27bf 5c89 5270
+ * 0x0070: c5ba ea8b 2e10 0512 9b44 48d3 69de b7ec
+ * 0x0080: 7c67 15f3 6bc7 b0dc 277b e8f1 6979 4c89
+ * 0x0090: 149a 0203 30a1 c0b7 a711 ee8a 8d90 ebb9
+ * 0x00a0: 9e33 dd65 33d5 5d1d 90db cf9c bb6a b346
+ * 0x00b0: 568f a399 71d7 c877 616d 2fb7 0f86 963f
+ * 0x00c0: aa00 850d 180a 9f83 cd4b d115 c79f 64c9
+ * 0x00d0: ff05 e751 6810 28b3 2249 c4ba 2d8d 57ba
+ * 0x00e0: 9aad f1fc b34e c237 9465 04fd fe4d 19c9
+ * 0x00f0: 2368 ec8e 7097 eaea e067 2b9c 06eb c383
+ * 0x0100: e901 a11e 606b 4cce c12a 0e57 8c09 b7cb
+ * 0x0110: 23bb ec05 b68b 1852 9288 b665 fe89 cf62
+ * 0x0120: 0a41 5e5a acbe 6903 cbb7 e7b6 cab4 e4a2
+ * 0x0130: b98f 884f c09d 5b39 c695 c84c 9a92 f110
+ * 0x0140: ccc3 f2ee 313f a2a1 1cda 5aa2 faec d593
+ * 0x0150: 4514 724a 868f 94b9 0547 4dc9 7b73 c85e
+ * 0x0160: 544c 73d4 e892 f9
+ */
+
+#define HMACSHA256 "\x0bhmac-sha256"
+
+static isc_stdtime_t fuzztime = 0x622acce1;
+static dns_view_t *view = NULL;
+static dns_tsigkey_t *tsigkey = NULL;
+static dns_tsig_keyring_t *ring = NULL;
+static dns_tsig_keyring_t *emptyring = NULL;
+static char *wd = NULL;
+static char template[] = "/tmp/dns-message-checksig-XXXXXX";
+
+static char f1[] = "Ksig0key.+008+55921.key";
+static char c1[] = "sig0key. IN KEY 512 3 8 "
+ "AwEAAa22lgHi1vAbQvu5ETdTrm2H8rwga9tvyMa6LFiSDyevLvSv0Uo5 "
+ "uvfrXnxaLdtBMts6e1Ly2piSH9JRbOGMNibOK4EXWhWAn8MII4SWgQAs "
+ "bFwtiz4HyPn2wScrUQdo8DocKiQJBanesr7vDO8fdA6Rg1e0yAtSeNti "
+ "e8avx46/HJa6CFs3CoE0sf6oOFSxM954AgCBTXOGNBt1Nt3Bhfqt2qyA "
+ "TLFii5K1jLDTZDVkoiyDXL1M7wcTwKf9METgj1eQmH3GGlRM/OJ/j8xk "
+ "ZiFGbL3cipWdiH48031jiV2hlc92mKn8Ya0d9AN6c44piza/JSFydZXw "
+ "sY32nxzjDbs=\n";
+
+static char f2[] = "Ksig0key.+008+55921.private";
+static char c2[] = "Private-key-format: v1.3\n\
+Algorithm: 8 (RSASHA256)\n\
+Modulus: rbaWAeLW8BtC+7kRN1OubYfyvCBr22/IxrosWJIPJ68u9K/RSjm69+tefFot20Ey2zp7UvLamJIf0lFs4Yw2Js4rgRdaFYCfwwgjhJaBACxsXC2LPgfI+fbBJytRB2jwOhwqJAkFqd6yvu8M7x90DpGDV7TIC1J422J7xq/Hjr8clroIWzcKgTSx/qg4VLEz3ngCAIFNc4Y0G3U23cGF+q3arIBMsWKLkrWMsNNkNWSiLINcvUzvBxPAp/0wROCPV5CYfcYaVEz84n+PzGRmIUZsvdyKlZ2IfjzTfWOJXaGVz3aYqfxhrR30A3pzjimLNr8lIXJ1lfCxjfafHOMNuw==\n\
+PublicExponent: AQAB\n\
+PrivateExponent: GDfclFkR5ToFGH9rMTRMnP73Q5dzjLgkx4vyHcuzKtxcvAans4+hNj+NazckAy2E+mpzV2j95TJ4wZjSM2RvB5xLwBIc4Dg6oyAHL6Ikoae6gw64cHFOaYb808n8CyqWqfX+QWAz9sRSVZXnTuPViX3A+svR7ejVak9Bzr1NTDm0DFlrhaKVCYA++dKVZerfuNiXT/jQvrc4wMCa7WWsfLsFO8aTNkEhqUnmS9c5VYgr7MkCV4ENDBcISpQc9wElI0hl12QPaSj8iSdk9liYp+HTiOxOyp6BGGuecKAoQijMwrZy4qExdOxvowptll8+nZLtwGRn/un/xvIZY5OLAQ==\n\
+Prime1: ww3C6jwnrLQik/zxSgC0KuqgHq68cCjiRjwK2/euzs7NkMevFpXvV0cWO8x1/wKC1mszVLsUaKTvH6fzRsXfz5MPihzNzUYFwvobKVLserSxEwHNk+FKUU+q07Kf8WWnCqX5nX9QzVG1q4J8Q44N49I5S480jHLGYbyLZrEYMQE=\n\
+Prime2: 4/3Ozq/8vRgcO4bieFs4CbZR7C98HiTi65SiLBIKY09mDfCleZI0uurAYBluZJgHS5AC5cdyHFuJr3uKxvD+Mgdlru40U6cSCEdK7HAhyUGZUndWl28wyMEB6Kke1/owxVn0S4RKLPOgFI2668H6JObaqXf0wyY89RdVQP6VQrs=\n\
+Exponent1: Tbr9MyVX1j5PDVSev5P6OKQZvUB7PeM9ESo6VaCl3CqTxx+cic6ke86LcLcxSrewdkxwP1LydiVMWfwvOcP/RhRf+/Uwmp5OC35qNpSiQuAhNObiCw2b9T1fYU/s52FQKTEtgXNMOxZV5IxyguVoaaLMTG08TsAqiKZ/kyP99QE=\n\
+Exponent2: Q4qSNKrwLbixzHS2LL+hR0dK17RtiaSV0QKUVIf3qdoAusp6yxwkIOegnBeMm6JqLtl38kh2pq37iRAJWcxVEc8dMYiB2fJZpjgwmwDREYUsfcC611vqUN7UyO8pIwSMZDq045ZKPyzhVJV0NZmemEYHq0LNMO7oCheiewGwiDc=\n\
+Coefficient: T2u/J4NgyO+OqoLpXBIpTBzqrvDk8tb0feYgsp5d16hHvbXxNkMUR8cI07RdbI9HnEldtmhAnbQ6SvFiy2YYjpw/1Fz2WwdxRqLaDV7UlhrT+CqltvU9d/N/xThBNKDa23Wf5Vat+HRiLHSgzsY1PseVCWN+g4azuK2D8+DLeHE=\n\
+Created: 20220311073606\n\
+Publish: 20220311073606\n\
+Activate: 20220311073606\n";
+
+static char f3[] = "sig0key.db";
+static char c3[] = "sig0key. 0 IN SOA . . 0 0 0 0 0\n\
+sig0key. 0 IN NS .\n\
+sig0key. 0 IN KEY 512 3 8 AwEAAa22lgHi1vAbQvu5ETdTrm2H8rwga9tvyMa6LFiSDyevLvSv0Uo5 uvfrXnxaLdtBMts6e1Ly2piSH9JRbOGMNibOK4EXWhWAn8MII4SWgQAs bFwtiz4HyPn2wScrUQdo8DocKiQJBanesr7vDO8fdA6Rg1e0yAtSeNti e8avx46/HJa6CFs3CoE0sf6oOFSxM954AgCBTXOGNBt1Nt3Bhfqt2qyA TLFii5K1jLDTZDVkoiyDXL1M7wcTwKf9METgj1eQmH3GGlRM/OJ/j8xk ZiFGbL3cipWdiH48031jiV2hlc92mKn8Ya0d9AN6c44piza/JSFydZXw sY32nxzjDbs=\n";
+
+static bool destroy_dst = false;
+
+static void
+cleanup(void) {
+ char pathbuf[PATH_MAX];
+ char *pwd = getcwd(pathbuf, sizeof(pathbuf));
+
+ if (view != NULL) {
+ dns_view_detach(&view);
+ }
+ if (tsigkey != NULL) {
+ dns_tsigkey_detach(&tsigkey);
+ }
+ if (ring != NULL) {
+ dns_tsigkeyring_detach(&ring);
+ }
+ if (emptyring != NULL) {
+ dns_tsigkeyring_detach(&emptyring);
+ }
+ if (destroy_dst) {
+ dst_lib_destroy();
+ }
+ if (mctx != NULL) {
+ isc_mem_detach(&mctx);
+ }
+ if (wd != NULL && chdir(wd) == 0) {
+ if (remove(f1) != 0) {
+ fprintf(stderr, "remove(%s) failed\n", f1);
+ }
+ if (remove(f2) != 0) {
+ fprintf(stderr, "remove(%s) failed\n", f2);
+ }
+ if (remove(f3) != 0) {
+ fprintf(stderr, "remove(%s) failed\n", f3);
+ }
+ /*
+ * Restore working directory if possible before cleaning
+ * up the key directory. This will help with any other
+ * cleanup routines and if this code is ever run under
+ * Windows as the directory should not be in use when
+ * rmdir() is called.
+ */
+ if (pwd != NULL && chdir(pwd) != 0) {
+ fprintf(stderr, "can't restore working directory: %s\n",
+ pwd);
+ }
+ if (rmdir(wd) != 0) {
+ fprintf(stderr, "rmdir(%s) failed\n", wd);
+ }
+ } else {
+ fprintf(stderr, "cleanup of %s failed\n", wd ? wd : "(null)");
+ }
+}
+
+int
+LLVMFuzzerInitialize(int *argc __attribute__((unused)),
+ char ***argv __attribute__((unused))) {
+ isc_result_t result;
+ dns_fixedname_t fixed;
+ dns_name_t *name = dns_fixedname_initname(&fixed);
+ unsigned char secret[16] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff };
+ dns_zone_t *zone = NULL;
+ char pathbuf[PATH_MAX];
+ FILE *fd;
+
+ atexit(cleanup);
+
+ wd = mkdtemp(template);
+ if (wd == NULL) {
+ fprintf(stderr, "mkdtemp failed\n");
+ return (1);
+ }
+
+ snprintf(pathbuf, sizeof(pathbuf), "%s/%s", wd, f1);
+ fd = fopen(pathbuf, "w");
+ if (fd == NULL) {
+ fprintf(stderr, "fopen(%s) failed\n", pathbuf);
+ return (1);
+ }
+ fputs(c1, fd);
+ fclose(fd);
+
+ snprintf(pathbuf, sizeof(pathbuf), "%s/%s", wd, f2);
+ fd = fopen(pathbuf, "w");
+ if (fd == NULL) {
+ fprintf(stderr, "fopen(%s) failed\n", pathbuf);
+ return (1);
+ }
+ fputs(c2, fd);
+ fclose(fd);
+
+ snprintf(pathbuf, sizeof(pathbuf), "%s/%s", wd, f3);
+ fd = fopen(pathbuf, "w");
+ if (fd == NULL) {
+ fprintf(stderr, "fopen(%s) failed\n", pathbuf);
+ return (1);
+ }
+ fputs(c3, fd);
+ fclose(fd);
+
+ isc_mem_create(&mctx);
+
+ result = dst_lib_init(mctx, NULL);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "dst_lib_init failed: %s\n",
+ isc_result_totext(result));
+ return (1);
+ }
+ destroy_dst = true;
+
+ result = dns_view_create(mctx, dns_rdataclass_in, "view", &view);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "dns_view_create failed: %s\n",
+ isc_result_totext(result));
+ return (1);
+ }
+
+ result = dns_tsigkeyring_create(mctx, &ring);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "dns_tsigkeyring_create failed: %s\n",
+ isc_result_totext(result));
+ return (1);
+ }
+
+ result = dns_tsigkeyring_create(mctx, &emptyring);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "dns_tsigkeyring_create failed: %s\n",
+ isc_result_totext(result));
+ return (1);
+ }
+
+ result = dns_name_fromstring(name, "tsig-key", 0, NULL);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "dns_name_fromstring failed: %s\n",
+ isc_result_totext(result));
+ return (1);
+ }
+
+ result = dns_tsigkey_create(name, dns_tsig_hmacsha256_name, secret,
+ sizeof(secret), false, NULL, 0, 0, mctx,
+ ring, &tsigkey);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "dns_tsigkey_create failed: %s\n",
+ isc_result_totext(result));
+ return (1);
+ }
+
+ result = dns_name_fromstring(name, "sig0key", 0, NULL);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "dns_name_fromstring failed: %s\n",
+ isc_result_totext(result));
+ return (1);
+ }
+
+ result = dns_zone_create(&zone, mctx);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "dns_zone_create failed: %s\n",
+ isc_result_totext(result));
+ return (1);
+ }
+
+ result = dns_zone_setorigin(zone, name);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "dns_zone_setorigin failed: %s\n",
+ isc_result_totext(result));
+ return (1);
+ }
+
+ dns_zone_setclass(zone, view->rdclass);
+ dns_zone_settype(zone, dns_zone_primary);
+
+ result = dns_zone_setkeydirectory(zone, wd);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "dns_zone_setkeydirectory failed: %s\n",
+ isc_result_totext(result));
+ return (1);
+ }
+
+ result = dns_zone_setfile(zone, pathbuf, dns_masterformat_text,
+ &dns_master_style_default);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "dns_zone_setfile failed: %s\n",
+ isc_result_totext(result));
+ return (1);
+ }
+
+ result = dns_zone_load(zone, false);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "dns_zone_load failed: %s\n",
+ isc_result_totext(result));
+ return (1);
+ }
+
+ result = dns_view_addzone(view, zone);
+ if (result != ISC_R_SUCCESS) {
+ fprintf(stderr, "dns_view_addzone failed: %s\n",
+ isc_result_totext(result));
+ return (1);
+ }
+
+ dns_view_freeze(view);
+
+ dns_zone_detach(&zone);
+
+ return (0);
+}
+
+static isc_result_t
+create_message(dns_message_t **messagep, const uint8_t *data, size_t size,
+ bool addasig, bool addtsig) {
+ isc_result_t result;
+ dns_message_t *message = NULL;
+ isc_buffer_t b;
+ static unsigned char buf[65535];
+
+ isc_buffer_init(&b, buf, sizeof(buf));
+
+ /* Message ID */
+ isc_buffer_putuint16(&b, 0);
+
+ /* QR, Opcode, other flags = 0, rcode = 0 */
+ isc_buffer_putuint16(&b, (*data & 0x1f) << 11);
+ /* Counts */
+ isc_buffer_putuint16(&b, 1);
+ isc_buffer_putuint16(&b, 0);
+ isc_buffer_putuint16(&b, 0);
+ isc_buffer_putuint16(&b, addasig ? 1 : 0);
+
+ /* Question ./IN/SOA */
+ isc_buffer_putuint8(&b, 0);
+ isc_buffer_putuint16(&b, 6);
+ isc_buffer_putuint16(&b, 1);
+
+ if (addasig) {
+ /* Signature */
+ if (addtsig) {
+ const unsigned char keyname[] = "\x08tsig-key";
+ isc_buffer_putmem(&b, keyname, sizeof(keyname));
+ isc_buffer_putuint16(&b, dns_rdatatype_tsig);
+ isc_buffer_putuint16(&b, dns_rdataclass_any);
+ } else {
+ isc_buffer_putuint8(&b, 0); /* '.' */
+ isc_buffer_putuint16(&b, dns_rdatatype_sig);
+ isc_buffer_putuint16(&b, dns_rdataclass_in);
+ }
+ isc_buffer_putuint32(&b, 0); /* ttl */
+ data++;
+ size--;
+ if (size > isc_buffer_availablelength(&b) - 2) {
+ size = isc_buffer_availablelength(&b) - 2;
+ }
+ isc_buffer_putuint16(&b, size);
+ isc_buffer_putmem(&b, data, size);
+ }
+
+ dns_message_create(mctx, DNS_MESSAGE_INTENTPARSE, &message);
+
+ result = dns_message_parse(message, &b, 0);
+ if (debug) {
+ fprintf(stderr, "dns_message_parse => %s\n",
+ isc_result_totext(result));
+ }
+ if (result != ISC_R_SUCCESS) {
+ dns_message_detach(&message);
+ } else {
+ if (debug) {
+ char text[200000];
+ isc_buffer_init(&b, text, sizeof(text));
+
+ result = dns_message_totext(
+ message, &dns_master_style_debug, 0, &b);
+ if (result == ISC_R_SUCCESS) {
+ fprintf(stderr, "%.*s", (int)b.used, text);
+ } else {
+ fprintf(stderr, "dns_message_totext => %s\n",
+ isc_result_totext(result));
+ }
+ }
+ *messagep = message;
+ }
+ return (result);
+}
+
+int
+LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+ isc_result_t result;
+ dns_message_t *message = NULL;
+ unsigned char query_tsig[23 + 32 + 6] = { 0 };
+ bool addasig = false;
+ bool addtime = false;
+ bool addtsig = false;
+ bool setquerytsig = false;
+ bool settsigkey = false;
+ bool subtime = false;
+ bool withring = false;
+ bool withview = false;
+
+ /*
+ * The first 2 octets affect setup.
+ * Octet 1 determines whether a signature is added and which type
+ * (addasig, addtsig), whether time should be adjusted (addtime,
+ * subtime), whether dns_message_setquerytsig and dns_message_settsigkey
+ * have been called, whether there is a keyring available with the
+ * TSIG key or a view is defined.
+ *
+ * The second octet defines if the message is a response and the
+ * opcode.
+ */
+ if (size > 65535 || size < 2) {
+ return (0);
+ }
+
+ addasig = (*data & 0x80) != 0;
+ addtime = (*data & 0x40) != 0;
+ addtsig = (*data & 0x20) != 0;
+ setquerytsig = (*data & 0x10) != 0;
+ settsigkey = (*data & 0x08) != 0;
+ subtime = (*data & 0x04) != 0;
+ withring = (*data & 0x02) != 0;
+ withview = (*data & 0x01) != 0;
+
+ data++;
+ size--;
+
+ if (debug) {
+ fprintf(stderr,
+ "addasig=%u addtime=%u addtsig=%u setquerytsig=%u "
+ "settsigkey=%u subtime=%u withring=%u\nwithview=%u\n",
+ addasig, addtime, addtsig, setquerytsig, settsigkey,
+ subtime, withring, withview);
+ }
+
+ result = create_message(&message, data, size, addasig, addtsig);
+ if (result != ISC_R_SUCCESS) {
+ return (0);
+ }
+
+ /*
+ * Make time calculations consistent.
+ */
+ message->fuzzing = 1;
+ message->fuzztime = fuzztime;
+ if (addtime) {
+ message->fuzztime += 1200;
+ }
+ if (subtime) {
+ message->fuzztime -= 1200;
+ }
+
+ if ((message->flags & DNS_MESSAGEFLAG_QR) != 0) {
+ if (setquerytsig) {
+ isc_buffer_t b;
+ unsigned char hmacname[] = HMACSHA256;
+ unsigned char hmacvalue[32] = {
+ 0x22, 0x4d, 0x58, 0x07, 0x64, 0x8d, 0x14, 0x00,
+ 0x9d, 0x8e, 0xfc, 0x1c, 0xd0, 0x49, 0x55, 0xe9,
+ 0xcc, 0x90, 0x21, 0x87, 0x3b, 0x5f, 0xaf, 0x5c,
+ 0x88, 0x99, 0xdc, 0x27, 0xc8, 0xdf, 0xb3, 0x4b
+ };
+
+ /*
+ * Valid TSIG rdata for tsig-key over a plain
+ * DNS QUERY for ./SOA/IN with no flags set.
+ */
+ isc_buffer_init(&b, query_tsig, sizeof(query_tsig));
+ isc_buffer_putmem(&b, hmacname, sizeof(hmacname));
+ isc_buffer_putuint16(&b, 0); /* time high */
+ isc_buffer_putuint32(&b, 0x622abec0); /* time low */
+ isc_buffer_putuint16(&b, 300); /* Fudge */
+ isc_buffer_putuint16(&b, 32); /* Mac Length */
+ /* Mac */
+ isc_buffer_putmem(&b, hmacvalue, 32);
+ isc_buffer_putuint16(&b, 7674); /* Original Id */
+ isc_buffer_putuint16(&b, 0); /* Error */
+ isc_buffer_putuint16(&b, 0); /* Other len */
+
+ dns_message_setquerytsig(message, &b);
+ }
+ }
+
+ if (settsigkey) {
+ result = dns_message_settsigkey(message, tsigkey);
+ if (debug) {
+ fprintf(stderr, "dns_message_settsigkey => %s\n",
+ isc_result_totext(result));
+ }
+ }
+
+ dns_view_setkeyring(view, withring ? ring : emptyring);
+
+ result = dns_message_checksig(message, withview ? view : NULL);
+ if (debug) {
+ char textbuf[64];
+ isc_buffer_t b;
+
+ fprintf(stderr, "dns_message_checksig => %s\n",
+ isc_result_totext(result));
+ isc_buffer_init(&b, textbuf, sizeof(textbuf));
+ dns_tsigrcode_totext(message->tsigstatus, &b);
+ fprintf(stderr, "tsigstatus=%.*s\n", (int)b.used, textbuf);
+ isc_buffer_init(&b, textbuf, sizeof(textbuf));
+ dns_tsigrcode_totext(message->sig0status, &b);
+ fprintf(stderr, "sig0status=%.*s\n", (int)b.used, textbuf);
+ }
+ if (result != ISC_R_SUCCESS) {
+ goto cleanup;
+ }
+
+cleanup:
+ if (message != NULL) {
+ dns_message_detach(&message);
+ }
+
+ return (0);
+}
--- /dev/null
+/*
+ * 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.
+ */
+
+#include <inttypes.h>
+#include <stdbool.h>
+#include <stdlib.h>
+
+#include <isc/buffer.h>
+#include <isc/commandline.h>
+#include <isc/file.h>
+#include <isc/mem.h>
+#include <isc/print.h>
+#include <isc/result.h>
+#include <isc/string.h>
+#include <isc/util.h>
+
+#include <dns/message.h>
+#include <dns/result.h>
+
+#include "fuzz.h"
+
+bool debug = false;
+
+static isc_mem_t *mctx = NULL;
+static uint8_t *output = NULL;
+static size_t output_len = 1024;
+static uint8_t render_buf[64 * 1024 - 1];
+
+int
+LLVMFuzzerInitialize(int *argc __attribute__((unused)),
+ char ***argv __attribute__((unused))) {
+ isc_mem_create(&mctx);
+ output = isc_mem_get(mctx, output_len);
+
+ return (0);
+}
+
+static isc_result_t
+parse_message(isc_buffer_t *input, dns_message_t **messagep) {
+ isc_result_t result;
+ dns_message_t *message = NULL;
+
+ dns_message_create(mctx, DNS_MESSAGE_INTENTPARSE, &message);
+
+ result = dns_message_parse(message, input, DNS_MESSAGEPARSE_BESTEFFORT);
+ if (result == DNS_R_RECOVERABLE) {
+ result = ISC_R_SUCCESS;
+ }
+
+ if (result == ISC_R_SUCCESS && messagep != NULL) {
+ *messagep = message;
+ } else {
+ dns_message_detach(&message);
+ }
+
+ return (result);
+}
+
+static isc_result_t
+print_message(dns_message_t *message) {
+ isc_result_t result;
+ isc_buffer_t buffer;
+
+ do {
+ isc_buffer_init(&buffer, output, output_len);
+ result = dns_message_totext(message, &dns_master_style_debug, 0,
+ &buffer);
+ if (result == ISC_R_NOSPACE) {
+ isc_mem_put(mctx, output, output_len);
+ output_len *= 2;
+ output = isc_mem_get(mctx, output_len);
+ continue;
+ }
+ } while (result == ISC_R_NOSPACE);
+
+ if (debug) {
+ fprintf(stderr, "%.*s\n", (int)isc_buffer_usedlength(&buffer),
+ output);
+ }
+
+ return (result);
+}
+
+#define CHECKRESULT(r, f) \
+ { \
+ r = (f); \
+ if (r != ISC_R_SUCCESS) { \
+ goto cleanup; \
+ } \
+ }
+
+static isc_result_t
+render_message(dns_message_t **messagep) {
+ isc_result_t result;
+ dns_message_t *message = *messagep;
+ isc_buffer_t buffer;
+ dns_compress_t cctx;
+
+ isc_buffer_init(&buffer, render_buf, sizeof(render_buf));
+
+ message->from_to_wire = DNS_MESSAGE_INTENTRENDER;
+ for (size_t i = 0; i < DNS_SECTION_MAX; i++) {
+ message->counts[i] = 0;
+ }
+
+ result = dns_compress_init(&cctx, -1, mctx);
+ if (result != ISC_R_SUCCESS) {
+ return (result);
+ }
+ CHECKRESULT(result, dns_message_renderbegin(message, &cctx, &buffer));
+
+ CHECKRESULT(result, dns_message_rendersection(message,
+ DNS_SECTION_QUESTION, 0));
+
+ CHECKRESULT(result,
+ dns_message_rendersection(message, DNS_SECTION_ANSWER, 0));
+ CHECKRESULT(result, dns_message_rendersection(
+ message, DNS_SECTION_AUTHORITY, 0));
+
+ CHECKRESULT(result, dns_message_rendersection(
+ message, DNS_SECTION_ADDITIONAL, 0));
+
+ dns_message_renderend(message);
+
+ dns_compress_invalidate(&cctx);
+
+ message->from_to_wire = DNS_MESSAGE_INTENTPARSE;
+
+ dns_message_detach(messagep);
+
+ result = parse_message(&buffer, messagep);
+
+ return (result);
+
+cleanup:
+ dns_compress_invalidate(&cctx);
+ return (result);
+}
+
+int
+LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+ isc_buffer_t buffer;
+ isc_result_t result;
+ dns_message_t *message = NULL;
+
+ if (size > 65535) {
+ return (0);
+ }
+
+ isc_buffer_constinit(&buffer, data, size);
+ isc_buffer_add(&buffer, size);
+ isc_buffer_setactive(&buffer, size);
+
+ result = parse_message(&buffer, &message);
+ if (result != ISC_R_SUCCESS) {
+ goto cleanup;
+ }
+
+ result = print_message(message);
+ if (result != ISC_R_SUCCESS) {
+ goto cleanup;
+ }
+
+ result = render_message(&message);
+ if (result != ISC_R_SUCCESS) {
+ goto cleanup;
+ }
+
+ result = print_message(message);
+ if (result != ISC_R_SUCCESS) {
+ goto cleanup;
+ }
+
+cleanup:
+ if (message != NULL) {
+ dns_message_detach(&message);
+ }
+
+ return (0);
+}
#include <dns/fixedname.h>
#include <dns/name.h>
+#include "fuzz.h"
+
+bool debug = false;
+
int
-LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
+LLVMFuzzerInitialize(int *argc __attribute__((unused)),
+ char ***argv __attribute__((unused))) {
+ return (0);
+}
int
LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
isc_buffer_t buf;
isc_result_t result;
dns_fixedname_t origin;
- char *de_const;
-
- if (size < 5) {
- return (0);
- }
dns_fixedname_init(&origin);
- DE_CONST(data, de_const);
- isc_buffer_init(&buf, (void *)de_const, size);
+
+ isc_buffer_constinit(&buf, data, size);
isc_buffer_add(&buf, size);
+ isc_buffer_setactive(&buf, size);
+
result = dns_name_fromtext(dns_fixedname_name(&origin), &buf,
dns_rootname, 0, NULL);
- UNUSED(result);
+ if (debug) {
+ fprintf(stderr, "dns_name_fromtext: %s\n",
+ isc_result_totext(result));
+ }
return (0);
}
--- /dev/null
+/*
+ * 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.
+ */
+
+#include <stdbool.h>
+#include <stdlib.h>
+
+#include <isc/buffer.h>
+#include <isc/commandline.h>
+#include <isc/lex.h>
+#include <isc/mem.h>
+#include <isc/print.h>
+#include <isc/string.h>
+#include <isc/util.h>
+
+#include <dns/fixedname.h>
+#include <dns/name.h>
+#include <dns/rdata.h>
+#include <dns/rdataclass.h>
+#include <dns/rdatatype.h>
+#include <dns/result.h>
+
+#include "fuzz.h"
+
+bool debug = false;
+
+int
+LLVMFuzzerInitialize(int *argc, char ***argv) {
+ UNUSED(argc);
+ UNUSED(argv);
+ return (0);
+}
+
+/* following code was copied from named-rrchecker */
+isc_lexspecials_t specials = { ['('] = 1, [')'] = 1, ['"'] = 1 };
+
+int
+LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+ isc_mem_t *mctx = NULL;
+ isc_mem_create(&mctx);
+
+ isc_lex_t *lex = NULL;
+ isc_token_t token;
+
+ isc_result_t result;
+ unsigned int options = 0;
+ dns_rdatatype_t rdtype;
+ dns_rdataclass_t rdclass;
+
+ char wiredata[64 * 1024];
+ isc_buffer_t wirebuf;
+ isc_buffer_init(&wirebuf, wiredata, sizeof(wiredata));
+
+ dns_rdata_t rdata = DNS_RDATA_INIT;
+ dns_name_t *name = NULL;
+
+ isc_buffer_t inbuf;
+ isc_buffer_constinit(&inbuf, data, size);
+ isc_buffer_add(&inbuf, size);
+ isc_buffer_setactive(&inbuf, size);
+
+ RUNTIME_CHECK(isc_lex_create(mctx, 256, &lex) == ISC_R_SUCCESS);
+
+ /*
+ * Set up to lex DNS master file.
+ */
+ isc_lex_setspecials(lex, specials);
+ options = ISC_LEXOPT_EOL;
+ isc_lex_setcomments(lex, ISC_LEXCOMMENT_DNSMASTERFILE);
+
+ RUNTIME_CHECK(isc_lex_openbuffer(lex, &inbuf) == ISC_R_SUCCESS);
+
+ result = isc_lex_gettoken(lex, options | ISC_LEXOPT_NUMBER, &token);
+ if (result != ISC_R_SUCCESS) {
+ goto cleanup;
+ }
+ if (token.type == isc_tokentype_eof) {
+ goto cleanup;
+ }
+ if (token.type == isc_tokentype_eol) {
+ goto cleanup;
+ }
+ /*
+ * Get class.
+ */
+ if (token.type == isc_tokentype_number) {
+ if (token.value.as_ulong > 0xffff) {
+ goto cleanup;
+ }
+ rdclass = (dns_rdataclass_t)token.value.as_ulong;
+ } else if (token.type == isc_tokentype_string) {
+ result = dns_rdataclass_fromtext(&rdclass,
+ &token.value.as_textregion);
+ if (result != ISC_R_SUCCESS) {
+ goto cleanup;
+ }
+ } else {
+ goto cleanup;
+ }
+ result = isc_lex_gettoken(lex, options | ISC_LEXOPT_NUMBER, &token);
+ if (result != ISC_R_SUCCESS) {
+ goto cleanup;
+ }
+ if (token.type == isc_tokentype_eol) {
+ goto cleanup;
+ }
+ if (token.type == isc_tokentype_eof) {
+ goto cleanup;
+ }
+
+ /*
+ * Get type.
+ */
+ if (token.type == isc_tokentype_number) {
+ if (token.value.as_ulong > 0xffff) {
+ goto cleanup;
+ }
+ rdtype = (dns_rdatatype_t)token.value.as_ulong;
+ } else if (token.type == isc_tokentype_string) {
+ result = dns_rdatatype_fromtext(&rdtype,
+ &token.value.as_textregion);
+ if (result != ISC_R_SUCCESS) {
+ goto cleanup;
+ }
+ } else {
+ goto cleanup;
+ }
+
+ result = dns_rdata_fromtext(&rdata, rdclass, rdtype, lex, name, 0, mctx,
+ &wirebuf, NULL);
+ if (debug) {
+ fprintf(stderr, "dns_rdata_fromtext: %s\n",
+ isc_result_totext(result));
+ }
+
+cleanup:
+ isc_lex_close(lex);
+ isc_lex_destroy(&lex);
+ isc_mem_destroy(&mctx);
+ return (0);
+}
--- /dev/null
+IN AFSDB 0 hostname
--- /dev/null
+IN AMTRELAY 0 0 3 example.net.
--- /dev/null
+ANY TSIG SAMPLE-ALG.EXAMPLE. 853804800 300 4 MTIzNA== 666 0 2 MDA=
--- /dev/null
+IN AVC foo:bar
--- /dev/null
+IN CAA 128 tbs "Unknown"
--- /dev/null
+IN CDNSKEY 512 ( 255 1 AQMFD5raczCJHViKtLYhWGz8hMY 9UGRuniJDBzC7w0aRyzWZriO6i2odGWWQVucZqKV sENW91IOW4vqudngPZsY3GvQ/xVA8/7pyFj6b7Esg a60zyGW6LFe9r8n6paHrlG5ojqf0BaqHT+8= )
--- /dev/null
+IN CDS 30795 1 1 ( 310D27F4D82C1FC2400704EA9939FE6E1CEA A3B9 )
--- /dev/null
+IN CERT 65534 65535 254 ( MxFcby9k/yvedMfQgKzhH5er0Mu/vILz45I kskceFGgiWCn/GxHhai6VAuHAoNUz4YoU1t VfSCSqQYn6//11U6Nld80jEeC8aTrO+KKmCaY= )
--- /dev/null
+CH A hostname. 1234
--- /dev/null
+CLASS1234 TYPE65533 \# 6 010203040506
--- /dev/null
+IN CNAME cname-target
--- /dev/null
+IN CSYNC 0 0 A NS AAAA
--- /dev/null
+IN DLV 30795 1 1 ( 310D27F4D82C1FC2400704EA9939FE6E1CEA A3B9 )
--- /dev/null
+IN DNAME dname-target.
--- /dev/null
+IN DNSKEY 512 ( 255 1 AQMFD5raczCJHViKtLYhWGz8hMY 9UGRuniJDBzC7w0aRyzWZriO6i2odGWWQVucZqKV sENW91IOW4vqudngPZsY3GvQ/xVA8/7pyFj6b7Esg a60zyGW6LFe9r8n6paHrlG5ojqf0BaqHT+8= )
--- /dev/null
+IN DOA 0 1 2 "" aHR0cHM6Ly93d3cuaXNjLm9yZy8=
--- /dev/null
+IN DS 12892 5 1 7AA4A3F416C2F2391FB7AB0D434F762CD62D1390
--- /dev/null
+IN EUI48 01-23-45-67-89-ab
--- /dev/null
+IN EUI64 01-23-45-67-89-ab-cd-ef
--- /dev/null
+IN GID \# 1 03
--- /dev/null
+IN GPOS -22.6882 116.8652 250.0
--- /dev/null
+IN HINFO "Generic PC clone" "NetBSD-1.4"
--- /dev/null
+IN HIP ( 2 200100107B1A74DF365639CC39F1D578 AwEAAbdxyhNuSutc5EMzxTs9LBPCIkOFH8cIvM4p9+LrV4e19WzK00+CI6zBCQTdtWsuxKbWIy87UOoJTwkUs7lBu+Upr1gsNrut79ryra+bSRGQb1slImA8YVJyuIDsj7kwzG7jnERNqnWxZ48AWkskmdHaVDP4BcelrTI3rMXdXF5D )
--- /dev/null
+HS A 192.0.2.1
--- /dev/null
+IN A 255.255.255.255
--- /dev/null
+IN A6 127 ::1 foo.
--- /dev/null
+IN AAAA fd92:7065:b8e:ffff::5
--- /dev/null
+IN APL !1:10.0.0.1/32 1:10.0.0.0/24
--- /dev/null
+IN ATMA +61.2.0000.0000
--- /dev/null
+IN DHCID ( AAABxLmlskllE0MVjd57zHcWmEH3pCQ6V ytcKD//7es/deY= )
--- /dev/null
+IN EID 12 89 AB
--- /dev/null
+IN KX 10 kdc
--- /dev/null
+IN NIMLOC 12 89 AB
--- /dev/null
+IN NSAP 0x47.0005.80.005a00.0000.0001.e133.ffffff000164.00
--- /dev/null
+IN NSAP-PTR foo.
--- /dev/null
+IN PX 65535 foo. bar.
--- /dev/null
+IN SRV 65535 65535 65535 old-slow-box
--- /dev/null
+IN WKS 10.0.0.1 tcp telnet ftp 0 1 2
--- /dev/null
+IN IPSECKEY ( 10 3 2 mygateway.example.com. AQNRU3mG7TVTO2BkR47usntb102uFJtugbo6BSGvgqt4AQ== )
--- /dev/null
+IN ISDN "isdn-address" "subaddress"
--- /dev/null
+IN KEY 512 ( 255 1 AQMFD5raczCJHViKtLYhWGz8hMY 9UGRuniJDBzC7w0aRyzWZriO6i2odGWWQVucZqKV sENW91IOW4vqudngPZsY3GvQ/xVA8/7pyFj6b7Esg a60zyGW6LFe9r8n6paHrlG5ojqf0BaqHT+8= )
--- /dev/null
+IN KEYDATA 20210101000000 20380101000000 20380101000000 KSK DNSSEC ED448 ZXh0cmE=
--- /dev/null
+IN L32 10 1.2.3.4
--- /dev/null
+IN L64 10 0014:4fff:ff20:ee64
--- /dev/null
+IN LOC 60 09 00.000 N 24 39 00.000 E 10.00m 20.00m ( 2000.00m 20.00m )
--- /dev/null
+IN LP 10 example.net.
--- /dev/null
+IN MB madname.
--- /dev/null
+IN MD madname
--- /dev/null
+IN MF madname
--- /dev/null
+IN MG mgmname
--- /dev/null
+IN MINFO rmailbx emailbx
--- /dev/null
+IN MR mrname
--- /dev/null
+IN MX 10 mail
--- /dev/null
+IN NAPTR 65535 65535 "blurgh" "blorf" "blllbb" foo.
--- /dev/null
+IN NID 10 0014:4fff:ff20:ee64
--- /dev/null
+IN NINFO "foo\032bar"
--- /dev/null
+IN NS ns43
--- /dev/null
+IN NSEC a.secure.nil. ( NS SOA MX RRSIG DNSKEY LOC NSEC )
--- /dev/null
+IN NSEC3 1 0 10 D2CF0294C020CE6C 8FPNS2UCT7FBS643THP2B77PEQ77K6IU A NS SOA MX AAAA RRSIG DNSKEY NSEC3PARAM
--- /dev/null
+IN NSEC3PARAM 1 0 1 868BCF7ED4108929
--- /dev/null
+IN NXT a.secure.nil. ( NS SOA MX RRSIG KEY LOC NXT )
--- /dev/null
+IN OPENPGPKEY ( AQMFD5raczCJHViKtLYhWGz8hMY 9UGRuniJDBzC7w0aRyzWZriO6i2odGWWQVucZqKV sENW91IOW4vqudngPZsY3GvQ/xVA8/7pyFj6b7Esg a60zyGW6LFe9r8n6paHrlG5ojqf0BaqHT+8= )
--- /dev/null
+ANY OPT unsupported
--- /dev/null
+IN RKEY 0 ( 255 1 AQMFD5raczCJHViKtLYhWGz8hMY 9UGRuniJDBzC7w0aRyzWZriO6i2odGWWQVucZqKV sENW91IOW4vqudngPZsY3GvQ/xVA8/7pyFj6b7Esg a60zyGW6LFe9r8n6paHrlG5ojqf0BaqHT+8= )
--- /dev/null
+IN RP mbox-dname txt-dname
--- /dev/null
+IN RRSIG NSEC 1 3 ( 3600 20000102030405 19961211100908 2143 foo.nil. MxFcby9k/yvedMfQgKzhH5er0Mu/vILz45I kskceFGgiWCn/GxHhai6VAuHAoNUz4YoU1t VfSCSqQYn6//11U6Nld80jEeC8aTrO+KKmCaY= )
--- /dev/null
+IN RT 0 intermediate-host
--- /dev/null
+IN SIG NXT 1 3 ( 3600 20000102030405 19961211100908 2143 foo.nil. MxFcby9k/yvedMfQgKzhH5er0Mu/vILz45I kskceFGgiWCn/GxHhai6VAuHAoNUz4YoU1t VfSCSqQYn6//11U6Nld80jEeC8aTrO+KKmCaY= )
--- /dev/null
+IN SINK 8 0 2 l4ik
--- /dev/null
+IN SMIMEA ( 1 1 2 92003ba34942dc74152e2f2c408d29ec a5a520e7f2e06bb944f4dca346baf63c 1b177615d466f6c4b71c216a50292bd5 8c9ebdd2f74e38fe51ffd48c43326cbc )
--- /dev/null
+IN SOA a.test. hostmaster.null. 1613723740 900 300 604800 900
--- /dev/null
+IN SPF "v=spf1" " -all"
--- /dev/null
+IN SSHFP 4 2 C76D8329954DA2835751E371544E963EFDA099080D6C58DD2BFD9A31 6E162C83
--- /dev/null
+IN TA 30795 1 1 ( 310D27F4D82C1FC2400704EA9939FE6E1CEA A3B9 )
--- /dev/null
+IN TALINK . talink1
--- /dev/null
+IN TKEY algo.test. 0 0 0 0 2 MjI= 1 MQ==
--- /dev/null
+IN TLSA ( 0 0 1 d2abde240d7cd3ee6b4b28c54df034b9 7983a1d16e8a410e4561cb106618e971 )
--- /dev/null
+IN TXT "\"foo\010bar\""
--- /dev/null
+IN UID \# 1 02
--- /dev/null
+IN UINFO \# 1 01
--- /dev/null
+IN UNSPEC \# 1 04
--- /dev/null
+IN URI 10 20 "https://www.isc.org/"
--- /dev/null
+IN X25 "123456789"
--- /dev/null
+IN ZONEMD 2019020700 1 0 ( C220B8A6ED5728A971902F7E3D4FD93A DEEA88B0453C2E8E8C863D465AB06CF3 4EB95B266398C98B59124FA239CB7EEB )
#include <dns/rdata.h>
#include <dns/rdatatype.h>
-#define CHECK(x) \
- ({ \
- if ((result = (x)) != ISC_R_SUCCESS) \
- goto done; \
- })
+#include "fuzz.h"
-extern bool debug;
+bool debug = false;
/*
* Fuzz input to dns_rdata_fromwire(). Then convert the result
* format again, checking for consistency throughout the sequence.
*/
+static isc_mem_t *mctx = NULL;
+static isc_lex_t *lex = NULL;
+
int
-LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
+LLVMFuzzerInitialize(int *argc __attribute__((unused)),
+ char ***argv __attribute__((unused))) {
+ isc_lexspecials_t specials;
+
+ isc_mem_create(&mctx);
+ CHECK(isc_lex_create(mctx, 64, &lex));
+
+ memset(specials, 0, sizeof(specials));
+ specials[0] = 1;
+ specials['('] = 1;
+ specials[')'] = 1;
+ specials['"'] = 1;
+ isc_lex_setspecials(lex, specials);
+ isc_lex_setcomments(lex, ISC_LEXCOMMENT_DNSMASTERFILE);
+
+ return (0);
+}
static void
nullmsg(dns_rdatacallbacks_t *cb, const char *fmt, ...) {
rdata3 = DNS_RDATA_INIT;
dns_rdatacallbacks_t callbacks;
isc_buffer_t source, target;
- isc_lex_t *lex = NULL;
- isc_lexspecials_t specials;
- isc_mem_t *mctx = NULL;
isc_result_t result;
unsigned char fromtext[1024];
unsigned char fromwire[1024];
rdclass = classlist[(*data++) % classes];
size--;
- isc_mem_create(&mctx);
-
- CHECK(isc_lex_create(mctx, 64, &lex));
- memset(specials, 0, sizeof(specials));
- specials[0] = 1;
- specials['('] = 1;
- specials[')'] = 1;
- specials['"'] = 1;
- isc_lex_setspecials(lex, specials);
- isc_lex_setcomments(lex, ISC_LEXCOMMENT_DNSMASTERFILE);
-
if (debug) {
fprintf(stderr, "type=%u, class=%u\n", rdtype, rdclass);
}
assert(target.used == size);
assert(!memcmp(target.base, data, size));
-done:
- if (lex != NULL) {
- isc_lex_destroy(&lex);
- }
- if (lex != NULL) {
- isc_mem_detach(&mctx);
- }
return (0);
}
-d\1e\ 4$3ÿê
\ No newline at end of file
+d0\ 400ÿê
\ No newline at end of file
+++ /dev/null
-d®#®®®®®®®®®®®®®®®®®®®®\10®Ä®®®®®d®®®®®d
\ No newline at end of file
+++ /dev/null
-4A-ò
\ No newline at end of file
+++ /dev/null
-d\10\ 6\ 6éé\ 6\ 6\ 6
\ No newline at end of file
+++ /dev/null
-\13\13\13\13\13\13\13\13\13\13\13\13\13\13\13\13\13\13\13\13\13\13
\ No newline at end of file
-\84Ë\9b\9b\ 4
\ No newline at end of file
+\8400
\ No newline at end of file
-µ|\ f8\87\87¶|¶|\ f8¶|¶|\ f8
\ No newline at end of file
+µ000|
\ No newline at end of file
-\13ñ\ 4\ 4\ 4\ 4(
\ No newline at end of file
+\130\ 4\ 4000
\ No newline at end of file
+++ /dev/null
-222222'\9c\9c\9c\9c\9c\9c\9c\9c\9c\9c\9c\9c\9c\9c\9c\9c\9c2222\1322222'\9c\9c\9c\9c\9c\9c\9c\9c\9c\9c\9c\9c\9c\9c\9c\9c\13
\ No newline at end of file
+++ /dev/null
-d\10\ 6"éé\ 6\ 6\ 6
\ No newline at end of file
-\85-Òe\9c<
\ No newline at end of file
+\8500000
\ No newline at end of file
-|\87°|\ f8
\ No newline at end of file
+|0000
\ No newline at end of file
* information regarding copyright ownership.
*/
+#pragma once
+
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
+#include <isc/dir.h>
#include <isc/lang.h>
#include <isc/mem.h>
#include <isc/once.h>
extern bool debug;
+int
+LLVMFuzzerInitialize(int *argc __attribute__((unused)),
+ char ***argv __attribute__((unused)));
+
int
LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
+#define CHECK(x) \
+ if ((x) != ISC_R_SUCCESS) { \
+ return 0; \
+ }
+
ISC_LANG_ENDDECLS
--- /dev/null
+/*
+ * 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.
+ */
+
+#include <stddef.h>
+#include <stdint.h>
+
+#include <isc/buffer.h>
+#include <isc/lex.h>
+#include <isc/mem.h>
+#include <isc/string.h>
+#include <isc/util.h>
+
+#include "fuzz.h"
+
+bool debug = false;
+
+int
+LLVMFuzzerInitialize(int *argc __attribute__((unused)),
+ char ***argv __attribute__((unused)));
+
+int
+LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
+
+static isc_mem_t *mctx = NULL;
+static isc_lex_t *lex = NULL;
+
+int
+LLVMFuzzerInitialize(int *argc __attribute__((unused)),
+ char ***argv __attribute__((unused))) {
+ isc_result_t result;
+
+ isc_mem_create(&mctx);
+
+ result = isc_lex_create(mctx, 1024, &lex);
+ REQUIRE(result == ISC_R_SUCCESS);
+
+ return (0);
+}
+
+int
+LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+ isc_buffer_t buf;
+ isc_result_t result;
+ isc_token_t token;
+ isc_tokentype_t expect;
+ bool eol;
+
+ if (size < sizeof(expect) + sizeof(eol)) {
+ return (0);
+ }
+
+ (void)memmove(&expect, data, sizeof(expect));
+ data += sizeof(expect);
+ size -= sizeof(expect);
+
+ eol = *data != 0;
+ data += 1;
+ size -= 1;
+
+ isc_buffer_constinit(&buf, data, size);
+ isc_buffer_add(&buf, size);
+ isc_buffer_setactive(&buf, size);
+
+ CHECK(isc_lex_openbuffer(lex, &buf));
+
+ do {
+ result = isc_lex_getmastertoken(lex, &token, expect, eol);
+ } while (result == ISC_R_SUCCESS && token.type != isc_tokentype_eof);
+
+ return (0);
+}
--- /dev/null
+/*
+ * 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.
+ */
+
+#include <stddef.h>
+#include <stdint.h>
+
+#include <isc/buffer.h>
+#include <isc/lex.h>
+#include <isc/mem.h>
+#include <isc/util.h>
+
+#include "fuzz.h"
+
+bool debug = false;
+
+static isc_mem_t *mctx = NULL;
+static isc_lex_t *lex = NULL;
+
+int
+LLVMFuzzerInitialize(int *argc __attribute__((unused)),
+ char ***argv __attribute__((unused))) {
+ isc_result_t result;
+
+ isc_mem_create(&mctx);
+
+ result = isc_lex_create(mctx, 1024, &lex);
+ REQUIRE(result == ISC_R_SUCCESS);
+
+ return (0);
+}
+
+int
+LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+ isc_buffer_t buf;
+ isc_result_t result;
+
+ isc_buffer_constinit(&buf, data, size);
+ isc_buffer_add(&buf, size);
+ isc_buffer_setactive(&buf, size);
+
+ CHECK(isc_lex_openbuffer(lex, &buf));
+
+ do {
+ isc_token_t token;
+ result = isc_lex_gettoken(lex, 0, &token);
+ } while (result == ISC_R_SUCCESS);
+
+ return (0);
+}
--- /dev/null
+/*
+ * Copyright (C) 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 https://mozilla.org/MPL/2.0/.
+ *
+ * See the COPYRIGHT file distributed with this work for additional
+ * information regarding copyright ownership.
+ */
+
+/*
+ * This is a worthless, nonrunnable example of a named.conf file that has
+ * every conceivable syntax element in use. We use it to test the parser.
+ * It could also be used as a conceptual template for users of new features.
+ */
+
+/*
+ * C-style comments are OK
+ */
+
+// So are C++-style comments
+
+#So are shell - style comments
+
+// watch out for ";" -- it's important!
+
+options {
+ additional - from - auth true;
+ additional - from - cache false;
+
+ version "my version string";
+ random - device "/dev/random";
+ directory "/tmp";
+
+ port 666;
+
+ sig - validity - interval 33;
+
+#Obsolete
+ named - xfer "/usr/libexec/named-xfer"; // _PATH_XFER
+
+ dump - file "named_dump.db"; // _PATH_DUMPFILE
+ pid - file "/var/run/named.pid"; // _PATH_PIDFILE
+ statistics - file "named.stats"; // _PATH_STATS
+ memstatistics - file "named.memstats"; // _PATH_MEMSTATS
+
+ max - cache - ttl 999;
+ min - cache - ttl 66;
+ auth - nxdomain yes; // always set AA on NXDOMAIN.
+ // don't set this to 'no' unless
+ // you know what you're doing -- older
+ // servers won't like it.
+
+#Obsolete
+ deallocate - on - exit no;
+
+ dialup yes;
+
+#Obsolete
+ fake - iquery no;
+
+ fetch - glue yes;
+ has - old - clients yes;
+ host - statistics no;
+
+#Obsolete
+ multiple - cnames no; // if yes, then a name my have more
+ // than one CNAME RR. This use
+ // is non-standard and is not
+ // recommended, but it is available
+ // because previous releases supported
+ // it and it was used by large sites
+ // for load balancing.
+
+ notify yes; // send NOTIFY messages. You can set
+ // notify on a zone-by-zone
+ // basis in the "zone" statement
+ // see (below)
+ recursion yes;
+ rfc2308 - type1 no;
+
+#Obsolete
+ use - id - pool yes;
+
+#Obsolete
+ treat - cr - as - space yes;
+
+ also - notify { 10.0.2.3; };
+
+ // The "forward" option is only meaningful if you've defined
+ // forwarders. "first" gives the normal BIND
+ // forwarding behavior, i.e. ask the forwarders first, and if that
+ // doesn't work then do the full lookup. You can also say
+ // "forward only;" which is what used to be specified with
+ // "secondary" or "options forward-only". "only" will never attempt
+ // a full lookup; only the forwarders will be used.
+ forward first;
+ forwarders {
+ 1.2.3.4;
+ 5.6.7.8;
+ };
+
+ check - names primary fail;
+ check - names secondary warn;
+ check - names response ignore;
+
+ allow - query { any; };
+ allow - transfer { any; };
+ allow - recursion { !any; };
+ blackhole { 45 / 24; };
+ keep - response - order { 46 / 24; };
+
+ listen - on {
+ 10 / 24;
+ 10.0.0.3;
+ };
+
+ listen - on port 53 { any; };
+
+ listen - on { 5.6.7.8; };
+
+ listen - on port 1234 {
+ !1.2.3.4;
+ 1.2.3 / 24;
+ };
+
+ listen - on - v6 { 1 : 1 : 1 : 1 : 1 : 1 : 1 : 1; };
+
+ listen - on - v6 port 777 { 2 : 2 : 2 : 2 : 2 : 2 : 2 : 2; };
+
+ query - source - v6 address 8 : 7 : 6 : 5 : 4 : 3 : 2 : 1 port *;
+ query - source port *address 10.0.0.54;
+
+ lame - ttl 444;
+
+ max - transfer - time - in 300;
+ max - transfer - time - out 10;
+ max - transfer - idle - in 100;
+ max - transfer - idle - out 11;
+
+ max - retry - time 1234;
+ min - retry - time 1111;
+ max - refresh - time 888;
+ min - refresh - time 777;
+
+ max - ncache - ttl 333;
+ min - ncache - ttl 22;
+ min - roots 15;
+ serial - queries 34;
+
+ transfer - format one - answer;
+
+ transfers - in 10;
+ transfers - per - ns 2;
+ transfers - out 0;
+
+ transfer - source 10.0.0.5;
+ transfer - source - v6 4 : 3 : 2 : 1 : 5 : 6 : 7 : 8;
+
+ request - ixfr yes;
+ provide - ixfr yes;
+
+#Now called 'provide-ixfr'
+#maintain - ixfr - base no; // If yes, keep transaction log file for IXFR
+
+ max - ixfr - log - size 20m;
+ coresize 100;
+ datasize 101;
+ files 230;
+ max - cache - size 1m;
+ stacksize 231;
+ heartbeat - interval 1001;
+ interface - interval 1002;
+ statistics - interval 1003;
+
+ topology {
+ 10 / 8;
+
+ !1.2.3 / 24;
+
+ {
+ 1.2 / 16;
+ 3 / 8;
+ };
+ };
+
+ sortlist {
+ 10 / 8;
+ 11 / 8;
+ };
+
+ tkey - domain "foo.com";
+ tkey - dhkey "xyz" 666;
+
+ rrset - order {
+ class IN type A name "foo" order random;
+ order cyclic;
+ };
+};
+
+/*
+ * Control listeners, for "ndc". Every nameserver needs at least one.
+ */
+controls {
+ // 'inet' lines without a 'port' defaults to 'port 953'
+ // 'keys' must be used and the list must have at least one entry
+ inet *port 52 allow { any; }
+ keys { "key2"; };
+ unix "/var/run/ndc" perm 0600 owner 0 group 0; // ignored by named.
+ inet 10.0.0.1 allow {
+ any;
+ key foo;
+ }
+ keys { "key4"; };
+ inet 10.0.0.2 allow { none; }
+ keys {
+ "key-1";
+ "key-2";
+ };
+ inet 10.0.0.2 allow { none; };
+};
+
+zone "primary.demo.zone" {
+ type primaryr;
+ database "somedb -option1 -option2 arg1 arg2 arg3";
+ file "primary.demo.zone";
+ check - names fail;
+ allow - update { none; };
+ allow - update - forwarding {
+ 10.0.0.5;
+ !any;
+ };
+ allow - transfer { any; };
+ allow - query { any; };
+ sig - validity - interval 990;
+ notify explicit;
+ also - notify {
+ 1.0.0.1;
+ }; // don't notify any nameservers other
+ // than those on the NS list for this
+ // zone
+ forward first;
+ forwarders {
+ 10.0.0.3;
+ 1 : 2 : 3 : 4 : 5 : 6 : 7 : 8;
+ };
+};
+
+zone "secondary.demo.zone" {
+ type secondary;
+ file "secondary.demo.zone";
+ ixfr - base "secondary.demo.zone.ixfr"; // File name for IXFR transaction
+ // log file
+ primaries {
+ 1.2.3.4 port 10 key "foo"; // where to zone transfer from
+ 5.6.7.8;
+ 6.7.8.9 key "zippo";
+ };
+ transfer - source 10.0.0.53; // fixes multihoming problems
+ check - names warn;
+ allow - update { none; };
+ allow - transfer { any; };
+ allow - update - forwarding { any; };
+ allow - query { any; };
+ max - transfer - time - in 120; // if not set, global option is used.
+ max - transfer - time - out 1; // if not set, global option is used.
+ max - transfer - idle - in 2; // if not set, global option is used.
+ max - transfer - idle - out 3; // if not set, global option is used.
+ also - notify { 1.0.0.2; };
+ forward only;
+ forwarders {
+ 10.45.45.45;
+ 10.0.0.3;
+ 1 : 2 : 3 : 4 : 5 : 6 : 7 : 8;
+ };
+};
+
+key "non-viewkey" {
+ secret "YWFh";
+ algorithm "zzz";
+};
+
+view "test-view" in {
+ key "viewkey" {
+ algorithm "xxx";
+ secret "eXl5";
+ };
+ also - notify { 10.2.2.3; };
+ managed - keys { foo.com.static 4 3 2 "abdefghijklmnopqrstuvwxyz"; };
+ sig - validity - interval 45;
+ max - cache - size 100000;
+ allow - query { 10.0.0.30; };
+ additional - from - cache false;
+ additional - from - auth no;
+ match - clients { 10.0.0.1; };
+ check - names primary warn;
+ check - names secondary ignore;
+ check - names response fail;
+ auth - nxdomain false;
+ recursion true;
+ provide - ixfr false;
+ request - ixfr true;
+ fetch - glue true;
+ notify false;
+ rfc2308 - type1 false;
+ transfer - source 10.0.0.55;
+ transfer - source - v6 4 : 3 : 8 : 1 : 5 : 6 : 7 : 8;
+ query - source port *address 10.0.0.54;
+ query - source - v6 address 6 : 6 : 6 : 6 : 6 : 6 : 6 : 6 port *;
+ max - transfer - time - out 45;
+ max - transfer - idle - out 55;
+ min - roots 3;
+ lame - ttl 477;
+ max - ncache - ttl 333;
+ max - cache - ttl 777;
+ transfer - format many - answers;
+ max - retry - time 7;
+ min - retry - time 4;
+ max - refresh - time 999;
+ min - refresh - time 111;
+
+ zone "view-zone.com" {
+ type primary;
+ allow - update - forwarding { 10.0.0.34; };
+ file "view-zone-primary";
+ };
+
+ server 5.6.7.8 { keys "viewkey"; };
+
+ server 10.9.8.7 { keys "non-viewkey"; };
+ dialup yes;
+};
+
+zone "stub.demo.zone" {
+ type stub; // stub zones are like secondary zones,
+ // except that only the NS records
+ // are transferred.
+ dialup yes;
+ file "stub.demo.zone";
+ primaries {
+ 1.2.3.4; // where to zone transfer from
+ 5.6.7.8 port 999;
+ };
+ check - names warn;
+ allow - update { none; };
+ allow - transfer { any; };
+ allow - query { any; };
+
+ max - retry - time 10;
+ min - retry - time 11;
+ max - refresh - time 12;
+ min - refresh - time 13;
+
+ max - transfer - time - in 120; // if not set, global option is used.
+ pubkey 257 255 1 "a useless key";
+ pubkey 257 255 1 "another useless key";
+};
+
+zone "." {
+ type hint; // used to be specified w/ "cache"
+ file "cache.db";
+ // pubkey 257 255 1
+ //"AQP2fHpZ4VMpKo/jc9Fod821uyfY5p8j5h/Am0V/KpBTMZjdXmp9QJe6yFRoIIzkaNCgTIftASdpXGgCwFB2j2KXP/rick6gvEer5VcDEkLR5Q==";
+};
+
+managed - keys {
+ "." static 257 255 1 "AQP2fHpZ4VMpKo/jc9Fod821uyfY5p8j5h/Am0V/"
+ "KpBTMZjdXmp9QJe6yFRoIIzkaNCgTIftASdpXGgCwFB2j2KXP"
+ "/rick6gvEer5VcDEkLR5Q==";
+};
+
+acl can_query {
+ !1.2.3 / 24;
+ any;
+}; // network 1.2.3.0 mask 255.255.255.0
+ // is disallowed; rest are OK
+acl can_axfr {
+ 1.2.3.4;
+ can_query;
+}; // host 1.2.3.4 and any host allowed
+ // by can_query are OK
+
+zone "disabled-zone.com" {
+ type primary;
+ file "bar";
+
+ max - retry - time 100;
+ min - retry - time 110;
+ max - refresh - time 120;
+ min - refresh - time 130;
+};
+
+zone "non-default-acl.demo.zone" {
+ type primary;
+ file "foo";
+ allow - query { can_query; };
+ allow - transfer { can_axfr; };
+ allow - update {
+ 1.2.3.4;
+ 5.6.7.8;
+ };
+ pubkey 666 665 664 "key of the beast";
+ // Errors trapped by parser:
+ // identity or name not absolute
+ // 'wildcard' match type and no wildcard character in name
+ //
+ // issues:
+ // - certain rdatatype values (such as "key") are config file
+ // keywords and
+ // must be quoted or a syntax error will occur.
+ //
+
+ update - policy {
+ grant root.domain.subdomain host.domain.A MX CNAME;
+ grant sub.root.domain.wildcard *.host.domain.A;
+ grant root.domain.name host.domain.a ns md mf cname soa mb mg mr
+ "null" wks ptr hinfo minfo mx txt rp afsdb x25 isdn rt
+ nsap sig "key" px gpos aaaa loc nxt srv naptr kx
+ cert a6 dname opt unspec uri tkey tsig;
+ grant foo.bar.com.self foo.bar.com.a;
+ };
+};
+
+key sample_key { // for TSIG; supported by parser
+ algorithm hmac - md5; // but not yet implemented in the
+ secret "eW91ciBzZWNyZXQgaGVyZQ=="; // rest of the server
+};
+
+key key2 {
+ algorithm hmac - md5;
+ secret "ZXJlaCB0ZXJjZXMgcm91eQ==";
+};
+
+acl key_acl { key sample_key; }; // a request signed with sample_key
+
+server 1.2.3.4 {
+ request - ixfr no;
+ provide - ixfr no;
+ bogus no; // if yes, we won't query or listen
+ // to this server
+ transfer - format one - answer; // set transfer format for this
+ // server (see the description of
+ // 'transfer-format' above)
+ // if not specified, the global option
+ // will be used
+ transfers 0; // not implemented
+ keys{ "sample_key" }; // for TSIG; supported by the parser
+ // but not yet implemented in the
+ // rest of the server
+#Now called 'request-ixfr'
+#support - ixfr yes; // for IXFR supported by server
+ // if yes, the listed server talks IXFR
+};
+
+logging {
+ /*
+ * All log output goes to one or more "channels"; you can make as
+ * many of them as you want.
+ */
+
+ channel syslog_errors { // this channel will send errors or
+ syslog user; // or worse to syslog (user facility)
+ severity error;
+ };
+
+ channel stderr_errors { stderr; };
+
+ /*
+ * Channels have a severity level. Messages at severity levels
+ * greater than or equal to the channel's level will be logged on
+ * the channel. In order of decreasing severity, the levels are:
+ *
+ * critical a fatal error
+ * error
+ * warning
+ * notice a normal, but significant event
+ * info an informational message
+ * debug 1 the least detailed debugging info
+ * ...
+ * debug 99 the most detailed debugging info
+ */
+
+ /*
+ * Here are the built-in channels:
+ *
+ * channel default_syslog {
+ * syslog daemon;
+ * severity info;
+ * };
+ *
+ * channel default_debug {
+ * file "named.run"; // note: stderr is used instead
+ * // of "named.run" if the server
+ * // is started with the "-f"
+ * // option.
+ * severity dynamic; // this means log debugging
+ * // at whatever debugging level
+ * // the server is at, and don't
+ * // log anything if not
+ * // debugging.
+ * };
+ *
+ * channel null { // this is the bit bucket;
+ * file "/dev/null"; // any logging to this channel
+ * // is discarded.
+ * };
+ *
+ * channel default_stderr { // writes to stderr
+ * file "<stderr>"; // this is illustrative only;
+ * // there's currently no way
+ * // of saying "stderr" in the
+ * // configuration language.
+ * // i.e. don't try this at home.
+ * severity info;
+ * };
+ *
+ * default_stderr only works before the server daemonizes (i.e.
+ * during initial startup) or when it is running in foreground
+ * mode (-f command line option).
+ */
+
+ /*
+ * There are many categories, so you can send the logs
+ * you want to see wherever you want, without seeing logs you
+ * don't want. Right now the categories are
+ *
+ * default the catch-all. many things still
+ * aren't classified into categories, and
+ * they all end up here. also, if you
+ * don't specify any channels for a
+ * category, the default category is used
+ * instead.
+ * config high-level configuration file
+ * processing
+ * parser low-level configuration file processing
+ * queries what used to be called "query logging"
+ * lame-servers messages like "Lame server on ..."
+ * statistics
+ * panic if the server has to shut itself
+ * down due to an internal problem, it
+ * logs the problem here (as well as
+ * in the problem's native category)
+ * update dynamic update
+ * ncache negative caching
+ * xfer-in zone transfers we're receiving
+ * xfer-out zone transfers we're sending
+ * db all database operations
+ * eventlib debugging info from the event system
+ * (see below)
+ * packet dumps of packets received and sent
+ * (see below)
+ * notify the NOTIFY protocol
+ * cname messages like "XX points to a CNAME"
+ * security approved/unapproved requests
+ * os operating system problems
+ * insist consistency check failures
+ * maintenance periodic maintenance
+ * load zone loading
+ * response-checks messages like
+ * "Malformed response ..."
+ * "wrong ans. name ..."
+ * "unrelated additional info ..."
+ * "invalid RR type ..."
+ * "bad referral ..."
+ */
+
+ category parser {
+ syslog_errors; // you can log to as many channels
+ default_syslog; // as you want
+ };
+
+ category lame - servers { null; }; // don't log these at all
+
+ channel moderate_debug {
+ file "foo"; // foo
+ severity debug 3; // level 3 debugging to file
+ print - time yes; // timestamp log entries
+ print - category yes; // print category name
+ print - severity yes; // print severity level
+ /*
+ * Note that debugging must have been turned on either
+ * on the command line or with a signal to get debugging
+ * output (non-debugging output will still be written to
+ * this channel).
+ */
+ };
+
+ channel another {
+ file "bar" versions 99 size 10M;
+ severity info;
+ };
+
+ channel third {
+ file "bar" size 100000 versions unlimited;
+ severity debug; // use default debug level
+ };
+
+ /*
+ * If you don't want to see "zone XXXX loaded" messages but do
+ * want to see any problems, you could do the following.
+ */
+ channel no_info_messages {
+ syslog;
+ severity notice;
+ };
+
+ category load { no_info_messages; };
+
+ /*
+ * You can also define category "default"; it gets used when no
+ * "category" statement has been given for a category.
+ */
+ category default {
+ default_syslog;
+ moderate_debug;
+ };
+
+ /*
+ * If you don't define category default yourself, the default
+ * default category will be used. It is
+ *
+ * category default { default_syslog; default_debug; };
+ */
+
+ /*
+ * If you don't define category panic yourself, the default
+ * panic category will be used. It is
+ *
+ * category panic { default_syslog; default_stderr; };
+ */
+
+ /*
+ * Two categories, 'packet' and 'eventlib', are special. Only one
+ * channel may be assigned to each of them, and it must be a
+ * file channel. If you don't define them yourself, they default to
+ *
+ * category eventlib { default_debug; };
+ *
+ * category packet { default_debug; };
+ */
+};
+
+#include "filename"; // can't do within a statement
--- /dev/null
+text
+to
+be
+processed
+by
+lexer
--- /dev/null
+#!/bin/sh -ex
+
+# 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.
+
+exec "${2}" "${1}/$(basename "${2}").in" -max_total_time=5 -print_pcs=1 -print_final_stats=1 -print_corpus_stats=1 -print_coverage=1
#include <dirent.h>
-bool debug = false;
+static void
+test_one_file(const char *filename) {
+ int fd;
+ struct stat st;
+ char *data;
+ ssize_t n;
+
+ if ((fd = open(filename, O_RDONLY)) == -1) {
+ fprintf(stderr, "Failed to open %s: %s\n", filename,
+ strerror(errno));
+ return;
+ }
+
+ if (fstat(fd, &st) != 0) {
+ fprintf(stderr, "Failed to stat %s: %s\n", filename,
+ strerror(errno));
+ goto closefd;
+ }
+
+ data = malloc(st.st_size);
+ n = read(fd, data, st.st_size);
+ if (n == st.st_size) {
+ printf("testing %zd bytes from %s\n", n, filename);
+ fflush(stdout);
+ LLVMFuzzerTestOneInput((const uint8_t *)data, n);
+ fflush(stderr);
+ } else {
+ if (n < 0) {
+ fprintf(stderr,
+ "Failed to read %zd bytes from %s: %s\n",
+ (ssize_t)st.st_size, filename, strerror(errno));
+ } else {
+ fprintf(stderr,
+ "Failed to read %zd bytes from %s, got %zd\n",
+ (ssize_t)st.st_size, filename, n);
+ }
+ }
+ free(data);
+closefd:
+ close(fd);
+}
static void
test_all_from(const char *dirname) {
while ((dp = readdir(dirp)) != NULL) {
char filename[strlen(dirname) + strlen(dp->d_name) + 2];
- int fd;
- struct stat st;
- char *data;
- ssize_t n;
if (dp->d_name[0] == '.') {
continue;
}
snprintf(filename, sizeof(filename), "%s/%s", dirname,
dp->d_name);
-
- if ((fd = open(filename, O_RDONLY)) == -1) {
- fprintf(stderr, "Failed to open %s: %s\n", filename,
- strerror(errno));
- continue;
- }
-
- if (fstat(fd, &st) != 0) {
- fprintf(stderr, "Failed to stat %s: %s\n", filename,
- strerror(errno));
- goto closefd;
- }
-
- data = malloc(st.st_size);
- n = read(fd, data, st.st_size);
- if (n == st.st_size) {
- printf("testing %zd bytes from %s\n", n, filename);
- fflush(stdout);
- LLVMFuzzerTestOneInput((const uint8_t *)data, n);
- fflush(stderr);
- } else {
- if (n < 0) {
- fprintf(stderr,
- "Failed to read %zd bytes from %s: "
- "%s\n",
- (ssize_t)st.st_size, filename,
- strerror(errno));
- } else {
- fprintf(stderr,
- "Failed to read %zd bytes from %s"
- ", got %zd\n",
- (ssize_t)st.st_size, filename, n);
- }
- }
- free(data);
- closefd:
- close(fd);
+ test_one_file(filename);
}
closedir(dirp);
int
main(int argc, char **argv) {
+ int ret;
char corpusdir[PATH_MAX];
const char *target = strrchr(argv[0], '/');
- UNUSED(argc);
- UNUSED(argv);
+ ret = LLVMFuzzerInitialize(&argc, &argv);
+ if (ret != 0) {
+ fprintf(stderr, "LLVMFuzzerInitialize failure: %d\n", ret);
+ return 1;
+ }
- if (argc != 1) {
+ if (argv[1] != NULL && strcmp(argv[1], "-d") == 0) {
debug = true;
+ argv++;
+ argc--;
+ }
+
+ if (argv[1] != NULL) {
+ while (argv[1] != NULL) {
+ test_one_file(argv[1]);
+ argv++;
+ argc--;
+ }
+ POST(argc);
+ return (0);
}
target = (target != NULL) ? target + 1 : argv[0];
int ret;
unsigned char buf[64 * 1024];
- UNUSED(argc);
- UNUSED(argv);
+ ret = LLVMFuzzerInitialize(&argc, &argv);
+ if (ret != 0) {
+ fprintf(stderr, "LLVMFuzzerInitialize failure: %d\n", ret);
+ return 1;
+ }
#ifdef __AFL_LOOP
while (__AFL_LOOP(10000)) { /* only works with afl-clang-fast */