Compare commits
12
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ed85d0660d | ||
|
|
960c7f931c | ||
|
|
144b01ddb3 | ||
|
|
14fa55b5d8 | ||
|
|
07ec0a88f7 | ||
|
|
ecbd7b0831 | ||
|
|
2c286c1097 | ||
|
|
40385deb52 | ||
|
|
dc466f3068 | ||
|
|
8de9f6952e | ||
|
|
9d2593e132 | ||
|
|
007db6c650 |
@@ -11,7 +11,6 @@ BraceWrapping:
|
||||
AfterFunction: false # should also be MultiLine, but not yet supported
|
||||
AfterExternBlock: false
|
||||
BeforeElse: false
|
||||
BeforeWhile: false
|
||||
IndentBraces: false
|
||||
SplitEmptyFunction: true
|
||||
AllowShortIfStatementsOnASingleLine: false
|
||||
@@ -20,7 +19,6 @@ AlwaysBreakAfterReturnType: All
|
||||
Cpp11BracedListStyle: false
|
||||
ColumnLimit: 80
|
||||
AlignAfterOpenBracket: Align
|
||||
AlignConsecutiveBitFields: true
|
||||
AlignConsecutiveDeclarations: false
|
||||
AlignConsecutiveMacros: true
|
||||
AlignTrailingComments: true
|
||||
@@ -64,7 +62,6 @@ IncludeCategories:
|
||||
Priority: 1
|
||||
- Regex: '.*'
|
||||
Priority: 0
|
||||
IndentExternBlock: NoIndent
|
||||
KeepEmptyLinesAtTheStartOfBlocks: false
|
||||
MaxEmptyLinesToKeep: 1
|
||||
PenaltyBreakAssignment: 30
|
||||
|
||||
@@ -11,7 +11,6 @@ BraceWrapping:
|
||||
AfterFunction: false # should also be MultiLine, but not yet supported
|
||||
AfterExternBlock: false
|
||||
BeforeElse: false
|
||||
BeforeWhile: false
|
||||
IndentBraces: false
|
||||
SplitEmptyFunction: true
|
||||
AllowShortIfStatementsOnASingleLine: false
|
||||
@@ -20,7 +19,6 @@ AlwaysBreakAfterReturnType: All
|
||||
Cpp11BracedListStyle: false
|
||||
ColumnLimit: 80
|
||||
AlignAfterOpenBracket: Align
|
||||
AlignConsecutiveBitFields: true
|
||||
AlignConsecutiveDeclarations: true
|
||||
AlignConsecutiveMacros: true
|
||||
AlignTrailingComments: true
|
||||
@@ -52,7 +50,6 @@ IncludeCategories:
|
||||
Priority: 1
|
||||
- Regex: '".*"'
|
||||
Priority: 9
|
||||
IndentExternBlock: NoIndent
|
||||
KeepEmptyLinesAtTheStartOfBlocks: false
|
||||
MaxEmptyLinesToKeep: 1
|
||||
PenaltyBreakAssignment: 30
|
||||
|
||||
@@ -106,9 +106,6 @@
|
||||
(list
|
||||
"--enable=all"
|
||||
"--suppress=missingIncludeSystem"
|
||||
"--suppress=nullPointerRedundantCheck"
|
||||
(concat "--suppressions-list=" (expand-file-name
|
||||
(concat directory-of-current-dir-locals-file "util/suppressions.txt")))
|
||||
(concat "-include=" (expand-file-name
|
||||
(concat directory-of-current-dir-locals-file "config.h")))
|
||||
)
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
name: 'Lock down mirror repository'
|
||||
|
||||
on:
|
||||
issues:
|
||||
types: opened
|
||||
pull_request:
|
||||
types: opened
|
||||
|
||||
jobs:
|
||||
lockdown:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: dessant/repo-lockdown@v2
|
||||
with:
|
||||
github-token: ${{ github.token }}
|
||||
+1
-12
@@ -56,12 +56,11 @@ Makefile
|
||||
Makefile.in
|
||||
ans.run
|
||||
gen.dSYM/
|
||||
kyua.log
|
||||
named.memstats
|
||||
named.run
|
||||
timestamp
|
||||
/compile_commands.json
|
||||
# Gets generated by Build Ear (bear)
|
||||
/compile_commands.commands.json
|
||||
/cppcheck_html/
|
||||
/cppcheck.results
|
||||
/tsan
|
||||
@@ -88,13 +87,3 @@ doc/man/pkcs11-destroy.8in
|
||||
doc/man/pkcs11-keygen.8in
|
||||
doc/man/pkcs11-list.8in
|
||||
doc/man/pkcs11-tokens.8in
|
||||
# clangd index directory
|
||||
/\.cache/
|
||||
# GNU Global index files
|
||||
/GPATH
|
||||
/GRTAGS
|
||||
/GTAGS
|
||||
# Emacs specific files
|
||||
\.dir-locals-2.el
|
||||
/emacs.desktop
|
||||
/emacs.desktop-lock
|
||||
|
||||
+190
-181
@@ -8,21 +8,24 @@ variables:
|
||||
CCACHE_DIR: "/ccache"
|
||||
SOFTHSM2_CONF: "/var/tmp/softhsm2/softhsm2.conf"
|
||||
|
||||
# VirtualBox driver needs to set build_dir to "/builds" in gitlab-runner.toml
|
||||
KYUA_RESULT: "$CI_PROJECT_DIR/kyua.results"
|
||||
|
||||
GIT_DEPTH: 1
|
||||
BUILD_PARALLEL_JOBS: 6
|
||||
TEST_PARALLEL_JOBS: 6
|
||||
|
||||
CONFIGURE: ./configure
|
||||
CLANG: clang-11
|
||||
SCAN_BUILD: scan-build-11
|
||||
ASAN_SYMBOLIZER_PATH: /usr/lib/llvm-11/bin/llvm-symbolizer
|
||||
CLANG_FORMAT: clang-format-11
|
||||
CLANG: clang-10
|
||||
SCAN_BUILD: scan-build-10
|
||||
ASAN_SYMBOLIZER_PATH: /usr/lib/llvm-10/bin/llvm-symbolizer
|
||||
CLANG_FORMAT: clang-format-10
|
||||
|
||||
CFLAGS_COMMON: -fno-omit-frame-pointer -fno-optimize-sibling-calls -O1 -g -Wall -Wextra
|
||||
|
||||
# Pass run-time flags to AddressSanitizer to get core dumps on error.
|
||||
ASAN_OPTIONS_COMMON: abort_on_error=1:disable_coredump=0:unmap_shadow_on_exit=1
|
||||
TSAN_OPTIONS_COMMON: "disable_coredump=0 second_deadlock_stack=1 history_size=7 log_exe_name=true log_path=tsan external_symbolizer_path=/usr/lib/llvm-11/bin/llvm-symbolizer"
|
||||
TSAN_OPTIONS_COMMON: "second_deadlock_stack=1 history_size=7 log_exe_name=true log_path=tsan external_symbolizer_path=/usr/lib/llvm-10/bin/llvm-symbolizer"
|
||||
|
||||
TARBALL_EXTENSION: xz
|
||||
|
||||
@@ -34,19 +37,11 @@ variables:
|
||||
WITH_READLINE_LIBEDIT: "--with-readline=libedit"
|
||||
WITH_READLINE_READLINE: "--with-readline=readline"
|
||||
|
||||
INSTALL_PATH: "${CI_PROJECT_DIR}/.local"
|
||||
BIND_INSTALL_PATH: "${CI_PROJECT_DIR}/.local"
|
||||
|
||||
# In multithreaded unit tests, abort on the first failure
|
||||
CMOCKA_TEST_ABORT: 1
|
||||
|
||||
# Disable pytest's "cacheprovider" plugin to prevent it from creating
|
||||
# cross-testrun files as there is no need to use that feature in CI.
|
||||
PYTEST_ADDOPTS: "-p no:cacheprovider"
|
||||
|
||||
# Default platforms to run "stress" tests on
|
||||
BIND_STRESS_TEST_OS: linux
|
||||
BIND_STRESS_TEST_ARCH: amd64
|
||||
|
||||
stages:
|
||||
- autoconf
|
||||
- precheck
|
||||
@@ -71,6 +66,11 @@ stages:
|
||||
- linux
|
||||
- amd64
|
||||
|
||||
.linux-i386: &linux_i386
|
||||
tags:
|
||||
- linux
|
||||
- i386
|
||||
|
||||
.linux-stress-amd64: &linux_stress_amd64
|
||||
tags:
|
||||
- amd64
|
||||
@@ -101,8 +101,8 @@ stages:
|
||||
|
||||
# Alpine Linux
|
||||
|
||||
.alpine-3.13-amd64: &alpine_3_13_amd64_image
|
||||
image: "$CI_REGISTRY_IMAGE:alpine-3.13-amd64"
|
||||
.alpine-3.12-amd64: &alpine_3_12_amd64_image
|
||||
image: "$CI_REGISTRY_IMAGE:alpine-3.12-amd64"
|
||||
<<: *linux_amd64
|
||||
|
||||
# CentOS
|
||||
@@ -129,6 +129,10 @@ stages:
|
||||
image: "$CI_REGISTRY_IMAGE:debian-sid-amd64"
|
||||
<<: *linux_amd64
|
||||
|
||||
.debian-sid-i386: &debian_sid_i386_image
|
||||
image: "$CI_REGISTRY_IMAGE:debian-sid-i386"
|
||||
<<: *linux_i386
|
||||
|
||||
# openSUSE Tumbleweed
|
||||
|
||||
.tumbleweed-latest-amd64: &tumbleweed_latest_amd64_image
|
||||
@@ -137,18 +141,18 @@ stages:
|
||||
|
||||
# Fedora
|
||||
|
||||
.fedora-34-amd64: &fedora_34_amd64_image
|
||||
image: "$CI_REGISTRY_IMAGE:fedora-34-amd64"
|
||||
.fedora-33-amd64: &fedora_33_amd64_image
|
||||
image: "$CI_REGISTRY_IMAGE:fedora-33-amd64"
|
||||
<<: *linux_amd64
|
||||
|
||||
.fedora-34-arm64: &fedora_34_arm64_image
|
||||
image: "$CI_REGISTRY_IMAGE:fedora-34-arm64"
|
||||
.fedora-33-arm64: &fedora_33_arm64_image
|
||||
image: "$CI_REGISTRY_IMAGE:fedora-33-arm64"
|
||||
<<: *linux_stress_arm64
|
||||
|
||||
# Ubuntu
|
||||
|
||||
.ubuntu-bionic-amd64: &ubuntu_bionic_amd64_image
|
||||
image: "$CI_REGISTRY_IMAGE:ubuntu-bionic-amd64"
|
||||
.ubuntu-xenial-amd64: &ubuntu_xenial_amd64_image
|
||||
image: "$CI_REGISTRY_IMAGE:ubuntu-xenial-amd64"
|
||||
<<: *linux_amd64
|
||||
|
||||
.ubuntu-focal-amd64: &ubuntu_focal_amd64_image
|
||||
@@ -177,12 +181,8 @@ stages:
|
||||
image: "freebsd-12.2-x86_64"
|
||||
<<: *libvirt_amd64
|
||||
|
||||
.freebsd-13-amd64: &freebsd_13_amd64_image
|
||||
image: "freebsd-13.0-x86_64"
|
||||
<<: *libvirt_amd64
|
||||
|
||||
.openbsd-amd64: &openbsd_amd64_image
|
||||
image: "openbsd-6.9-x86_64"
|
||||
image: "openbsd-6.8-x86_64"
|
||||
<<: *libvirt_amd64
|
||||
|
||||
### Job Templates
|
||||
@@ -203,12 +203,6 @@ stages:
|
||||
- main@isc-projects/bind9
|
||||
- /^v9_[1-9][0-9]$/@isc-projects/bind9
|
||||
|
||||
.schedules-tags-web-triggering-rules: &schedules_tags_web_triggering_rules
|
||||
only:
|
||||
- schedules
|
||||
- tags
|
||||
- web
|
||||
|
||||
.precheck: &precheck_job
|
||||
<<: *default_triggering_rules
|
||||
<<: *base_image
|
||||
@@ -228,13 +222,12 @@ stages:
|
||||
${CONFIGURE} \
|
||||
--disable-maintainer-mode \
|
||||
--enable-developer \
|
||||
--enable-option-checking=fatal \
|
||||
--enable-dnstap \
|
||||
--with-cmocka \
|
||||
--with-libxml2 \
|
||||
--with-json-c \
|
||||
--prefix="${BIND_INSTALL_PATH}" \
|
||||
$EXTRA_CONFIGURE \
|
||||
|| (test -s config.log && cat config.log; exit 1)
|
||||
|| cat config.log
|
||||
|
||||
.check_readline_setup: &check_readline_setup |
|
||||
if [[ -n "${WITHOUT_READLINE}" ]]; then \
|
||||
@@ -251,18 +244,6 @@ stages:
|
||||
grep "^#define HAVE_READLINE_READLINE" config.h; \
|
||||
fi
|
||||
|
||||
# Move the out-of-tree workspace to CI project dir to save it for use in
|
||||
# dependent jobs.
|
||||
.save_out_of_tree_workspace: &save_out_of_tree_workspace
|
||||
- test -n "${OUT_OF_TREE_WORKSPACE}" && mv "${OUT_OF_TREE_WORKSPACE}" "${CI_PROJECT_DIR}"
|
||||
|
||||
# Move the artifacts from the out-of-tree build job to their original
|
||||
# location (the out-of-tree workspace) and then continue work in the
|
||||
# out-of-tree workspace.
|
||||
.retrieve_out_of_tree_workspace: &retrieve_out_of_tree_workspace
|
||||
- test -n "${OUT_OF_TREE_WORKSPACE}" && mv "$(basename "${OUT_OF_TREE_WORKSPACE}")" "${OUT_OF_TREE_WORKSPACE}"
|
||||
- test -n "${OUT_OF_TREE_WORKSPACE}" && cd "${OUT_OF_TREE_WORKSPACE}"
|
||||
|
||||
.build: &build_job
|
||||
<<: *default_triggering_rules
|
||||
stage: build
|
||||
@@ -273,12 +254,11 @@ stages:
|
||||
- *configure
|
||||
- *check_readline_setup
|
||||
- make -j${BUILD_PARALLEL_JOBS:-1} -k all V=1
|
||||
- test -z "${RUN_MAKE_INSTALL}" || make DESTDIR="${INSTALL_PATH}" install
|
||||
- test -z "${RUN_MAKE_INSTALL}" || DESTDIR="${INSTALL_PATH}" sh util/check-make-install
|
||||
- if [[ "${CFLAGS}" == *"-fsanitize=address"* ]]; then ( ! grep -F AddressSanitizer config.log ); fi
|
||||
- test -z "${RUN_MAKE_INSTALL}" || make install
|
||||
- test -z "${RUN_MAKE_INSTALL}" || sh util/check-make-install
|
||||
- if test -z "${OUT_OF_TREE_WORKSPACE}" && test "$(git status --porcelain | grep -Ev '\?\?' | wc -l)" -gt "0"; then git status --short; exit 1; fi
|
||||
after_script:
|
||||
- *save_out_of_tree_workspace
|
||||
- test -n "${OUT_OF_TREE_WORKSPACE}" && mv "${OUT_OF_TREE_WORKSPACE}" "${CI_PROJECT_DIR}"
|
||||
needs:
|
||||
- job: autoreconf
|
||||
artifacts: true
|
||||
@@ -301,7 +281,6 @@ stages:
|
||||
"with-openssl=C:/OpenSSL"
|
||||
"with-libxml2=C:/libxml2"
|
||||
"with-libuv=C:/libuv"
|
||||
"with-nghttp2=C:/nghttp2"
|
||||
"without-python"
|
||||
"with-system-tests"
|
||||
x64'
|
||||
@@ -329,17 +308,19 @@ stages:
|
||||
stage: system
|
||||
before_script:
|
||||
- *setup_softhsm
|
||||
- *retrieve_out_of_tree_workspace
|
||||
# Move the artifacts from the out-of-tree build job to their original location (the out-of-tree workspace).
|
||||
- test -n "${OUT_OF_TREE_WORKSPACE}" && mv "$(basename "${OUT_OF_TREE_WORKSPACE}")" "${OUT_OF_TREE_WORKSPACE}"
|
||||
# Continue work in the out-of-tree workspace.
|
||||
- test -n "${OUT_OF_TREE_WORKSPACE}" && cd "${OUT_OF_TREE_WORKSPACE}"
|
||||
- *setup_interfaces
|
||||
script:
|
||||
- cd bin/tests/system
|
||||
- make -j${TEST_PARALLEL_JOBS:-1} -k check V=1
|
||||
- if git rev-parse > /dev/null 2>&1; then ( ! grep "^I:.*:file.*not removed$" *.log ); fi
|
||||
after_script:
|
||||
- test -n "${OUT_OF_TREE_WORKSPACE}" && cd "${OUT_OF_TREE_WORKSPACE}"
|
||||
- test -d bind-* && cd bind-*
|
||||
- cat bin/tests/system/test-suite.log
|
||||
- *save_out_of_tree_workspace
|
||||
- test -n "${OUT_OF_TREE_WORKSPACE}" && mv "${OUT_OF_TREE_WORKSPACE}" "${CI_PROJECT_DIR}"
|
||||
|
||||
.system_test: &system_test_job
|
||||
<<: *system_test_common
|
||||
@@ -357,6 +338,7 @@ stages:
|
||||
|
||||
.system_test_tsan: &system_test_tsan_job
|
||||
<<: *system_test_common
|
||||
allow_failure: true
|
||||
after_script:
|
||||
- cat bin/tests/system/test-suite.log
|
||||
- find bin -name 'tsan.*' -exec python3 util/parse_tsan.py {} \;
|
||||
@@ -365,8 +347,14 @@ stages:
|
||||
untracked: true
|
||||
when: on_failure
|
||||
|
||||
.kyua_report: &kyua_report_html |
|
||||
kyua --logfile /dev/null report-html \
|
||||
--force \
|
||||
--results-file "$KYUA_RESULT" \
|
||||
--results-filter "" \
|
||||
--output kyua_html
|
||||
|
||||
.windows_system_test: &windows_system_test_job
|
||||
<<: *schedules_tags_web_triggering_rules
|
||||
stage: system
|
||||
script:
|
||||
- 'Push-Location bin/tests/system'
|
||||
@@ -382,17 +370,18 @@ stages:
|
||||
untracked: true
|
||||
expire_in: "1 day"
|
||||
when: on_failure
|
||||
only:
|
||||
- schedules
|
||||
- tags
|
||||
- web
|
||||
|
||||
.unit_test_common: &unit_test_common
|
||||
<<: *default_triggering_rules
|
||||
stage: unit
|
||||
before_script:
|
||||
- *setup_softhsm
|
||||
- *retrieve_out_of_tree_workspace
|
||||
script:
|
||||
- make -j${TEST_PARALLEL_JOBS:-1} -k unit V=1
|
||||
after_script:
|
||||
- *save_out_of_tree_workspace
|
||||
|
||||
.unit_test: &unit_test_job
|
||||
<<: *unit_test_common
|
||||
@@ -429,6 +418,9 @@ stages:
|
||||
<<: *default_triggering_rules
|
||||
stage: postcheck
|
||||
script:
|
||||
# Workaround for cppcheck 2.0 uninitvar false positives triggered by (&var)->field syntax
|
||||
# (see: https://sourceforge.net/p/cppcheck/discussion/general/thread/122153e3c1/)
|
||||
- sed -i '/^#define ISC__BUFFER.*\\$/{s|_b|__b|;N;s|do {|\0 isc_buffer_t *_b = (isc_buffer_t *)__b;|}; /^#define ISC__BUFFER.*REGION.*\\$/{s|_r|__r|;N;s|do {|\0 isc_region_t *_r = (isc_region_t *)__r;|; /USEDREGION/{s|isc_buffer_t|const \0|g}}' lib/isc/include/isc/buffer.h
|
||||
- *configure
|
||||
- (make -nwk all || true) | compiledb
|
||||
- export GCC_VERSION=$(gcc --version | sed -n 's/.* \([0-9]\+\)\.[0-9]\+\.[0-9]\+.*/\1/p')
|
||||
@@ -461,11 +453,9 @@ misc:
|
||||
- sh util/tabify-changes < CHANGES > CHANGES.tmp
|
||||
- diff -urNap CHANGES CHANGES.tmp
|
||||
- perl util/check-changes CHANGES
|
||||
- sh util/check-line-length.sh CHANGES
|
||||
- test ! -f CHANGES.SE || sh util/tabify-changes < CHANGES.SE > CHANGES.tmp
|
||||
- test ! -f CHANGES.SE || diff -urNap CHANGES.SE CHANGES.tmp
|
||||
- test ! -f CHANGES.SE || perl util/check-changes master=0 CHANGES.SE
|
||||
- test ! -f CHANGES.SE || sh util/check-line-length.sh CHANGES.SE
|
||||
- rm CHANGES.tmp
|
||||
- perl -w util/merge_copyrights
|
||||
- diff -urNap util/copyrights util/newcopyrights
|
||||
@@ -520,6 +510,8 @@ flake8:
|
||||
script:
|
||||
- *configure
|
||||
- flake8 --max-line-length=80 $(git ls-files '*.py' | grep -vE '(ans\.py|dangerfile\.py)')
|
||||
only:
|
||||
- merge_requests
|
||||
|
||||
pylint:
|
||||
<<: *default_triggering_rules
|
||||
@@ -532,6 +524,8 @@ pylint:
|
||||
- *configure
|
||||
- PYTHONPATH="$PYTHONPATH:$CI_PROJECT_DIR/bin/python"
|
||||
- pylint --rcfile $CI_PROJECT_DIR/.pylintrc $(git ls-files '*.py' | grep -vE '(ans\.py|dangerfile\.py)')
|
||||
only:
|
||||
- merge_requests
|
||||
|
||||
tarball-create:
|
||||
stage: precheck
|
||||
@@ -563,8 +557,6 @@ docs:
|
||||
script:
|
||||
- *configure
|
||||
- make -j${BUILD_PARALLEL_JOBS:-1} -k doc V=1
|
||||
- qpdf --check doc/arm/_build/latex/Bv9ARM.pdf
|
||||
- find doc/man/ -maxdepth 1 -name "*.[0-9]" -exec mandoc -T lint "{}" \; | ( ! grep -v -e "skipping paragraph macro. sp after" -e "unknown font, skipping request. ft C" )
|
||||
needs:
|
||||
- job: autoreconf
|
||||
artifacts: true
|
||||
@@ -588,28 +580,28 @@ push:docs:
|
||||
- main@isc-projects/bind9
|
||||
- /^v9_[1-9][0-9]$/@isc-projects/bind9
|
||||
|
||||
# Jobs for regular GCC builds on Alpine Linux 3.13 (amd64)
|
||||
# Jobs for regular GCC builds on Alpine Linux 3.12 (amd64)
|
||||
|
||||
gcc:alpine3.13:amd64:
|
||||
gcc:alpine3.12:amd64:
|
||||
variables:
|
||||
CC: gcc
|
||||
CFLAGS: "${CFLAGS_COMMON}"
|
||||
EXTRA_CONFIGURE: "${WITHOUT_READLINE}"
|
||||
<<: *alpine_3_13_amd64_image
|
||||
EXTRA_CONFIGURE: "--enable-dnstap ${WITHOUT_READLINE}"
|
||||
<<: *alpine_3_12_amd64_image
|
||||
<<: *build_job
|
||||
|
||||
system:gcc:alpine3.13:amd64:
|
||||
<<: *alpine_3_13_amd64_image
|
||||
system:gcc:alpine3.12:amd64:
|
||||
<<: *alpine_3_12_amd64_image
|
||||
<<: *system_test_job
|
||||
needs:
|
||||
- job: gcc:alpine3.13:amd64
|
||||
- job: gcc:alpine3.12:amd64
|
||||
artifacts: true
|
||||
|
||||
unit:gcc:alpine3.13:amd64:
|
||||
<<: *alpine_3_13_amd64_image
|
||||
unit:gcc:alpine3.12:amd64:
|
||||
<<: *alpine_3_12_amd64_image
|
||||
<<: *unit_test_job
|
||||
needs:
|
||||
- job: gcc:alpine3.13:amd64
|
||||
- job: gcc:alpine3.12:amd64
|
||||
artifacts: true
|
||||
|
||||
# Jobs for regular GCC builds on CentOS 7 (amd64)
|
||||
@@ -618,7 +610,7 @@ gcc:centos7:amd64:
|
||||
variables:
|
||||
CC: gcc
|
||||
CFLAGS: "${CFLAGS_COMMON}"
|
||||
EXTRA_CONFIGURE: "--with-libidn2"
|
||||
EXTRA_CONFIGURE: "--enable-dnstap --with-libidn2"
|
||||
<<: *centos_centos7_amd64_image
|
||||
<<: *build_job
|
||||
|
||||
@@ -666,7 +658,6 @@ gcc:stretch:amd64:
|
||||
variables:
|
||||
CC: gcc
|
||||
CFLAGS: "${CFLAGS_COMMON} -O2"
|
||||
EXTRA_CONFIGURE: "--without-cmocka --without-gssapi"
|
||||
<<: *debian_stretch_amd64_image
|
||||
<<: *build_job
|
||||
|
||||
@@ -690,7 +681,7 @@ gcc:buster:amd64:
|
||||
variables:
|
||||
CC: gcc
|
||||
CFLAGS: "${CFLAGS_COMMON} --coverage -O0"
|
||||
EXTRA_CONFIGURE: "--with-libidn2 ${WITH_READLINE_LIBEDIT}"
|
||||
EXTRA_CONFIGURE: "--enable-dnstap --with-libidn2 ${WITH_READLINE_LIBEDIT}"
|
||||
<<: *debian_buster_amd64_image
|
||||
<<: *build_job
|
||||
|
||||
@@ -726,7 +717,7 @@ scan-build:
|
||||
CC: "${CLANG}"
|
||||
CFLAGS: "${CFLAGS_COMMON}"
|
||||
CONFIGURE: "${SCAN_BUILD} ./configure"
|
||||
EXTRA_CONFIGURE: "--with-libidn2"
|
||||
EXTRA_CONFIGURE: "--enable-dnstap --with-libidn2"
|
||||
script:
|
||||
- *configure
|
||||
- *scan_build
|
||||
@@ -746,7 +737,7 @@ gcc:sid:amd64:
|
||||
variables:
|
||||
CC: gcc
|
||||
CFLAGS: "${CFLAGS_COMMON} -O3"
|
||||
EXTRA_CONFIGURE: "--with-libidn2 --without-lmdb"
|
||||
EXTRA_CONFIGURE: "--enable-dnstap --with-libidn2 --without-lmdb"
|
||||
RUN_MAKE_INSTALL: 1
|
||||
<<: *debian_sid_amd64_image
|
||||
<<: *build_job
|
||||
@@ -777,7 +768,7 @@ gcc:out-of-tree:
|
||||
CC: gcc
|
||||
CFLAGS: "${CFLAGS_COMMON} -Og"
|
||||
CONFIGURE: "${CI_PROJECT_DIR}/configure"
|
||||
EXTRA_CONFIGURE: "--with-libidn2 --with-lmdb"
|
||||
EXTRA_CONFIGURE: "--enable-dnstap --with-libidn2 --with-lmdb"
|
||||
RUN_MAKE_INSTALL: 1
|
||||
OUT_OF_TREE_WORKSPACE: /tmp/out_of_tree_workspace
|
||||
<<: *base_image
|
||||
@@ -791,24 +782,17 @@ system:gcc:out-of-tree:
|
||||
artifacts: true
|
||||
<<: *base_image
|
||||
<<: *system_test_job
|
||||
<<: *schedules_tags_web_triggering_rules
|
||||
|
||||
unit:gcc:out-of-tree:
|
||||
variables:
|
||||
OUT_OF_TREE_WORKSPACE: /tmp/out_of_tree_workspace
|
||||
needs:
|
||||
- job: gcc:out-of-tree
|
||||
artifacts: true
|
||||
<<: *base_image
|
||||
<<: *unit_test_job
|
||||
<<: *schedules_tags_web_triggering_rules
|
||||
only:
|
||||
- schedules
|
||||
- tags
|
||||
- web
|
||||
|
||||
# Jobs for tarball GCC builds on Debian 10 "buster" (amd64)
|
||||
|
||||
gcc:tarball:
|
||||
variables:
|
||||
CC: gcc
|
||||
EXTRA_CONFIGURE: "--with-libidn2"
|
||||
EXTRA_CONFIGURE: "--enable-dnstap --with-libidn2"
|
||||
RUN_MAKE_INSTALL: 1
|
||||
<<: *base_image
|
||||
<<: *build_job
|
||||
@@ -819,27 +803,58 @@ gcc:tarball:
|
||||
needs:
|
||||
- job: tarball-create
|
||||
artifacts: true
|
||||
only:
|
||||
- schedules
|
||||
- tags
|
||||
|
||||
system:gcc:tarball:
|
||||
<<: *base_image
|
||||
<<: *system_test_job
|
||||
<<: *schedules_tags_web_triggering_rules
|
||||
before_script:
|
||||
- cd bind-*
|
||||
- *setup_interfaces
|
||||
needs:
|
||||
- job: gcc:tarball
|
||||
artifacts: true
|
||||
only:
|
||||
- schedules
|
||||
- tags
|
||||
|
||||
unit:gcc:tarball:
|
||||
<<: *base_image
|
||||
<<: *unit_test_job
|
||||
<<: *schedules_tags_web_triggering_rules
|
||||
before_script:
|
||||
- cd bind-*
|
||||
needs:
|
||||
- job: gcc:tarball
|
||||
artifacts: true
|
||||
only:
|
||||
- schedules
|
||||
- tags
|
||||
|
||||
# Jobs for regular GCC builds on Debian "sid" (i386)
|
||||
|
||||
gcc:sid:i386:
|
||||
variables:
|
||||
CC: gcc
|
||||
CFLAGS: "${CFLAGS_COMMON}"
|
||||
EXTRA_CONFIGURE: "--with-libidn2"
|
||||
<<: *debian_sid_i386_image
|
||||
<<: *build_job
|
||||
|
||||
system:gcc:sid:i386:
|
||||
<<: *debian_sid_i386_image
|
||||
<<: *system_test_job
|
||||
needs:
|
||||
- job: gcc:sid:i386
|
||||
artifacts: true
|
||||
|
||||
unit:gcc:sid:i386:
|
||||
<<: *debian_sid_i386_image
|
||||
<<: *unit_test_job
|
||||
needs:
|
||||
- job: gcc:sid:i386
|
||||
artifacts: true
|
||||
|
||||
# Jobs for debug GCC builds on openSUSE Tumbleweed (amd64)
|
||||
|
||||
@@ -865,28 +880,28 @@ unit:gcc:tumbleweed:amd64:
|
||||
- job: gcc:tumbleweed:amd64
|
||||
artifacts: true
|
||||
|
||||
# Jobs for regular GCC builds on Ubuntu 18.04 Bionic Beaver (amd64)
|
||||
# Jobs for regular GCC builds on Ubuntu 16.04 Xenial Xerus (amd64)
|
||||
|
||||
gcc:bionic:amd64:
|
||||
gcc:xenial:amd64:
|
||||
variables:
|
||||
CC: gcc
|
||||
CFLAGS: "${CFLAGS_COMMON} -O2"
|
||||
EXTRA_CONFIGURE: "--disable-dnstap --disable-geoip"
|
||||
<<: *ubuntu_bionic_amd64_image
|
||||
EXTRA_CONFIGURE: "--disable-geoip"
|
||||
<<: *ubuntu_xenial_amd64_image
|
||||
<<: *build_job
|
||||
|
||||
system:gcc:bionic:amd64:
|
||||
<<: *ubuntu_bionic_amd64_image
|
||||
system:gcc:xenial:amd64:
|
||||
<<: *ubuntu_xenial_amd64_image
|
||||
<<: *system_test_job
|
||||
needs:
|
||||
- job: gcc:bionic:amd64
|
||||
- job: gcc:xenial:amd64
|
||||
artifacts: true
|
||||
|
||||
unit:gcc:bionic:amd64:
|
||||
<<: *ubuntu_bionic_amd64_image
|
||||
unit:gcc:xenial:amd64:
|
||||
<<: *ubuntu_xenial_amd64_image
|
||||
<<: *unit_test_job
|
||||
needs:
|
||||
- job: gcc:bionic:amd64
|
||||
- job: gcc:xenial:amd64
|
||||
artifacts: true
|
||||
|
||||
# Jobs for regular GCC builds on Ubuntu 20.04 Focal Fossa (amd64)
|
||||
@@ -918,7 +933,7 @@ unit:gcc:focal:amd64:
|
||||
gcc:asan:
|
||||
variables:
|
||||
CC: gcc
|
||||
CFLAGS: "${CFLAGS_COMMON} -fsanitize=address,undefined"
|
||||
CFLAGS: "${CFLAGS_COMMON} -fsanitize=address,undefined -DISC_MEM_USE_INTERNAL_MALLOC=0"
|
||||
LDFLAGS: "-fsanitize=address,undefined"
|
||||
EXTRA_CONFIGURE: "--with-libidn2"
|
||||
<<: *base_image
|
||||
@@ -945,7 +960,7 @@ unit:gcc:asan:
|
||||
clang:asan:
|
||||
variables:
|
||||
CC: ${CLANG}
|
||||
CFLAGS: "${CFLAGS_COMMON} -fsanitize=address,undefined"
|
||||
CFLAGS: "${CFLAGS_COMMON} -fsanitize=address,undefined -DISC_MEM_USE_INTERNAL_MALLOC=0"
|
||||
LDFLAGS: "-fsanitize=address,undefined"
|
||||
EXTRA_CONFIGURE: "--with-libidn2"
|
||||
<<: *base_image
|
||||
@@ -976,7 +991,7 @@ gcc:tsan:
|
||||
<<: *build_job
|
||||
variables:
|
||||
CC: gcc
|
||||
CFLAGS: "${CFLAGS_COMMON} -fsanitize=thread"
|
||||
CFLAGS: "${CFLAGS_COMMON} -fsanitize=thread -DISC_MEM_USE_INTERNAL_MALLOC=0"
|
||||
LDFLAGS: "-fsanitize=thread"
|
||||
EXTRA_CONFIGURE: "--with-libidn2 --enable-pthread-rwlock"
|
||||
|
||||
@@ -991,7 +1006,7 @@ system:gcc:tsan:
|
||||
|
||||
unit:gcc:tsan:
|
||||
variables:
|
||||
TSAN_OPTIONS: ${TSAN_OPTIONS_COMMON} suppressions=$CI_PROJECT_DIR/tsan-suppressions.txt
|
||||
TSAN_OPTIONS: ${TSAN_OPTIONS_COMMON}
|
||||
<<: *base_image
|
||||
<<: *unit_test_tsan_job
|
||||
needs:
|
||||
@@ -1003,7 +1018,7 @@ clang:tsan:
|
||||
<<: *build_job
|
||||
variables:
|
||||
CC: "${CLANG}"
|
||||
CFLAGS: "${CFLAGS_COMMON} -fsanitize=thread"
|
||||
CFLAGS: "${CFLAGS_COMMON} -fsanitize=thread -DISC_MEM_USE_INTERNAL_MALLOC=0"
|
||||
LDFLAGS: "-fsanitize=thread"
|
||||
EXTRA_CONFIGURE: "--with-libidn2 --enable-pthread-rwlock"
|
||||
|
||||
@@ -1018,7 +1033,7 @@ system:clang:tsan:
|
||||
|
||||
unit:clang:tsan:
|
||||
variables:
|
||||
TSAN_OPTIONS: ${TSAN_OPTIONS_COMMON} suppressions=$CI_PROJECT_DIR/tsan-suppressions.txt
|
||||
TSAN_OPTIONS: ${TSAN_OPTIONS_COMMON}
|
||||
<<: *base_image
|
||||
<<: *unit_test_tsan_job
|
||||
needs:
|
||||
@@ -1030,7 +1045,7 @@ unit:clang:tsan:
|
||||
gcc:mutexatomics:
|
||||
variables:
|
||||
CC: gcc
|
||||
CFLAGS: "${CFLAGS_COMMON}"
|
||||
CFLAGS: "${CFLAGS_COMMON} -DISC_MEM_USE_INTERNAL_MALLOC=0"
|
||||
EXTRA_CONFIGURE: "--with-libidn2 --enable-mutex-atomics"
|
||||
<<: *base_image
|
||||
<<: *build_job
|
||||
@@ -1096,25 +1111,25 @@ unit:gcc:softhsm2.4:
|
||||
- job: gcc:softhsm2.4
|
||||
artifacts: true
|
||||
|
||||
# Jobs for PKCS#11-enabled GCC builds on Fedora 34 (amd64)
|
||||
# Jobs for PKCS#11-enabled GCC builds on Fedora 33 (amd64)
|
||||
|
||||
gcc:softhsm2.6:
|
||||
variables:
|
||||
CC: gcc
|
||||
CFLAGS: "${CFLAGS_COMMON} -O1"
|
||||
EXTRA_CONFIGURE: "--with-libidn2 --enable-native-pkcs11 --with-pkcs11=/usr/lib64/pkcs11/libsofthsm2.so"
|
||||
<<: *fedora_34_amd64_image
|
||||
<<: *fedora_33_amd64_image
|
||||
<<: *build_job
|
||||
|
||||
system:gcc:softhsm2.6:
|
||||
<<: *fedora_34_amd64_image
|
||||
<<: *fedora_33_amd64_image
|
||||
<<: *system_test_job
|
||||
needs:
|
||||
- job: gcc:softhsm2.6
|
||||
artifacts: true
|
||||
|
||||
unit:gcc:softhsm2.6:
|
||||
<<: *fedora_34_amd64_image
|
||||
<<: *fedora_33_amd64_image
|
||||
<<: *unit_test_job
|
||||
needs:
|
||||
- job: gcc:softhsm2.6
|
||||
@@ -1129,12 +1144,10 @@ clang:freebsd11:amd64:
|
||||
USER: gitlab-runner
|
||||
<<: *freebsd_11_amd64_image
|
||||
<<: *build_job
|
||||
<<: *schedules_tags_web_triggering_rules
|
||||
|
||||
system:clang:freebsd11:amd64:
|
||||
<<: *freebsd_11_amd64_image
|
||||
<<: *system_test_job
|
||||
<<: *schedules_tags_web_triggering_rules
|
||||
variables:
|
||||
USER: gitlab-runner
|
||||
TEST_PARALLEL_JOBS: 4
|
||||
@@ -1145,7 +1158,6 @@ system:clang:freebsd11:amd64:
|
||||
unit:clang:freebsd11:amd64:
|
||||
<<: *freebsd_11_amd64_image
|
||||
<<: *unit_test_job
|
||||
<<: *schedules_tags_web_triggering_rules
|
||||
needs:
|
||||
- job: clang:freebsd11:amd64
|
||||
artifacts: true
|
||||
@@ -1155,7 +1167,7 @@ unit:clang:freebsd11:amd64:
|
||||
clang:freebsd12:amd64:
|
||||
variables:
|
||||
CFLAGS: "${CFLAGS_COMMON}"
|
||||
EXTRA_CONFIGURE: "${WITH_READLINE_EDITLINE}"
|
||||
EXTRA_CONFIGURE: "--enable-dnstap ${WITH_READLINE_EDITLINE}"
|
||||
USER: gitlab-runner
|
||||
<<: *freebsd_12_amd64_image
|
||||
<<: *build_job
|
||||
@@ -1177,40 +1189,12 @@ unit:clang:freebsd12:amd64:
|
||||
- job: clang:freebsd12:amd64
|
||||
artifacts: true
|
||||
|
||||
# Jobs for Clang builds on FreeBSD 13 (amd64)
|
||||
|
||||
clang:freebsd13:amd64:
|
||||
variables:
|
||||
CFLAGS: "${CFLAGS_COMMON}"
|
||||
EXTRA_CONFIGURE: "${WITH_READLINE_LIBEDIT}"
|
||||
USER: gitlab-runner
|
||||
<<: *freebsd_13_amd64_image
|
||||
<<: *build_job
|
||||
|
||||
system:clang:freebsd13:amd64:
|
||||
<<: *freebsd_13_amd64_image
|
||||
<<: *system_test_job
|
||||
variables:
|
||||
USER: gitlab-runner
|
||||
TEST_PARALLEL_JOBS: 4
|
||||
needs:
|
||||
- job: clang:freebsd13:amd64
|
||||
artifacts: true
|
||||
|
||||
unit:clang:freebsd13:amd64:
|
||||
<<: *freebsd_13_amd64_image
|
||||
<<: *unit_test_job
|
||||
needs:
|
||||
- job: clang:freebsd13:amd64
|
||||
artifacts: true
|
||||
|
||||
# Jobs for Clang builds on OpenBSD (amd64)
|
||||
|
||||
clang:openbsd:amd64:
|
||||
variables:
|
||||
CC: clang
|
||||
USER: gitlab-runner
|
||||
EXTRA_CONFIGURE: "--disable-dnstap"
|
||||
<<: *openbsd_amd64_image
|
||||
<<: *build_job
|
||||
|
||||
@@ -1256,9 +1240,12 @@ system:msvc:windows:amd64:
|
||||
msvc-debug:windows:amd64:
|
||||
<<: *windows_server_2016_amd64_image
|
||||
<<: *windows_build_job
|
||||
<<: *schedules_tags_web_triggering_rules
|
||||
variables:
|
||||
VSCONF: Debug
|
||||
only:
|
||||
- schedules
|
||||
- tags
|
||||
- web
|
||||
|
||||
system:msvc-debug:windows:amd64:
|
||||
<<: *windows_server_2016_amd64_image
|
||||
@@ -1330,10 +1317,10 @@ release:
|
||||
)
|
||||
test "$(md5sum cov-analysis-linux64.tgz | awk '{ print $1 }')" = "$(cat cov-analysis-linux64.md5)"
|
||||
tar --extract --gzip --file=cov-analysis-linux64.tgz
|
||||
test -d cov-analysis-linux64-2020.09
|
||||
test -d cov-analysis-linux64-2019.03
|
||||
|
||||
.coverity_build: &coverity_build |
|
||||
cov-analysis-linux64-2020.09/bin/cov-build --dir cov-int sh -c 'make -j${BUILD_PARALLEL_JOBS:-1} -k all V=1'
|
||||
cov-analysis-linux64-2019.03/bin/cov-build --dir cov-int sh -c 'make -j${BUILD_PARALLEL_JOBS:-1} -k all V=1'
|
||||
tar --create --gzip --file=cov-int.tar.gz cov-int/
|
||||
curl -v https://scan.coverity.com/builds?project=$COVERITY_SCAN_PROJECT_NAME \
|
||||
--form token=$COVERITY_SCAN_TOKEN \
|
||||
@@ -1350,7 +1337,7 @@ coverity:
|
||||
variables:
|
||||
CC: gcc
|
||||
CFLAGS: "${CFLAGS_COMMON} -Og"
|
||||
EXTRA_CONFIGURE: "--with-libidn2"
|
||||
EXTRA_CONFIGURE: "--enable-dnstap --with-libidn2"
|
||||
script:
|
||||
- *coverity_cache_prep
|
||||
- *configure
|
||||
@@ -1369,7 +1356,7 @@ coverity:
|
||||
- $COVERITY_SCAN_PROJECT_NAME
|
||||
- $COVERITY_SCAN_TOKEN
|
||||
cache:
|
||||
key: cov-analysis-linux64-2020.09
|
||||
key: cov-analysis-linux64-2019.03
|
||||
paths:
|
||||
- cov-analysis-linux64.md5
|
||||
- cov-analysis-linux64.tgz
|
||||
@@ -1416,21 +1403,24 @@ respdiff:
|
||||
- *setup_interfaces
|
||||
- *setup_softhsm
|
||||
- make -j${BUILD_PARALLEL_JOBS:-1} -k all V=1
|
||||
- make DESTDIR="${INSTALL_PATH}" install
|
||||
- make install
|
||||
- git clone --depth 1 https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.isc.org/isc-private/bind-qa.git
|
||||
- cd bind-qa/bind9/stress
|
||||
- LD_LIBRARY_PATH="${INSTALL_PATH}/usr/local/lib" BIND_INSTALL_PATH="${INSTALL_PATH}/usr/local" WORKSPACE="${CI_PROJECT_DIR}" bash stress.sh
|
||||
- DIG="${BIND_INSTALL_PATH}/bin/dig" WORKSPACE="${CI_PROJECT_DIR}" bash stress.sh
|
||||
needs:
|
||||
- job: autoreconf
|
||||
artifacts: true
|
||||
only:
|
||||
- schedules
|
||||
- tags
|
||||
artifacts:
|
||||
untracked: true
|
||||
expire_in: "1 day"
|
||||
when: always
|
||||
timeout: 2h
|
||||
|
||||
stress:authoritative:fedora:34:amd64:
|
||||
<<: *fedora_34_amd64_image
|
||||
stress:authoritative:fedora:33:amd64:
|
||||
<<: *fedora_33_amd64_image
|
||||
<<: *linux_stress_amd64
|
||||
<<: *stress_job
|
||||
variables:
|
||||
@@ -1439,12 +1429,9 @@ stress:authoritative:fedora:34:amd64:
|
||||
MODE: authoritative
|
||||
RATE: 10000
|
||||
RUN_TIME: 1
|
||||
only:
|
||||
variables:
|
||||
- $CI_COMMIT_TAG || ($BIND_STRESS_TEST_OS =~ /linux/i && $BIND_STRESS_TEST_MODE =~ /authoritative/i && $BIND_STRESS_TEST_ARCH =~ /amd64/i)
|
||||
|
||||
stress:recursive:fedora:34:amd64:
|
||||
<<: *fedora_34_amd64_image
|
||||
stress:recursive:fedora:33:amd64:
|
||||
<<: *fedora_33_amd64_image
|
||||
<<: *linux_stress_amd64
|
||||
<<: *stress_job
|
||||
variables:
|
||||
@@ -1453,12 +1440,9 @@ stress:recursive:fedora:34:amd64:
|
||||
MODE: recursive
|
||||
RATE: 10000
|
||||
RUN_TIME: 1
|
||||
only:
|
||||
variables:
|
||||
- $CI_COMMIT_TAG || ($BIND_STRESS_TEST_OS =~ /linux/i && $BIND_STRESS_TEST_MODE =~ /recursive/i && $BIND_STRESS_TEST_ARCH =~ /amd64/i)
|
||||
|
||||
stress:authoritative:fedora:34:arm64:
|
||||
<<: *fedora_34_arm64_image
|
||||
stress:authoritative:fedora:33:arm64:
|
||||
<<: *fedora_33_arm64_image
|
||||
<<: *linux_stress_arm64
|
||||
<<: *stress_job
|
||||
variables:
|
||||
@@ -1467,12 +1451,9 @@ stress:authoritative:fedora:34:arm64:
|
||||
MODE: authoritative
|
||||
RATE: 10000
|
||||
RUN_TIME: 1
|
||||
only:
|
||||
variables:
|
||||
- $CI_COMMIT_TAG || ($BIND_STRESS_TEST_OS =~ /linux/i && $BIND_STRESS_TEST_MODE =~ /authoritative/i && $BIND_STRESS_TEST_ARCH =~ /arm64/i)
|
||||
|
||||
stress:recursive:fedora:34:arm64:
|
||||
<<: *fedora_34_arm64_image
|
||||
stress:recursive:fedora:33:arm64:
|
||||
<<: *fedora_33_arm64_image
|
||||
<<: *linux_stress_arm64
|
||||
<<: *stress_job
|
||||
variables:
|
||||
@@ -1481,11 +1462,8 @@ stress:recursive:fedora:34:arm64:
|
||||
MODE: recursive
|
||||
RATE: 10000
|
||||
RUN_TIME: 1
|
||||
only:
|
||||
variables:
|
||||
- $CI_COMMIT_TAG || ($BIND_STRESS_TEST_OS =~ /linux/i && $BIND_STRESS_TEST_MODE =~ /recursive/i && $BIND_STRESS_TEST_ARCH =~ /arm64/i)
|
||||
|
||||
stress:authoritative:freebsd12:amd64:
|
||||
stress:authoritative:freebsd12:
|
||||
<<: *freebsd_12_amd64_image
|
||||
<<: *freebsd_stress_amd64
|
||||
<<: *stress_job
|
||||
@@ -1495,11 +1473,10 @@ stress:authoritative:freebsd12:amd64:
|
||||
MODE: authoritative
|
||||
RATE: 10000
|
||||
RUN_TIME: 1
|
||||
only:
|
||||
variables:
|
||||
- $CI_COMMIT_TAG || ($BIND_STRESS_TEST_OS =~ /freebsd/i && $BIND_STRESS_TEST_MODE =~ /authoritative/i && $BIND_STRESS_TEST_ARCH =~ /amd64/i)
|
||||
# See: https://gitlab.isc.org/isc-projects/bind9/-/issues/1941
|
||||
allow_failure: true
|
||||
|
||||
stress:recursive:freebsd12:amd64:
|
||||
stress:recursive:freebsd12:
|
||||
<<: *freebsd_12_amd64_image
|
||||
<<: *freebsd_stress_amd64
|
||||
<<: *stress_job
|
||||
@@ -1509,9 +1486,41 @@ stress:recursive:freebsd12:amd64:
|
||||
MODE: recursive
|
||||
RATE: 10000
|
||||
RUN_TIME: 1
|
||||
# See: https://gitlab.isc.org/isc-projects/bind9/-/issues/1941
|
||||
allow_failure: true
|
||||
|
||||
# ABI check
|
||||
|
||||
abi-check:
|
||||
<<: *base_image
|
||||
stage: build
|
||||
needs:
|
||||
- job: autoreconf
|
||||
artifacts: true
|
||||
variables:
|
||||
CC: gcc
|
||||
CFLAGS: "${CFLAGS_COMMON} -Og"
|
||||
EXTRA_CONFIGURE: "--enable-dnstap --with-libidn2"
|
||||
BIND_BASELINE_VERSION: v9_17_6
|
||||
script:
|
||||
- *configure
|
||||
- make -j${BUILD_PARALLEL_JOBS:-1} V=1
|
||||
- git clone --branch "${BIND_BASELINE_VERSION}" --depth 1 https://gitlab.isc.org/isc-projects/bind9.git refbind
|
||||
- cd refbind/
|
||||
- autoreconf -fi
|
||||
- *configure
|
||||
- make -j${BUILD_PARALLEL_JOBS:-1} V=1
|
||||
- cd ..
|
||||
- util/api-checker.sh . refbind
|
||||
artifacts:
|
||||
paths:
|
||||
- "*-lib*.html"
|
||||
- "*-lib*.txt"
|
||||
- "abi-*.dump"
|
||||
expire_in: "1 week"
|
||||
only:
|
||||
variables:
|
||||
- $CI_COMMIT_TAG || ($BIND_STRESS_TEST_OS =~ /freebsd/i && $BIND_STRESS_TEST_MODE =~ /recursive/i && $BIND_STRESS_TEST_ARCH =~ /amd64/i)
|
||||
- main@isc-projects/bind9
|
||||
- /^v9_[1-9][0-9]$/@isc-projects/bind9
|
||||
|
||||
gcov:
|
||||
<<: *base_image
|
||||
|
||||
@@ -1,33 +0,0 @@
|
||||
<!--
|
||||
THIS ISSUE TEMPLATE IS INTENDED ONLY FOR INTERNAL USE.
|
||||
|
||||
If the bug you are reporting is potentially security-related - for example,
|
||||
if it involves an assertion failure or other crash in `named` that can be
|
||||
triggered repeatedly - then please do *NOT* report it here, but send an
|
||||
email to [security-officer@isc.org](security-officer@isc.org).
|
||||
-->
|
||||
|
||||
### CVE-specific actions
|
||||
|
||||
- [ ] Assign a CVE identifier
|
||||
- [ ] Determine CVSS score
|
||||
- [ ] Determine the range of BIND versions affected (including the Subscription Edition)
|
||||
- [ ] Determine whether workarounds for the problem exists
|
||||
- [ ] Create a draft of the security advisory and put the information above in there
|
||||
- [ ] Prepare a detailed description of the problem which should include the following by default:
|
||||
- instructions for reproducing the problem (a system test is good enough)
|
||||
- explanation of code flow which triggers the problem (a system test is *not* good enough)
|
||||
- [ ] Prepare a private merge request containing the following items in separate commits:
|
||||
- a test for the issue (may be moved to a separate merge request for deferred merging)
|
||||
- a fix for the issue
|
||||
- documentation updates (`CHANGES`, release notes, anything else applicable)
|
||||
- [ ] Ensure the merge request from the previous step is reviewed by SWENG staff and has no outstanding discussions
|
||||
- [ ] Ensure the documentation changes introduced by the merge request addressing the problem are reviewed by Support and Marketing staff
|
||||
- [ ] Prepare backports of the merge request addressing the problem for all affected (and still maintained) BIND branches (backporting might affect the issue's scope and/or description)
|
||||
- [ ] Prepare a standalone patch for the last stable release of each affected (and still maintained) BIND branch
|
||||
|
||||
### Release-specific actions
|
||||
|
||||
- [ ] Create/update the private issue containing links to fixes & reproducers for all CVEs fixed in a given release cycle
|
||||
- [ ] Reserve a block of `CHANGES` placeholders once the complete set of vulnerabilities fixed in a given release cycle is determined
|
||||
- [ ] Ensure the merge requests containing CVE fixes are merged into `security-*` branches in CVE identifier order
|
||||
@@ -6,26 +6,6 @@
|
||||
|
||||
**Public Release:**
|
||||
|
||||
## Documentation Review Links
|
||||
|
||||
**Closed issues assigned to the milestone without a release note:**
|
||||
|
||||
- []()
|
||||
- []()
|
||||
- []()
|
||||
|
||||
**Merge requests merged into the milestone without a release note:**
|
||||
|
||||
- []()
|
||||
- []()
|
||||
- []()
|
||||
|
||||
**Merge requests merged into the milestone without a `CHANGES` entry:**
|
||||
|
||||
- []()
|
||||
- []()
|
||||
- []()
|
||||
|
||||
## Release Checklist
|
||||
|
||||
### Before the Code Freeze
|
||||
@@ -41,17 +21,20 @@
|
||||
|
||||
- [ ] ***(QA)*** Look for outstanding documentation issues (e.g. `CHANGES` mistakes) and address them if any are found.
|
||||
- [ ] ***(QA)*** Ensure release notes are correct, ask Support and Marketing to check them as well.
|
||||
- [ ] ***(QA)*** Update API files for libraries with new version information.
|
||||
- [ ] ***(QA)*** Change software version and library versions in `configure.ac` (new major release only).
|
||||
- [ ] ***(QA)*** Rebuild `configure` using Autoconf on `docs.isc.org`.
|
||||
- [ ] ***(QA)*** Update `CHANGES`.
|
||||
- [ ] ***(QA)*** Update `CHANGES.SE` (Subscription Edition only).
|
||||
- [ ] ***(QA)*** Update `README.md`.
|
||||
- [ ] ***(QA)*** Update `version`.
|
||||
- [ ] ***(QA)*** Build documentation on `docs.isc.org`.
|
||||
- [ ] ***(Support)*** Check release notes, ask QA to correct any mistakes found.
|
||||
- [ ] ***(Marketing)*** Check release notes, ask QA to correct any mistakes found.
|
||||
- [ ] ***(SwEng)*** Update API files for libraries with new version information.
|
||||
- [ ] ***(SwEng)*** Change software version and library versions in `configure.ac` (new major release only).
|
||||
- [ ] ***(SwEng)*** Rebuild `configure` using Autoconf on `docs.isc.org`.
|
||||
- [ ] ***(SwEng)*** Update `CHANGES`.
|
||||
- [ ] ***(SwEng)*** Update `CHANGES.SE` (Subscription Edition only).
|
||||
- [ ] ***(SwEng)*** Update `README.md`.
|
||||
- [ ] ***(SwEng)*** Update `version`.
|
||||
- [ ] ***(SwEng)*** Build documentation on `docs.isc.org`.
|
||||
- [ ] ***(QA)*** Check that all the above steps were performed correctly.
|
||||
- [ ] ***(QA)*** Check that the formatting is correct for text, PDF, and HTML versions of release notes.
|
||||
- [ ] ***(QA)*** Check that the formatting of the generated man pages is correct.
|
||||
- [ ] ***(QA)*** Tag the releases in the private repository (`git tag -s -m "BIND 9.x.y" v9_x_y`).
|
||||
- [ ] ***(SwEng)*** Tag the releases[^2]. (Tags may only be pushed to the public repository for releases which are *not* security releases.)
|
||||
- [ ] ***(SwEng)*** If this is the first tag for a release (e.g. beta), create a release branch named `release_v9_X_Y` to allow development to continue on the maintenance branch whilst release engineering continues.
|
||||
|
||||
### Before the ASN Deadline (for ASN Releases) or the Public Release Date (for Regular Releases)
|
||||
|
||||
@@ -71,7 +54,7 @@
|
||||
- [ ] ***(Support)*** Publish links to downloads on ISC website.
|
||||
- [ ] ***(Support)*** Write release email to *bind-announce*.
|
||||
- [ ] ***(Support)*** Write email to *bind-users* (if a major release).
|
||||
- [ ] ***(Support)*** Send eligible customers updated links to the Subscription Edition (update the -S edition delivery tickets, even if those links were provided earlier via an ASN ticket).
|
||||
- [ ] ***(Support)*** Send eligible customers updated links to the Subscription Edition.
|
||||
- [ ] ***(Support)*** Update tickets in case of waiting support customers.
|
||||
- [ ] ***(QA)*** Build and test any outstanding private packages.
|
||||
- [ ] ***(QA)*** Build public packages (`*.deb`, RPMs).
|
||||
@@ -81,13 +64,13 @@
|
||||
- [ ] ***(Marketing)*** Update [Wikipedia entry for BIND](https://en.wikipedia.org/wiki/BIND).
|
||||
- [ ] ***(Marketing)*** Write blog article (if a major release).
|
||||
- [ ] ***(QA)*** Ensure all new tags are annotated and signed.
|
||||
- [ ] ***(QA)*** Push tags for the published releases to the public repository.
|
||||
- [ ] ***(QA)*** Merge the automatically prepared `prep 9.x.y` commit which updates `version` and documentation on the release branch into the relevant maintenance branch (`v9_x`).
|
||||
- [ ] ***(SwEng)*** Merge the automatically prepared `prep 9.X.Y` commit which updates `version` and documentation on the release branch into the relevant maintenance branch (`v9_X`).
|
||||
- [ ] ***(SwEng)*** Push tags for the published releases to the public repository.
|
||||
- [ ] ***(QA)*** For each maintained branch, update the `BIND_BASELINE_VERSION` variable for the `abi-check` job in `.gitlab-ci.yml` to the latest published BIND version tag for a given branch.
|
||||
- [ ] ***(QA)*** Prepare empty release notes for the next set of releases.
|
||||
- [ ] ***(QA)*** Sanitize confidential issues which are assigned to the current release milestone and do not describe a security vulnerability, then make them public.
|
||||
- [ ] ***(QA)*** Sanitize confidential issues which are assigned to older release milestones and describe security vulnerabilities, then make them public if appropriate[^2].
|
||||
- [ ] ***(QA)*** Sanitize all confidential issues assigned to the release milestone and make them public.
|
||||
- [ ] ***(QA)*** Update QA tools used in GitLab CI (e.g. Flake8, PyLint) by modifying the relevant `Dockerfile`.
|
||||
|
||||
[^1]: If not, use the time remaining until the tagging deadline to ensure all outstanding issues are either resolved or moved to a different milestone.
|
||||
[^2]: As a rule of thumb, security vulnerabilities which have reproducers merged to the public repository are considered okay for full disclosure.
|
||||
|
||||
[^2]: Preferred command line: `git tag -u <DEVELOPER_KEYID> -a -s -m "BIND 9.X.Y[alphatag]" v9_X_Y[alphatag]`, where `[alphatag]` is an optional string such as `b1`, `rc1`, etc.
|
||||
|
||||
@@ -5,4 +5,3 @@ disable=
|
||||
C0116, # missing-function-docstring
|
||||
R0801, # duplicate-code
|
||||
C0103, # invalid-name
|
||||
C0415,# import-outside-toplevel
|
||||
|
||||
@@ -1,523 +1,3 @@
|
||||
5651. [func] Refactor zone dumping to be processed asynchronously
|
||||
via the uv_work_t thread pool API. [GL #2732]
|
||||
|
||||
5650. [bug] Prevent a crash that could occur if serve-stale
|
||||
was enabled and a prefetch was triggered during a
|
||||
query restart. [GL #2733]
|
||||
|
||||
5649. [bug] If a query was answered with stale data on a server
|
||||
with DNS64 enabled, an assertion could occur if a
|
||||
non-stale answer arrived afterward. [GL #2731]
|
||||
|
||||
5648. [bug] The calculation of the estimated IXFR transaction
|
||||
size by dns_journal_iter_init() was invalid. [GL #2685]
|
||||
|
||||
5647. [func] The interfacemgr has been refactored to use fewer
|
||||
clientmgr objects, which in turn use fewer memory
|
||||
contexts and tasks. This should result in less
|
||||
fragmented memory and better startup performance.
|
||||
[GL #2433]
|
||||
|
||||
5646. [bug] The default TCP timeout for rndc has been increased
|
||||
to 60 seconds. This was its original value, but it
|
||||
had been inadvertently lowered to 10. [GL #2643]
|
||||
|
||||
5645. [cleanup] Remove the rarely-used dns_name_copy() function
|
||||
and rename dns_name_copynf() to dns_name_copy().
|
||||
[GL !5081]
|
||||
|
||||
5644. [bug] Fix a race condition in reading and writing key files
|
||||
for KASP zones in multiple views. [GL #1875]
|
||||
|
||||
5643. [placeholder]
|
||||
|
||||
5642. [bug] Check "key-directory" conflicts in "named.conf" for
|
||||
zones in multiple views with different "dnssec-policy".
|
||||
[GL #2463].
|
||||
|
||||
5641. [bug] Address potential memory leak in dst_key_fromnamedfile.
|
||||
[GL #2689]
|
||||
|
||||
5640. [func] Add new configuration option to set the operating system
|
||||
receive and send buffers. [GL #2313]
|
||||
|
||||
5639. [bug] Check that the first and last SOA record of an AXFR
|
||||
are consistent. [GL #2528]
|
||||
|
||||
--- 9.17.13 released ---
|
||||
|
||||
5638. [bug] Improvements related to network manager/task manager
|
||||
integration:
|
||||
- isc_managers_create() and isc_managers_destroy()
|
||||
functions were added to handle setup and teardown of
|
||||
netmgr, taskmgr, timermgr, and socketmgr, since these
|
||||
require a precise order of operations now.
|
||||
- Event queue processing is now quantized to prevent
|
||||
infinite looping.
|
||||
- The netmgr can now be paused from within a netmgr
|
||||
thread.
|
||||
- Deadlocks due to a conflict between netmgr's
|
||||
pause/resume and listen/stoplistening operations were
|
||||
fixed.
|
||||
[GL #2654]
|
||||
|
||||
5637. [placeholder]
|
||||
|
||||
5636. [bug] named and named-checkconf did not report an error when
|
||||
multiple zones with the "dnssec-policy" option set were
|
||||
using the same zone file. This has been fixed.
|
||||
[GL #2603]
|
||||
|
||||
5635. [bug] Journal compaction could fail when a journal with
|
||||
invalid transaction headers was not detected at startup.
|
||||
This has been fixed. [GL #2670]
|
||||
|
||||
5634. [bug] If "dnssec-policy" was active and a private key file was
|
||||
temporarily offline during a rekey event, named could
|
||||
incorrectly introduce replacement keys and break a
|
||||
signed zone. This has been fixed. [GL #2596]
|
||||
|
||||
5633. [doc] The "inline-signing" option was incorrectly described as
|
||||
being inherited from the "options"/"view" levels and was
|
||||
incorrectly accepted at those levels without effect.
|
||||
This has been fixed. [GL #2536]
|
||||
|
||||
5632. [func] Add a new built-in KASP, "insecure", which is used to
|
||||
transition a zone from a signed to an unsigned state.
|
||||
The existing built-in KASP "none" should no longer be
|
||||
used to unsign a zone. [GL #2645]
|
||||
|
||||
5631. [protocol] Update the implementation of the ZONEMD RR type to match
|
||||
RFC 8976. [GL #2658]
|
||||
|
||||
5630. [func] Treat DNSSEC responses containing NSEC3 records with
|
||||
iteration counts greater than 150 as insecure.
|
||||
[GL #2445]
|
||||
|
||||
5629. [func] Reduce the maximum supported number of NSEC3 iterations
|
||||
that can be configured for a zone to 150. [GL #2642]
|
||||
|
||||
5628. [bug] Host and nslookup could crash upon receiving a SERVFAIL
|
||||
response. This has been fixed. [GL #2564]
|
||||
|
||||
5627. [bug] RRSIG(SOA) RRsets placed anywhere other than at the zone
|
||||
apex were triggering infinite resigning loops. This has
|
||||
been fixed. [GL #2650]
|
||||
|
||||
5626. [bug] When generating zone signing keys, KASP now also checks
|
||||
for key ID conflicts among newly created keys, rather
|
||||
than just between new and existing ones. [GL #2628]
|
||||
|
||||
5625. [bug] A deadlock could occur when multiple "rndc addzone",
|
||||
"rndc delzone", and/or "rndc modzone" commands were
|
||||
invoked simultaneously for different zones. This has
|
||||
been fixed. [GL #2626]
|
||||
|
||||
5624. [func] Task manager events are now processed inside network
|
||||
manager loops. The task manager no longer needs its own
|
||||
set of worker threads, which improves resolver
|
||||
performance. [GL #2638]
|
||||
|
||||
5623. [bug] When named was shut down during an ongoing zone
|
||||
transfer, xfrin_fail() could incorrectly be called
|
||||
twice. This has been fixed. [GL #2630]
|
||||
|
||||
5622. [cleanup] The lib/samples/ directory has been removed, as export
|
||||
versions of libraries are no longer maintained.
|
||||
[GL !4835]
|
||||
|
||||
5621. [placeholder]
|
||||
|
||||
5620. [bug] If zone journal files written by BIND 9.16.11 or earlier
|
||||
were present when BIND was upgraded, the zone file for
|
||||
that zone could have been inadvertently rewritten with
|
||||
the current zone contents. This caused the original zone
|
||||
file structure (e.g. comments, $INCLUDE directives) to
|
||||
be lost, although the zone data itself was preserved.
|
||||
This has been fixed. [GL #2623]
|
||||
|
||||
5619. [protocol] Implement draft-vandijk-dnsop-nsec-ttl, updating the
|
||||
protocol such that NSEC(3) TTL values are set to the
|
||||
minimum of the SOA MINIMUM value or the SOA TTL.
|
||||
[GL #2347]
|
||||
|
||||
5618. [bug] Change 5149 introduced some inconsistencies in the way
|
||||
record TTLs were presented in cache dumps. These
|
||||
inconsistencies have been eliminated. [GL #389]
|
||||
[GL #2289]
|
||||
|
||||
--- 9.17.12 released ---
|
||||
|
||||
5617. [placeholder]
|
||||
|
||||
5616. [security] named crashed when a DNAME record placed in the ANSWER
|
||||
section during DNAME chasing turned out to be the final
|
||||
answer to a client query. (CVE-2021-25215) [GL #2540]
|
||||
|
||||
5615. [security] Insufficient IXFR checks could result in named serving a
|
||||
zone without an SOA record at the apex, leading to a
|
||||
RUNTIME_CHECK assertion failure when the zone was
|
||||
subsequently refreshed. This has been fixed by adding an
|
||||
owner name check for all SOA records which are included
|
||||
in a zone transfer. (CVE-2021-25214) [GL #2467]
|
||||
|
||||
5614. [bug] Ensure all resources are properly cleaned up when a call
|
||||
to gss_accept_sec_context() fails. [GL #2620]
|
||||
|
||||
5613. [bug] It was possible to write an invalid transaction header
|
||||
in the journal file for a managed-keys database after
|
||||
upgrading. This has been fixed. Invalid headers in
|
||||
existing journal files are detected and named is able
|
||||
to recover from them. [GL #2600]
|
||||
|
||||
5612. [bug] Continued refactoring of the network manager:
|
||||
- allow recovery from read and connect timeout events,
|
||||
- ensure that calls to isc_nm_*connect() always
|
||||
return the connection status via a callback
|
||||
function.
|
||||
[GL #2401]
|
||||
|
||||
5611. [func] Set "stale-answer-client-timeout" to "off" by default.
|
||||
[GL #2608]
|
||||
|
||||
5610. [bug] Prevent a crash which could happen when a lookup
|
||||
triggered by "stale-answer-client-timeout" was attempted
|
||||
right after recursion for a client query finished.
|
||||
[GL #2594]
|
||||
|
||||
5609. [func] The ISC implementation of SPNEGO was removed from BIND 9
|
||||
source code. It was no longer necessary as all major
|
||||
contemporary Kerberos/GSSAPI libraries include support
|
||||
for SPNEGO. [GL #2607]
|
||||
|
||||
5608. [bug] When sending queries over TCP, dig now properly handles
|
||||
"+tries=1 +retry=0" by not retrying the connection when
|
||||
the remote server closes the connection prematurely.
|
||||
[GL #2490]
|
||||
|
||||
5607. [bug] As "rndc dnssec -checkds" and "rndc dnssec -rollover"
|
||||
commands may affect the next scheduled key event,
|
||||
reconfiguration of zone keys is now triggered after
|
||||
receiving either of these commands to prevent
|
||||
unnecessary key rollover delays. [GL #2488]
|
||||
|
||||
5606. [bug] CDS/CDNSKEY DELETE records are now removed when a zone
|
||||
transitions from a secure to an insecure state.
|
||||
named-checkzone also no longer reports an error when
|
||||
such records are found in an unsigned zone. [GL #2517]
|
||||
|
||||
5605. [bug] "dig -u" now uses the CLOCK_REALTIME clock source for
|
||||
more accurate time reporting. [GL #2592]
|
||||
|
||||
5604. [experimental] A "filter-a.so" plugin, which is similar to the
|
||||
"filter-aaaa.so" plugin but which omits A records
|
||||
instead of AAAA records, has been added. Thanks to
|
||||
GitLab user @treysis. [GL #2585]
|
||||
|
||||
5603. [placeholder]
|
||||
|
||||
5602. [bug] Fix TCPDNS and TLSDNS timers in Network Manager. This
|
||||
makes the "tcp-initial-timeout" and "tcp-idle-timeout"
|
||||
options work correctly again. [GL #2583]
|
||||
|
||||
5601. [bug] Zones using KASP could not be thawed after they were
|
||||
frozen using "rndc freeze". This has been fixed.
|
||||
[GL #2523]
|
||||
|
||||
5600. [bug] Send a full certificate chain instead of just the leaf
|
||||
certificate to DNS-over-TLS (DoT) and DNS-over-HTTPS
|
||||
(DoH) clients. This makes BIND 9 DoT/DoH servers
|
||||
compatible with a broader set of clients. [GL #2514]
|
||||
|
||||
5599. [bug] Fix a named crash which occurred after skipping a
|
||||
primary server while transferring a zone over TLS.
|
||||
[GL #2562]
|
||||
|
||||
5598. [port] Silence -Wchar-subscripts compiler warnings triggered on
|
||||
some platforms due to calling character classification
|
||||
functions declared in the <ctype.h> header with
|
||||
arguments of type char. [GL #2567]
|
||||
|
||||
--- 9.17.11 released ---
|
||||
|
||||
5597. [bug] When serve-stale was enabled and starting the recursive
|
||||
resolution process for a query failed, a named instance
|
||||
could crash if it was configured as both a recursive and
|
||||
authoritative server. This problem was introduced by
|
||||
change 5573 and has now been fixed. [GL #2565]
|
||||
|
||||
5596. [func] Client-side support for DNS-over-HTTPS (DoH) has been
|
||||
added to dig. "dig +https" can now query a server via
|
||||
HTTP/2. [GL #1641]
|
||||
|
||||
5595. [cleanup] Public header files for BIND 9 libraries no longer
|
||||
directly include third-party library headers. This
|
||||
prevents the need to include paths to third-party header
|
||||
files in CFLAGS whenever BIND 9 public header files are
|
||||
used, which could cause build-time issues on hosts with
|
||||
older versions of BIND 9 installed. [GL #2357]
|
||||
|
||||
5594. [bug] Building with --enable-dnsrps --enable-dnsrps-dl failed.
|
||||
[GL #2298]
|
||||
|
||||
5593. [bug] Journal files written by older versions of named can now
|
||||
be read when loading zones, so that journal
|
||||
incompatibility does not cause problems on upgrade.
|
||||
Outdated journals are updated to the new format after
|
||||
loading. [GL #2505]
|
||||
|
||||
5592. [bug] Prevent hazard pointer table overflows on machines with
|
||||
many cores, by allowing the thread IDs (serving as
|
||||
indices into hazard pointer tables) of finished threads
|
||||
to be reused by those created later. [GL #2396]
|
||||
|
||||
5591. [bug] Fix a crash that occurred when
|
||||
"stale-answer-client-timeout" was triggered without any
|
||||
(stale) data available in the cache to answer the query.
|
||||
[GL #2503]
|
||||
|
||||
5590. [bug] NSEC3 records were not immediately created for dynamic
|
||||
zones using NSEC3 with "dnssec-policy", resulting in
|
||||
such zones going bogus. Add code to process the
|
||||
NSEC3PARAM queue at zone load time so that NSEC3 records
|
||||
for such zones are created immediately. [GL #2498]
|
||||
|
||||
5589. [placeholder]
|
||||
|
||||
5588. [func] Add a new "purge-keys" option for "dnssec-policy". This
|
||||
option determines the period of time for which key files
|
||||
are retained after they become obsolete. [GL #2408]
|
||||
|
||||
5587. [bug] A standalone libtool script no longer needs to be
|
||||
present in PATH to build BIND 9 from a source tarball
|
||||
prepared using "make dist". [GL #2504]
|
||||
|
||||
5586. [bug] An invalid direction field in a LOC record resulted in
|
||||
an INSIST failure when a zone file containing such a
|
||||
record was loaded. [GL #2499]
|
||||
|
||||
5585. [func] Memory contexts and memory pool implementations were
|
||||
refactored to reduce lock contention for shared memory
|
||||
contexts by replacing mutexes with atomic operations.
|
||||
The internal memory allocator was simplified so that it
|
||||
is only a thin wrapper around the system allocator. This
|
||||
change made the "-M external" named option redundant and
|
||||
it was therefore removed. [GL #2433]
|
||||
|
||||
5584. [bug] No longer set the IP_DONTFRAG option on UDP sockets, to
|
||||
prevent dropping outgoing packets exceeding
|
||||
"max-udp-size". [GL #2466]
|
||||
|
||||
5583. [func] Changes to DNS-over-HTTPS (DoH) configuration syntax:
|
||||
- When "http" is specified in "listen-on" or
|
||||
"listen-on-v6" statements, "tls" must also now be
|
||||
specified. If an unencrypted connection is desired
|
||||
(for example, when running behind a reverse proxy),
|
||||
use "tls none".
|
||||
- "http default" can now be specified in "listen-on" and
|
||||
"listen-on-v6" statements to use the default HTTP
|
||||
endpoint of "/dns-query". It is no longer necessary to
|
||||
include an "http" statement in named.conf unless
|
||||
overriding this value.
|
||||
[GL #2472]
|
||||
|
||||
5582. [bug] BIND 9 failed to build when static OpenSSL libraries
|
||||
were used and the pkg-config files for libssl and/or
|
||||
libcrypto were unavailable. This has been fixed by
|
||||
ensuring that the correct linking order for libssl and
|
||||
libcrypto is always used. [GL #2402]
|
||||
|
||||
5581. [bug] Fix a memory leak that occurred when inline-signed zones
|
||||
were added to the configuration, followed by a
|
||||
reconfiguration of named. [GL #2041]
|
||||
|
||||
5580. [test] The system test framework no longer differentiates
|
||||
between SKIPPED and UNTESTED system test results. Any
|
||||
system test which is not run is now marked as SKIPPED.
|
||||
[GL !4517]
|
||||
|
||||
5579. [bug] If an invalid key name (e.g. "a..b") was specified in a
|
||||
primaries list in named.conf, the wrong size was passed
|
||||
to isc_mem_put(), resulting in the returned memory being
|
||||
put on the wrong free list. This prevented named from
|
||||
starting up. [GL #2460]
|
||||
|
||||
--- 9.17.10 released ---
|
||||
|
||||
5578. [protocol] Make "check-names" accept A records below "_spf",
|
||||
"_spf_rate", and "_spf_verify" labels in order to cater
|
||||
for the "exists" SPF mechanism specified in RFC 7208
|
||||
section 5.7 and appendix D.1. [GL #2377]
|
||||
|
||||
5577. [bug] Fix the "three is a crowd" key rollover bug in KASP by
|
||||
correctly implementing Equation (2) of the "Flexible and
|
||||
Robust Key Rollover" paper. [GL #2375]
|
||||
|
||||
5576. [experimental] Initial server-side implementation of DNS-over-HTTPS
|
||||
(DoH). Support for both TLS-encrypted and unencrypted
|
||||
HTTP/2 connections has been added to the network manager
|
||||
and integrated into named. (Note: there is currently no
|
||||
client-side support for DNS-over-HTTPS; this will be
|
||||
added to dig in a future release.) [GL #1144]
|
||||
|
||||
5575. [bug] When migrating to KASP, BIND 9 considered keys with the
|
||||
"Inactive" and/or "Delete" timing metadata to be
|
||||
possible active keys. This has been fixed. [GL #2406]
|
||||
|
||||
5574. [func] Incoming zone transfers can now use TLS. Addresses in a
|
||||
"primaries" list take an optional "tls" argument,
|
||||
specifying either a previously configured "tls" block or
|
||||
"ephemeral"; SOA queries and zone transfer requests are
|
||||
then sent via TLS. [GL #2392]
|
||||
|
||||
5573. [func] When serve-stale is enabled and stale data is available,
|
||||
named now returns stale answers upon encountering any
|
||||
unexpected error in the query resolution process.
|
||||
However, the "stale-refresh-time" window is still only
|
||||
started upon a timeout. [GL #2434]
|
||||
|
||||
5572. [bug] Address potential double free in generatexml().
|
||||
[GL #2420]
|
||||
|
||||
5571. [bug] named failed to start when its configuration included a
|
||||
zone with a non-builtin "allow-update" ACL attached.
|
||||
[GL #2413]
|
||||
|
||||
5570. [bug] Improve performance of the DNSSEC verification code by
|
||||
reducing the number of repeated calls to
|
||||
dns_dnssec_keyfromrdata(). [GL #2073]
|
||||
|
||||
5569. [bug] Emit useful error message when "rndc retransfer" is
|
||||
applied to a zone of inappropriate type. [GL #2342]
|
||||
|
||||
5568. [bug] Fixed a crash in "dnssec-keyfromlabel" when using ECDSA
|
||||
keys. [GL #2178]
|
||||
|
||||
5567. [bug] Dig now reports unknown dash options while pre-parsing
|
||||
the options. This prevents "-multi" instead of "+multi"
|
||||
from reporting memory usage before ending option parsing
|
||||
with "Invalid option: -lti". [GL #2403]
|
||||
|
||||
5566. [func] Add "stale-answer-client-timeout" option, which is the
|
||||
amount of time a recursive resolver waits before
|
||||
attempting to answer the query using stale data from
|
||||
cache. [GL #2247]
|
||||
|
||||
5565. [func] The SONAMEs for BIND 9 libraries now include the current
|
||||
BIND 9 version number, in an effort to tightly couple
|
||||
internal libraries with a specific release. [GL #2387]
|
||||
|
||||
5564. [cleanup] Network manager's TLSDNS module was refactored to use
|
||||
libuv and libssl directly instead of a stack of TCP/TLS
|
||||
sockets. [GL #2335]
|
||||
|
||||
5563. [cleanup] Changed several obsolete configuration options to
|
||||
ancient, making them fatal errors. Also cleaned up the
|
||||
number of clause flags in the configuration parser.
|
||||
[GL #1086]
|
||||
|
||||
5562. [placeholder]
|
||||
|
||||
5561. [bug] KASP incorrectly set signature validity to the value of
|
||||
the DNSKEY signature validity. This is now fixed.
|
||||
[GL #2383]
|
||||
|
||||
5560. [func] The default value of "max-stale-ttl" has been changed
|
||||
from 12 hours to 1 day and the default value of
|
||||
"stale-answer-ttl" has been changed from 1 second to 30
|
||||
seconds, following RFC 8767 recommendations. [GL #2248]
|
||||
|
||||
--- 9.17.9 released ---
|
||||
|
||||
5559. [bug] The --with-maxminddb=PATH form of the build-time option
|
||||
enabling support for libmaxminddb was not working
|
||||
correctly. This has been fixed. [GL #2366]
|
||||
|
||||
5558. [bug] Asynchronous hook modules could trigger an assertion
|
||||
failure when the fetch handle was detached too late.
|
||||
Thanks to Jinmei Tatuya at Infoblox. [GL #2379]
|
||||
|
||||
5557. [bug] Prevent RBTDB instances from being destroyed by multiple
|
||||
threads at the same time. [GL #2317]
|
||||
|
||||
5556. [bug] Further tweak newline printing in dnssec-signzone and
|
||||
dnssec-verify. [GL #2359]
|
||||
|
||||
5555. [placeholder]
|
||||
|
||||
5554. [bug] dnssec-signzone and dnssec-verify were missing newlines
|
||||
between log messages. [GL #2359]
|
||||
|
||||
5553. [bug] When reconfiguring named, removing "auto-dnssec" did not
|
||||
turn off DNSSEC maintenance. [GL #2341]
|
||||
|
||||
5552. [func] When switching to "dnssec-policy none;", named now
|
||||
permits a safe transition to insecure mode and publishes
|
||||
the CDS and CDNSKEY DELETE records, as described in RFC
|
||||
8078. [GL #1750]
|
||||
|
||||
5551. [bug] named no longer attempts to assign threads to CPUs
|
||||
outside the CPU affinity set. Thanks to Ole Bjørn
|
||||
Hessen. [GL #2245]
|
||||
|
||||
5550. [func] dnssec-signzone and named now log a warning when falling
|
||||
back to the "increment" SOA serial method. [GL #2058]
|
||||
|
||||
5549. [protocol] ipv4only.arpa is now served when DNS64 is configured.
|
||||
[GL #385]
|
||||
|
||||
5548. [placeholder]
|
||||
|
||||
5547. [placeholder]
|
||||
|
||||
--- 9.17.8 released ---
|
||||
|
||||
5546. [placeholder]
|
||||
|
||||
5545. [func] OS support for load-balanced sockets is no longer
|
||||
required to receive incoming queries in multiple netmgr
|
||||
threads. [GL #2137]
|
||||
|
||||
5544. [func] Restore the default value of "nocookie-udp-size" to 4096
|
||||
bytes. [GL #2250]
|
||||
|
||||
5543. [bug] Fix UDP performance issues caused by making netmgr
|
||||
callbacks asynchronous-only. [GL #2320]
|
||||
|
||||
5542. [bug] Refactor netmgr. [GL #1920] [GL #2034] [GL #2061]
|
||||
[GL #2194] [GL #2221] [GL #2266] [GL #2283] [GL #2318]
|
||||
[GL #2321]
|
||||
|
||||
5541. [func] Adjust the "max-recursion-queries" default from 75 to
|
||||
100. [GL #2305]
|
||||
|
||||
5540. [port] Fix building with native PKCS#11 support for AEP Keyper.
|
||||
[GL #2315]
|
||||
|
||||
5539. [bug] Tighten handling of missing DNS COOKIE responses over
|
||||
UDP by falling back to TCP. [GL #2275]
|
||||
|
||||
5538. [func] Add NSEC3 support to KASP. A new option for
|
||||
"dnssec-policy", "nsec3param", can be used to set the
|
||||
desired NSEC3 parameters. NSEC3 salt collisions are
|
||||
automatically prevented during resalting. Salt
|
||||
generation is now logged with zone context. [GL #1620]
|
||||
|
||||
5537. [func] The query plugin mechanism has been extended
|
||||
to support asynchronous operations. For example, a
|
||||
plugin can now trigger recursion and resume
|
||||
processing when it is complete. Thanks to Jinmei
|
||||
Tatuya at Infoblox. [GL #2141]
|
||||
|
||||
5536. [func] Dig can now report the DNS64 prefixes in use
|
||||
(+dns64prefix). [GL #1154]
|
||||
|
||||
5535. [bug] dig/nslookup/host could crash on shutdown after an
|
||||
interrupt. [GL #2287] [GL #2288]
|
||||
|
||||
5534. [bug] The CNAME synthesized from a DNAME was incorrectly
|
||||
followed when the QTYPE was CNAME or ANY. [GL #2280]
|
||||
|
||||
--- 9.17.7 released ---
|
||||
|
||||
5533. [func] Add the "stale-refresh-time" option, a time window that
|
||||
@@ -531,8 +11,7 @@
|
||||
to those files. [GL #1913]
|
||||
|
||||
5531. [func] Add support for DNS over TLS (DoT) to dig and named.
|
||||
dig output now includes the transport protocol used.
|
||||
[GL #1816] [GL #1840]
|
||||
[GL #1840]
|
||||
|
||||
5530. [bug] dnstap did not capture responses to forwarded UPDATE
|
||||
requests. [GL #2252]
|
||||
|
||||
+9
-7
@@ -39,7 +39,7 @@ anyone can see the source, but only ISC employees have commit access.
|
||||
In the past, the source could only be seen once ISC had published
|
||||
a release; read access to the source repository was restricted just
|
||||
as commit access was. That has changed, as ISC now provides a
|
||||
public git repository of the BIND source tree (see below).
|
||||
public git mirror to the BIND source tree (see below).
|
||||
|
||||
At ISC, we're committed to
|
||||
building communities that are welcoming and inclusive: environments where people
|
||||
@@ -55,12 +55,14 @@ the industry.
|
||||
Public BIND releases are always available from the
|
||||
[ISC FTP site](ftp://ftp.isc.org/isc/bind9).
|
||||
|
||||
A public-access git repository is also available at
|
||||
[https://gitlab.isc.org](https://gitlab.isc.org). This repository
|
||||
contains all public release branches. Upcoming releases can be viewed in
|
||||
their current state at any time. Short-lived development branches
|
||||
contain unreviewed work in progress. Commits which address security
|
||||
vulnerablilities are withheld until after public disclosure.
|
||||
A public-access GIT repository is also available at
|
||||
[https://gitlab.isc.org](https://gitlab.isc.org).
|
||||
This repository is a mirror, updated several times per day, of the
|
||||
source repository maintained by ISC. It contains all the public release
|
||||
branches; upcoming releases can be viewed in their current state at any
|
||||
time. It does *not* contain development branches or unreviewed work in
|
||||
progress. Commits which address security vulnerablilities are withheld
|
||||
until after public disclosure.
|
||||
|
||||
You can browse the source online via
|
||||
[https://gitlab.isc.org/isc-projects/bind9](https://gitlab.isc.org/isc-projects/bind9)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
Copyright (C) 1996-2021 Internet Systems Consortium, Inc. ("ISC")
|
||||
Copyright (C) 1996-2020 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
|
||||
@@ -367,25 +367,3 @@ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
|
||||
Copyright Joyent, Inc. and other Node contributors. All rights reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to
|
||||
deal in the Software without restriction, including without limitation the
|
||||
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
sell copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
IN THE SOFTWARE.
|
||||
|
||||
@@ -10,7 +10,6 @@ AM_V_SPHINX_0 = @echo " SPHINX $@";
|
||||
SPHINXBUILDDIR = $(builddir)/_build
|
||||
|
||||
common_SPHINXOPTS = \
|
||||
-W \
|
||||
-c $(srcdir) \
|
||||
-a \
|
||||
$(SPHINX_V)
|
||||
|
||||
+2
-3
@@ -3,9 +3,8 @@
|
||||
|
||||
AM_CPPFLAGS += \
|
||||
$(CMOCKA_CFLAGS) \
|
||||
-DNAMED_PLUGINDIR=\"$(libdir)/named\" \
|
||||
-DSKIPPED_TEST_EXIT_CODE=77 \
|
||||
-DTESTS_DIR=\"$(abs_srcdir)\"
|
||||
-DTESTS_DIR=\"$(abs_srcdir)\" \
|
||||
-DNAMED_PLUGINDIR=\"$(libdir)/named\"
|
||||
|
||||
LDADD = \
|
||||
$(CMOCKA_LIBS)
|
||||
|
||||
@@ -18,6 +18,11 @@ AM_LDFLAGS += \
|
||||
-Wl,-flat_namespace
|
||||
endif HOST_MACOS
|
||||
|
||||
if HAVE_GSSAPI
|
||||
AM_CPPFLAGS += \
|
||||
$(GSSAPI_CFLAGS)
|
||||
endif
|
||||
|
||||
LIBISC_CFLAGS = \
|
||||
-I$(top_srcdir)/include \
|
||||
-I$(top_srcdir)/lib/isc/unix/include \
|
||||
@@ -25,6 +30,21 @@ LIBISC_CFLAGS = \
|
||||
-I$(top_srcdir)/lib/isc/include \
|
||||
-I$(top_builddir)/lib/isc/include
|
||||
|
||||
if HAVE_JSON_C
|
||||
LIBISC_CFLAGS += \
|
||||
$(JSON_C_CFLAGS)
|
||||
endif HAVE_JSON_C
|
||||
|
||||
if HAVE_LIBXML2
|
||||
LIBISC_CFLAGS += \
|
||||
$(LIBXML2_CFLAGS)
|
||||
endif HAVE_LIBXML2
|
||||
|
||||
if HAVE_READLINE
|
||||
LIBISC_CFLAGS += \
|
||||
$(READLINE_CFLAGS)
|
||||
endif HAVE_READLINE
|
||||
|
||||
LIBISC_LIBS = $(top_builddir)/lib/isc/libisc.la
|
||||
|
||||
LIBDNS_CFLAGS = \
|
||||
@@ -34,6 +54,16 @@ LIBDNS_CFLAGS = \
|
||||
LIBDNS_LIBS = \
|
||||
$(top_builddir)/lib/dns/libdns.la
|
||||
|
||||
if HAVE_DNSTAP
|
||||
LIBDNS_CFLAGS += \
|
||||
$(DNSTAP_CFLAGS)
|
||||
endif HAVE_DNSTAP
|
||||
|
||||
if HAVE_LMDB
|
||||
LIBDNS_CFLAGS += \
|
||||
$(LMDB_CFLAGS)
|
||||
endif HAVE_LMDB
|
||||
|
||||
LIBNS_CFLAGS = \
|
||||
-I$(top_srcdir)/lib/ns/include
|
||||
|
||||
|
||||
+14
-13
@@ -8,19 +8,20 @@
|
||||
- See the COPYRIGHT file distributed with this work for additional
|
||||
- information regarding copyright ownership.
|
||||
-->
|
||||
Setting the `CPPFLAGS` environment variable before running `configure`
|
||||
can be used to enable certain compile-time options that are not
|
||||
explicitly defined in `configure`.
|
||||
Setting the `STD_CDEFINES` environment variable before running `configure`
|
||||
can be used to enable certain compile-time options that are not explicitly
|
||||
defined in `configure`.
|
||||
|
||||
Some of these settings are:
|
||||
|
||||
| Setting | Description |
|
||||
| ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `-DCHECK_LOCAL=0` | Don't check out-of-zone addresses in `named-checkzone` |
|
||||
| `-DCHECK_SIBLING=0` | Don't check sibling glue in `named-checkzone` |
|
||||
| `-DISC_FACILITY=LOG_LOCAL0` | Change the default syslog facility for `named` |
|
||||
| `-DISC_HEAP_CHECK` | Test heap consistency after every heap operation; used when debugging |
|
||||
| `-DISC_MEM_DEFAULTFILL=1` | Overwrite memory with tag values when allocating or freeing it; this impairs performance but makes debugging of memory problems easier |
|
||||
| `-DISC_MEM_TRACKLINES=0` | Don't track memory allocations by file and line number; this improves performance but makes debugging more difficult |
|
||||
| `-DNAMED_RUN_PID_DIR=0` | Create default PID files in `${localstatedir}/run` rather than `${localstatedir}/run/named/` |
|
||||
| `-DNS_CLIENT_DROPPORT=0` | Disable dropping queries from particular well-known ports |
|
||||
|Setting |Description |
|
||||
|-----------------------------------|----------------------------------------|
|
||||
|`-DISC_MEM_DEFAULTFILL=1`|Overwrite memory with tag values when allocating or freeing it; this impairs performance but makes debugging of memory problems easier.|
|
||||
|`-DISC_MEM_TRACKLINES=0`|Don't track memory allocations by file and line number; this improves performance but makes debugging more difficult.|
|
||||
|<nobr>`-DISC_FACILITY=LOG_LOCAL0`</nobr>|Change the default syslog facility for `named`|
|
||||
|`-DNS_CLIENT_DROPPORT=0`|Disable dropping queries from particular well-known ports:|
|
||||
|`-DCHECK_SIBLING=0`|Don't check sibling glue in `named-checkzone`|
|
||||
|`-DCHECK_LOCAL=0`|Don't check out-of-zone addresses in `named-checkzone`|
|
||||
|`-DNS_RUN_PID_DIR=0`|Create default PID files in `${localstatedir}/run` rather than `${localstatedir}/run/named/`|
|
||||
|`-DISC_BUFFER_USEINLINE=0`|Disable the use of inline functions to implement the `isc_buffer` API: this reduces performance but may be useful when debugging |
|
||||
|`-DISC_HEAP_CHECK`|Test heap consistency after every heap operation; used when debugging|
|
||||
|
||||
+9
-9
@@ -13,7 +13,7 @@
|
||||
In general, this version of BIND will build and run on any POSIX-compliant
|
||||
system with a C11-compliant C compiler, BSD-style sockets with RFC-compliant
|
||||
IPv6 support, POSIX-compliant threads, the `libuv` asynchronous I/O library,
|
||||
the OpenSSL cryptography library, and the `nghttp2` HTTP/2 library.
|
||||
and the OpenSSL cryptography library.
|
||||
|
||||
The following C11 features are used in BIND 9:
|
||||
|
||||
@@ -46,12 +46,12 @@ As of Nov 2020, BIND 9.17 is fully supported and regularly tested on the
|
||||
following systems:
|
||||
|
||||
* Debian 9, 10
|
||||
* Ubuntu LTS 18.04, 20.04
|
||||
* Fedora 34
|
||||
* Ubuntu LTS 16.04, 20.04
|
||||
* Fedora 33
|
||||
* Red Hat Enterprise Linux / CentOS 7, 8
|
||||
* FreeBSD 11.4, 12.2, 13.0
|
||||
* OpenBSD 6.9
|
||||
* Alpine Linux 3.13
|
||||
* FreeBSD 11.4, 12.2
|
||||
* OpenBSD 6.8
|
||||
* Alpine Linux 3.12
|
||||
|
||||
The amd64, i386, armhf and arm64 CPU architectures are all fully supported.
|
||||
|
||||
@@ -61,7 +61,7 @@ The following are platforms on which BIND is known to build and run.
|
||||
ISC makes every effort to fix bugs on these platforms, but may be unable to
|
||||
do so quickly due to lack of hardware, less familiarity on the part of
|
||||
engineering staff, and other constraints. With the exception of Windows
|
||||
Server 2016, none of these are tested regularly by ISC.
|
||||
Server 2012 R2, none of these are tested regularly by ISC.
|
||||
|
||||
* Windows Server 2012 R2, 2016 / x64
|
||||
* Windows 10 / x64
|
||||
@@ -69,7 +69,7 @@ Server 2016, none of these are tested regularly by ISC.
|
||||
* Solaris 11
|
||||
* NetBSD
|
||||
* Other Linux distributions still supported by their vendors, such as:
|
||||
* Ubuntu 20.10+
|
||||
* Ubuntu 19.04+
|
||||
* Gentoo
|
||||
* Arch Linux
|
||||
* OpenWRT/LEDE 17.01+
|
||||
@@ -86,7 +86,7 @@ assessed against the risk of adverse effect on officially supported
|
||||
platforms.
|
||||
|
||||
* Platforms past or close to their respective EOL dates, such as:
|
||||
* Ubuntu 14.04, 16.04 (Ubuntu ESM releases are not supported)
|
||||
* Ubuntu 14.04, 18.10
|
||||
* CentOS 6
|
||||
* Debian Jessie
|
||||
* FreeBSD 10.x
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
1. [Introduction](#intro)
|
||||
1. [Reporting bugs and getting help](#help)
|
||||
1. [Contributing to BIND](#contrib)
|
||||
1. [BIND 9.17 features](#features)
|
||||
1. [Building BIND](#build)
|
||||
1. [macOS](#macos)
|
||||
1. [Dependencies](#dependencies)
|
||||
@@ -124,17 +125,27 @@ If you prefer, you may also submit code by opening a
|
||||
including your patch as an attachment, preferably generated by
|
||||
`git format-patch`.
|
||||
|
||||
### <a name="features"/> BIND 9.17 features
|
||||
|
||||
BIND 9.17 is the newest development branch of BIND 9. It includes a
|
||||
number of changes from BIND 9.16 and earlier releases. New features include:
|
||||
|
||||
* The new option `max-ixfr-ratio` to limit the size of outgoing IXFR responses
|
||||
before falling back to full zone transfers.
|
||||
* `rndc nta -d` and `rndc secroots` now include `validate-except` entries
|
||||
when listing negative trust anchors.
|
||||
|
||||
### <a name="build"/> Building BIND 9
|
||||
|
||||
At a minimum, BIND requires a Unix or Linux system with an ANSI C compiler,
|
||||
basic POSIX support, and a 64-bit integer type. BIND also requires the
|
||||
`libuv` asynchronous I/O library, the `nghttp2` HTTP/2 library, and a
|
||||
cryptography provider library such as OpenSSL or a hardware service
|
||||
module supporting PKCS#11. On Linux, BIND requires the `libcap` library
|
||||
to set process privileges, though this requirement can be overridden by
|
||||
disabling capability support at compile time. See [Compile-time
|
||||
options](#opts) below for details on other libraries that may be
|
||||
required to support optional features.
|
||||
`libuv` asynchronous I/O library, and a cryptography provider library
|
||||
such as OpenSSL or a hardware service module supporting PKCS#11. On
|
||||
Linux, BIND requires the `libcap` library to set process privileges,
|
||||
though this requirement can be overridden by disabling capability
|
||||
support at compile time. See [Compile-time options](#opts) below
|
||||
for details on other libraries that may be required to support
|
||||
optional features.
|
||||
|
||||
Successful builds have been observed on many versions of Linux and
|
||||
Unix, including RHEL/CentOS, Fedora, Debian, Ubuntu, SLES, openSUSE,
|
||||
|
||||
@@ -21,6 +21,8 @@
|
||||
|
||||
.. highlight: console
|
||||
|
||||
.. _man_named-checkzone:
|
||||
|
||||
named-checkzone, named-compilezone - zone file validity checking or converting tool
|
||||
-----------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -21,6 +21,8 @@
|
||||
|
||||
.. highlight: console
|
||||
|
||||
.. _man_tsig-keygen:
|
||||
|
||||
tsig-keygen, ddns-confgen - TSIG key generation tool
|
||||
----------------------------------------------------
|
||||
|
||||
|
||||
+20
-16
@@ -34,10 +34,8 @@
|
||||
#include <isc/hex.h>
|
||||
#include <isc/lib.h>
|
||||
#include <isc/log.h>
|
||||
#include <isc/managers.h>
|
||||
#include <isc/md.h>
|
||||
#include <isc/mem.h>
|
||||
#include <isc/netmgr.h>
|
||||
#ifdef WIN32
|
||||
#include <isc/ntpaths.h>
|
||||
#endif /* ifdef WIN32 */
|
||||
@@ -612,13 +610,11 @@ key_fromconfig(const cfg_obj_t *key, dns_client_t *client) {
|
||||
dns_name_t *keyname;
|
||||
isc_result_t result;
|
||||
bool match_root = false;
|
||||
enum {
|
||||
INITIAL_KEY,
|
||||
STATIC_KEY,
|
||||
INITIAL_DS,
|
||||
STATIC_DS,
|
||||
TRUSTED
|
||||
} anchortype;
|
||||
enum { INITIAL_KEY,
|
||||
STATIC_KEY,
|
||||
INITIAL_DS,
|
||||
STATIC_DS,
|
||||
TRUSTED } anchortype;
|
||||
const cfg_obj_t *obj;
|
||||
|
||||
keynamestr = cfg_obj_asstring(cfg_tuple_get(key, "name"));
|
||||
@@ -1738,7 +1734,6 @@ main(int argc, char *argv[]) {
|
||||
dns_namelist_t namelist;
|
||||
unsigned int resopt;
|
||||
isc_appctx_t *actx = NULL;
|
||||
isc_nm_t *netmgr = NULL;
|
||||
isc_taskmgr_t *taskmgr = NULL;
|
||||
isc_socketmgr_t *socketmgr = NULL;
|
||||
isc_timermgr_t *timermgr = NULL;
|
||||
@@ -1762,8 +1757,9 @@ main(int argc, char *argv[]) {
|
||||
isc_mem_create(&mctx);
|
||||
|
||||
CHECK(isc_appctx_create(mctx, &actx));
|
||||
isc_managers_create(mctx, 1, 0, 0, &netmgr, &taskmgr, &timermgr,
|
||||
&socketmgr);
|
||||
CHECK(isc_taskmgr_createinctx(mctx, 1, 0, &taskmgr));
|
||||
CHECK(isc_socketmgr_createinctx(mctx, &socketmgr));
|
||||
CHECK(isc_timermgr_createinctx(mctx, &timermgr));
|
||||
|
||||
parse_args(argc, argv);
|
||||
|
||||
@@ -1783,8 +1779,8 @@ main(int argc, char *argv[]) {
|
||||
#endif /* ifndef WIN32 */
|
||||
|
||||
/* Create client */
|
||||
result = dns_client_create(mctx, actx, taskmgr, socketmgr, timermgr, 0,
|
||||
&client, srcaddr4, srcaddr6);
|
||||
result = dns_client_createx(mctx, actx, taskmgr, socketmgr, timermgr, 0,
|
||||
&client, srcaddr4, srcaddr6);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
delv_log(ISC_LOG_ERROR, "dns_client_create: %s",
|
||||
isc_result_totext(result));
|
||||
@@ -1804,7 +1800,7 @@ main(int argc, char *argv[]) {
|
||||
CHECK(convert_name(&qfn, &query_name, qname));
|
||||
|
||||
/* Set up resolution options */
|
||||
resopt = DNS_CLIENTRESOPT_NOCDFLAG;
|
||||
resopt = DNS_CLIENTRESOPT_ALLOWRUN | DNS_CLIENTRESOPT_NOCDFLAG;
|
||||
if (no_sigs) {
|
||||
resopt |= DNS_CLIENTRESOPT_NODNSSEC;
|
||||
}
|
||||
@@ -1866,7 +1862,15 @@ cleanup:
|
||||
if (client != NULL) {
|
||||
dns_client_destroy(&client);
|
||||
}
|
||||
isc_managers_destroy(&netmgr, &taskmgr, &timermgr, &socketmgr);
|
||||
if (taskmgr != NULL) {
|
||||
isc_taskmgr_destroy(&taskmgr);
|
||||
}
|
||||
if (timermgr != NULL) {
|
||||
isc_timermgr_destroy(&timermgr);
|
||||
}
|
||||
if (socketmgr != NULL) {
|
||||
isc_socketmgr_destroy(&socketmgr);
|
||||
}
|
||||
if (actx != NULL) {
|
||||
isc_appctx_destroy(&actx);
|
||||
}
|
||||
|
||||
@@ -25,15 +25,10 @@ libdighost_la_SOURCES = \
|
||||
|
||||
bin_PROGRAMS = dig host nslookup
|
||||
|
||||
nslookup_CPPFLAGS = \
|
||||
$(AM_CPPFLAGS)
|
||||
|
||||
nslookup_LDADD = \
|
||||
$(LDADD)
|
||||
|
||||
if HAVE_READLINE
|
||||
nslookup_CPPFLAGS += \
|
||||
$(READLINE_CFLAGS)
|
||||
nslookup_LDADD += \
|
||||
$(READLINE_LIBS)
|
||||
endif HAVE_READLINE
|
||||
|
||||
+26
-222
@@ -30,7 +30,6 @@
|
||||
#include <pk11/site.h>
|
||||
|
||||
#include <dns/byaddr.h>
|
||||
#include <dns/dns64.h>
|
||||
#include <dns/fixedname.h>
|
||||
#include <dns/masterdump.h>
|
||||
#include <dns/message.h>
|
||||
@@ -207,8 +206,6 @@ help(void) {
|
||||
" fields in records)\n"
|
||||
" +[no]defname (Use search list "
|
||||
"(+[no]search))\n"
|
||||
" +[no]dns64prefix (Get the DNS64 prefixes "
|
||||
"from ipv4only.arpa)\n"
|
||||
" +[no]dnssec (Request DNSSEC records)\n"
|
||||
" +domain=### (Set default domainname)\n"
|
||||
" +[no]dscp[=###] (Set the DSCP value to "
|
||||
@@ -228,10 +225,6 @@ help(void) {
|
||||
"SERVFAIL)\n"
|
||||
" +[no]header-only (Send query without a "
|
||||
"question section)\n"
|
||||
" +[no]https[=###] (DNS over HTTPS mode) "
|
||||
"[/]\n"
|
||||
" +[no]https-get (Use GET instead of "
|
||||
"default POST method\n"
|
||||
" +[no]identify (ID responders in short "
|
||||
"answers)\n"
|
||||
#ifdef HAVE_LIBIDN2
|
||||
@@ -352,18 +345,12 @@ received(unsigned int bytes, isc_sockaddr_t *from, dig_query_t *query) {
|
||||
}
|
||||
if (query->lookup->tls_mode) {
|
||||
proto = "TLS";
|
||||
} else if (query->lookup->https_mode) {
|
||||
if (query->lookup->http_plain) {
|
||||
proto = "HTTP";
|
||||
} else {
|
||||
proto = "HTTPS";
|
||||
}
|
||||
} else if (query->lookup->tcp_mode) {
|
||||
proto = "TCP";
|
||||
} else {
|
||||
proto = "UDP";
|
||||
}
|
||||
printf(";; SERVER: %s(%s) (%s)\n", fromtext, query->userarg,
|
||||
printf(";; SERVER: %s(%s) (%s)\n", fromtext, query->servname,
|
||||
proto);
|
||||
time(&tnow);
|
||||
(void)localtime_r(&tnow, &tmnow);
|
||||
@@ -486,50 +473,6 @@ say_message(dns_rdata_t *rdata, dig_query_t *query, isc_buffer_t *buf) {
|
||||
return (ISC_R_SUCCESS);
|
||||
}
|
||||
|
||||
/*%
|
||||
* short_form message print handler. Calls above say_message()
|
||||
*/
|
||||
static isc_result_t
|
||||
dns64prefix_answer(dns_message_t *msg, isc_buffer_t *buf) {
|
||||
dns_rdataset_t *rdataset = NULL;
|
||||
dns_fixedname_t fixed;
|
||||
dns_name_t *name;
|
||||
isc_result_t result;
|
||||
isc_netprefix_t prefix[10];
|
||||
size_t i, count = 10;
|
||||
|
||||
name = dns_fixedname_initname(&fixed);
|
||||
result = dns_name_fromstring(name, "ipv4only.arpa", 0, NULL);
|
||||
check_result(result, "dns_name_fromstring");
|
||||
|
||||
result = dns_message_findname(msg, DNS_SECTION_ANSWER, name,
|
||||
dns_rdatatype_aaaa, dns_rdatatype_none,
|
||||
NULL, &rdataset);
|
||||
if (result == DNS_R_NXDOMAIN || result == DNS_R_NXRRSET) {
|
||||
return (ISC_R_SUCCESS);
|
||||
} else if (result != ISC_R_SUCCESS) {
|
||||
return (result);
|
||||
}
|
||||
|
||||
result = dns_dns64_findprefix(rdataset, prefix, &count);
|
||||
if (result == ISC_R_NOTFOUND)
|
||||
return (ISC_R_SUCCESS);
|
||||
if (count > 10)
|
||||
count = 10;
|
||||
for (i = 0; i < count; i++) {
|
||||
result = isc_netaddr_totext(&prefix[i].addr, buf);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
return (result);
|
||||
}
|
||||
result = isc_buffer_printf(buf, "/%u\n", prefix[i].prefixlen);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
return (result);
|
||||
}
|
||||
}
|
||||
|
||||
return (ISC_R_SUCCESS);
|
||||
}
|
||||
|
||||
/*%
|
||||
* short_form message print handler. Calls above say_message()
|
||||
*/
|
||||
@@ -616,7 +559,6 @@ printmessage(dig_query_t *query, const isc_buffer_t *msgbuf, dns_message_t *msg,
|
||||
dns_master_style_t *style = NULL;
|
||||
unsigned int styleflags = 0;
|
||||
bool isquery = (msg == query->lookup->sendmsg);
|
||||
bool dns64prefix = query->lookup->dns64prefix;
|
||||
|
||||
UNUSED(msgbuf);
|
||||
|
||||
@@ -681,16 +623,14 @@ printmessage(dig_query_t *query, const isc_buffer_t *msgbuf, dns_message_t *msg,
|
||||
check_result(result, "dns_master_stylecreate");
|
||||
|
||||
if (query->lookup->cmdline[0] != 0) {
|
||||
if (!short_form && !dns64prefix && printcmd) {
|
||||
if (!short_form && printcmd) {
|
||||
printf("%s", query->lookup->cmdline);
|
||||
}
|
||||
query->lookup->cmdline[0] = '\0';
|
||||
}
|
||||
debug("printmessage(%s %s %s)", headers ? "headers" : "noheaders",
|
||||
query->lookup->comments ? "comments" : "nocomments",
|
||||
short_form ? "short_form"
|
||||
: dns64prefix ? "dns64prefix_form"
|
||||
: "long_form");
|
||||
short_form ? "short_form" : "long_form");
|
||||
|
||||
flags = 0;
|
||||
if (!headers) {
|
||||
@@ -811,7 +751,7 @@ printmessage(dig_query_t *query, const isc_buffer_t *msgbuf, dns_message_t *msg,
|
||||
printf(" %s:\n", isquery ? "query_message_data"
|
||||
: "response_message_data");
|
||||
result = dns_message_headertotext(msg, style, flags, buf);
|
||||
} else if (query->lookup->comments && !short_form && !dns64prefix) {
|
||||
} else if (query->lookup->comments && !short_form) {
|
||||
if (query->lookup->cmdline[0] != '\0' && printcmd) {
|
||||
printf("; %s\n", query->lookup->cmdline);
|
||||
}
|
||||
@@ -892,7 +832,7 @@ printmessage(dig_query_t *query, const isc_buffer_t *msgbuf, dns_message_t *msg,
|
||||
|
||||
repopulate_buffer:
|
||||
|
||||
if (query->lookup->comments && headers && !short_form && !dns64prefix) {
|
||||
if (query->lookup->comments && headers && !short_form) {
|
||||
result = dns_message_pseudosectiontotext(
|
||||
msg, DNS_PSEUDOSECTION_OPT, style, flags, buf);
|
||||
if (result == ISC_R_NOSPACE) {
|
||||
@@ -906,7 +846,7 @@ repopulate_buffer:
|
||||
}
|
||||
|
||||
if (query->lookup->section_question && headers) {
|
||||
if (!short_form && !dns64prefix) {
|
||||
if (!short_form) {
|
||||
result = dns_message_sectiontotext(
|
||||
msg, DNS_SECTION_QUESTION, style, flags, buf);
|
||||
if (result == ISC_R_NOSPACE) {
|
||||
@@ -916,18 +856,13 @@ repopulate_buffer:
|
||||
}
|
||||
}
|
||||
if (query->lookup->section_answer) {
|
||||
if (!short_form && !dns64prefix) {
|
||||
if (!short_form) {
|
||||
result = dns_message_sectiontotext(
|
||||
msg, DNS_SECTION_ANSWER, style, flags, buf);
|
||||
if (result == ISC_R_NOSPACE) {
|
||||
goto buftoosmall;
|
||||
}
|
||||
check_result(result, "dns_message_sectiontotext");
|
||||
} else if (dns64prefix) {
|
||||
result = dns64prefix_answer(msg, buf);
|
||||
if (result == ISC_R_NOSPACE)
|
||||
goto buftoosmall;
|
||||
check_result(result, "dns64prefix_answer");
|
||||
} else {
|
||||
result = short_answer(msg, flags, buf, query);
|
||||
if (result == ISC_R_NOSPACE) {
|
||||
@@ -937,7 +872,7 @@ repopulate_buffer:
|
||||
}
|
||||
}
|
||||
if (query->lookup->section_authority) {
|
||||
if (!short_form && !dns64prefix) {
|
||||
if (!short_form) {
|
||||
result = dns_message_sectiontotext(
|
||||
msg, DNS_SECTION_AUTHORITY, style, flags, buf);
|
||||
if (result == ISC_R_NOSPACE) {
|
||||
@@ -947,7 +882,7 @@ repopulate_buffer:
|
||||
}
|
||||
}
|
||||
if (query->lookup->section_additional) {
|
||||
if (!short_form && !dns64prefix) {
|
||||
if (!short_form) {
|
||||
result = dns_message_sectiontotext(
|
||||
msg, DNS_SECTION_ADDITIONAL, style, flags, buf);
|
||||
if (result == ISC_R_NOSPACE) {
|
||||
@@ -1041,9 +976,8 @@ printgreeting(int argc, char **argv, dig_lookup_t *lookup) {
|
||||
* XXX doc options
|
||||
*/
|
||||
|
||||
static dig_lookup_t *
|
||||
plus_option(char *option, bool is_batchfile, bool *need_clone,
|
||||
dig_lookup_t *lookup) {
|
||||
static void
|
||||
plus_option(char *option, bool is_batchfile, dig_lookup_t *lookup) {
|
||||
isc_result_t result;
|
||||
char *cmd, *value, *last = NULL, *code, *extra;
|
||||
uint32_t num;
|
||||
@@ -1054,7 +988,7 @@ plus_option(char *option, bool is_batchfile, bool *need_clone,
|
||||
|
||||
if ((cmd = strtok_r(option, "=", &last)) == NULL) {
|
||||
printf(";; Invalid option %s\n", option);
|
||||
return (lookup);
|
||||
return;
|
||||
}
|
||||
if (strncasecmp(cmd, "no", 2) == 0) {
|
||||
cmd += 2;
|
||||
@@ -1076,17 +1010,6 @@ plus_option(char *option, bool is_batchfile, bool *need_clone,
|
||||
(_l >= sizeof(B) || strncasecmp(cmd, B, _l) != 0)) \
|
||||
goto invalid_option; \
|
||||
} while (0)
|
||||
#define FULLCHECK6(A, B, C, D, E, F) \
|
||||
do { \
|
||||
size_t _l = strlen(cmd); \
|
||||
if ((_l >= sizeof(A) || strncasecmp(cmd, A, _l) != 0) && \
|
||||
(_l >= sizeof(B) || strncasecmp(cmd, B, _l) != 0) && \
|
||||
(_l >= sizeof(C) || strncasecmp(cmd, C, _l) != 0) && \
|
||||
(_l >= sizeof(D) || strncasecmp(cmd, D, _l) != 0) && \
|
||||
(_l >= sizeof(E) || strncasecmp(cmd, E, _l) != 0) && \
|
||||
(_l >= sizeof(F) || strncasecmp(cmd, F, _l) != 0)) \
|
||||
goto invalid_option; \
|
||||
} while (0)
|
||||
|
||||
switch (cmd[0]) {
|
||||
case 'a':
|
||||
@@ -1232,57 +1155,13 @@ plus_option(char *option, bool is_batchfile, bool *need_clone,
|
||||
usesearch = state;
|
||||
}
|
||||
break;
|
||||
case 'n':
|
||||
switch (cmd[2]) {
|
||||
case 's':
|
||||
switch (cmd[3]) {
|
||||
case '6': /* dns64prefix */
|
||||
FULLCHECK("dns64prefix");
|
||||
if (state) {
|
||||
if (*need_clone) {
|
||||
lookup = clone_lookup(
|
||||
default_lookup,
|
||||
true);
|
||||
}
|
||||
*need_clone = true;
|
||||
lookup->dns64prefix = state;
|
||||
strlcpy(lookup->textname,
|
||||
"ipv4only.arpa",
|
||||
sizeof(lookup->textname));
|
||||
printcmd = false;
|
||||
lookup->section_additional =
|
||||
false;
|
||||
lookup->section_answer = true;
|
||||
lookup->section_authority =
|
||||
false;
|
||||
lookup->section_question =
|
||||
false;
|
||||
lookup->comments = false;
|
||||
lookup->stats = false;
|
||||
lookup->rrcomments = -1;
|
||||
lookup->rdtype =
|
||||
dns_rdatatype_aaaa;
|
||||
lookup->rdtypeset = true;
|
||||
ISC_LIST_APPEND(lookup_list,
|
||||
lookup, link);
|
||||
}
|
||||
break;
|
||||
case 's': /* dnssec */
|
||||
FULLCHECK("dnssec");
|
||||
dnssec:
|
||||
if (state && lookup->edns == -1) {
|
||||
lookup->edns =
|
||||
DEFAULT_EDNS_VERSION;
|
||||
}
|
||||
lookup->dnssec = state;
|
||||
break;
|
||||
default:
|
||||
goto invalid_option;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
goto invalid_option;
|
||||
case 'n': /* dnssec */
|
||||
FULLCHECK("dnssec");
|
||||
dnssec:
|
||||
if (state && lookup->edns == -1) {
|
||||
lookup->edns = DEFAULT_EDNS_VERSION;
|
||||
}
|
||||
lookup->dnssec = state;
|
||||
break;
|
||||
case 'o': /* domain ... but treat "do" as synonym for dnssec */
|
||||
if (cmd[2] == '\0') {
|
||||
@@ -1433,78 +1312,8 @@ plus_option(char *option, bool is_batchfile, bool *need_clone,
|
||||
lookup->servfail_stops = state;
|
||||
break;
|
||||
case 'h':
|
||||
switch (cmd[1]) {
|
||||
case 'e': /* header-only */
|
||||
FULLCHECK("header-only");
|
||||
lookup->header_only = state;
|
||||
break;
|
||||
case 't':
|
||||
FULLCHECK6("https", "https-get", "https-post",
|
||||
"http-plain", "http-plain-get",
|
||||
"http-plain-post");
|
||||
if (lookup->https_path != NULL) {
|
||||
isc_mem_free(mctx, lookup->https_path);
|
||||
lookup->https_path = NULL;
|
||||
}
|
||||
if (!state) {
|
||||
lookup->https_mode = false;
|
||||
break;
|
||||
}
|
||||
lookup->https_mode = true;
|
||||
if (cmd[4] == '-') {
|
||||
lookup->http_plain = true;
|
||||
switch (cmd[10]) {
|
||||
case '\0':
|
||||
FULLCHECK("http-plain");
|
||||
break;
|
||||
case '-':
|
||||
switch (cmd[6]) {
|
||||
case 'p':
|
||||
FULLCHECK("https-plain-post");
|
||||
break;
|
||||
case 'g':
|
||||
FULLCHECK("https-plain-get");
|
||||
lookup->https_get = true;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
goto invalid_option;
|
||||
}
|
||||
} else {
|
||||
switch (cmd[5]) {
|
||||
case '\0':
|
||||
FULLCHECK("https");
|
||||
break;
|
||||
case '-':
|
||||
switch (cmd[6]) {
|
||||
case 'p':
|
||||
FULLCHECK("https-post");
|
||||
break;
|
||||
case 'g':
|
||||
FULLCHECK("https-get");
|
||||
lookup->https_get = true;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
goto invalid_option;
|
||||
}
|
||||
}
|
||||
if (!lookup->tcp_mode_set) {
|
||||
lookup->tcp_mode = state;
|
||||
}
|
||||
if (value == NULL) {
|
||||
lookup->https_path = isc_mem_strdup(
|
||||
mctx, DEFAULT_HTTPS_PATH);
|
||||
} else {
|
||||
lookup->https_path = isc_mem_strdup(mctx,
|
||||
value);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
goto invalid_option;
|
||||
}
|
||||
FULLCHECK("header-only");
|
||||
lookup->header_only = state;
|
||||
break;
|
||||
case 'i':
|
||||
switch (cmd[1]) {
|
||||
@@ -2062,7 +1871,7 @@ plus_option(char *option, bool is_batchfile, bool *need_clone,
|
||||
fprintf(stderr, "Invalid option: +%s\n", option);
|
||||
usage();
|
||||
}
|
||||
return (lookup);
|
||||
return;
|
||||
|
||||
#if !TARGET_OS_IPHONE
|
||||
exit_or_usage:
|
||||
@@ -2432,20 +2241,16 @@ preparse_args(int argc, char **argv) {
|
||||
continue;
|
||||
}
|
||||
/* Look for dash value option. */
|
||||
if (strpbrk(option, dash_opts) != &option[0]) {
|
||||
goto invalid_option;
|
||||
}
|
||||
if (strlen(option) > 1U) {
|
||||
/* value in option. */
|
||||
if (strpbrk(option, dash_opts) != &option[0] ||
|
||||
strlen(option) > 1U) {
|
||||
/* Error or value in option. */
|
||||
continue;
|
||||
}
|
||||
/* Dash value is next argument so we need to skip it. */
|
||||
rc--, rv++;
|
||||
/* Handle missing argument */
|
||||
if (rc == 0) {
|
||||
invalid_option:
|
||||
fprintf(stderr, "Invalid option: -%s\n", option);
|
||||
usage();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2577,8 +2382,7 @@ parse_args(bool is_batchfile, bool config_only, int argc, char **argv) {
|
||||
}
|
||||
}
|
||||
} else if (rv[0][0] == '+') {
|
||||
lookup = plus_option(&rv[0][1], is_batchfile,
|
||||
&need_clone, lookup);
|
||||
plus_option(&rv[0][1], is_batchfile, lookup);
|
||||
} else if (rv[0][0] == '-') {
|
||||
if (rc <= 1) {
|
||||
if (dash_option(&rv[0][1], NULL, &lookup,
|
||||
|
||||
+9
-40
@@ -297,9 +297,6 @@ abbreviation is unambiguous; for example, ``+cd`` is equivalent to
|
||||
``+[no]defname``
|
||||
This option, which is deprecated, is treated as a synonym for ``+[no]search``.
|
||||
|
||||
``+[no]dns64prefix``
|
||||
Lookup IPV4ONLY.ARPA AAAA and print any DNS64 prefixes found.
|
||||
|
||||
``+[no]dnssec``
|
||||
This option requests that DNSSEC records be sent by setting the DNSSEC OK (DO) bit in
|
||||
the OPT record in the additional section of the query.
|
||||
@@ -349,38 +346,11 @@ abbreviation is unambiguous; for example, ``+cd`` is equivalent to
|
||||
default is to add a question section. The query type and query name
|
||||
are ignored when this is set.
|
||||
|
||||
``+[no]https[=value]``
|
||||
This option indicates whether to use DNS-over-HTTPS (DoH) when querying
|
||||
name servers. When this option is in use, the port number defaults to 443.
|
||||
The HTTP POST request mode is used when sending the query.
|
||||
|
||||
If ``value`` is specified, it will be used as the HTTP endpoint in the
|
||||
query URI; the default is ``/dns-query``. So, for example, ``dig
|
||||
@example.com +https`` will use the URI ``https://example.com/dns-query``.
|
||||
|
||||
``+[no]https-get[=value]``
|
||||
Similar to ``+https``, except that the HTTP GET request mode is used
|
||||
when sending the query.
|
||||
|
||||
``+[no]https-post[=value]``
|
||||
Same as ``+https``.
|
||||
|
||||
``+[no]http-plain[=value]``
|
||||
Similar to ``+https``, except that HTTP queries will be sent over a
|
||||
non-encrypted channel. When this option is in use, the port number
|
||||
defaults to 80 and the HTTP request mode is POST.
|
||||
|
||||
``+[no]http-plain-get[=value]``
|
||||
Similar to ``+http-plain``, except that the HTTP request mode is GET.
|
||||
|
||||
``+[no]http-plain-post[=value]``
|
||||
Same as ``+http-plain``.
|
||||
|
||||
``+[no]identify``
|
||||
This option shows [or does not show] the IP address and port number that
|
||||
supplied the answer, when the ``+short`` option is enabled. If short
|
||||
form answers are requested, the default is not to show the source
|
||||
address and port number of the server that provided the answer.
|
||||
This option shows [or does not show] the IP address and port number that supplied
|
||||
the answer, when the ``+short`` option is enabled. If short form
|
||||
answers are requested, the default is not to show the source address
|
||||
and port number of the server that provided the answer.
|
||||
|
||||
``+[no]idnin``
|
||||
This option processes [or does not process] IDN domain names on input. This requires
|
||||
@@ -480,8 +450,8 @@ abbreviation is unambiguous; for example, ``+cd`` is equivalent to
|
||||
``+nssearch`` or ``+trace`` query option is used.
|
||||
|
||||
``+retry=T``
|
||||
This option sets the number of times to retry UDP and TCP queries to server to ``T``
|
||||
instead of the default, 2. Unlike ``+tries``, this does not include
|
||||
This option sets the number of times to retry UDP queries to server to ``T``
|
||||
instead of the default, 2. Unlike ``+tries``, this does not include
|
||||
the initial query.
|
||||
|
||||
``+[no]rrcomments``
|
||||
@@ -546,9 +516,8 @@ abbreviation is unambiguous; for example, ``+cd`` is equivalent to
|
||||
5 seconds. An attempt to set ``T`` to less than 1 is silently set to 1.
|
||||
|
||||
``+[no]tls``
|
||||
This option indicates whether to use DNS-over-TLS (DoT) when querying
|
||||
name servers. When this option is in use, the port number defaults
|
||||
to 853.
|
||||
This option indicates whether to use DNS over TLS (DoT) when querying
|
||||
name servers.
|
||||
|
||||
``+[no]topdown``
|
||||
This feature is related to ``dig +sigchase``, which is obsolete and
|
||||
@@ -569,7 +538,7 @@ abbreviation is unambiguous; for example, ``+cd`` is equivalent to
|
||||
default queries from a name server.
|
||||
|
||||
``+tries=T``
|
||||
This option sets the number of times to try UDP and TCP queries to server to ``T``
|
||||
This option sets the number of times to try UDP queries to server to ``T``
|
||||
instead of the default, 3. If ``T`` is less than or equal to zero,
|
||||
the number of tries is silently rounded up to 1.
|
||||
|
||||
|
||||
+191
-172
@@ -41,7 +41,6 @@
|
||||
#include <isc/hex.h>
|
||||
#include <isc/lang.h>
|
||||
#include <isc/log.h>
|
||||
#include <isc/managers.h>
|
||||
#include <isc/netaddr.h>
|
||||
#include <isc/netdb.h>
|
||||
#include <isc/nonce.h>
|
||||
@@ -107,9 +106,9 @@ unsigned int timeout = 0;
|
||||
unsigned int extrabytes;
|
||||
isc_mem_t *mctx = NULL;
|
||||
isc_log_t *lctx = NULL;
|
||||
isc_nm_t *netmgr = NULL;
|
||||
isc_taskmgr_t *taskmgr = NULL;
|
||||
isc_task_t *global_task = NULL;
|
||||
isc_nm_t *netmgr = NULL;
|
||||
isc_sockaddr_t localaddr;
|
||||
isc_refcount_t sendcount = ATOMIC_VAR_INIT(0);
|
||||
isc_refcount_t recvcount = ATOMIC_VAR_INIT(0);
|
||||
@@ -227,9 +226,8 @@ void (*dighost_shutdown)(void);
|
||||
|
||||
/* forward declarations */
|
||||
|
||||
#define cancel_lookup(l) _cancel_lookup(l, __FILE__, __LINE__)
|
||||
static void
|
||||
_cancel_lookup(dig_lookup_t *lookup, const char *file, unsigned int line);
|
||||
cancel_lookup(dig_lookup_t *lookup);
|
||||
|
||||
static void
|
||||
recv_done(isc_nmhandle_t *handle, isc_result_t eresult, isc_region_t *region,
|
||||
@@ -605,46 +603,105 @@ clone_server_list(dig_serverlist_t src, dig_serverlist_t *dest) {
|
||||
dig_lookup_t *
|
||||
make_empty_lookup(void) {
|
||||
dig_lookup_t *looknew;
|
||||
#ifdef HAVE_LIBIDN2
|
||||
bool idn_allowed = isatty(1) ? (getenv("IDN_DISABLE") == NULL) : false;
|
||||
#endif /* HAVE_LIBIDN2 */
|
||||
|
||||
debug("make_empty_lookup()");
|
||||
|
||||
INSIST(!free_now);
|
||||
|
||||
looknew = isc_mem_allocate(mctx, sizeof(*looknew));
|
||||
*looknew = (dig_lookup_t){
|
||||
.pending = true,
|
||||
.rdtype = dns_rdatatype_a,
|
||||
.qrdtype = dns_rdatatype_a,
|
||||
.rdclass = dns_rdataclass_in,
|
||||
.servfail_stops = true,
|
||||
.besteffort = true,
|
||||
.opcode = dns_opcode_query,
|
||||
.badcookie = true,
|
||||
looknew = isc_mem_allocate(mctx, sizeof(struct dig_lookup));
|
||||
looknew->pending = true;
|
||||
looknew->textname[0] = 0;
|
||||
looknew->cmdline[0] = 0;
|
||||
looknew->rdtype = dns_rdatatype_a;
|
||||
looknew->qrdtype = dns_rdatatype_a;
|
||||
looknew->rdclass = dns_rdataclass_in;
|
||||
looknew->rdtypeset = false;
|
||||
looknew->rdclassset = false;
|
||||
looknew->sendspace = NULL;
|
||||
looknew->sendmsg = NULL;
|
||||
looknew->name = NULL;
|
||||
looknew->oname = NULL;
|
||||
looknew->xfr_q = NULL;
|
||||
looknew->current_query = NULL;
|
||||
looknew->doing_xfr = false;
|
||||
looknew->ixfr_serial = 0;
|
||||
looknew->trace = false;
|
||||
looknew->trace_root = false;
|
||||
looknew->identify = false;
|
||||
looknew->identify_previous_line = false;
|
||||
looknew->ignore = false;
|
||||
looknew->servfail_stops = true;
|
||||
looknew->besteffort = true;
|
||||
looknew->dnssec = false;
|
||||
looknew->ednsflags = 0;
|
||||
looknew->opcode = dns_opcode_query;
|
||||
looknew->expire = false;
|
||||
looknew->nsid = false;
|
||||
looknew->tcp_keepalive = false;
|
||||
looknew->padding = 0;
|
||||
looknew->header_only = false;
|
||||
looknew->sendcookie = false;
|
||||
looknew->seenbadcookie = false;
|
||||
looknew->badcookie = true;
|
||||
looknew->multiline = false;
|
||||
looknew->nottl = false;
|
||||
looknew->noclass = false;
|
||||
looknew->onesoa = false;
|
||||
looknew->use_usec = false;
|
||||
looknew->nocrypto = false;
|
||||
looknew->ttlunits = false;
|
||||
looknew->expandaaaa = false;
|
||||
looknew->qr = false;
|
||||
#ifdef HAVE_LIBIDN2
|
||||
.idnin = idn_allowed,
|
||||
.idnout = idn_allowed,
|
||||
looknew->idnin = isatty(1) ? (getenv("IDN_DISABLE") == NULL) : false;
|
||||
looknew->idnout = looknew->idnin;
|
||||
#else /* ifdef HAVE_LIBIDN2 */
|
||||
looknew->idnin = false;
|
||||
looknew->idnout = false;
|
||||
#endif /* HAVE_LIBIDN2 */
|
||||
.udpsize = -1,
|
||||
.edns = -1,
|
||||
.recurse = true,
|
||||
.retries = tries,
|
||||
.comments = true,
|
||||
.stats = true,
|
||||
.section_question = true,
|
||||
.section_answer = true,
|
||||
.section_authority = true,
|
||||
.section_additional = true,
|
||||
.ednsneg = true,
|
||||
.mapped = true,
|
||||
.dscp = -1,
|
||||
};
|
||||
|
||||
looknew->udpsize = -1;
|
||||
looknew->edns = -1;
|
||||
looknew->recurse = true;
|
||||
looknew->aaonly = false;
|
||||
looknew->adflag = false;
|
||||
looknew->cdflag = false;
|
||||
looknew->raflag = false;
|
||||
looknew->tcflag = false;
|
||||
looknew->print_unknown_format = false;
|
||||
looknew->zflag = false;
|
||||
looknew->setqid = false;
|
||||
looknew->qid = 0;
|
||||
looknew->ns_search_only = false;
|
||||
looknew->origin = NULL;
|
||||
looknew->tsigctx = NULL;
|
||||
looknew->querysig = NULL;
|
||||
looknew->retries = tries;
|
||||
looknew->nsfound = 0;
|
||||
looknew->tcp_mode = false;
|
||||
looknew->tcp_mode_set = false;
|
||||
looknew->tls_mode = false;
|
||||
looknew->comments = true;
|
||||
looknew->stats = true;
|
||||
looknew->section_question = true;
|
||||
looknew->section_answer = true;
|
||||
looknew->section_authority = true;
|
||||
looknew->section_additional = true;
|
||||
looknew->new_search = false;
|
||||
looknew->done_as_is = false;
|
||||
looknew->need_search = false;
|
||||
looknew->ecs_addr = NULL;
|
||||
looknew->cookie = NULL;
|
||||
looknew->ednsopts = NULL;
|
||||
looknew->ednsoptscnt = 0;
|
||||
looknew->ednsneg = true;
|
||||
looknew->mapped = true;
|
||||
looknew->dscp = -1;
|
||||
looknew->rrcomments = 0;
|
||||
looknew->eoferr = 0;
|
||||
dns_fixedname_init(&looknew->fdomain);
|
||||
ISC_LINK_INIT(looknew, link);
|
||||
ISC_LIST_INIT(looknew->q);
|
||||
ISC_LIST_INIT(looknew->connecting);
|
||||
ISC_LIST_INIT(looknew->my_server_list);
|
||||
|
||||
isc_refcount_init(&looknew->references, 1);
|
||||
@@ -722,7 +779,6 @@ clone_lookup(dig_lookup_t *lookold, bool servers) {
|
||||
looknew->ignore = lookold->ignore;
|
||||
looknew->servfail_stops = lookold->servfail_stops;
|
||||
looknew->besteffort = lookold->besteffort;
|
||||
looknew->dns64prefix = lookold->dns64prefix;
|
||||
looknew->dnssec = lookold->dnssec;
|
||||
looknew->ednsflags = lookold->ednsflags;
|
||||
looknew->opcode = lookold->opcode;
|
||||
@@ -730,12 +786,6 @@ clone_lookup(dig_lookup_t *lookold, bool servers) {
|
||||
looknew->nsid = lookold->nsid;
|
||||
looknew->tcp_keepalive = lookold->tcp_keepalive;
|
||||
looknew->header_only = lookold->header_only;
|
||||
looknew->https_mode = lookold->https_mode;
|
||||
if (lookold->https_path != NULL) {
|
||||
looknew->https_path = isc_mem_strdup(mctx, lookold->https_path);
|
||||
}
|
||||
looknew->https_get = lookold->https_get;
|
||||
looknew->http_plain = lookold->http_plain;
|
||||
looknew->sendcookie = lookold->sendcookie;
|
||||
looknew->seenbadcookie = lookold->seenbadcookie;
|
||||
looknew->badcookie = lookold->badcookie;
|
||||
@@ -797,8 +847,8 @@ clone_lookup(dig_lookup_t *lookold, bool servers) {
|
||||
memmove(looknew->ecs_addr, lookold->ecs_addr, len);
|
||||
}
|
||||
|
||||
dns_name_copy(dns_fixedname_name(&lookold->fdomain),
|
||||
dns_fixedname_name(&looknew->fdomain));
|
||||
dns_name_copynf(dns_fixedname_name(&lookold->fdomain),
|
||||
dns_fixedname_name(&looknew->fdomain));
|
||||
|
||||
if (servers) {
|
||||
clone_server_list(lookold->my_server_list,
|
||||
@@ -1350,7 +1400,7 @@ setup_libs(void) {
|
||||
}
|
||||
|
||||
isc_mem_create(&mctx);
|
||||
isc_mem_setname(mctx, "dig");
|
||||
isc_mem_setname(mctx, "dig", NULL);
|
||||
|
||||
isc_log_create(mctx, &lctx, &logconfig);
|
||||
isc_log_setcontext(lctx);
|
||||
@@ -1362,7 +1412,10 @@ setup_libs(void) {
|
||||
|
||||
isc_log_setdebuglevel(lctx, 0);
|
||||
|
||||
isc_managers_create(mctx, 1, 0, 0, &netmgr, &taskmgr, NULL, NULL);
|
||||
netmgr = isc_nm_start(mctx, 1);
|
||||
|
||||
result = isc_taskmgr_create(mctx, 1, 0, netmgr, &taskmgr);
|
||||
check_result(result, "isc_taskmgr_create");
|
||||
|
||||
result = isc_task_create(taskmgr, 0, &global_task);
|
||||
check_result(result, "isc_task_create");
|
||||
@@ -1540,13 +1593,13 @@ _destroy_lookup(dig_lookup_t *lookup) {
|
||||
dig_server_t *s;
|
||||
void *ptr;
|
||||
|
||||
REQUIRE(lookup != NULL);
|
||||
REQUIRE(ISC_LIST_EMPTY(lookup->q));
|
||||
|
||||
debug("destroy_lookup");
|
||||
|
||||
isc_refcount_destroy(&lookup->references);
|
||||
|
||||
REQUIRE(ISC_LIST_EMPTY(lookup->q));
|
||||
REQUIRE(ISC_LIST_EMPTY(lookup->connecting));
|
||||
|
||||
s = ISC_LIST_HEAD(lookup->my_server_list);
|
||||
while (s != NULL) {
|
||||
debug("freeing server %p belonging to %p", s, lookup);
|
||||
@@ -1585,10 +1638,6 @@ _destroy_lookup(dig_lookup_t *lookup) {
|
||||
isc_mem_free(mctx, lookup->ednsopts);
|
||||
}
|
||||
|
||||
if (lookup->https_path) {
|
||||
isc_mem_free(mctx, lookup->https_path);
|
||||
}
|
||||
|
||||
isc_mem_free(mctx, lookup);
|
||||
}
|
||||
|
||||
@@ -1691,16 +1740,17 @@ _query_detach(dig_query_t **queryp, const char *file, unsigned int line) {
|
||||
query_detach(&lookup->current_query);
|
||||
}
|
||||
|
||||
if (ISC_LINK_LINKED(query, link)) {
|
||||
ISC_LIST_UNLINK(lookup->q, query, link);
|
||||
}
|
||||
if (ISC_LINK_LINKED(query, clink)) {
|
||||
ISC_LIST_UNLINK(lookup->connecting, query, clink);
|
||||
}
|
||||
|
||||
debug("%s:%u:query_detach(%p) = %" PRIuFAST32, file, line, query,
|
||||
isc_refcount_current(&query->references) - 1);
|
||||
|
||||
if (isc_refcount_decrement(&query->references) == 1) {
|
||||
INSIST(query->readhandle == NULL);
|
||||
INSIST(query->sendhandle == NULL);
|
||||
|
||||
if (ISC_LINK_LINKED(query, link)) {
|
||||
ISC_LIST_UNLINK(lookup->q, query, link);
|
||||
}
|
||||
destroy_query(query, file, line);
|
||||
}
|
||||
}
|
||||
@@ -1754,18 +1804,14 @@ start_lookup(void) {
|
||||
* decremented, current_lookup will not be set to NULL.)
|
||||
*/
|
||||
static void
|
||||
clear_current_lookup(void) {
|
||||
clear_current_lookup() {
|
||||
dig_lookup_t *lookup = current_lookup;
|
||||
|
||||
INSIST(!free_now);
|
||||
INSIST(lookup != NULL);
|
||||
|
||||
debug("clear_current_lookup()");
|
||||
|
||||
if (lookup == NULL) {
|
||||
debug("current_lookup is already detached");
|
||||
return;
|
||||
}
|
||||
|
||||
if (ISC_LIST_HEAD(lookup->q) != NULL) {
|
||||
debug("still have a worker");
|
||||
return;
|
||||
@@ -1890,7 +1936,7 @@ followup_lookup(dns_message_t *msg, dig_query_t *query, dns_section_t section) {
|
||||
lookup->recurse = false;
|
||||
}
|
||||
domain = dns_fixedname_name(&lookup->fdomain);
|
||||
dns_name_copy(name, domain);
|
||||
dns_name_copynf(name, domain);
|
||||
}
|
||||
debug("adding server %s", namestr);
|
||||
num = getaddresses(lookup, namestr, &lresult);
|
||||
@@ -2065,6 +2111,7 @@ insert_soa(dig_lookup_t *lookup) {
|
||||
|
||||
result = dns_message_gettempname(lookup->sendmsg, &soaname);
|
||||
check_result(result, "dns_message_gettempname");
|
||||
dns_name_init(soaname, NULL);
|
||||
dns_name_clone(lookup->name, soaname);
|
||||
ISC_LIST_INIT(soaname->list);
|
||||
ISC_LIST_APPEND(soaname->list, rdataset, link);
|
||||
@@ -2162,6 +2209,7 @@ setup_lookup(dig_lookup_t *lookup) {
|
||||
}
|
||||
result = dns_message_gettempname(lookup->sendmsg, &lookup->name);
|
||||
check_result(result, "dns_message_gettempname");
|
||||
dns_name_init(lookup->name, NULL);
|
||||
|
||||
isc_buffer_init(&lookup->namebuf, lookup->name_space,
|
||||
sizeof(lookup->name_space));
|
||||
@@ -2205,6 +2253,7 @@ setup_lookup(dig_lookup_t *lookup) {
|
||||
result = dns_message_gettempname(lookup->sendmsg,
|
||||
&lookup->oname);
|
||||
check_result(result, "dns_message_gettempname");
|
||||
dns_name_init(lookup->oname, NULL);
|
||||
/* XXX Helper funct to conv char* to name? */
|
||||
origin = lookup->origin->origin;
|
||||
#ifdef HAVE_LIBIDN2
|
||||
@@ -2244,7 +2293,9 @@ setup_lookup(dig_lookup_t *lookup) {
|
||||
name, lookup->oname,
|
||||
lookup->name, &lookup->namebuf);
|
||||
} else {
|
||||
dns_name_copy(name, lookup->name);
|
||||
result = dns_name_copy(
|
||||
name, lookup->name,
|
||||
&lookup->namebuf);
|
||||
}
|
||||
}
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
@@ -2673,12 +2724,11 @@ send_done(isc_nmhandle_t *handle, isc_result_t eresult, void *arg) {
|
||||
/*%
|
||||
* Cancel a lookup, sending canceling reads on all existing sockets.
|
||||
*/
|
||||
|
||||
static void
|
||||
_cancel_lookup(dig_lookup_t *lookup, const char *file, unsigned int line) {
|
||||
cancel_lookup(dig_lookup_t *lookup) {
|
||||
dig_query_t *query, *next;
|
||||
|
||||
debug("%s:%u:%s()", file, line, __func__);
|
||||
debug("cancel_lookup()");
|
||||
query = ISC_LIST_HEAD(lookup->q);
|
||||
while (query != NULL) {
|
||||
REQUIRE(DIG_VALID_QUERY(query));
|
||||
@@ -2714,20 +2764,7 @@ start_tcp(dig_query_t *query) {
|
||||
* For TLS connections, we want to override the default
|
||||
* port number.
|
||||
*/
|
||||
if (!port_set) {
|
||||
if (query->lookup->tls_mode) {
|
||||
port = 853;
|
||||
} else if (query->lookup->https_mode &&
|
||||
!query->lookup->http_plain) {
|
||||
port = 443;
|
||||
} else if (query->lookup->https_mode) {
|
||||
port = 80;
|
||||
} else {
|
||||
port = 53;
|
||||
}
|
||||
}
|
||||
|
||||
debug("query->servname = %s\n", query->servname);
|
||||
port = port_set ? port : (query->lookup->tls_mode ? 853 : 53);
|
||||
|
||||
result = get_address(query->servname, port, &query->sockaddr);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
@@ -2795,34 +2832,17 @@ start_tcp(dig_query_t *query) {
|
||||
REQUIRE(query != NULL);
|
||||
|
||||
if (query->lookup->tls_mode) {
|
||||
result = isc_tlsctx_createclient(&query->tlsctx);
|
||||
RUNTIME_CHECK(result == ISC_R_SUCCESS);
|
||||
isc_nm_tlsdnsconnect(netmgr, &localaddr,
|
||||
&query->sockaddr, tcp_connected,
|
||||
query, local_timeout, 0,
|
||||
query->tlsctx);
|
||||
} else if (query->lookup->https_mode) {
|
||||
char uri[4096] = { 0 };
|
||||
snprintf(uri, sizeof(uri), "https://%s:%u%s",
|
||||
query->userarg, (uint16_t)port,
|
||||
query->lookup->https_path);
|
||||
|
||||
if (!query->lookup->http_plain) {
|
||||
result =
|
||||
isc_tlsctx_createclient(&query->tlsctx);
|
||||
RUNTIME_CHECK(result == ISC_R_SUCCESS);
|
||||
isc_tlsctx_enable_http2client_alpn(
|
||||
query->tlsctx);
|
||||
}
|
||||
|
||||
isc_nm_httpconnect(netmgr, &localaddr, &query->sockaddr,
|
||||
uri, !query->lookup->https_get,
|
||||
tcp_connected, query, query->tlsctx,
|
||||
local_timeout, 0);
|
||||
result = isc_nm_tlsdnsconnect(
|
||||
netmgr, (isc_nmiface_t *)&localaddr,
|
||||
(isc_nmiface_t *)&query->sockaddr,
|
||||
tcp_connected, query, local_timeout, 0);
|
||||
check_result(result, "isc_nm_tcpdnsconnect");
|
||||
} else {
|
||||
isc_nm_tcpdnsconnect(netmgr, &localaddr,
|
||||
&query->sockaddr, tcp_connected,
|
||||
query, local_timeout, 0);
|
||||
result = isc_nm_tcpdnsconnect(
|
||||
netmgr, (isc_nmiface_t *)&localaddr,
|
||||
(isc_nmiface_t *)&query->sockaddr,
|
||||
tcp_connected, query, local_timeout, 0);
|
||||
check_result(result, "isc_nm_tcpdnsconnect");
|
||||
}
|
||||
|
||||
/* XXX: set DSCP */
|
||||
@@ -2840,6 +2860,7 @@ start_tcp(dig_query_t *query) {
|
||||
} else {
|
||||
next = NULL;
|
||||
}
|
||||
ISC_LIST_ENQUEUE(query->lookup->connecting, query, clink);
|
||||
if (next != NULL) {
|
||||
start_tcp(next);
|
||||
}
|
||||
@@ -2863,11 +2884,7 @@ send_udp(dig_query_t *query) {
|
||||
|
||||
isc_buffer_usedregion(&query->sendbuf, &r);
|
||||
debug("sending a request");
|
||||
if (query->lookup->use_usec) {
|
||||
TIME_NOW_HIRES(&query->time_sent);
|
||||
} else {
|
||||
TIME_NOW(&query->time_sent);
|
||||
}
|
||||
TIME_NOW(&query->time_sent);
|
||||
|
||||
isc_nmhandle_attach(query->handle, &query->sendhandle);
|
||||
|
||||
@@ -2897,16 +2914,13 @@ udp_ready(isc_nmhandle_t *handle, isc_result_t eresult, void *arg) {
|
||||
query_detach(&query);
|
||||
return;
|
||||
} else if (eresult != ISC_R_SUCCESS) {
|
||||
dig_lookup_t *l = query->lookup;
|
||||
|
||||
if (eresult != ISC_R_CANCELED) {
|
||||
debug("udp setup failed: %s",
|
||||
isc_result_totext(eresult));
|
||||
}
|
||||
|
||||
cancel_lookup(l);
|
||||
lookup_detach(&l);
|
||||
query_detach(&query);
|
||||
if (query->tries == 0) {
|
||||
query_detach(&query);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2942,7 +2956,6 @@ static void
|
||||
start_udp(dig_query_t *query) {
|
||||
isc_result_t result;
|
||||
dig_query_t *next = NULL;
|
||||
dig_query_t *connectquery = NULL;
|
||||
|
||||
REQUIRE(DIG_VALID_QUERY(query));
|
||||
|
||||
@@ -2994,10 +3007,24 @@ start_udp(dig_query_t *query) {
|
||||
}
|
||||
}
|
||||
|
||||
query_attach(query, &connectquery);
|
||||
isc_nm_udpconnect(netmgr, &localaddr, &query->sockaddr, udp_ready,
|
||||
connectquery,
|
||||
(timeout ? timeout : UDP_TIMEOUT) * 1000, 0);
|
||||
query->tries = 3;
|
||||
do {
|
||||
int local_timeout = timeout * 1000;
|
||||
if (local_timeout == 0) {
|
||||
local_timeout = UDP_TIMEOUT * 1000;
|
||||
}
|
||||
|
||||
/*
|
||||
* On FreeBSD the UDP connect() call sometimes results
|
||||
* in a spurious transient EADDRINUSE. Try a few more times
|
||||
* before giving up.
|
||||
*/
|
||||
debug("isc_nm_udpconnect(): %d tries left", --query->tries);
|
||||
result = isc_nm_udpconnect(netmgr, (isc_nmiface_t *)&localaddr,
|
||||
(isc_nmiface_t *)&query->sockaddr,
|
||||
udp_ready, query, local_timeout, 0);
|
||||
} while (result != ISC_R_SUCCESS && query->tries > 0);
|
||||
check_result(result, "isc_nm_udpconnect");
|
||||
}
|
||||
|
||||
/*%
|
||||
@@ -3104,8 +3131,7 @@ force_next(dig_query_t *query) {
|
||||
*/
|
||||
static void
|
||||
requeue_or_update_exitcode(dig_lookup_t *lookup) {
|
||||
if (lookup->eoferr == 0U && lookup->retries > 1) {
|
||||
--lookup->retries;
|
||||
if (lookup->eoferr == 0U) {
|
||||
/*
|
||||
* Peer closed the connection prematurely for the first time
|
||||
* for this lookup. Try again, keeping track of this failure.
|
||||
@@ -3164,12 +3190,7 @@ launch_next_query(dig_query_t *query) {
|
||||
if (!query->first_soa_rcvd) {
|
||||
dig_query_t *sendquery = NULL;
|
||||
debug("sending a request in launch_next_query");
|
||||
if (query->lookup->use_usec) {
|
||||
TIME_NOW_HIRES(&query->time_sent);
|
||||
} else {
|
||||
TIME_NOW(&query->time_sent);
|
||||
}
|
||||
|
||||
TIME_NOW(&query->time_sent);
|
||||
query_attach(query, &sendquery);
|
||||
isc_buffer_usedregion(&query->sendbuf, &r);
|
||||
if (keep != NULL) {
|
||||
@@ -3192,7 +3213,6 @@ launch_next_query(dig_query_t *query) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
lookup_detach(&l);
|
||||
return;
|
||||
}
|
||||
@@ -3209,26 +3229,15 @@ tcp_connected(isc_nmhandle_t *handle, isc_result_t eresult, void *arg) {
|
||||
char sockstr[ISC_SOCKADDR_FORMATSIZE];
|
||||
dig_lookup_t *l = NULL;
|
||||
|
||||
debug("tcp_connected()");
|
||||
|
||||
if (atomic_load(&cancel_now)) {
|
||||
return;
|
||||
}
|
||||
|
||||
REQUIRE(DIG_VALID_QUERY(query));
|
||||
REQUIRE(query->handle == NULL);
|
||||
INSIST(!free_now);
|
||||
|
||||
debug("tcp_connected(%p, %s, %p)", handle, isc_result_totext(eresult),
|
||||
query);
|
||||
debug("tcp_connected()");
|
||||
|
||||
LOCK_LOOKUP;
|
||||
lookup_attach(query->lookup, &l);
|
||||
|
||||
if (query->tlsctx != NULL) {
|
||||
isc_tlsctx_free(&query->tlsctx);
|
||||
}
|
||||
|
||||
if (eresult == ISC_R_CANCELED) {
|
||||
debug("in cancel handler");
|
||||
isc_sockaddr_format(&query->sockaddr, sockstr, sizeof(sockstr));
|
||||
@@ -3295,6 +3304,7 @@ tcp_connected(isc_nmhandle_t *handle, isc_result_t eresult, void *arg) {
|
||||
|
||||
launch_next_query(query);
|
||||
query_detach(&query);
|
||||
isc_nmhandle_detach(&handle);
|
||||
lookup_detach(&l);
|
||||
UNLOCK_LOOKUP;
|
||||
}
|
||||
@@ -3564,31 +3574,25 @@ recv_done(isc_nmhandle_t *handle, isc_result_t eresult, isc_region_t *region,
|
||||
isc_sockaddr_t peer;
|
||||
|
||||
REQUIRE(DIG_VALID_QUERY(query));
|
||||
REQUIRE(query->readhandle != NULL);
|
||||
INSIST(query->readhandle != NULL);
|
||||
INSIST(handle == query->readhandle);
|
||||
INSIST(!free_now);
|
||||
|
||||
debug("recv_done(%p, %s, %p, %p)", handle, isc_result_totext(eresult),
|
||||
region, arg);
|
||||
|
||||
LOCK_LOOKUP;
|
||||
lookup_attach(query->lookup, &l);
|
||||
|
||||
if (eresult == ISC_R_CANCELED) {
|
||||
debug("recv_done: cancel");
|
||||
goto detach_query;
|
||||
}
|
||||
|
||||
isc_refcount_decrement0(&recvcount);
|
||||
debug("recvcount=%" PRIuFAST32, isc_refcount_current(&recvcount));
|
||||
|
||||
if (eresult == ISC_R_CANCELED) {
|
||||
debug("recv_done: cancel");
|
||||
isc_nmhandle_detach(&query->readhandle);
|
||||
query_detach(&query);
|
||||
return;
|
||||
}
|
||||
|
||||
lookup_attach(query->lookup, &l);
|
||||
|
||||
if (query->lookup->use_usec) {
|
||||
TIME_NOW_HIRES(&query->time_recv);
|
||||
} else {
|
||||
TIME_NOW(&query->time_recv);
|
||||
}
|
||||
TIME_NOW(&query->time_recv);
|
||||
|
||||
if (eresult == ISC_R_TIMEDOUT && !l->tcp_mode && l->retries > 1) {
|
||||
dig_query_t *newq = NULL;
|
||||
@@ -3725,7 +3729,7 @@ recv_done(isc_nmhandle_t *handle, isc_result_t eresult, isc_region_t *region,
|
||||
}
|
||||
|
||||
debug("before parse starts");
|
||||
parseflags = l->dns64prefix ? 0 : DNS_MESSAGEPARSE_PRESERVEORDER;
|
||||
parseflags = DNS_MESSAGEPARSE_PRESERVEORDER;
|
||||
if (l->besteffort) {
|
||||
parseflags |= DNS_MESSAGEPARSE_BESTEFFORT;
|
||||
parseflags |= DNS_MESSAGEPARSE_IGNORETRUNCATION;
|
||||
@@ -4194,23 +4198,26 @@ cancel_all(void) {
|
||||
return;
|
||||
}
|
||||
atomic_store(&cancel_now, true);
|
||||
while (current_lookup != NULL) {
|
||||
if (current_lookup != NULL) {
|
||||
for (q = ISC_LIST_HEAD(current_lookup->q); q != NULL; q = nq) {
|
||||
nq = ISC_LIST_NEXT(q, link);
|
||||
debug("canceling pending query %p, belonging to %p", q,
|
||||
current_lookup);
|
||||
if (q->readhandle != NULL) {
|
||||
isc_nm_cancelread(q->readhandle);
|
||||
isc_refcount_decrement0(&recvcount);
|
||||
debug("recvcount=%" PRIuFAST32,
|
||||
isc_refcount_current(&recvcount));
|
||||
}
|
||||
query_detach(&q);
|
||||
}
|
||||
|
||||
/*
|
||||
* current_lookup could have been detached via query_detach().
|
||||
*/
|
||||
if (current_lookup != NULL) {
|
||||
lookup_detach(¤t_lookup);
|
||||
for (q = ISC_LIST_HEAD(current_lookup->connecting); q != NULL;
|
||||
q = nq) {
|
||||
nq = ISC_LIST_NEXT(q, clink);
|
||||
debug("canceling connecting query %p, belonging to %p",
|
||||
q, current_lookup);
|
||||
query_detach(&q);
|
||||
}
|
||||
lookup_detach(¤t_lookup);
|
||||
}
|
||||
l = ISC_LIST_HEAD(lookup_list);
|
||||
while (l != NULL) {
|
||||
@@ -4236,8 +4243,20 @@ destroy_libs(void) {
|
||||
debug("freeing task");
|
||||
isc_task_detach(&global_task);
|
||||
}
|
||||
/*
|
||||
* The taskmgr_destroy() and isc_nm_destroy() calls block until
|
||||
* all events are cleared.
|
||||
*/
|
||||
if (taskmgr != NULL) {
|
||||
debug("freeing taskmgr");
|
||||
isc_taskmgr_destroy(&taskmgr);
|
||||
}
|
||||
|
||||
isc_managers_destroy(&netmgr, &taskmgr, NULL, NULL);
|
||||
debug("closing down netmgr");
|
||||
isc_nm_closedown(netmgr);
|
||||
|
||||
debug("destroy netmgr");
|
||||
isc_nm_destroy(&netmgr);
|
||||
|
||||
LOCK_LOOKUP;
|
||||
isc_refcount_destroy(&recvcount);
|
||||
|
||||
+23
-31
@@ -24,7 +24,6 @@
|
||||
#include <isc/list.h>
|
||||
#include <isc/magic.h>
|
||||
#include <isc/mem.h>
|
||||
#include <isc/netmgr.h>
|
||||
#include <isc/print.h>
|
||||
#include <isc/refcount.h>
|
||||
#include <isc/sockaddr.h>
|
||||
@@ -76,9 +75,6 @@
|
||||
#define DEFAULT_EDNS_VERSION 0
|
||||
#define DEFAULT_EDNS_BUFSIZE 1232
|
||||
|
||||
#define DEFAULT_HTTPS_PATH "/dns-query"
|
||||
#define DEFAULT_HTTPS_QUERY "?dns="
|
||||
|
||||
/*%
|
||||
* Lookup_limit is just a limiter, keeping too many lookups from being
|
||||
* created. It's job is mainly to prevent the program from running away
|
||||
@@ -105,27 +101,29 @@ typedef struct dig_searchlist dig_searchlist_t;
|
||||
struct dig_lookup {
|
||||
unsigned int magic;
|
||||
isc_refcount_t references;
|
||||
bool aaonly, adflag, badcookie, besteffort, cdflag, comments,
|
||||
dns64prefix, dnssec, doing_xfr, done_as_is, ednsneg, expandaaaa,
|
||||
expire, header_only, identify, /*%< Append an "on server <foo>"
|
||||
message */
|
||||
identify_previous_line, /*% Prepend a "Nameserver <foo>:"
|
||||
message, with newline and tab */
|
||||
idnin, idnout, ignore, mapped, multiline, need_search,
|
||||
new_search, noclass, nocrypto, nottl,
|
||||
ns_search_only, /*%< dig +nssearch, host -C */
|
||||
nsid, /*% Name Server ID (RFC 5001) */
|
||||
onesoa, pending, /*%< Pending a successful answer */
|
||||
print_unknown_format, qr, raflag, recurse, section_additional,
|
||||
section_answer, section_authority, section_question,
|
||||
seenbadcookie, sendcookie, servfail_stops,
|
||||
setqid, /*% use a speciied query ID */
|
||||
stats, tcflag, tcp_keepalive, tcp_mode, tcp_mode_set,
|
||||
tls_mode, /*% connect using TLS */
|
||||
bool pending, /*%< Pending a successful answer */
|
||||
waiting_connect, doing_xfr, ns_search_only, /*%< dig
|
||||
* +nssearch,
|
||||
* host -C */
|
||||
identify, /*%< Append an "on server <foo>" message */
|
||||
identify_previous_line, /*% Prepend a "Nameserver <foo>:"
|
||||
* message, with newline and tab */
|
||||
ignore, recurse, aaonly, adflag, cdflag, raflag, tcflag, zflag,
|
||||
trace, /*% dig +trace */
|
||||
trace_root, /*% initial query for either +trace or +nssearch */
|
||||
ttlunits, use_usec, waiting_connect, zflag;
|
||||
char textname[MXNAME]; /*% Name we're going to be looking up */
|
||||
trace_root, /*% initial query for either +trace or +nssearch
|
||||
* */
|
||||
tcp_mode, tcp_mode_set, comments, stats, section_question,
|
||||
section_answer, section_authority, section_additional,
|
||||
servfail_stops, new_search, need_search, done_as_is, besteffort,
|
||||
dnssec, expire, sendcookie, seenbadcookie, badcookie,
|
||||
nsid, /*% Name Server ID (RFC 5001) */
|
||||
tcp_keepalive, header_only, ednsneg, mapped,
|
||||
print_unknown_format, multiline, nottl, noclass, onesoa,
|
||||
use_usec, nocrypto, ttlunits, idnin, idnout, expandaaaa, qr,
|
||||
setqid, /*% use a specified query ID */
|
||||
tls_mode; /*% connect using TLS */
|
||||
char textname[MXNAME]; /*% Name we're going to be
|
||||
* looking up */
|
||||
char cmdline[MXNAME];
|
||||
dns_rdatatype_t rdtype;
|
||||
dns_rdatatype_t qrdtype;
|
||||
@@ -171,12 +169,6 @@ struct dig_lookup {
|
||||
int rrcomments;
|
||||
unsigned int eoferr;
|
||||
uint16_t qid;
|
||||
struct {
|
||||
bool http_plain;
|
||||
bool https_mode;
|
||||
bool https_get;
|
||||
char *https_path;
|
||||
};
|
||||
};
|
||||
|
||||
/*% The dig_query structure */
|
||||
@@ -208,7 +200,7 @@ struct dig_query {
|
||||
isc_time_t time_recv;
|
||||
uint64_t byte_count;
|
||||
isc_timer_t *timer;
|
||||
isc_tlsctx_t *tlsctx;
|
||||
uint8_t tries;
|
||||
};
|
||||
|
||||
struct dig_server {
|
||||
|
||||
+3
-7
@@ -151,11 +151,7 @@ received(unsigned int bytes, isc_sockaddr_t *from, dig_query_t *query) {
|
||||
if (!short_form) {
|
||||
char fromtext[ISC_SOCKADDR_FORMATSIZE];
|
||||
isc_sockaddr_format(from, fromtext, sizeof(fromtext));
|
||||
if (query->lookup->use_usec) {
|
||||
TIME_NOW_HIRES(&now);
|
||||
} else {
|
||||
TIME_NOW(&now);
|
||||
}
|
||||
TIME_NOW(&now);
|
||||
diff = (int)isc_time_microdiff(&now, &query->time_sent);
|
||||
printf("Received %u bytes from %s in %d ms\n", bytes, fromtext,
|
||||
diff / 1000);
|
||||
@@ -379,7 +375,7 @@ chase_cnamechain(dns_message_t *msg, dns_name_t *qname) {
|
||||
dns_rdataset_current(rdataset, &rdata);
|
||||
result = dns_rdata_tostruct(&rdata, &cname, NULL);
|
||||
check_result(result, "dns_rdata_tostruct");
|
||||
dns_name_copy(&cname.cname, qname);
|
||||
dns_name_copynf(&cname.cname, qname);
|
||||
dns_rdata_freestruct(&cname);
|
||||
}
|
||||
}
|
||||
@@ -442,7 +438,7 @@ printmessage(dig_query_t *query, const isc_buffer_t *msgbuf, dns_message_t *msg,
|
||||
|
||||
/* Add AAAA and MX lookups. */
|
||||
name = dns_fixedname_initname(&fixed);
|
||||
dns_name_copy(query->lookup->name, name);
|
||||
dns_name_copynf(query->lookup->name, name);
|
||||
chase_cnamechain(msg, name);
|
||||
dns_name_format(name, namestr, sizeof(namestr));
|
||||
lookup = clone_lookup(query->lookup, false);
|
||||
|
||||
Symlink
+1
@@ -0,0 +1 @@
|
||||
../../../.clang-format.headers
|
||||
+3
-3
@@ -22,6 +22,7 @@
|
||||
#include <isc/netaddr.h>
|
||||
#include <isc/parseint.h>
|
||||
#include <isc/print.h>
|
||||
#include <isc/readline.h>
|
||||
#include <isc/string.h>
|
||||
#include <isc/task.h>
|
||||
#include <isc/util.h>
|
||||
@@ -37,7 +38,6 @@
|
||||
#include <dns/rdatatype.h>
|
||||
|
||||
#include "dighost.h"
|
||||
#include "readline.h"
|
||||
|
||||
static bool short_form = true, tcpmode = false, tcpmode_set = false,
|
||||
identify = false, stats = true, comments = true,
|
||||
@@ -391,7 +391,7 @@ chase_cnamechain(dns_message_t *msg, dns_name_t *qname) {
|
||||
dns_rdataset_current(rdataset, &rdata);
|
||||
result = dns_rdata_tostruct(&rdata, &cname, NULL);
|
||||
check_result(result, "dns_rdata_tostruct");
|
||||
dns_name_copy(&cname.cname, qname);
|
||||
dns_name_copynf(&cname.cname, qname);
|
||||
dns_rdata_freestruct(&cname);
|
||||
}
|
||||
}
|
||||
@@ -448,7 +448,7 @@ printmessage(dig_query_t *query, const isc_buffer_t *msgbuf, dns_message_t *msg,
|
||||
|
||||
/* Add AAAA lookup. */
|
||||
name = dns_fixedname_initname(&fixed);
|
||||
dns_name_copy(query->lookup->name, name);
|
||||
dns_name_copynf(query->lookup->name, name);
|
||||
chase_cnamechain(msg, name);
|
||||
dns_name_format(name, namestr, sizeof(namestr));
|
||||
lookup = clone_lookup(query->lookup, false);
|
||||
|
||||
@@ -215,7 +215,7 @@ loadkey(char *filename, unsigned char *key_buf, unsigned int key_buf_size,
|
||||
rdclass = dst_key_class(key);
|
||||
|
||||
name = dns_fixedname_initname(&fixed);
|
||||
dns_name_copy(dst_key_name(key), name);
|
||||
dns_name_copynf(dst_key_name(key), name);
|
||||
|
||||
dst_key_free(&key);
|
||||
}
|
||||
|
||||
@@ -185,7 +185,7 @@ loadkey(char *filename, unsigned char *key_buf, unsigned int key_buf_size,
|
||||
rdclass = dst_key_class(key);
|
||||
|
||||
name = dns_fixedname_initname(&fixed);
|
||||
dns_name_copy(dst_key_name(key), name);
|
||||
dns_name_copynf(dst_key_name(key), name);
|
||||
|
||||
dst_key_free(&key);
|
||||
}
|
||||
|
||||
@@ -362,6 +362,7 @@ main(int argc, char **argv) {
|
||||
setup_logging(mctx, &log);
|
||||
|
||||
if (predecessor == NULL) {
|
||||
/* cppcheck-suppress nullPointerRedundantCheck */
|
||||
if (label == NULL) {
|
||||
fatal("the key label was not specified");
|
||||
}
|
||||
@@ -383,6 +384,7 @@ main(int argc, char **argv) {
|
||||
isc_result_totext(ret));
|
||||
}
|
||||
|
||||
/* cppcheck-suppress nullPointerRedundantCheck */
|
||||
if (strchr(label, ':') == NULL) {
|
||||
char *l;
|
||||
int len;
|
||||
@@ -394,11 +396,13 @@ main(int argc, char **argv) {
|
||||
label = l;
|
||||
}
|
||||
|
||||
/* cppcheck-suppress nullPointerRedundantCheck */
|
||||
if (algname == NULL) {
|
||||
fatal("no algorithm specified");
|
||||
}
|
||||
|
||||
r.base = algname;
|
||||
/* cppcheck-suppress nullPointerRedundantCheck */
|
||||
r.length = strlen(algname);
|
||||
ret = dns_secalg_fromtext(&alg, &r);
|
||||
if (ret != ISC_R_SUCCESS) {
|
||||
|
||||
@@ -76,9 +76,9 @@ Options
|
||||
``-E engine``
|
||||
This option specifies the cryptographic hardware to use.
|
||||
|
||||
When BIND 9 is built with OpenSSL, this needs to be set to the OpenSSL
|
||||
engine identifier that drives the cryptographic accelerator or
|
||||
hardware service module (usually ``pkcs11``). When BIND is
|
||||
When BIND 9 is built with OpenSSL PKCS#11 support, this defaults to the
|
||||
string ``pkcs11``, which identifies an OpenSSL engine that can drive a
|
||||
cryptographic accelerator or hardware service module. When BIND is
|
||||
built with native PKCS#11 cryptography (``--enable-native-pkcs11``), it
|
||||
defaults to the path of the PKCS#11 provider library specified via
|
||||
``--with-pkcs11``.
|
||||
|
||||
@@ -269,8 +269,8 @@ kasp_from_conf(cfg_obj_t *config, isc_mem_t *mctx, const char *name,
|
||||
continue;
|
||||
}
|
||||
|
||||
result = cfg_kasp_fromconfig(kconfig, NULL, mctx, lctx,
|
||||
&kasplist, &kasp);
|
||||
result = cfg_kasp_fromconfig(kconfig, mctx, lctx, &kasplist,
|
||||
&kasp);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
fatal("failed to configure dnssec-policy '%s': %s",
|
||||
cfg_obj_asstring(cfg_tuple_get(kconfig, "name")),
|
||||
@@ -284,7 +284,7 @@ kasp_from_conf(cfg_obj_t *config, isc_mem_t *mctx, const char *name,
|
||||
*kaspp = kasp;
|
||||
|
||||
/*
|
||||
* Cleanup kasp list.
|
||||
* Same cleanup for kasp list.
|
||||
*/
|
||||
for (kasp = ISC_LIST_HEAD(kasplist); kasp != NULL; kasp = kasp_next) {
|
||||
kasp_next = ISC_LIST_NEXT(kasp, link);
|
||||
@@ -782,7 +782,7 @@ keygen(keygen_ctx_t *ctx, isc_mem_t *mctx, int argc, char **argv) {
|
||||
}
|
||||
|
||||
/* Set dnssec-policy related metadata */
|
||||
if (ctx->policy != NULL) {
|
||||
if (ctx->policy) {
|
||||
dst_key_setnum(key, DST_NUM_LIFETIME, ctx->lifetime);
|
||||
dst_key_setbool(key, DST_BOOL_KSK, ctx->ksk);
|
||||
dst_key_setbool(key, DST_BOOL_ZSK, ctx->zsk);
|
||||
@@ -1180,10 +1180,12 @@ main(int argc, char **argv) {
|
||||
}
|
||||
|
||||
if (ctx.predecessor == NULL && ctx.policy == NULL) {
|
||||
/* cppcheck-suppress nullPointerRedundantCheck */
|
||||
if (algname == NULL) {
|
||||
fatal("no algorithm specified");
|
||||
}
|
||||
r.base = algname;
|
||||
/* cppcheck-suppress nullPointerRedundantCheck */
|
||||
r.length = strlen(algname);
|
||||
ret = dns_secalg_fromtext(&ctx.alg, &r);
|
||||
if (ret != ISC_R_SUCCESS) {
|
||||
|
||||
@@ -103,9 +103,9 @@ Options
|
||||
``-E engine``
|
||||
This option specifies the cryptographic hardware to use, when applicable.
|
||||
|
||||
When BIND 9 is built with OpenSSL, this needs to be set to the OpenSSL
|
||||
engine identifier that drives the cryptographic accelerator or
|
||||
hardware service module (usually ``pkcs11``). When BIND is
|
||||
When BIND is built with OpenSSL PKCS#11 support, this defaults to the
|
||||
string ``pkcs11``, which identifies an OpenSSL engine that can drive a
|
||||
cryptographic accelerator or hardware service module. When BIND is
|
||||
built with native PKCS#11 cryptography (``--enable-native-pkcs11``), it
|
||||
defaults to the path of the PKCS#11 provider library specified via
|
||||
``--with-pkcs11``.
|
||||
|
||||
@@ -59,9 +59,9 @@ Options
|
||||
``-E engine``
|
||||
This option specifies the cryptographic hardware to use, when applicable.
|
||||
|
||||
When BIND 9 is built with OpenSSL, this needs to be set to the OpenSSL
|
||||
engine identifier that drives the cryptographic accelerator or
|
||||
hardware service module (usually ``pkcs11``). When BIND is
|
||||
When BIND 9 is built with OpenSSL PKCS#11 support, this defaults to the
|
||||
string ``pkcs11``, which identifies an OpenSSL engine that can drive a
|
||||
cryptographic accelerator or hardware service module. When BIND is
|
||||
built with native PKCS#11 cryptography (``--enable-native-pkcs11``), it
|
||||
defaults to the path of the PKCS#11 provider library specified via
|
||||
``--with-pkcs11``.
|
||||
|
||||
@@ -102,9 +102,9 @@ Options
|
||||
``-E engine``
|
||||
This option specifies the cryptographic hardware to use, when applicable.
|
||||
|
||||
When BIND 9 is built with OpenSSL, this needs to be set to the OpenSSL
|
||||
engine identifier that drives the cryptographic accelerator or
|
||||
hardware service module (usually ``pkcs11``). When BIND is
|
||||
When BIND is built with OpenSSL PKCS#11 support, this defaults to the
|
||||
string ``pkcs11``, which identifies an OpenSSL engine that can drive a
|
||||
cryptographic accelerator or hardware service module. When BIND is
|
||||
built with native PKCS#11 cryptography (``--enable-native-pkcs11``), it
|
||||
defaults to the path of the PKCS#11 provider library specified via
|
||||
``--with-pkcs11``.
|
||||
|
||||
@@ -40,7 +40,6 @@
|
||||
#include <isc/file.h>
|
||||
#include <isc/hash.h>
|
||||
#include <isc/hex.h>
|
||||
#include <isc/managers.h>
|
||||
#include <isc/md.h>
|
||||
#include <isc/mem.h>
|
||||
#include <isc/mutex.h>
|
||||
@@ -145,7 +144,6 @@ static unsigned int nsigned = 0, nretained = 0, ndropped = 0;
|
||||
static unsigned int nverified = 0, nverifyfailed = 0;
|
||||
static const char *directory = NULL, *dsdir = NULL;
|
||||
static isc_mutex_t namelock, statslock;
|
||||
static isc_nm_t *netmgr = NULL;
|
||||
static isc_taskmgr_t *taskmgr = NULL;
|
||||
static dns_db_t *gdb; /* The database */
|
||||
static dns_dbversion_t *gversion; /* The database version */
|
||||
@@ -179,9 +177,8 @@ static bool remove_orphansigs = false;
|
||||
static bool remove_inactkeysigs = false;
|
||||
static bool output_dnssec_only = false;
|
||||
static bool output_stdout = false;
|
||||
static bool set_maxttl = false;
|
||||
bool set_maxttl = false;
|
||||
static dns_ttl_t maxttl = 0;
|
||||
static bool no_max_check = false;
|
||||
|
||||
#define INCSTAT(counter) \
|
||||
if (printstats) { \
|
||||
@@ -201,7 +198,7 @@ savezonecut(dns_fixedname_t *fzonecut, dns_name_t *name) {
|
||||
dns_name_t *result;
|
||||
|
||||
result = dns_fixedname_initname(fzonecut);
|
||||
dns_name_copy(name, result);
|
||||
dns_name_copynf(name, result);
|
||||
|
||||
return (result);
|
||||
}
|
||||
@@ -594,10 +591,10 @@ signset(dns_diff_t *del, dns_diff_t *add, dns_dbnode_t *node, dns_name_t *name,
|
||||
vbprintf(2, "\trrsig by %s dropped - %s\n",
|
||||
sigstr,
|
||||
expired ? "expired"
|
||||
: rrsig.originalttl != set->ttl
|
||||
? "ttl change"
|
||||
: "failed to "
|
||||
"verify");
|
||||
: rrsig.originalttl != set->ttl
|
||||
? "ttl change"
|
||||
: "failed to "
|
||||
"verify");
|
||||
resign = true;
|
||||
}
|
||||
} else if (!ispublishedkey(key) && remove_orphansigs) {
|
||||
@@ -615,10 +612,10 @@ signset(dns_diff_t *del, dns_diff_t *add, dns_dbnode_t *node, dns_name_t *name,
|
||||
vbprintf(2, "\trrsig by %s dropped - %s\n",
|
||||
sigstr,
|
||||
expired ? "expired"
|
||||
: rrsig.originalttl != set->ttl
|
||||
? "ttl change"
|
||||
: "failed to "
|
||||
"verify");
|
||||
: rrsig.originalttl != set->ttl
|
||||
? "ttl change"
|
||||
: "failed to "
|
||||
"verify");
|
||||
}
|
||||
} else if (!expired) {
|
||||
vbprintf(2, "\trrsig by %s retained\n", sigstr);
|
||||
@@ -1337,8 +1334,8 @@ get_soa_ttls(void) {
|
||||
result = dns_rdataset_first(&soaset);
|
||||
check_result(result, "dns_rdataset_first");
|
||||
dns_rdataset_current(&soaset, &rdata);
|
||||
zone_soa_min_ttl = dns_soa_getminimum(&rdata);
|
||||
soa_ttl = soaset.ttl;
|
||||
zone_soa_min_ttl = ISC_MIN(dns_soa_getminimum(&rdata), soa_ttl);
|
||||
if (set_maxttl) {
|
||||
zone_soa_min_ttl = ISC_MIN(zone_soa_min_ttl, maxttl);
|
||||
soa_ttl = ISC_MIN(soa_ttl, maxttl);
|
||||
@@ -1355,8 +1352,7 @@ setsoaserial(uint32_t serial, dns_updatemethod_t method) {
|
||||
dns_dbnode_t *node = NULL;
|
||||
dns_rdataset_t rdataset;
|
||||
dns_rdata_t rdata = DNS_RDATA_INIT;
|
||||
uint32_t old_serial, new_serial = 0;
|
||||
dns_updatemethod_t used = dns_updatemethod_none;
|
||||
uint32_t old_serial, new_serial;
|
||||
|
||||
result = dns_db_getoriginnode(gdb, &node);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
@@ -1380,20 +1376,16 @@ setsoaserial(uint32_t serial, dns_updatemethod_t method) {
|
||||
|
||||
if (method == dns_updatemethod_date ||
|
||||
method == dns_updatemethod_unixtime) {
|
||||
new_serial = dns_update_soaserial(old_serial, method, &used);
|
||||
new_serial = dns_update_soaserial(old_serial, method);
|
||||
} else if (serial != 0 || method == dns_updatemethod_none) {
|
||||
/* Set SOA serial to the value provided. */
|
||||
new_serial = serial;
|
||||
used = method;
|
||||
} else {
|
||||
new_serial = dns_update_soaserial(old_serial, method, &used);
|
||||
}
|
||||
|
||||
if (method != used) {
|
||||
fprintf(stderr,
|
||||
"%s: warning: Serial number would not advance, "
|
||||
"using increment method instead\n",
|
||||
program);
|
||||
/* Increment SOA serial using RFC 1982 arithmetic */
|
||||
new_serial = (old_serial + 1) & 0xFFFFFFFF;
|
||||
if (new_serial == 0) {
|
||||
new_serial = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* If the new serial is not likely to cause a zone transfer
|
||||
@@ -2397,7 +2389,7 @@ nsec3ify(unsigned int hashalg, dns_iterations_t iterations,
|
||||
break;
|
||||
}
|
||||
if (result == ISC_R_NOMORE) {
|
||||
dns_name_copy(gorigin, nextname);
|
||||
dns_name_copynf(gorigin, nextname);
|
||||
done = true;
|
||||
} else if (result != ISC_R_SUCCESS) {
|
||||
fatal("iterating through the database failed: %s",
|
||||
@@ -2534,7 +2526,7 @@ nsec3ify(unsigned int hashalg, dns_iterations_t iterations,
|
||||
break;
|
||||
}
|
||||
if (result == ISC_R_NOMORE) {
|
||||
dns_name_copy(gorigin, nextname);
|
||||
dns_name_copynf(gorigin, nextname);
|
||||
done = true;
|
||||
} else if (result != ISC_R_SUCCESS) {
|
||||
fatal("iterating through the database failed: %s",
|
||||
@@ -2731,13 +2723,10 @@ static void
|
||||
report(const char *format, ...) {
|
||||
if (!quiet) {
|
||||
FILE *out = output_stdout ? stderr : stdout;
|
||||
char buf[4096];
|
||||
va_list args;
|
||||
|
||||
va_start(args, format);
|
||||
vsnprintf(buf, sizeof(buf), format, args);
|
||||
vfprintf(out, format, args);
|
||||
va_end(args);
|
||||
fprintf(out, "%s\n", buf);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3441,12 +3430,6 @@ main(int argc, char *argv[]) {
|
||||
|
||||
case 'H':
|
||||
set_iter = true;
|
||||
/* too-many is NOT DOCUMENTED */
|
||||
if (strcmp(isc_commandline_argument, "too-many") == 0) {
|
||||
nsec3iter = 151;
|
||||
no_max_check = true;
|
||||
break;
|
||||
}
|
||||
nsec3iter = strtoul(isc_commandline_argument, &endp, 0);
|
||||
if (*endp != '\0') {
|
||||
fatal("iterations must be numeric");
|
||||
@@ -3815,7 +3798,11 @@ main(int argc, char *argv[]) {
|
||||
* of keys rather early.
|
||||
*/
|
||||
ISC_LIST_INIT(keylist);
|
||||
isc_rwlock_init(&keylist_lock, 0, 0);
|
||||
result = isc_rwlock_init(&keylist_lock, 0, 0);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
fatal("could not initialize keylist_lock: %s",
|
||||
isc_result_totext(result));
|
||||
}
|
||||
|
||||
/*
|
||||
* Fill keylist with:
|
||||
@@ -3865,6 +3852,7 @@ main(int argc, char *argv[]) {
|
||||
warnifallksk(gdb);
|
||||
|
||||
if (IS_NSEC3) {
|
||||
unsigned int max;
|
||||
bool answer;
|
||||
|
||||
hash_length = dns_nsec3_hashlength(dns_hash_sha1);
|
||||
@@ -3883,15 +3871,12 @@ main(int argc, char *argv[]) {
|
||||
"NSEC-only DNSKEY");
|
||||
}
|
||||
|
||||
if (nsec3iter > dns_nsec3_maxiterations()) {
|
||||
if (no_max_check) {
|
||||
fprintf(stderr,
|
||||
"Ignoring max iterations check.\n");
|
||||
} else {
|
||||
fatal("NSEC3 iterations too big. Maximum "
|
||||
"iterations allowed %u.",
|
||||
dns_nsec3_maxiterations());
|
||||
}
|
||||
result = dns_nsec3_maxiterations(gdb, NULL, mctx, &max);
|
||||
check_result(result, "dns_nsec3_maxiterations()");
|
||||
if (nsec3iter > max) {
|
||||
fatal("NSEC3 iterations too big for weakest DNSKEY "
|
||||
"strength. Maximum iterations allowed %u.",
|
||||
max);
|
||||
}
|
||||
} else {
|
||||
hashlist_init(&hashlist, 0, 0); /* silence clang */
|
||||
@@ -3964,7 +3949,11 @@ main(int argc, char *argv[]) {
|
||||
print_time(outfp);
|
||||
print_version(outfp);
|
||||
|
||||
isc_managers_create(mctx, ntasks, 0, 0, &netmgr, &taskmgr, NULL, NULL);
|
||||
result = isc_taskmgr_create(mctx, ntasks, 0, NULL, &taskmgr);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
fatal("failed to create task manager: %s",
|
||||
isc_result_totext(result));
|
||||
}
|
||||
|
||||
master = NULL;
|
||||
result = isc_task_create(taskmgr, 0, &master);
|
||||
@@ -4015,7 +4004,7 @@ main(int argc, char *argv[]) {
|
||||
for (i = 0; i < (int)ntasks; i++) {
|
||||
isc_task_detach(&tasks[i]);
|
||||
}
|
||||
isc_managers_destroy(&netmgr, &taskmgr, NULL, NULL);
|
||||
isc_taskmgr_destroy(&taskmgr);
|
||||
isc_mem_put(mctx, tasks, ntasks * sizeof(isc_task_t *));
|
||||
postsign();
|
||||
TIME_NOW(&sign_finish);
|
||||
|
||||
@@ -69,9 +69,9 @@ Options
|
||||
This option specifies the hardware to use for cryptographic
|
||||
operations, such as a secure key store used for signing, when applicable.
|
||||
|
||||
When BIND 9 is built with OpenSSL, this needs to be set to the OpenSSL
|
||||
engine identifier that drives the cryptographic accelerator or
|
||||
hardware service module (usually ``pkcs11``). When BIND is
|
||||
When BIND is built with OpenSSL PKCS#11 support, this defaults to the
|
||||
string ``pkcs11``, which identifies an OpenSSL engine that can drive a
|
||||
cryptographic accelerator or hardware service module. When BIND is
|
||||
built with native PKCS#11 cryptography (``--enable-native-pkcs11``), it
|
||||
defaults to the path of the PKCS#11 provider library specified via
|
||||
``--with-pkcs11``.
|
||||
@@ -202,16 +202,10 @@ Options
|
||||
This format increments the SOA serial number using :rfc:`1982` arithmetic.
|
||||
|
||||
**unixtime**
|
||||
This format sets the SOA serial number to the number of seconds
|
||||
since the beginning of the Unix epoch, unless the serial
|
||||
number is already greater than or equal to that value, in
|
||||
which case it is simply incremented by one.
|
||||
This format sets the SOA serial number to the number of seconds since the beginning of the Unix epoch.
|
||||
|
||||
**date**
|
||||
This format sets the SOA serial number to today's date, in
|
||||
YYYYMMDDNN format, unless the serial number is already greater
|
||||
than or equal to that value, in which case it is simply
|
||||
incremented by one.
|
||||
This format sets the SOA serial number to today's date, in YYYYMMDDNN format.
|
||||
|
||||
``-o origin``
|
||||
This option sets the zone origin. If not specified, the name of the zone file is
|
||||
|
||||
@@ -82,13 +82,10 @@ static bool keyset_kskonly = false;
|
||||
static void
|
||||
report(const char *format, ...) {
|
||||
if (!quiet) {
|
||||
char buf[4096];
|
||||
va_list args;
|
||||
|
||||
va_start(args, format);
|
||||
vsnprintf(buf, sizeof(buf), format, args);
|
||||
vfprintf(stdout, format, args);
|
||||
va_end(args);
|
||||
fprintf(stdout, "%s\n", buf);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -47,9 +47,9 @@ Options
|
||||
``-E engine``
|
||||
This option specifies the cryptographic hardware to use, when applicable.
|
||||
|
||||
When BIND 9 is built with OpenSSL, this needs to be set to the OpenSSL
|
||||
engine identifier that drives the cryptographic accelerator or
|
||||
hardware service module (usually ``pkcs11``). When BIND is
|
||||
When BIND is built with OpenSSL PKCS#11 support, this defaults to the
|
||||
string ``pkcs11``, which identifies an OpenSSL engine that can drive a
|
||||
cryptographic accelerator or hardware service module. When BIND is
|
||||
built with native PKCS#11 cryptography (``--enable-native-pkcs11``), it
|
||||
defaults to the path of the PKCS#11 provider library specified via
|
||||
``--with-pkcs11``.
|
||||
|
||||
@@ -43,12 +43,8 @@ extern uint8_t dtype[8];
|
||||
|
||||
typedef void(fatalcallback_t)(void);
|
||||
|
||||
#ifndef CPPCHECK
|
||||
ISC_NORETURN void
|
||||
fatal(const char *format, ...) ISC_FORMAT_PRINTF(1, 2);
|
||||
#else /* CPPCHECK */
|
||||
#define fatal(...) exit(1)
|
||||
#endif
|
||||
|
||||
void
|
||||
setfatalcallback(fatalcallback_t *callback);
|
||||
|
||||
@@ -59,7 +59,6 @@ named_SOURCES = \
|
||||
server.c \
|
||||
statschannel.c \
|
||||
tkeyconf.c \
|
||||
transportconf.c \
|
||||
tsigconf.c \
|
||||
zoneconf.c \
|
||||
unix/dlz_dlopen_driver.c \
|
||||
@@ -78,7 +77,6 @@ named_SOURCES = \
|
||||
include/named/smf_globals.h \
|
||||
include/named/statschannel.h \
|
||||
include/named/tkeyconf.h \
|
||||
include/named/transportconf.h \
|
||||
include/named/tsigconf.h \
|
||||
include/named/types.h \
|
||||
include/named/zoneconf.h \
|
||||
|
||||
+25
-88
@@ -33,21 +33,17 @@
|
||||
typedef struct builtin builtin_t;
|
||||
|
||||
static isc_result_t
|
||||
do_authors_lookup(dns_sdblookup_t *lookup);
|
||||
static isc_result_t
|
||||
do_dns64_lookup(dns_sdblookup_t *lookup);
|
||||
static isc_result_t
|
||||
do_empty_lookup(dns_sdblookup_t *lookup);
|
||||
do_version_lookup(dns_sdblookup_t *lookup);
|
||||
static isc_result_t
|
||||
do_hostname_lookup(dns_sdblookup_t *lookup);
|
||||
static isc_result_t
|
||||
do_authors_lookup(dns_sdblookup_t *lookup);
|
||||
static isc_result_t
|
||||
do_id_lookup(dns_sdblookup_t *lookup);
|
||||
static isc_result_t
|
||||
do_ipv4only_lookup(dns_sdblookup_t *lookup);
|
||||
do_empty_lookup(dns_sdblookup_t *lookup);
|
||||
static isc_result_t
|
||||
do_ipv4reverse_lookup(dns_sdblookup_t *lookup);
|
||||
static isc_result_t
|
||||
do_version_lookup(dns_sdblookup_t *lookup);
|
||||
do_dns64_lookup(dns_sdblookup_t *lookup);
|
||||
|
||||
/*
|
||||
* We can't use function pointers as the db_data directly
|
||||
@@ -61,14 +57,12 @@ struct builtin {
|
||||
char *contact;
|
||||
};
|
||||
|
||||
static builtin_t authors_builtin = { do_authors_lookup, NULL, NULL };
|
||||
static builtin_t dns64_builtin = { do_dns64_lookup, NULL, NULL };
|
||||
static builtin_t empty_builtin = { do_empty_lookup, NULL, NULL };
|
||||
static builtin_t hostname_builtin = { do_hostname_lookup, NULL, NULL };
|
||||
static builtin_t id_builtin = { do_id_lookup, NULL, NULL };
|
||||
static builtin_t ipv4only_builtin = { do_ipv4only_lookup, NULL, NULL };
|
||||
static builtin_t ipv4reverse_builtin = { do_ipv4reverse_lookup, NULL, NULL };
|
||||
static builtin_t version_builtin = { do_version_lookup, NULL, NULL };
|
||||
static builtin_t hostname_builtin = { do_hostname_lookup, NULL, NULL };
|
||||
static builtin_t authors_builtin = { do_authors_lookup, NULL, NULL };
|
||||
static builtin_t id_builtin = { do_id_lookup, NULL, NULL };
|
||||
static builtin_t empty_builtin = { do_empty_lookup, NULL, NULL };
|
||||
static builtin_t dns64_builtin = { do_dns64_lookup, NULL, NULL };
|
||||
|
||||
static dns_sdbimplementation_t *builtin_impl;
|
||||
static dns_sdbimplementation_t *dns64_impl;
|
||||
@@ -95,8 +89,7 @@ static const unsigned char hex16[256] = {
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 /*F0*/
|
||||
};
|
||||
|
||||
static const unsigned char decimal[] = "0123456789";
|
||||
static const unsigned char ipv4only[] = "\010ipv4only\004arpa";
|
||||
const unsigned char decimal[] = "0123456789";
|
||||
|
||||
static size_t
|
||||
dns64_rdata(unsigned char *v, size_t start, unsigned char *rdata) {
|
||||
@@ -296,16 +289,6 @@ dns64_cname(const dns_name_t *zone, const dns_name_t *name,
|
||||
*/
|
||||
return (ISC_R_NOTFOUND);
|
||||
}
|
||||
|
||||
/*
|
||||
* Reverse of 192.0.0.170 or 192.0.0.171 maps to ipv4only.arpa.
|
||||
*/
|
||||
if ((v[0] == 170 || v[0] == 171) && v[1] == 0 && v[2] == 0 &&
|
||||
v[3] == 192) {
|
||||
return (dns_sdb_putrdata(lookup, dns_rdatatype_ptr, 3600,
|
||||
ipv4only, sizeof(ipv4only)));
|
||||
}
|
||||
|
||||
return (dns_sdb_putrdata(lookup, dns_rdatatype_cname, 600, rdata,
|
||||
(unsigned int)len));
|
||||
}
|
||||
@@ -446,30 +429,6 @@ do_empty_lookup(dns_sdblookup_t *lookup) {
|
||||
return (ISC_R_SUCCESS);
|
||||
}
|
||||
|
||||
static isc_result_t
|
||||
do_ipv4only_lookup(dns_sdblookup_t *lookup) {
|
||||
isc_result_t result;
|
||||
unsigned char data[2][4] = { { 192, 0, 0, 170 }, { 192, 0, 0, 171 } };
|
||||
|
||||
for (int i = 0; i < 2; i++) {
|
||||
result = dns_sdb_putrdata(lookup, dns_rdatatype_a, 3600,
|
||||
data[i], 4);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
return (result);
|
||||
}
|
||||
}
|
||||
return (ISC_R_SUCCESS);
|
||||
}
|
||||
|
||||
static isc_result_t
|
||||
do_ipv4reverse_lookup(dns_sdblookup_t *lookup) {
|
||||
isc_result_t result;
|
||||
|
||||
result = dns_sdb_putrdata(lookup, dns_rdatatype_ptr, 3600, ipv4only,
|
||||
sizeof(ipv4only));
|
||||
return (result);
|
||||
}
|
||||
|
||||
static isc_result_t
|
||||
builtin_authority(const char *zone, void *dbdata, dns_sdblookup_t *lookup) {
|
||||
isc_result_t result;
|
||||
@@ -513,10 +472,7 @@ builtin_create(const char *zone, int argc, char **argv, void *driverdata,
|
||||
UNUSED(zone);
|
||||
UNUSED(driverdata);
|
||||
|
||||
if (strcmp(argv[0], "dns64") == 0 || strcmp(argv[0], "empty") == 0 ||
|
||||
strcmp(argv[0], "ipv4only") == 0 ||
|
||||
strcmp(argv[0], "ipv4reverse") == 0)
|
||||
{
|
||||
if (strcmp(argv[0], "empty") == 0 || strcmp(argv[0], "dns64") == 0) {
|
||||
if (argc != 3) {
|
||||
return (DNS_R_SYNTAX);
|
||||
}
|
||||
@@ -524,27 +480,19 @@ builtin_create(const char *zone, int argc, char **argv, void *driverdata,
|
||||
return (DNS_R_SYNTAX);
|
||||
}
|
||||
|
||||
if (strcmp(argv[0], "authors") == 0) {
|
||||
*dbdata = &authors_builtin;
|
||||
if (strcmp(argv[0], "version") == 0) {
|
||||
*dbdata = &version_builtin;
|
||||
} else if (strcmp(argv[0], "hostname") == 0) {
|
||||
*dbdata = &hostname_builtin;
|
||||
} else if (strcmp(argv[0], "authors") == 0) {
|
||||
*dbdata = &authors_builtin;
|
||||
} else if (strcmp(argv[0], "id") == 0) {
|
||||
*dbdata = &id_builtin;
|
||||
} else if (strcmp(argv[0], "version") == 0) {
|
||||
*dbdata = &version_builtin;
|
||||
} else if (strcmp(argv[0], "dns64") == 0 ||
|
||||
strcmp(argv[0], "empty") == 0 ||
|
||||
strcmp(argv[0], "ipv4only") == 0 ||
|
||||
strcmp(argv[0], "ipv4reverse") == 0)
|
||||
{
|
||||
} else if (strcmp(argv[0], "empty") == 0 ||
|
||||
strcmp(argv[0], "dns64") == 0) {
|
||||
builtin_t *empty;
|
||||
char *server;
|
||||
char *contact;
|
||||
|
||||
if (argc != 3) {
|
||||
return (DNS_R_SYNTAX);
|
||||
}
|
||||
|
||||
/*
|
||||
* We don't want built-in zones to fail. Fallback to
|
||||
* the static configuration if memory allocation fails.
|
||||
@@ -553,14 +501,10 @@ builtin_create(const char *zone, int argc, char **argv, void *driverdata,
|
||||
server = isc_mem_strdup(named_g_mctx, argv[1]);
|
||||
contact = isc_mem_strdup(named_g_mctx, argv[2]);
|
||||
if (empty == NULL || server == NULL || contact == NULL) {
|
||||
if (strcmp(argv[0], "dns64") == 0) {
|
||||
*dbdata = &dns64_builtin;
|
||||
} else if (strcmp(argv[0], "empty") == 0) {
|
||||
if (strcmp(argv[0], "empty") == 0) {
|
||||
*dbdata = &empty_builtin;
|
||||
} else if (strcmp(argv[0], "ipv4only") == 0) {
|
||||
*dbdata = &ipv4only_builtin;
|
||||
} else {
|
||||
*dbdata = &ipv4reverse_builtin;
|
||||
*dbdata = &dns64_builtin;
|
||||
}
|
||||
if (server != NULL) {
|
||||
isc_mem_free(named_g_mctx, server);
|
||||
@@ -573,17 +517,11 @@ builtin_create(const char *zone, int argc, char **argv, void *driverdata,
|
||||
sizeof(*empty));
|
||||
}
|
||||
} else {
|
||||
if (strcmp(argv[0], "dns64") == 0) {
|
||||
memmove(empty, &dns64_builtin,
|
||||
sizeof(empty_builtin));
|
||||
} else if (strcmp(argv[0], "empty") == 0) {
|
||||
if (strcmp(argv[0], "empty") == 0) {
|
||||
memmove(empty, &empty_builtin,
|
||||
sizeof(empty_builtin));
|
||||
} else if (strcmp(argv[0], "ipv4only") == 0) {
|
||||
memmove(empty, &ipv4only_builtin,
|
||||
sizeof(empty_builtin));
|
||||
} else {
|
||||
memmove(empty, &ipv4reverse_builtin,
|
||||
memmove(empty, &dns64_builtin,
|
||||
sizeof(empty_builtin));
|
||||
}
|
||||
empty->server = server;
|
||||
@@ -606,10 +544,9 @@ builtin_destroy(const char *zone, void *driverdata, void **dbdata) {
|
||||
/*
|
||||
* Don't free the static versions.
|
||||
*/
|
||||
if (*dbdata == &authors_builtin || *dbdata == &dns64_builtin ||
|
||||
*dbdata == &empty_builtin || *dbdata == &hostname_builtin ||
|
||||
*dbdata == &id_builtin || *dbdata == &ipv4only_builtin ||
|
||||
*dbdata == &ipv4reverse_builtin || *dbdata == &version_builtin)
|
||||
if (*dbdata == &version_builtin || *dbdata == &hostname_builtin ||
|
||||
*dbdata == &authors_builtin || *dbdata == &id_builtin ||
|
||||
*dbdata == &empty_builtin || *dbdata == &dns64_builtin)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
+149
-158
@@ -87,15 +87,13 @@ options {\n\
|
||||
memstatistics-file \"named.memstats\";\n\
|
||||
# multiple-cnames <obsolete>;\n\
|
||||
# named-xfer <obsolete>;\n\
|
||||
nocookie-udp-size 4096;\n\
|
||||
nocookie-udp-size 1232;\n\
|
||||
notify-rate 20;\n\
|
||||
nta-lifetime 3600;\n\
|
||||
nta-recheck 300;\n\
|
||||
# pid-file \"" NAMED_LOCALSTATEDIR "/run/named/named.pid\"; \n\
|
||||
port 53;\n\
|
||||
tls-port 853;\n\
|
||||
http-port 80;\n\
|
||||
https-port 443;\n\
|
||||
prefetch 2 9;\n\
|
||||
recursing-file \"named.recursing\";\n\
|
||||
recursive-clients 1000;\n\
|
||||
@@ -123,8 +121,6 @@ options {\n\
|
||||
tcp-initial-timeout 300;\n\
|
||||
tcp-keepalive-timeout 300;\n\
|
||||
tcp-listen-queue 10;\n\
|
||||
tcp-receive-buffer 0;\n\
|
||||
tcp-send-buffer 0;\n\
|
||||
# tkey-dhkey <none>\n\
|
||||
# tkey-domain <none>\n\
|
||||
# tkey-gssapi-credential <none>\n\
|
||||
@@ -135,8 +131,7 @@ options {\n\
|
||||
# treat-cr-as-space <obsolete>;\n\
|
||||
trust-anchor-telemetry yes;\n\
|
||||
# use-id-pool <obsolete>;\n\
|
||||
udp-receive-buffer 0;\n\
|
||||
udp-send-buffer 0;\n\
|
||||
# use-ixfr <obsolete>;\n\
|
||||
\n\
|
||||
/* view */\n\
|
||||
allow-new-zones no;\n\
|
||||
@@ -146,6 +141,7 @@ options {\n\
|
||||
allow-recursion { localnets; localhost; };\n\
|
||||
allow-recursion-on { any; };\n\
|
||||
allow-update-forwarding {none;};\n\
|
||||
# allow-v6-synthesis <obsolete>;\n\
|
||||
auth-nxdomain false;\n\
|
||||
check-dup-records warn;\n\
|
||||
check-mx warn;\n\
|
||||
@@ -174,8 +170,8 @@ options {\n\
|
||||
max-clients-per-query 100;\n\
|
||||
max-ncache-ttl 10800; /* 3 hours */\n\
|
||||
max-recursion-depth 7;\n\
|
||||
max-recursion-queries 100;\n\
|
||||
max-stale-ttl 86400; /* 1 day */\n\
|
||||
max-recursion-queries 75;\n\
|
||||
max-stale-ttl 43200; /* 12 hours */\n\
|
||||
message-compression yes;\n\
|
||||
min-ncache-ttl 0; /* 0 hours */\n\
|
||||
min-cache-ttl 0; /* 0 seconds */\n\
|
||||
@@ -199,11 +195,10 @@ options {\n\
|
||||
root-key-sentinel yes;\n\
|
||||
servfail-ttl 1;\n\
|
||||
# sortlist <none>\n\
|
||||
stale-answer-client-timeout off;\n\
|
||||
stale-answer-enable false;\n\
|
||||
stale-answer-ttl 30; /* 30 seconds */\n\
|
||||
stale-cache-enable false;\n\
|
||||
stale-refresh-time 30; /* 30 seconds */\n\
|
||||
stale-answer-ttl 1; /* 1 second */\n\
|
||||
stale-cache-enable false;\n\
|
||||
synth-from-dnssec no;\n\
|
||||
# topology <none>\n\
|
||||
transfer-format many-answers;\n\
|
||||
@@ -229,7 +224,7 @@ options {\n\
|
||||
dnssec-update-mode maintain;\n\
|
||||
# forward <none>\n\
|
||||
# forwarders <none>\n\
|
||||
# inline-signing no;\n\
|
||||
inline-signing no;\n\
|
||||
ixfr-from-differences false;\n\
|
||||
# maintain-ixfr-base <obsolete>;\n\
|
||||
# max-ixfr-log-size <obsolete>\n\
|
||||
@@ -614,76 +609,10 @@ named_config_getprimariesdef(const cfg_obj_t *cctx, const char *name,
|
||||
return (result);
|
||||
}
|
||||
|
||||
static isc_result_t
|
||||
named_config_getname(isc_mem_t *mctx, const cfg_obj_t *obj,
|
||||
dns_name_t **namep) {
|
||||
REQUIRE(namep != NULL && *namep == NULL);
|
||||
|
||||
const char *objstr;
|
||||
isc_result_t result;
|
||||
isc_buffer_t b;
|
||||
dns_fixedname_t fname;
|
||||
|
||||
if (!cfg_obj_isstring(obj)) {
|
||||
*namep = NULL;
|
||||
return (ISC_R_SUCCESS);
|
||||
}
|
||||
|
||||
*namep = isc_mem_get(mctx, sizeof(**namep));
|
||||
dns_name_init(*namep, NULL);
|
||||
|
||||
objstr = cfg_obj_asstring(obj);
|
||||
isc_buffer_constinit(&b, objstr, strlen(objstr));
|
||||
isc_buffer_add(&b, strlen(objstr));
|
||||
dns_fixedname_init(&fname);
|
||||
result = dns_name_fromtext(dns_fixedname_name(&fname), &b, dns_rootname,
|
||||
0, NULL);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
isc_mem_put(mctx, *namep, sizeof(**namep));
|
||||
*namep = NULL;
|
||||
return (result);
|
||||
}
|
||||
dns_name_dup(dns_fixedname_name(&fname), mctx, *namep);
|
||||
|
||||
return (ISC_R_SUCCESS);
|
||||
}
|
||||
|
||||
#define grow_array(mctx, array, newlen, oldlen) \
|
||||
if (newlen >= oldlen) { \
|
||||
size_t newsize = (newlen + 16) * sizeof(array[0]); \
|
||||
size_t oldsize = oldlen * sizeof(array[0]); \
|
||||
void *tmp = isc_mem_get(mctx, newsize); \
|
||||
memset(tmp, 0, newsize); \
|
||||
if (oldlen != 0) { \
|
||||
memmove(tmp, array, oldsize); \
|
||||
isc_mem_put(mctx, array, oldsize); \
|
||||
} \
|
||||
array = tmp; \
|
||||
oldlen = newlen + 16; \
|
||||
}
|
||||
|
||||
#define shrink_array(mctx, array, newlen, oldlen) \
|
||||
if (newlen < oldlen) { \
|
||||
void *tmp = NULL; \
|
||||
size_t newsize = newlen * sizeof(array[0]); \
|
||||
size_t oldsize = oldlen * sizeof(array[0]); \
|
||||
if (newlen != 0) { \
|
||||
tmp = isc_mem_get(mctx, newsize); \
|
||||
memset(tmp, 0, newsize); \
|
||||
memmove(tmp, array, newsize); \
|
||||
} else { \
|
||||
tmp = NULL; \
|
||||
} \
|
||||
isc_mem_put(mctx, array, oldsize); \
|
||||
array = tmp; \
|
||||
oldlen = newlen; \
|
||||
}
|
||||
|
||||
isc_result_t
|
||||
named_config_getipandkeylist(const cfg_obj_t *config, const cfg_obj_t *list,
|
||||
isc_mem_t *mctx, dns_ipkeylist_t *ipkl) {
|
||||
uint32_t addrcount = 0, dscpcount = 0, keycount = 0, tlscount = 0,
|
||||
i = 0;
|
||||
uint32_t addrcount = 0, dscpcount = 0, keycount = 0, i = 0;
|
||||
uint32_t listcount = 0, l = 0, j;
|
||||
uint32_t stackcount = 0, pushed = 0;
|
||||
isc_result_t result;
|
||||
@@ -691,14 +620,12 @@ named_config_getipandkeylist(const cfg_obj_t *config, const cfg_obj_t *list,
|
||||
const cfg_obj_t *addrlist;
|
||||
const cfg_obj_t *portobj;
|
||||
const cfg_obj_t *dscpobj;
|
||||
in_port_t port = (in_port_t)0;
|
||||
in_port_t def_port;
|
||||
in_port_t def_tlsport;
|
||||
in_port_t port;
|
||||
isc_dscp_t dscp = -1;
|
||||
dns_fixedname_t fname;
|
||||
isc_sockaddr_t *addrs = NULL;
|
||||
isc_dscp_t *dscps = NULL;
|
||||
dns_name_t **keys = NULL;
|
||||
dns_name_t **tlss = NULL;
|
||||
struct {
|
||||
const char *name;
|
||||
} *lists = NULL;
|
||||
@@ -712,7 +639,6 @@ named_config_getipandkeylist(const cfg_obj_t *config, const cfg_obj_t *list,
|
||||
REQUIRE(ipkl->count == 0);
|
||||
REQUIRE(ipkl->addrs == NULL);
|
||||
REQUIRE(ipkl->keys == NULL);
|
||||
REQUIRE(ipkl->tlss == NULL);
|
||||
REQUIRE(ipkl->dscps == NULL);
|
||||
REQUIRE(ipkl->labels == NULL);
|
||||
REQUIRE(ipkl->allocated == 0);
|
||||
@@ -720,12 +646,7 @@ named_config_getipandkeylist(const cfg_obj_t *config, const cfg_obj_t *list,
|
||||
/*
|
||||
* Get system defaults.
|
||||
*/
|
||||
result = named_config_getport(config, "port", &def_port);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
result = named_config_getport(config, "tls-port", &def_tlsport);
|
||||
result = named_config_getport(config, "port", &port);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
goto cleanup;
|
||||
}
|
||||
@@ -769,20 +690,33 @@ resume:
|
||||
for (; element != NULL; element = cfg_list_next(element)) {
|
||||
const cfg_obj_t *addr;
|
||||
const cfg_obj_t *key;
|
||||
const cfg_obj_t *tls;
|
||||
const char *keystr;
|
||||
isc_buffer_t b;
|
||||
|
||||
addr = cfg_tuple_get(cfg_listelt_value(element),
|
||||
"primarieselement");
|
||||
key = cfg_tuple_get(cfg_listelt_value(element), "key");
|
||||
tls = cfg_tuple_get(cfg_listelt_value(element), "tls");
|
||||
|
||||
if (!cfg_obj_issockaddr(addr)) {
|
||||
const char *listname = cfg_obj_asstring(addr);
|
||||
isc_result_t tresult;
|
||||
|
||||
/* Grow lists? */
|
||||
grow_array(mctx, lists, l, listcount);
|
||||
if (listcount == l) {
|
||||
void *tmp;
|
||||
uint32_t newlen = listcount + 16;
|
||||
size_t newsize, oldsize;
|
||||
|
||||
newsize = newlen * sizeof(*lists);
|
||||
oldsize = listcount * sizeof(*lists);
|
||||
tmp = isc_mem_get(mctx, newsize);
|
||||
if (listcount != 0) {
|
||||
memmove(tmp, lists, oldsize);
|
||||
isc_mem_put(mctx, lists, oldsize);
|
||||
}
|
||||
lists = tmp;
|
||||
listcount = newlen;
|
||||
}
|
||||
/* Seen? */
|
||||
for (j = 0; j < l; j++) {
|
||||
if (strcasecmp(lists[j].name, listname) == 0) {
|
||||
@@ -808,7 +742,21 @@ resume:
|
||||
}
|
||||
lists[l++].name = listname;
|
||||
/* Grow stack? */
|
||||
grow_array(mctx, stack, pushed, stackcount);
|
||||
if (stackcount == pushed) {
|
||||
void *tmp;
|
||||
uint32_t newlen = stackcount + 16;
|
||||
size_t newsize, oldsize;
|
||||
|
||||
newsize = newlen * sizeof(*stack);
|
||||
oldsize = stackcount * sizeof(*stack);
|
||||
tmp = isc_mem_get(mctx, newsize);
|
||||
if (stackcount != 0) {
|
||||
memmove(tmp, stack, oldsize);
|
||||
isc_mem_put(mctx, stack, oldsize);
|
||||
}
|
||||
stack = tmp;
|
||||
stackcount = newlen;
|
||||
}
|
||||
/*
|
||||
* We want to resume processing this list on the
|
||||
* next element.
|
||||
@@ -820,44 +768,68 @@ resume:
|
||||
goto newlist;
|
||||
}
|
||||
|
||||
grow_array(mctx, addrs, i, addrcount);
|
||||
grow_array(mctx, dscps, i, dscpcount);
|
||||
grow_array(mctx, keys, i, keycount);
|
||||
grow_array(mctx, tlss, i, tlscount);
|
||||
if (i == addrcount) {
|
||||
void *tmp;
|
||||
uint32_t newlen = addrcount + 16;
|
||||
size_t newsize, oldsize;
|
||||
|
||||
newsize = newlen * sizeof(isc_sockaddr_t);
|
||||
oldsize = addrcount * sizeof(isc_sockaddr_t);
|
||||
tmp = isc_mem_get(mctx, newsize);
|
||||
if (addrcount != 0) {
|
||||
memmove(tmp, addrs, oldsize);
|
||||
isc_mem_put(mctx, addrs, oldsize);
|
||||
}
|
||||
addrs = tmp;
|
||||
addrcount = newlen;
|
||||
|
||||
newsize = newlen * sizeof(isc_dscp_t);
|
||||
oldsize = dscpcount * sizeof(isc_dscp_t);
|
||||
tmp = isc_mem_get(mctx, newsize);
|
||||
if (dscpcount != 0) {
|
||||
memmove(tmp, dscps, oldsize);
|
||||
isc_mem_put(mctx, dscps, oldsize);
|
||||
}
|
||||
dscps = tmp;
|
||||
dscpcount = newlen;
|
||||
|
||||
newsize = newlen * sizeof(dns_name_t *);
|
||||
oldsize = keycount * sizeof(dns_name_t *);
|
||||
tmp = isc_mem_get(mctx, newsize);
|
||||
if (keycount != 0) {
|
||||
memmove(tmp, keys, oldsize);
|
||||
isc_mem_put(mctx, keys, oldsize);
|
||||
}
|
||||
keys = tmp;
|
||||
keycount = newlen;
|
||||
}
|
||||
|
||||
addrs[i] = *cfg_obj_assockaddr(addr);
|
||||
if (isc_sockaddr_getport(&addrs[i]) == 0) {
|
||||
isc_sockaddr_setport(&addrs[i], port);
|
||||
}
|
||||
dscps[i] = cfg_obj_getdscp(addr);
|
||||
if (dscps[i] == -1) {
|
||||
dscps[i] = dscp;
|
||||
}
|
||||
keys[i] = NULL;
|
||||
i++; /* Increment here so that cleanup on error works. */
|
||||
if (!cfg_obj_isstring(key)) {
|
||||
continue;
|
||||
}
|
||||
keys[i - 1] = isc_mem_get(mctx, sizeof(dns_name_t));
|
||||
dns_name_init(keys[i - 1], NULL);
|
||||
|
||||
result = named_config_getname(mctx, key, &keys[i]);
|
||||
keystr = cfg_obj_asstring(key);
|
||||
isc_buffer_constinit(&b, keystr, strlen(keystr));
|
||||
isc_buffer_add(&b, strlen(keystr));
|
||||
dns_fixedname_init(&fname);
|
||||
result = dns_name_fromtext(dns_fixedname_name(&fname), &b,
|
||||
dns_rootname, 0, NULL);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
i++; /* Increment here so that cleanup on error works.
|
||||
*/
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
result = named_config_getname(mctx, tls, &tlss[i]);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
i++; /* Increment here so that cleanup on error works.
|
||||
*/
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* Set the default port or tls-port */
|
||||
if (port == 0) {
|
||||
if (tlss[i] != NULL) {
|
||||
port = def_tlsport;
|
||||
} else {
|
||||
port = def_port;
|
||||
}
|
||||
}
|
||||
|
||||
if (isc_sockaddr_getport(&addrs[i]) == 0) {
|
||||
isc_sockaddr_setport(&addrs[i], port);
|
||||
}
|
||||
i++;
|
||||
dns_name_dup(dns_fixedname_name(&fname), mctx, keys[i - 1]);
|
||||
}
|
||||
if (pushed != 0) {
|
||||
pushed--;
|
||||
@@ -866,28 +838,61 @@ resume:
|
||||
dscp = stack[pushed].dscp;
|
||||
goto resume;
|
||||
}
|
||||
if (i < addrcount) {
|
||||
void *tmp;
|
||||
size_t newsize, oldsize;
|
||||
|
||||
shrink_array(mctx, addrs, i, addrcount);
|
||||
shrink_array(mctx, dscps, i, dscpcount);
|
||||
shrink_array(mctx, keys, i, keycount);
|
||||
shrink_array(mctx, tlss, i, tlscount);
|
||||
newsize = i * sizeof(isc_sockaddr_t);
|
||||
oldsize = addrcount * sizeof(isc_sockaddr_t);
|
||||
if (i != 0) {
|
||||
tmp = isc_mem_get(mctx, newsize);
|
||||
memmove(tmp, addrs, newsize);
|
||||
} else {
|
||||
tmp = NULL;
|
||||
}
|
||||
isc_mem_put(mctx, addrs, oldsize);
|
||||
addrs = tmp;
|
||||
addrcount = i;
|
||||
|
||||
newsize = i * sizeof(isc_dscp_t);
|
||||
oldsize = dscpcount * sizeof(isc_dscp_t);
|
||||
if (i != 0) {
|
||||
tmp = isc_mem_get(mctx, newsize);
|
||||
memmove(tmp, dscps, newsize);
|
||||
} else {
|
||||
tmp = NULL;
|
||||
}
|
||||
isc_mem_put(mctx, dscps, oldsize);
|
||||
dscps = tmp;
|
||||
dscpcount = i;
|
||||
|
||||
newsize = i * sizeof(dns_name_t *);
|
||||
oldsize = keycount * sizeof(dns_name_t *);
|
||||
if (i != 0) {
|
||||
tmp = isc_mem_get(mctx, newsize);
|
||||
memmove(tmp, keys, newsize);
|
||||
} else {
|
||||
tmp = NULL;
|
||||
}
|
||||
isc_mem_put(mctx, keys, oldsize);
|
||||
keys = tmp;
|
||||
keycount = i;
|
||||
}
|
||||
|
||||
if (lists != NULL) {
|
||||
isc_mem_put(mctx, lists, listcount * sizeof(lists[0]));
|
||||
isc_mem_put(mctx, lists, listcount * sizeof(*lists));
|
||||
}
|
||||
if (stack != NULL) {
|
||||
isc_mem_put(mctx, stack, stackcount * sizeof(stack[0]));
|
||||
isc_mem_put(mctx, stack, stackcount * sizeof(*stack));
|
||||
}
|
||||
|
||||
INSIST(dscpcount == addrcount);
|
||||
INSIST(keycount == addrcount);
|
||||
INSIST(tlscount == addrcount);
|
||||
INSIST(keycount == dscpcount);
|
||||
|
||||
ipkl->addrs = addrs;
|
||||
ipkl->dscps = dscps;
|
||||
ipkl->keys = keys;
|
||||
ipkl->tlss = tlss;
|
||||
ipkl->count = addrcount;
|
||||
ipkl->allocated = addrcount;
|
||||
|
||||
@@ -895,10 +900,10 @@ resume:
|
||||
|
||||
cleanup:
|
||||
if (addrs != NULL) {
|
||||
isc_mem_put(mctx, addrs, addrcount * sizeof(addrs[0]));
|
||||
isc_mem_put(mctx, addrs, addrcount * sizeof(isc_sockaddr_t));
|
||||
}
|
||||
if (dscps != NULL) {
|
||||
isc_mem_put(mctx, dscps, dscpcount * sizeof(dscps[0]));
|
||||
isc_mem_put(mctx, dscps, dscpcount * sizeof(isc_dscp_t));
|
||||
}
|
||||
if (keys != NULL) {
|
||||
for (j = 0; j < i; j++) {
|
||||
@@ -908,27 +913,15 @@ cleanup:
|
||||
if (dns_name_dynamic(keys[j])) {
|
||||
dns_name_free(keys[j], mctx);
|
||||
}
|
||||
isc_mem_put(mctx, keys[j], sizeof(*keys[j]));
|
||||
isc_mem_put(mctx, keys[j], sizeof(dns_name_t));
|
||||
}
|
||||
isc_mem_put(mctx, keys, keycount * sizeof(keys[0]));
|
||||
}
|
||||
if (tlss != NULL) {
|
||||
for (j = 0; j < i; j++) {
|
||||
if (tlss[j] == NULL) {
|
||||
continue;
|
||||
}
|
||||
if (dns_name_dynamic(tlss[j])) {
|
||||
dns_name_free(tlss[j], mctx);
|
||||
}
|
||||
isc_mem_put(mctx, tlss[j], sizeof(*tlss[j]));
|
||||
}
|
||||
isc_mem_put(mctx, tlss, tlscount * sizeof(tlss[0]));
|
||||
isc_mem_put(mctx, keys, keycount * sizeof(dns_name_t *));
|
||||
}
|
||||
if (lists != NULL) {
|
||||
isc_mem_put(mctx, lists, listcount * sizeof(lists[0]));
|
||||
isc_mem_put(mctx, lists, listcount * sizeof(*lists));
|
||||
}
|
||||
if (stack != NULL) {
|
||||
isc_mem_put(mctx, stack, stackcount * sizeof(stack[0]));
|
||||
isc_mem_put(mctx, stack, stackcount * sizeof(*stack));
|
||||
}
|
||||
return (result);
|
||||
}
|
||||
@@ -990,15 +983,13 @@ named_config_getdscp(const cfg_obj_t *config, isc_dscp_t *dscpp) {
|
||||
|
||||
struct keyalgorithms {
|
||||
const char *str;
|
||||
enum {
|
||||
hmacnone,
|
||||
hmacmd5,
|
||||
hmacsha1,
|
||||
hmacsha224,
|
||||
hmacsha256,
|
||||
hmacsha384,
|
||||
hmacsha512
|
||||
} hmac;
|
||||
enum { hmacnone,
|
||||
hmacmd5,
|
||||
hmacsha1,
|
||||
hmacsha224,
|
||||
hmacsha256,
|
||||
hmacsha384,
|
||||
hmacsha512 } hmac;
|
||||
unsigned int type;
|
||||
uint16_t size;
|
||||
} algorithms[] = { { "hmac-md5", hmacmd5, DST_ALG_HMACMD5, 128 },
|
||||
|
||||
@@ -1164,9 +1164,10 @@ add_listener(named_controls_t *cp, controllistener_t **listenerp,
|
||||
}
|
||||
#endif
|
||||
|
||||
CHECK(isc_nm_listentcp(
|
||||
named_g_netmgr, &listener->address, control_newconn, listener,
|
||||
sizeof(controlconnection_t), 5, NULL, &listener->sock));
|
||||
CHECK(isc_nm_listentcp(named_g_nm, (isc_nmiface_t *)&listener->address,
|
||||
control_newconn, listener,
|
||||
sizeof(controlconnection_t), 5, NULL,
|
||||
&listener->sock));
|
||||
#if 0
|
||||
/* XXX: no unix socket support yet */
|
||||
if (type == isc_socktype_unix) {
|
||||
@@ -1188,9 +1189,11 @@ add_listener(named_controls_t *cp, controllistener_t **listenerp,
|
||||
return;
|
||||
|
||||
cleanup:
|
||||
isc_refcount_decrement(&listener->refs);
|
||||
listener->exiting = true;
|
||||
free_listener(listener);
|
||||
if (listener != NULL) {
|
||||
isc_refcount_decrement(&listener->refs);
|
||||
listener->exiting = true;
|
||||
free_listener(listener);
|
||||
}
|
||||
|
||||
if (control != NULL) {
|
||||
cfg_obj_log(control, named_g_lctx, ISC_LOG_WARNING,
|
||||
@@ -1466,7 +1469,6 @@ named_controls_create(named_server_t *server, named_controls_t **ctrlsp) {
|
||||
|
||||
ISC_LIST_INIT(controls->listeners);
|
||||
|
||||
atomic_init(&controls->shuttingdown, false);
|
||||
isc_mutex_init(&controls->symtab_lock);
|
||||
LOCK(&controls->symtab_lock);
|
||||
result = isccc_cc_createsymtab(&controls->symtab);
|
||||
|
||||
@@ -62,7 +62,7 @@ EXTERN bool named_g_run_done INIT(false);
|
||||
*/
|
||||
EXTERN isc_timermgr_t *named_g_timermgr INIT(NULL);
|
||||
EXTERN isc_socketmgr_t *named_g_socketmgr INIT(NULL);
|
||||
EXTERN isc_nm_t *named_g_netmgr INIT(NULL);
|
||||
EXTERN isc_nm_t *named_g_nm INIT(NULL);
|
||||
EXTERN cfg_parser_t *named_g_parser INIT(NULL);
|
||||
EXTERN cfg_parser_t *named_g_addparser INIT(NULL);
|
||||
EXTERN const char *named_g_version INIT(PACKAGE_VERSION);
|
||||
@@ -73,8 +73,6 @@ EXTERN const char *named_g_configargs INIT(PACKAGE_CONFIGARGS);
|
||||
EXTERN const char *named_g_builder INIT(PACKAGE_BUILDER);
|
||||
EXTERN in_port_t named_g_port INIT(0);
|
||||
EXTERN in_port_t named_g_tlsport INIT(0);
|
||||
EXTERN in_port_t named_g_httpsport INIT(0);
|
||||
EXTERN in_port_t named_g_httpport INIT(0);
|
||||
EXTERN isc_dscp_t named_g_dscp INIT(-1);
|
||||
|
||||
EXTERN named_server_t *named_g_server INIT(NULL);
|
||||
|
||||
@@ -1,41 +0,0 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
/*! \file */
|
||||
|
||||
#include <isc/lang.h>
|
||||
#include <isc/types.h>
|
||||
|
||||
#include <dns/transport.h>
|
||||
|
||||
#include <isccfg/cfg.h>
|
||||
|
||||
ISC_LANG_BEGINDECLS
|
||||
|
||||
isc_result_t
|
||||
named_transports_fromconfig(const cfg_obj_t *config, const cfg_obj_t *vconfig,
|
||||
isc_mem_t *mctx, dns_transport_list_t **listp);
|
||||
/*%<
|
||||
* Create a list of transport objects (DoT or DoH) and configure them
|
||||
* according to 'key-file', 'cert-file', 'ca-file' or 'hostname'
|
||||
* statements.
|
||||
*
|
||||
* Requires:
|
||||
* \li 'config' is not NULL.
|
||||
* \li 'vconfig' is not NULL.
|
||||
* \li 'mctx' is not NULL
|
||||
* \li 'listp' is not NULL, and '*listp' is NULL
|
||||
*
|
||||
*/
|
||||
|
||||
ISC_LANG_ENDDECLS
|
||||
@@ -43,9 +43,7 @@ named_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig,
|
||||
*/
|
||||
|
||||
bool
|
||||
named_zone_reusable(dns_zone_t *zone, const cfg_obj_t *zconfig,
|
||||
const cfg_obj_t *vconfig, const cfg_obj_t *config,
|
||||
cfg_aclconfctx_t *actx);
|
||||
named_zone_reusable(dns_zone_t *zone, const cfg_obj_t *zconfig);
|
||||
/*%<
|
||||
* If 'zone' can be safely reconfigured according to the configuration
|
||||
* data in 'zconfig', return true. If the configuration data is so
|
||||
@@ -53,15 +51,6 @@ named_zone_reusable(dns_zone_t *zone, const cfg_obj_t *zconfig,
|
||||
* and recreated, return false.
|
||||
*/
|
||||
|
||||
bool
|
||||
named_zone_inlinesigning(dns_zone_t *zone, const cfg_obj_t *zconfig,
|
||||
const cfg_obj_t *vconfig, const cfg_obj_t *config,
|
||||
cfg_aclconfctx_t *actx);
|
||||
/*%<
|
||||
* Determine if zone uses inline-signing. This is true if inline-signing
|
||||
* is set to yes, or if there is a dnssec-policy on a non-dynamic zone.
|
||||
*/
|
||||
|
||||
isc_result_t
|
||||
named_zone_configure_writeable_dlz(dns_dlzdb_t *dlzdatabase, dns_zone_t *zone,
|
||||
dns_rdataclass_t rdclass, dns_name_t *name);
|
||||
|
||||
+97
-56
@@ -18,10 +18,6 @@
|
||||
#include <string.h>
|
||||
#include <uv.h>
|
||||
|
||||
#ifdef HAVE_DNSTAP
|
||||
#include <protobuf-c/protobuf-c.h>
|
||||
#endif
|
||||
|
||||
#include <isc/app.h>
|
||||
#include <isc/attributes.h>
|
||||
#include <isc/backtrace.h>
|
||||
@@ -31,7 +27,6 @@
|
||||
#include <isc/hash.h>
|
||||
#include <isc/hp.h>
|
||||
#include <isc/httpd.h>
|
||||
#include <isc/managers.h>
|
||||
#include <isc/netmgr.h>
|
||||
#include <isc/os.h>
|
||||
#include <isc/platform.h>
|
||||
@@ -101,7 +96,6 @@
|
||||
#ifdef HAVE_ZLIB
|
||||
#include <zlib.h>
|
||||
#endif /* ifdef HAVE_ZLIB */
|
||||
#include <nghttp2/nghttp2.h>
|
||||
/*
|
||||
* Include header files for database drivers here.
|
||||
*/
|
||||
@@ -206,6 +200,8 @@ assertion_failed(const char *file, int line, isc_assertiontype_t type,
|
||||
const char *cond) {
|
||||
void *tracebuf[BACKTRACE_MAXFRAME];
|
||||
int nframes;
|
||||
isc_result_t result;
|
||||
const char *logsuffix = "";
|
||||
|
||||
/*
|
||||
* Handle assertion failures.
|
||||
@@ -218,23 +214,32 @@ assertion_failed(const char *file, int line, isc_assertiontype_t type,
|
||||
*/
|
||||
isc_assertion_setcallback(NULL);
|
||||
|
||||
nframes = isc_backtrace(tracebuf, BACKTRACE_MAXFRAME);
|
||||
result = isc_backtrace_gettrace(tracebuf, BACKTRACE_MAXFRAME,
|
||||
&nframes);
|
||||
if (result == ISC_R_SUCCESS && nframes > 0) {
|
||||
logsuffix = ", back trace";
|
||||
}
|
||||
isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
|
||||
NAMED_LOGMODULE_MAIN, ISC_LOG_CRITICAL,
|
||||
"%s:%d: %s(%s) failed%s", file, line,
|
||||
isc_assertion_typetotext(type), cond,
|
||||
(nframes > 0) ? ", back trace" : "");
|
||||
if (nframes > 0) {
|
||||
char **strs = isc_backtrace_symbols(tracebuf, nframes);
|
||||
if (strs != NULL) {
|
||||
for (int i = 0; i < nframes; i++) {
|
||||
isc_log_write(named_g_lctx,
|
||||
NAMED_LOGCATEGORY_GENERAL,
|
||||
NAMED_LOGMODULE_MAIN,
|
||||
ISC_LOG_CRITICAL, "%s",
|
||||
strs[i]);
|
||||
}
|
||||
isc_assertion_typetotext(type), cond, logsuffix);
|
||||
if (result == ISC_R_SUCCESS) {
|
||||
#if HAVE_BACKTRACE_SYMBOLS
|
||||
char **strs = backtrace_symbols(tracebuf, nframes);
|
||||
for (int i = 0; i < nframes; i++) {
|
||||
isc_log_write(named_g_lctx,
|
||||
NAMED_LOGCATEGORY_GENERAL,
|
||||
NAMED_LOGMODULE_MAIN,
|
||||
ISC_LOG_CRITICAL, "%s", strs[i]);
|
||||
}
|
||||
#else /* HAVE_BACKTRACE_SYMBOLS */
|
||||
for (int i = 0; i < nframes; i++) {
|
||||
isc_log_write(
|
||||
named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
|
||||
NAMED_LOGMODULE_MAIN, ISC_LOG_CRITICAL,
|
||||
"#%d %p in ??", i, tracebuf[i]);
|
||||
}
|
||||
#endif /* HAVE_BACKTRACE_SYMBOLS */
|
||||
}
|
||||
isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
|
||||
NAMED_LOGMODULE_MAIN, ISC_LOG_CRITICAL,
|
||||
@@ -320,14 +325,11 @@ library_unexpected_error(const char *file, int line, const char *format,
|
||||
static void
|
||||
usage(void) {
|
||||
fprintf(stderr, "usage: named [-4|-6] [-c conffile] [-d debuglevel] "
|
||||
"[-D comment] [-E engine]\n"
|
||||
" [-f|-g] [-L logfile] [-n number_of_cpus] "
|
||||
"[-p port] [-s]\n"
|
||||
" [-S sockets] [-t chrootdir] [-u "
|
||||
"username] [-U listeners]\n"
|
||||
" [-X lockfile] [-m "
|
||||
"{usage|trace|record|size|mctx}]\n"
|
||||
" [-M fill|nofill]\n"
|
||||
"[-E engine] [-f|-g]\n"
|
||||
" [-n number_of_cpus] [-p port] [-s] "
|
||||
"[-S sockets] [-t chrootdir]\n"
|
||||
" [-u username] [-U listeners] "
|
||||
"[-m {usage|trace|record|size|mctx}]\n"
|
||||
"usage: named [-v|-V]\n");
|
||||
}
|
||||
|
||||
@@ -433,7 +435,8 @@ static struct flag_def {
|
||||
{ "size", ISC_MEM_DEBUGSIZE, false },
|
||||
{ "mctx", ISC_MEM_DEBUGCTX, false },
|
||||
{ NULL, 0, false } },
|
||||
mem_context_flags[] = { { "fill", ISC_MEMFLAG_FILL, false },
|
||||
mem_context_flags[] = { { "external", ISC_MEMFLAG_INTERNAL, true },
|
||||
{ "fill", ISC_MEMFLAG_FILL, false },
|
||||
{ "nofill", ISC_MEMFLAG_FILL, true },
|
||||
{ NULL, 0, false } };
|
||||
|
||||
@@ -485,7 +488,6 @@ printversion(bool verbose) {
|
||||
cfg_obj_t *config = NULL;
|
||||
const cfg_obj_t *defaults = NULL, *obj = NULL;
|
||||
#endif /* if defined(HAVE_GEOIP2) */
|
||||
nghttp2_info *nginfo = NULL;
|
||||
|
||||
printf("%s%s <id:%s>\n", PACKAGE_STRING, PACKAGE_DESCRIPTION,
|
||||
PACKAGE_SRCID);
|
||||
@@ -527,9 +529,6 @@ printversion(bool verbose) {
|
||||
printf("compiled with libuv version: %d.%d.%d\n", UV_VERSION_MAJOR,
|
||||
UV_VERSION_MINOR, UV_VERSION_PATCH);
|
||||
printf("linked to libuv version: %s\n", uv_version_string());
|
||||
printf("compiled with libnghttp2 version: %s\n", NGHTTP2_VERSION);
|
||||
nginfo = nghttp2_version(1);
|
||||
printf("linked to libnghttp2 version: %s\n", nginfo->version_str);
|
||||
#ifdef HAVE_LIBXML2
|
||||
printf("compiled with libxml2 version: %s\n", LIBXML_DOTTED_VERSION);
|
||||
printf("linked to libxml2 version: %s\n", xmlParserVersion);
|
||||
@@ -706,7 +705,7 @@ parse_T_opt(char *option) {
|
||||
|
||||
static void
|
||||
parse_port(char *arg) {
|
||||
enum { DNSPORT, TLSPORT, HTTPSPORT, HTTPPORT } ptype = DNSPORT;
|
||||
enum { DNSPORT, TLSPORT } ptype = DNSPORT;
|
||||
char *value = arg;
|
||||
int port;
|
||||
|
||||
@@ -715,12 +714,6 @@ parse_port(char *arg) {
|
||||
} else if (strncmp(arg, "tls=", 4) == 0) {
|
||||
value = arg + 4;
|
||||
ptype = TLSPORT;
|
||||
} else if (strncmp(arg, "https=", 6) == 0) {
|
||||
value = arg + 6;
|
||||
ptype = HTTPSPORT;
|
||||
} else if (strncmp(arg, "http=", 5) == 0) {
|
||||
value = arg + 6;
|
||||
ptype = HTTPPORT;
|
||||
}
|
||||
|
||||
port = parse_int(value, "port");
|
||||
@@ -735,12 +728,6 @@ parse_port(char *arg) {
|
||||
case TLSPORT:
|
||||
named_g_tlsport = port;
|
||||
break;
|
||||
case HTTPSPORT:
|
||||
named_g_httpsport = port;
|
||||
break;
|
||||
case HTTPPORT:
|
||||
named_g_httpport = port;
|
||||
break;
|
||||
default:
|
||||
INSIST(0);
|
||||
ISC_UNREACHABLE();
|
||||
@@ -938,17 +925,45 @@ create_managers(void) {
|
||||
"using %u UDP listener%s per interface", named_g_udpdisp,
|
||||
named_g_udpdisp == 1 ? "" : "s");
|
||||
|
||||
result = isc_managers_create(named_g_mctx, named_g_cpus,
|
||||
0 /* quantum */, maxsocks, &named_g_netmgr,
|
||||
&named_g_taskmgr, &named_g_timermgr,
|
||||
&named_g_socketmgr);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
return (result);
|
||||
/*
|
||||
* We have ncpus network threads, ncpus worker threads, ncpus
|
||||
* old network threads - make it 4x just to be safe. The memory
|
||||
* impact is negligible.
|
||||
*/
|
||||
isc_hp_init(4 * named_g_cpus);
|
||||
named_g_nm = isc_nm_start(named_g_mctx, named_g_cpus);
|
||||
if (named_g_nm == NULL) {
|
||||
UNEXPECTED_ERROR(__FILE__, __LINE__, "isc_nm_start() failed");
|
||||
return (ISC_R_UNEXPECTED);
|
||||
}
|
||||
|
||||
isc_socketmgr_maxudp(named_g_socketmgr, maxudp);
|
||||
isc_nm_maxudp(named_g_netmgr, maxudp);
|
||||
result = isc_taskmgr_create(named_g_mctx, named_g_cpus, 0, named_g_nm,
|
||||
&named_g_taskmgr);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
UNEXPECTED_ERROR(__FILE__, __LINE__,
|
||||
"isc_taskmgr_create() failed: %s",
|
||||
isc_result_totext(result));
|
||||
return (ISC_R_UNEXPECTED);
|
||||
}
|
||||
|
||||
result = isc_timermgr_create(named_g_mctx, &named_g_timermgr);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
UNEXPECTED_ERROR(__FILE__, __LINE__,
|
||||
"isc_timermgr_create() failed: %s",
|
||||
isc_result_totext(result));
|
||||
return (ISC_R_UNEXPECTED);
|
||||
}
|
||||
|
||||
result = isc_socketmgr_create2(named_g_mctx, &named_g_socketmgr,
|
||||
maxsocks, named_g_cpus);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
UNEXPECTED_ERROR(__FILE__, __LINE__,
|
||||
"isc_socketmgr_create() failed: %s",
|
||||
isc_result_totext(result));
|
||||
return (ISC_R_UNEXPECTED);
|
||||
}
|
||||
isc_socketmgr_maxudp(named_g_socketmgr, maxudp);
|
||||
isc_nm_maxudp(named_g_nm, maxudp);
|
||||
result = isc_socketmgr_getmaxsockets(named_g_socketmgr, &socks);
|
||||
if (result == ISC_R_SUCCESS) {
|
||||
isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
|
||||
@@ -961,8 +976,25 @@ create_managers(void) {
|
||||
|
||||
static void
|
||||
destroy_managers(void) {
|
||||
isc_managers_destroy(&named_g_netmgr, &named_g_taskmgr,
|
||||
&named_g_timermgr, &named_g_socketmgr);
|
||||
/*
|
||||
* isc_nm_closedown() closes all active connections, freeing
|
||||
* attached clients and other resources and preventing new
|
||||
* connections from being established, but it not does not
|
||||
* stop all processing or destroy the netmgr yet.
|
||||
*/
|
||||
isc_nm_closedown(named_g_nm);
|
||||
|
||||
/*
|
||||
* isc_taskmgr_destroy() will block until all tasks have exited.
|
||||
*/
|
||||
isc_taskmgr_destroy(&named_g_taskmgr);
|
||||
isc_timermgr_destroy(&named_g_timermgr);
|
||||
isc_socketmgr_destroy(&named_g_socketmgr);
|
||||
|
||||
/*
|
||||
* At this point is safe to destroy the netmgr.
|
||||
*/
|
||||
isc_nm_destroy(&named_g_nm);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1472,6 +1504,15 @@ main(int argc, char *argv[]) {
|
||||
pk11_result_register();
|
||||
#endif /* if USE_PKCS11 */
|
||||
|
||||
#if !ISC_MEM_DEFAULTFILL
|
||||
/*
|
||||
* Update the default flags to remove ISC_MEMFLAG_FILL
|
||||
* before we parse the command line. If disabled here,
|
||||
* it can be turned back on with -M fill.
|
||||
*/
|
||||
isc_mem_defaultflags &= ~ISC_MEMFLAG_FILL;
|
||||
#endif /* if !ISC_MEM_DEFAULTFILL */
|
||||
|
||||
parse_command_line(argc, argv);
|
||||
|
||||
#ifdef ENABLE_AFL
|
||||
@@ -1502,7 +1543,7 @@ main(int argc, char *argv[]) {
|
||||
}
|
||||
|
||||
isc_mem_create(&named_g_mctx);
|
||||
isc_mem_setname(named_g_mctx, "main");
|
||||
isc_mem_setname(named_g_mctx, "main", NULL);
|
||||
|
||||
setup();
|
||||
|
||||
|
||||
+23
-58
@@ -66,12 +66,9 @@ DNSSEC-POLICY
|
||||
keys { ( csk | ksk | zsk ) [ ( key-directory ) ] lifetime
|
||||
duration_or_unlimited algorithm string [ integer ]; ... };
|
||||
max-zone-ttl duration;
|
||||
nsec3param [ iterations integer ] [ optout boolean ] [
|
||||
salt-length integer ];
|
||||
parent-ds-ttl duration;
|
||||
parent-propagation-delay duration;
|
||||
publish-safety duration;
|
||||
purge-keys duration;
|
||||
retire-safety duration;
|
||||
signatures-refresh duration;
|
||||
signatures-validity duration;
|
||||
@@ -87,15 +84,6 @@ DYNDB
|
||||
dyndb string quoted_string {
|
||||
unspecified-text };
|
||||
|
||||
HTTP
|
||||
^^^^
|
||||
|
||||
::
|
||||
|
||||
http string {
|
||||
endpoints { quoted_string; ... };
|
||||
};
|
||||
|
||||
KEY
|
||||
^^^
|
||||
|
||||
@@ -147,8 +135,7 @@ MASTERS
|
||||
masters string [ port integer ] [ dscp
|
||||
integer ] { ( primaries | ipv4_address
|
||||
[ port integer ] | ipv6_address [ port
|
||||
integer ] ) [ key string ] [ tls
|
||||
string ]; ... };
|
||||
integer ] ) [ key string ]; ... };
|
||||
|
||||
OPTIONS
|
||||
^^^^^^^
|
||||
@@ -169,14 +156,14 @@ OPTIONS
|
||||
allow-update-forwarding { address_match_element; ... };
|
||||
also-notify [ port integer ] [ dscp integer ] { ( primaries |
|
||||
ipv4_address [ port integer ] | ipv6_address [ port
|
||||
integer ] ) [ key string ] [ tls string ]; ... };
|
||||
integer ] ) [ key string ]; ... };
|
||||
alt-transfer-source ( ipv4_address | * ) [ port ( integer | * )
|
||||
] [ dscp integer ];
|
||||
alt-transfer-source-v6 ( ipv6_address | * ) [ port ( integer |
|
||||
* ) ] [ dscp integer ];
|
||||
answer-cookie boolean;
|
||||
attach-cache string;
|
||||
auth-nxdomain boolean;
|
||||
auth-nxdomain boolean; // default changed
|
||||
auto-dnssec ( allow | maintain | off );
|
||||
automatic-interface-scan boolean;
|
||||
avoid-v4-udp-ports { portrange; ... };
|
||||
@@ -187,9 +174,8 @@ OPTIONS
|
||||
catalog-zones { zone string [ default-masters [ port integer ]
|
||||
[ dscp integer ] { ( primaries | ipv4_address [ port
|
||||
integer ] | ipv6_address [ port integer ] ) [ key
|
||||
string ] [ tls string ]; ... } ] [ zone-directory
|
||||
quoted_string ] [ in-memory boolean ] [ min-update-interval
|
||||
duration ]; ... };
|
||||
string ]; ... } ] [ zone-directory quoted_string ] [
|
||||
in-memory boolean ] [ min-update-interval duration ]; ... };
|
||||
check-dup-records ( fail | warn | ignore );
|
||||
check-integrity boolean;
|
||||
check-mx ( fail | warn | ignore );
|
||||
@@ -274,24 +260,18 @@ OPTIONS
|
||||
glue-cache boolean;// deprecated
|
||||
heartbeat-interval integer;
|
||||
hostname ( quoted_string | none );
|
||||
http-port integer;
|
||||
https-port integer;
|
||||
inline-signing boolean;
|
||||
interface-interval duration;
|
||||
ipv4only-contact string;
|
||||
ipv4only-enable boolean;
|
||||
ipv4only-server string;
|
||||
ixfr-from-differences ( primary | master | secondary | slave |
|
||||
boolean );
|
||||
keep-response-order { address_match_element; ... };
|
||||
key-directory quoted_string;
|
||||
lame-ttl duration;
|
||||
listen-on [ port integer ] [ dscp
|
||||
integer ] [ tls string ] [ http
|
||||
string ] {
|
||||
integer ] [ tls string ] {
|
||||
address_match_element; ... };
|
||||
listen-on-v6 [ port integer ] [ dscp
|
||||
integer ] [ tls string ] [ http
|
||||
string ] {
|
||||
integer ] [ tls string ] {
|
||||
address_match_element; ... };
|
||||
lmdb-mapsize sizeval;
|
||||
lock-file ( quoted_string | none );
|
||||
@@ -418,7 +398,6 @@ OPTIONS
|
||||
sig-validity-interval integer [ integer ];
|
||||
sortlist { address_match_element; ... };
|
||||
stacksize ( default | unlimited | sizeval );
|
||||
stale-answer-client-timeout ( disabled | off | integer );
|
||||
stale-answer-enable boolean;
|
||||
stale-answer-ttl duration;
|
||||
stale-cache-enable boolean;
|
||||
@@ -432,8 +411,6 @@ OPTIONS
|
||||
tcp-initial-timeout integer;
|
||||
tcp-keepalive-timeout integer;
|
||||
tcp-listen-queue integer;
|
||||
tcp-receive-buffer integer;
|
||||
tcp-send-buffer integer;
|
||||
tkey-dhkey quoted_string integer;
|
||||
tkey-domain quoted_string;
|
||||
tkey-gssapi-credential quoted_string;
|
||||
@@ -450,8 +427,6 @@ OPTIONS
|
||||
transfers-per-ns integer;
|
||||
trust-anchor-telemetry boolean; // experimental
|
||||
try-tcp-refresh boolean;
|
||||
udp-receive-buffer integer;
|
||||
udp-send-buffer integer;
|
||||
update-check-ksk boolean;
|
||||
use-alt-transfer-source boolean;
|
||||
use-v4-udp-ports { portrange; ... };
|
||||
@@ -480,8 +455,7 @@ PRIMARIES
|
||||
primaries string [ port integer ] [ dscp
|
||||
integer ] { ( primaries | ipv4_address
|
||||
[ port integer ] | ipv6_address [ port
|
||||
integer ] ) [ key string ] [ tls
|
||||
string ]; ... };
|
||||
integer ] ) [ key string ]; ... };
|
||||
|
||||
SERVER
|
||||
^^^^^^
|
||||
@@ -539,13 +513,8 @@ TLS
|
||||
::
|
||||
|
||||
tls string {
|
||||
ca-file quoted_string;
|
||||
cert-file quoted_string;
|
||||
ciphers string; // experimental
|
||||
dh-param quoted_string; // experimental
|
||||
hostname quoted_string;
|
||||
key-file quoted_string;
|
||||
protocols sslprotos; // experimental
|
||||
};
|
||||
|
||||
TRUST-ANCHORS
|
||||
@@ -588,21 +557,20 @@ VIEW
|
||||
allow-update-forwarding { address_match_element; ... };
|
||||
also-notify [ port integer ] [ dscp integer ] { ( primaries |
|
||||
ipv4_address [ port integer ] | ipv6_address [ port
|
||||
integer ] ) [ key string ] [ tls string ]; ... };
|
||||
integer ] ) [ key string ]; ... };
|
||||
alt-transfer-source ( ipv4_address | * ) [ port ( integer | * )
|
||||
] [ dscp integer ];
|
||||
alt-transfer-source-v6 ( ipv6_address | * ) [ port ( integer |
|
||||
* ) ] [ dscp integer ];
|
||||
attach-cache string;
|
||||
auth-nxdomain boolean;
|
||||
auth-nxdomain boolean; // default changed
|
||||
auto-dnssec ( allow | maintain | off );
|
||||
cache-file quoted_string;
|
||||
catalog-zones { zone string [ default-masters [ port integer ]
|
||||
[ dscp integer ] { ( primaries | ipv4_address [ port
|
||||
integer ] | ipv6_address [ port integer ] ) [ key
|
||||
string ] [ tls string ]; ... } ] [ zone-directory
|
||||
quoted_string ] [ in-memory boolean ] [ min-update-interval
|
||||
duration ]; ... };
|
||||
string ]; ... } ] [ zone-directory quoted_string ] [
|
||||
in-memory boolean ] [ min-update-interval duration ]; ... };
|
||||
check-dup-records ( fail | warn | ignore );
|
||||
check-integrity boolean;
|
||||
check-mx ( fail | warn | ignore );
|
||||
@@ -669,9 +637,7 @@ VIEW
|
||||
forwarders [ port integer ] [ dscp integer ] { ( ipv4_address
|
||||
| ipv6_address ) [ port integer ] [ dscp integer ]; ... };
|
||||
glue-cache boolean;// deprecated
|
||||
ipv4only-contact string;
|
||||
ipv4only-enable boolean;
|
||||
ipv4only-server string;
|
||||
inline-signing boolean;
|
||||
ixfr-from-differences ( primary | master | secondary | slave |
|
||||
boolean );
|
||||
key string {
|
||||
@@ -829,7 +795,6 @@ VIEW
|
||||
sig-signing-type integer;
|
||||
sig-validity-interval integer [ integer ];
|
||||
sortlist { address_match_element; ... };
|
||||
stale-answer-client-timeout ( disabled | off | integer );
|
||||
stale-answer-enable boolean;
|
||||
stale-answer-ttl duration;
|
||||
stale-cache-enable boolean;
|
||||
@@ -865,8 +830,8 @@ VIEW
|
||||
allow-update-forwarding { address_match_element; ... };
|
||||
also-notify [ port integer ] [ dscp integer ] { (
|
||||
primaries | ipv4_address [ port integer ] |
|
||||
ipv6_address [ port integer ] ) [ key string ] [
|
||||
tls string ]; ... };
|
||||
ipv6_address [ port integer ] ) [ key string ];
|
||||
... };
|
||||
alt-transfer-source ( ipv4_address | * ) [ port (
|
||||
integer | * ) ] [ dscp integer ];
|
||||
alt-transfer-source-v6 ( ipv6_address | * ) [ port (
|
||||
@@ -906,8 +871,8 @@ VIEW
|
||||
masterfile-style ( full | relative );
|
||||
masters [ port integer ] [ dscp integer ] { (
|
||||
primaries | ipv4_address [ port integer ] |
|
||||
ipv6_address [ port integer ] ) [ key string ] [
|
||||
tls string ]; ... };
|
||||
ipv6_address [ port integer ] ) [ key string ];
|
||||
... };
|
||||
max-ixfr-ratio ( unlimited | percentage );
|
||||
max-journal-size ( default | unlimited | sizeval );
|
||||
max-records integer;
|
||||
@@ -930,8 +895,8 @@ VIEW
|
||||
notify-to-soa boolean;
|
||||
primaries [ port integer ] [ dscp integer ] { (
|
||||
primaries | ipv4_address [ port integer ] |
|
||||
ipv6_address [ port integer ] ) [ key string ] [
|
||||
tls string ]; ... };
|
||||
ipv6_address [ port integer ] ) [ key string ];
|
||||
... };
|
||||
request-expire boolean;
|
||||
request-ixfr boolean;
|
||||
serial-update-method ( date | increment | unixtime );
|
||||
@@ -976,7 +941,7 @@ ZONE
|
||||
allow-update-forwarding { address_match_element; ... };
|
||||
also-notify [ port integer ] [ dscp integer ] { ( primaries |
|
||||
ipv4_address [ port integer ] | ipv6_address [ port
|
||||
integer ] ) [ key string ] [ tls string ]; ... };
|
||||
integer ] ) [ key string ]; ... };
|
||||
alt-transfer-source ( ipv4_address | * ) [ port ( integer | * )
|
||||
] [ dscp integer ];
|
||||
alt-transfer-source-v6 ( ipv6_address | * ) [ port ( integer |
|
||||
@@ -1014,7 +979,7 @@ ZONE
|
||||
masterfile-style ( full | relative );
|
||||
masters [ port integer ] [ dscp integer ] { ( primaries |
|
||||
ipv4_address [ port integer ] | ipv6_address [ port
|
||||
integer ] ) [ key string ] [ tls string ]; ... };
|
||||
integer ] ) [ key string ]; ... };
|
||||
max-ixfr-ratio ( unlimited | percentage );
|
||||
max-journal-size ( default | unlimited | sizeval );
|
||||
max-records integer;
|
||||
@@ -1037,7 +1002,7 @@ ZONE
|
||||
notify-to-soa boolean;
|
||||
primaries [ port integer ] [ dscp integer ] { ( primaries |
|
||||
ipv4_address [ port integer ] | ipv6_address [ port
|
||||
integer ] ) [ key string ] [ tls string ]; ... };
|
||||
integer ] ) [ key string ]; ... };
|
||||
request-expire boolean;
|
||||
request-ixfr boolean;
|
||||
serial-update-method ( date | increment | unixtime );
|
||||
|
||||
+5
-9
@@ -72,9 +72,9 @@ Options
|
||||
When applicable, this option specifies the hardware to use for cryptographic
|
||||
operations, such as a secure key store used for signing.
|
||||
|
||||
When BIND 9 is built with OpenSSL, this needs to be set to the OpenSSL
|
||||
engine identifier that drives the cryptographic accelerator or
|
||||
hardware service module (usually ``pkcs11``). When BIND is
|
||||
When BIND is built with OpenSSL PKCS#11 support, this defaults to the
|
||||
string ``pkcs11``, which identifies an OpenSSL engine that can drive a
|
||||
cryptographic accelerator or hardware service module. When BIND is
|
||||
built with native PKCS#11 cryptography (``--enable-native-pkcs11``), it
|
||||
defaults to the path of the PKCS#11 provider library specified via
|
||||
``--with-pkcs11``.
|
||||
@@ -115,11 +115,7 @@ Options
|
||||
``portnum``; if not not specified, the default is port 53. If
|
||||
``value`` is of the form ``tls=<portnum>``, the server will
|
||||
listen for TLS queries on ``portnum``; the default is 853.
|
||||
If ``value`` is of the form ``https=<portnum>``, the server will
|
||||
listen for HTTPS queries on ``portnum``; the default is 443.
|
||||
If ``value`` is of the form ``http=<portnum>``, the server will
|
||||
listen for HTTP queries on ``portnum``; the default is 80.
|
||||
|
||||
|
||||
``-s``
|
||||
This option writes memory usage statistics to ``stdout`` on exit.
|
||||
|
||||
@@ -239,4 +235,4 @@ Files
|
||||
See Also
|
||||
~~~~~~~~
|
||||
|
||||
:rfc:`1033`, :rfc:`1034`, :rfc:`1035`, :manpage:`named-checkconf(8)`, :manpage:`named-checkzone(8)`, :manpage:`rndc(8)`, :manpage:`named.conf(5)`, BIND 9 Administrator Reference Manual.
|
||||
:rfc:`1033`, :rfc:`1034`, :rfc:`1035`, :manpage:`named-checkconf(8)`, :manpage:`named-checkzone(8)`, :manpage:`rndc(8), :manpage:`named.conf(5)`, BIND 9 Administrator Reference Manual.
|
||||
|
||||
+347
-741
File diff suppressed because it is too large
Load Diff
@@ -2336,12 +2336,12 @@ generatexml(named_server_t *server, uint32_t flags, int *buflen,
|
||||
TRY0(xmlTextWriterEndElement(writer)); /* /statistics */
|
||||
TRY0(xmlTextWriterEndDocument(writer));
|
||||
|
||||
xmlFreeTextWriter(writer);
|
||||
|
||||
xmlDocDumpFormatMemoryEnc(doc, buf, buflen, "UTF-8", 0);
|
||||
if (*buf == NULL) {
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
xmlFreeTextWriter(writer);
|
||||
xmlFreeDoc(doc);
|
||||
return (ISC_R_SUCCESS);
|
||||
|
||||
@@ -3612,7 +3612,7 @@ add_listener(named_server_t *server, named_statschannel_t **listenerp,
|
||||
CHECK(ISC_R_FAMILYNOSUPPORT);
|
||||
}
|
||||
|
||||
CHECK(isc_httpdmgr_create(named_g_netmgr, server->mctx, addr, client_ok,
|
||||
CHECK(isc_httpdmgr_create(named_g_nm, server->mctx, addr, client_ok,
|
||||
destroy_listener, listener,
|
||||
&listener->httpdmgr));
|
||||
|
||||
|
||||
@@ -1,201 +0,0 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/*! \file */
|
||||
|
||||
#include <inttypes.h>
|
||||
|
||||
#include <isc/buffer.h>
|
||||
#include <isc/string.h>
|
||||
#include <isc/util.h>
|
||||
|
||||
#include <dns/name.h>
|
||||
#include <dns/transport.h>
|
||||
|
||||
#include <isccfg/cfg.h>
|
||||
|
||||
#include <named/log.h>
|
||||
#include <named/transportconf.h>
|
||||
|
||||
#define create_name(id, name) \
|
||||
isc_buffer_t namesrc, namebuf; \
|
||||
char namedata[DNS_NAME_FORMATSIZE + 1]; \
|
||||
dns_name_init(name, NULL); \
|
||||
isc_buffer_constinit(&namesrc, id, strlen(id)); \
|
||||
isc_buffer_add(&namesrc, strlen(id)); \
|
||||
isc_buffer_init(&namebuf, namedata, sizeof(namedata)); \
|
||||
result = (dns_name_fromtext(name, &namesrc, dns_rootname, \
|
||||
DNS_NAME_DOWNCASE, &namebuf)); \
|
||||
if (result != ISC_R_SUCCESS) { \
|
||||
goto failure; \
|
||||
}
|
||||
|
||||
#define parse_transport_option(map, transport, name, setter) \
|
||||
{ \
|
||||
const cfg_obj_t *obj = NULL; \
|
||||
cfg_map_get(map, name, &obj); \
|
||||
if (obj != NULL) { \
|
||||
setter(transport, cfg_obj_asstring(obj)); \
|
||||
} \
|
||||
}
|
||||
|
||||
static isc_result_t
|
||||
add_doh_transports(const cfg_obj_t *transportlist, dns_transport_list_t *list) {
|
||||
const cfg_obj_t *doh = NULL;
|
||||
const char *dohid = NULL;
|
||||
isc_result_t result;
|
||||
|
||||
for (const cfg_listelt_t *element = cfg_list_first(transportlist);
|
||||
element != NULL; element = cfg_list_next(element))
|
||||
{
|
||||
dns_name_t dohname;
|
||||
dns_transport_t *transport;
|
||||
|
||||
doh = cfg_listelt_value(element);
|
||||
dohid = cfg_obj_asstring(cfg_map_getname(doh));
|
||||
|
||||
create_name(dohid, &dohname);
|
||||
|
||||
transport = dns_transport_new(&dohname, DNS_TRANSPORT_HTTP,
|
||||
list);
|
||||
|
||||
parse_transport_option(doh, transport, "key-file",
|
||||
dns_transport_set_keyfile);
|
||||
parse_transport_option(doh, transport, "cert-file",
|
||||
dns_transport_set_certfile);
|
||||
parse_transport_option(doh, transport, "ca-file",
|
||||
dns_transport_set_cafile);
|
||||
parse_transport_option(doh, transport, "hostname",
|
||||
dns_transport_set_hostname);
|
||||
}
|
||||
|
||||
return (ISC_R_SUCCESS);
|
||||
failure:
|
||||
cfg_obj_log(doh, named_g_lctx, ISC_LOG_ERROR,
|
||||
"configuring DoH '%s': %s", dohid,
|
||||
isc_result_totext(result));
|
||||
|
||||
return (result);
|
||||
}
|
||||
|
||||
static isc_result_t
|
||||
add_tls_transports(const cfg_obj_t *transportlist, dns_transport_list_t *list) {
|
||||
const cfg_obj_t *tls = NULL;
|
||||
const char *tlsid = NULL;
|
||||
isc_result_t result;
|
||||
|
||||
for (const cfg_listelt_t *element = cfg_list_first(transportlist);
|
||||
element != NULL; element = cfg_list_next(element))
|
||||
{
|
||||
dns_name_t tlsname;
|
||||
dns_transport_t *transport;
|
||||
|
||||
tls = cfg_listelt_value(element);
|
||||
tlsid = cfg_obj_asstring(cfg_map_getname(tls));
|
||||
|
||||
if (!strcmp(tlsid, "ephemeral")) {
|
||||
result = ISC_R_UNEXPECTEDTOKEN;
|
||||
goto failure;
|
||||
}
|
||||
|
||||
create_name(tlsid, &tlsname);
|
||||
|
||||
transport = dns_transport_new(&tlsname, DNS_TRANSPORT_TLS,
|
||||
list);
|
||||
|
||||
parse_transport_option(tls, transport, "key-file",
|
||||
dns_transport_set_keyfile);
|
||||
parse_transport_option(tls, transport, "cert-file",
|
||||
dns_transport_set_certfile);
|
||||
parse_transport_option(tls, transport, "ca-file",
|
||||
dns_transport_set_cafile);
|
||||
parse_transport_option(tls, transport, "hostname",
|
||||
dns_transport_set_hostname);
|
||||
}
|
||||
|
||||
return (ISC_R_SUCCESS);
|
||||
failure:
|
||||
cfg_obj_log(tls, named_g_lctx, ISC_LOG_ERROR,
|
||||
"configuring tls '%s': %s", tlsid,
|
||||
isc_result_totext(result));
|
||||
|
||||
return (result);
|
||||
}
|
||||
|
||||
#define CHECK(f) \
|
||||
if ((result = f) != ISC_R_SUCCESS) { \
|
||||
goto failure; \
|
||||
}
|
||||
|
||||
static isc_result_t
|
||||
transport_list_fromconfig(const cfg_obj_t *config, dns_transport_list_t *list) {
|
||||
const cfg_obj_t *obj = NULL;
|
||||
isc_result_t result = ISC_R_SUCCESS;
|
||||
|
||||
if (result == ISC_R_SUCCESS &&
|
||||
cfg_map_get(config, "tls", &obj) == ISC_R_SUCCESS)
|
||||
{
|
||||
result = add_tls_transports(obj, list);
|
||||
obj = NULL;
|
||||
}
|
||||
|
||||
if (result == ISC_R_SUCCESS &&
|
||||
cfg_map_get(config, "doh", &obj) == ISC_R_SUCCESS)
|
||||
{
|
||||
result = add_doh_transports(obj, list);
|
||||
obj = NULL;
|
||||
}
|
||||
|
||||
return (result);
|
||||
}
|
||||
|
||||
static void
|
||||
transport_list_add_ephemeral(dns_transport_list_t *list) {
|
||||
isc_result_t result;
|
||||
dns_name_t tlsname;
|
||||
|
||||
create_name("ephemeral", &tlsname);
|
||||
|
||||
(void)dns_transport_new(&tlsname, DNS_TRANSPORT_TLS, list);
|
||||
|
||||
return;
|
||||
failure:
|
||||
RUNTIME_CHECK(result == ISC_R_SUCCESS);
|
||||
}
|
||||
|
||||
isc_result_t
|
||||
named_transports_fromconfig(const cfg_obj_t *config, const cfg_obj_t *vconfig,
|
||||
isc_mem_t *mctx, dns_transport_list_t **listp) {
|
||||
isc_result_t result;
|
||||
dns_transport_list_t *list = dns_transport_list_new(mctx);
|
||||
|
||||
REQUIRE(listp != NULL && *listp == NULL);
|
||||
|
||||
transport_list_add_ephemeral(list);
|
||||
|
||||
if (config != NULL) {
|
||||
result = transport_list_fromconfig(config, list);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
goto failure;
|
||||
}
|
||||
}
|
||||
|
||||
if (vconfig != NULL) {
|
||||
config = cfg_tuple_get(vconfig, "options");
|
||||
transport_list_fromconfig(config, list);
|
||||
}
|
||||
|
||||
*listp = list;
|
||||
return (ISC_R_SUCCESS);
|
||||
failure:
|
||||
dns_transport_list_detach(&list);
|
||||
return (result);
|
||||
}
|
||||
+1
-1
@@ -379,7 +379,7 @@ all_digits(const char *s) {
|
||||
return (false);
|
||||
}
|
||||
while (*s != '\0') {
|
||||
if (!isdigit((unsigned char)(*s))) {
|
||||
if (!isdigit((*s) & 0xff)) {
|
||||
return (false);
|
||||
}
|
||||
s++;
|
||||
|
||||
@@ -59,9 +59,6 @@
|
||||
<ClCompile Include="..\tkeyconf.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\transportconf.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\tsigconf.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
@@ -114,9 +111,6 @@
|
||||
<ClInclude Include="..\include\named\tkeyconf.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\include\named\transportconf.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\include\named\tsigconf.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
|
||||
@@ -67,7 +67,7 @@
|
||||
<ProgramDataBaseFileName>$(OutDir)$(TargetName).pdb</ProgramDataBaseFileName>
|
||||
<BrowseInformation>true</BrowseInformation>
|
||||
<ForcedIncludeFiles>..\..\..\config.h</ForcedIncludeFiles>
|
||||
<AdditionalIncludeDirectories>@LIBUV_INC@@NGHTTP2_INC@@OPENSSL_INC@@GSSAPI_INC@@GEOIP_INC@.\;..\..\..\;@LIBXML2_INC@..\win32\include;..\include;..\..\..\lib\isc\win32;..\..\..\lib\isc\win32\include;..\..\..\lib\isc\include;..\..\..\lib\dns\include;..\..\..\lib\isccc\include;..\..\..\lib\isccfg\include;..\..\..\lib\bind9\include;..\..\..\lib\ns\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>@LIBUV_INC@@OPENSSL_INC@@GSSAPI_INC@@GEOIP_INC@.\;..\..\..\;@LIBXML2_INC@..\win32\include;..\include;..\..\..\lib\isc\win32;..\..\..\lib\isc\win32\include;..\..\..\lib\isc\include;..\..\..\lib\dns\include;..\..\..\lib\isccc\include;..\..\..\lib\isccfg\include;..\..\..\lib\bind9\include;..\..\..\lib\ns\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<CompileAs>CompileAsC</CompileAs>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
@@ -75,7 +75,7 @@
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<OutputFile>..\..\..\Build\$(Configuration)\$(TargetName)$(TargetExt)</OutputFile>
|
||||
<AdditionalLibraryDirectories>..\..\..\lib\isc\win32\$(Configuration);..\..\..\lib\dns\win32\$(Configuration);..\..\..\lib\isccc\win32\$(Configuration);..\..\..\lib\isccfg\win32\$(Configuration);..\..\..\lib\bind9\win32\$(Configuration);..\..\..\lib\ns\win32\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalDependencies>@LIBUV_LIB@@NGHTTP2_LIB@@OPENSSL_LIBCRYPTO@@OPENSSL_LIBSSL@@LIBXML2_LIB@@GSSAPI_LIB@@GEOIP_LIB@libisc.lib;libdns.lib;libisccc.lib;libisccfg.lib;libbind9.lib;libns.lib;version.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalDependencies>@LIBUV_LIB@@OPENSSL_LIBCRYPTO@@OPENSSL_LIBSSL@@LIBXML2_LIB@@GSSAPI_LIB@@GEOIP_LIB@libisc.lib;libdns.lib;libisccc.lib;libisccfg.lib;libbind9.lib;libns.lib;version.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
<PreBuildEvent>
|
||||
<Command>cd ..
|
||||
@@ -103,7 +103,7 @@ perl -e "print \";\";" >> xsl.c
|
||||
<ObjectFileName>.\$(Configuration)\</ObjectFileName>
|
||||
<ProgramDataBaseFileName>$(OutDir)$(TargetName).pdb</ProgramDataBaseFileName>
|
||||
<ForcedIncludeFiles>..\..\..\config.h</ForcedIncludeFiles>
|
||||
<AdditionalIncludeDirectories>@LIBUV_INC@@NGHTTP2_INC@@OPENSSL_INC@@GSSAPI_INC@@GEOIP_INC@.\;..\..\..\;@LIBXML2_INC@..\win32\include;..\include;..\..\..\lib\isc\win32;..\..\..\lib\isc\win32\include;..\..\..\lib\isc\include;..\..\..\lib\dns\include;..\..\..\lib\isccc\include;..\..\..\lib\isccfg\include;..\..\..\lib\bind9\include;..\..\..\lib\ns\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>@LIBUV_INC@@OPENSSL_INC@@GSSAPI_INC@@GEOIP_INC@.\;..\..\..\;@LIBXML2_INC@..\win32\include;..\include;..\..\..\lib\isc\win32;..\..\..\lib\isc\win32\include;..\..\..\lib\isc\include;..\..\..\lib\dns\include;..\..\..\lib\isccc\include;..\..\..\lib\isccfg\include;..\..\..\lib\bind9\include;..\..\..\lib\ns\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<CompileAs>CompileAsC</CompileAs>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
@@ -114,7 +114,7 @@ perl -e "print \";\";" >> xsl.c
|
||||
<OutputFile>..\..\..\Build\$(Configuration)\$(TargetName)$(TargetExt)</OutputFile>
|
||||
<LinkTimeCodeGeneration>Default</LinkTimeCodeGeneration>
|
||||
<AdditionalLibraryDirectories>..\..\..\lib\isc\win32\$(Configuration);..\..\..\lib\dns\win32\$(Configuration);..\..\..\lib\isccc\win32\$(Configuration);..\..\..\lib\isccfg\win32\$(Configuration);..\..\..\lib\bind9\win32\$(Configuration);..\..\..\lib\ns\win32\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalDependencies>@LIBUV_LIB@@NGHTTP2_LIB@@OPENSSL_LIBCRYPTO@@OPENSSL_LIBSSL@@LIBXML2_LIB@@GSSAPI_LIB@@GEOIP_LIB@libisc.lib;libdns.lib;libisccc.lib;libisccfg.lib;libbind9.lib;libns.lib;version.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalDependencies>@LIBUV_LIB@@OPENSSL_LIBCRYPTO@@OPENSSL_LIBSSL@@LIBXML2_LIB@@GSSAPI_LIB@@GEOIP_LIB@libisc.lib;libdns.lib;libisccc.lib;libisccfg.lib;libbind9.lib;libns.lib;version.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
<PreBuildEvent>
|
||||
<Command>cd ..
|
||||
@@ -138,7 +138,6 @@ perl -e "print \";\";" >> xsl.c
|
||||
<ClCompile Include="..\server.c" />
|
||||
<ClCompile Include="..\statschannel.c" />
|
||||
<ClCompile Include="..\tkeyconf.c" />
|
||||
<ClCompile Include="..\transportconf.c" />
|
||||
<ClCompile Include="..\tsigconf.c" />
|
||||
<ClCompile Include="..\xsl.c" />
|
||||
<ClCompile Include="..\zoneconf.c" />
|
||||
@@ -160,7 +159,6 @@ perl -e "print \";\";" >> xsl.c
|
||||
<ClInclude Include="..\include\named\server.h" />
|
||||
<ClInclude Include="..\include\named\statschannel.h" />
|
||||
<ClInclude Include="..\include\named\tkeyconf.h" />
|
||||
<ClInclude Include="..\include\named\transportconf.h" />
|
||||
<ClInclude Include="..\include\named\tsigconf.h" />
|
||||
<ClInclude Include="..\include\named\types.h" />
|
||||
<ClInclude Include="..\xsl_p.h" />
|
||||
|
||||
+25
-131
@@ -29,7 +29,6 @@
|
||||
#include <dns/log.h>
|
||||
#include <dns/masterdump.h>
|
||||
#include <dns/name.h>
|
||||
#include <dns/nsec3.h>
|
||||
#include <dns/rdata.h>
|
||||
#include <dns/rdatalist.h>
|
||||
#include <dns/rdataset.h>
|
||||
@@ -176,7 +175,7 @@ configure_zone_acl(const cfg_obj_t *zconfig, const cfg_obj_t *vconfig,
|
||||
|
||||
parse_acl:
|
||||
result = cfg_acl_fromconfig(aclobj, config, named_g_lctx, actx,
|
||||
named_g_mctx, 0, &acl);
|
||||
dns_zone_getmctx(zone), 0, &acl);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
return (result);
|
||||
}
|
||||
@@ -272,8 +271,8 @@ configure_zone_ssutable(const cfg_obj_t *zconfig, dns_zone_t *zone,
|
||||
|
||||
dns_fixedname_init(&fname);
|
||||
if (usezone) {
|
||||
dns_name_copy(dns_zone_getorigin(zone),
|
||||
dns_fixedname_name(&fname));
|
||||
dns_name_copynf(dns_zone_getorigin(zone),
|
||||
dns_fixedname_name(&fname));
|
||||
} else {
|
||||
str = cfg_obj_asstring(dname);
|
||||
isc_buffer_constinit(&b, str, strlen(str));
|
||||
@@ -913,7 +912,6 @@ named_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig,
|
||||
bool check = false, fail = false;
|
||||
bool warn = false, ignore = false;
|
||||
bool ixfrdiff;
|
||||
bool use_kasp = false;
|
||||
dns_masterformat_t masterformat;
|
||||
const dns_master_style_t *masterstyle = &dns_master_style_default;
|
||||
isc_stats_t *zoneqrystats;
|
||||
@@ -1253,20 +1251,16 @@ named_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig,
|
||||
result = dns_kasplist_find(kasplist, kaspname,
|
||||
&kasp);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
cfg_obj_log(
|
||||
obj, named_g_lctx,
|
||||
ISC_LOG_ERROR,
|
||||
"dnssec-policy '%s' not found ",
|
||||
kaspname);
|
||||
cfg_obj_log(obj, named_g_lctx,
|
||||
ISC_LOG_ERROR,
|
||||
"'dnssec-policy '%s' not "
|
||||
"found ",
|
||||
kaspname);
|
||||
RETERR(result);
|
||||
}
|
||||
dns_zone_setkasp(zone, kasp);
|
||||
use_kasp = true;
|
||||
}
|
||||
}
|
||||
if (!use_kasp) {
|
||||
dns_zone_setkasp(zone, NULL);
|
||||
}
|
||||
|
||||
obj = NULL;
|
||||
result = named_config_get(maps, "notify", &obj);
|
||||
@@ -1310,14 +1304,13 @@ named_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig,
|
||||
|
||||
RETERR(named_config_getipandkeylist(config, obj, mctx,
|
||||
&ipkl));
|
||||
result = dns_zone_setalsonotify(zone, ipkl.addrs,
|
||||
ipkl.dscps, ipkl.keys,
|
||||
ipkl.tlss, ipkl.count);
|
||||
result = dns_zone_setalsonotifydscpkeys(
|
||||
zone, ipkl.addrs, ipkl.dscps, ipkl.keys,
|
||||
ipkl.count);
|
||||
dns_ipkeylist_clear(mctx, &ipkl);
|
||||
RETERR(result);
|
||||
} else {
|
||||
RETERR(dns_zone_setalsonotify(zone, NULL, NULL, NULL,
|
||||
NULL, 0));
|
||||
RETERR(dns_zone_setalsonotify(zone, NULL, 0));
|
||||
}
|
||||
|
||||
obj = NULL;
|
||||
@@ -1567,21 +1560,7 @@ named_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig,
|
||||
bool allow = false, maint = false;
|
||||
bool sigvalinsecs;
|
||||
|
||||
if (use_kasp) {
|
||||
if (dns_kasp_nsec3(kasp)) {
|
||||
result = dns_zone_setnsec3param(
|
||||
zone, 1, dns_kasp_nsec3flags(kasp),
|
||||
dns_kasp_nsec3iter(kasp),
|
||||
dns_kasp_nsec3saltlen(kasp), NULL, true,
|
||||
false);
|
||||
} else {
|
||||
result = dns_zone_setnsec3param(
|
||||
zone, 0, 0, 0, 0, NULL, true, false);
|
||||
}
|
||||
INSIST(result == ISC_R_SUCCESS);
|
||||
}
|
||||
|
||||
if (use_kasp) {
|
||||
if (kasp) {
|
||||
seconds = (uint32_t)dns_kasp_sigvalidity_dnskey(kasp);
|
||||
} else {
|
||||
obj = NULL;
|
||||
@@ -1592,7 +1571,7 @@ named_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig,
|
||||
}
|
||||
dns_zone_setkeyvalidityinterval(zone, seconds);
|
||||
|
||||
if (use_kasp) {
|
||||
if (kasp) {
|
||||
seconds = (uint32_t)dns_kasp_sigvalidity(kasp);
|
||||
dns_zone_setsigvalidityinterval(zone, seconds);
|
||||
seconds = (uint32_t)dns_kasp_sigrefresh(kasp);
|
||||
@@ -1679,11 +1658,9 @@ named_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig,
|
||||
|
||||
obj = NULL;
|
||||
result = cfg_map_get(zoptions, "auto-dnssec", &obj);
|
||||
if (kasp != NULL) {
|
||||
bool s2i = (strcmp(dns_kasp_getname(kasp),
|
||||
"insecure") != 0);
|
||||
if (dns_zone_getkasp(zone) != NULL) {
|
||||
dns_zone_setkeyopt(zone, DNS_ZONEKEY_ALLOW, true);
|
||||
dns_zone_setkeyopt(zone, DNS_ZONEKEY_CREATE, !s2i);
|
||||
dns_zone_setkeyopt(zone, DNS_ZONEKEY_CREATE, true);
|
||||
dns_zone_setkeyopt(zone, DNS_ZONEKEY_MAINTAIN, true);
|
||||
} else if (result == ISC_R_SUCCESS) {
|
||||
const char *arg = cfg_obj_asstring(obj);
|
||||
@@ -1915,15 +1892,13 @@ named_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig,
|
||||
|
||||
RETERR(named_config_getipandkeylist(config, obj, mctx,
|
||||
&ipkl));
|
||||
result = dns_zone_setprimaries(mayberaw, ipkl.addrs,
|
||||
ipkl.keys, ipkl.tlss,
|
||||
ipkl.count);
|
||||
result = dns_zone_setprimarieswithkeys(
|
||||
mayberaw, ipkl.addrs, ipkl.keys, ipkl.count);
|
||||
count = ipkl.count;
|
||||
dns_ipkeylist_clear(mctx, &ipkl);
|
||||
RETERR(result);
|
||||
} else {
|
||||
result = dns_zone_setprimaries(mayberaw, NULL, NULL,
|
||||
NULL, 0);
|
||||
result = dns_zone_setprimaries(mayberaw, NULL, 0);
|
||||
}
|
||||
RETERR(result);
|
||||
|
||||
@@ -2074,15 +2049,13 @@ named_zone_configure_writeable_dlz(dns_dlzdb_t *dlzdatabase, dns_zone_t *zone,
|
||||
}
|
||||
|
||||
bool
|
||||
named_zone_reusable(dns_zone_t *zone, const cfg_obj_t *zconfig,
|
||||
const cfg_obj_t *vconfig, const cfg_obj_t *config,
|
||||
cfg_aclconfctx_t *actx) {
|
||||
named_zone_reusable(dns_zone_t *zone, const cfg_obj_t *zconfig) {
|
||||
const cfg_obj_t *zoptions = NULL;
|
||||
const cfg_obj_t *obj = NULL;
|
||||
const char *cfilename;
|
||||
const char *zfilename;
|
||||
dns_zone_t *raw = NULL;
|
||||
bool has_raw, inline_signing;
|
||||
bool has_raw;
|
||||
dns_zonetype_t ztype;
|
||||
|
||||
zoptions = cfg_tuple_get(zconfig, "options");
|
||||
@@ -2110,13 +2083,13 @@ named_zone_reusable(dns_zone_t *zone, const cfg_obj_t *zconfig,
|
||||
has_raw = false;
|
||||
}
|
||||
|
||||
inline_signing = named_zone_inlinesigning(zone, zconfig, vconfig,
|
||||
config, actx);
|
||||
if (!inline_signing && has_raw) {
|
||||
obj = NULL;
|
||||
(void)cfg_map_get(zoptions, "inline-signing", &obj);
|
||||
if ((obj == NULL || !cfg_obj_asboolean(obj)) && has_raw) {
|
||||
dns_zone_log(zone, ISC_LOG_DEBUG(1),
|
||||
"not reusable: old zone was inline-signing");
|
||||
return (false);
|
||||
} else if (inline_signing && !has_raw) {
|
||||
} else if ((obj != NULL && cfg_obj_asboolean(obj)) && !has_raw) {
|
||||
dns_zone_log(zone, ISC_LOG_DEBUG(1),
|
||||
"not reusable: old zone was not inline-signing");
|
||||
return (false);
|
||||
@@ -2146,82 +2119,3 @@ named_zone_reusable(dns_zone_t *zone, const cfg_obj_t *zconfig,
|
||||
|
||||
return (true);
|
||||
}
|
||||
|
||||
bool
|
||||
named_zone_inlinesigning(dns_zone_t *zone, const cfg_obj_t *zconfig,
|
||||
const cfg_obj_t *vconfig, const cfg_obj_t *config,
|
||||
cfg_aclconfctx_t *actx) {
|
||||
isc_result_t res;
|
||||
const cfg_obj_t *zoptions = NULL;
|
||||
const cfg_obj_t *voptions = NULL;
|
||||
const cfg_obj_t *options = NULL;
|
||||
const cfg_obj_t *signing = NULL;
|
||||
const cfg_obj_t *allowupdate = NULL;
|
||||
const cfg_obj_t *updatepolicy = NULL;
|
||||
bool zone_is_dynamic = false;
|
||||
bool inline_signing = false;
|
||||
|
||||
(void)cfg_map_get(config, "options", &options);
|
||||
|
||||
zoptions = cfg_tuple_get(zconfig, "options");
|
||||
if (vconfig != NULL) {
|
||||
voptions = cfg_tuple_get(vconfig, "options");
|
||||
}
|
||||
|
||||
inline_signing = (cfg_map_get(zoptions, "inline-signing", &signing) ==
|
||||
ISC_R_SUCCESS &&
|
||||
cfg_obj_asboolean(signing));
|
||||
if (inline_signing) {
|
||||
return (true);
|
||||
}
|
||||
|
||||
if (cfg_map_get(zoptions, "update-policy", &updatepolicy) ==
|
||||
ISC_R_SUCCESS) {
|
||||
zone_is_dynamic = true;
|
||||
} else {
|
||||
res = cfg_map_get(zoptions, "allow-update", &allowupdate);
|
||||
if (res != ISC_R_SUCCESS && voptions != NULL) {
|
||||
res = cfg_map_get(voptions, "allow-update",
|
||||
&allowupdate);
|
||||
}
|
||||
if (res != ISC_R_SUCCESS && options != NULL) {
|
||||
res = cfg_map_get(options, "allow-update",
|
||||
&allowupdate);
|
||||
}
|
||||
if (res == ISC_R_SUCCESS) {
|
||||
dns_acl_t *acl = NULL;
|
||||
res = cfg_acl_fromconfig(
|
||||
allowupdate, config, named_g_lctx, actx,
|
||||
dns_zone_getmctx(zone), 0, &acl);
|
||||
if (res == ISC_R_SUCCESS && acl != NULL &&
|
||||
!dns_acl_isnone(acl)) {
|
||||
zone_is_dynamic = true;
|
||||
}
|
||||
if (acl != NULL) {
|
||||
dns_acl_detach(&acl);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* If inline-signing is not set, perhaps implictly through a
|
||||
* dnssec-policy. Since automated DNSSEC maintenance requires
|
||||
* a dynamic zone, or inline-siging to be enabled, check if
|
||||
* the zone with dnssec-policy allows updates. If not, enable
|
||||
* inline-signing.
|
||||
*/
|
||||
signing = NULL;
|
||||
if (!inline_signing && !zone_is_dynamic &&
|
||||
cfg_map_get(zoptions, "dnssec-policy", &signing) == ISC_R_SUCCESS &&
|
||||
signing != NULL)
|
||||
{
|
||||
if (strcmp(cfg_obj_asstring(signing), "none") != 0) {
|
||||
inline_signing = true;
|
||||
dns_zone_log(zone, ISC_LOG_DEBUG(1),
|
||||
"inline-signing: "
|
||||
"implicitly through dnssec-policy");
|
||||
}
|
||||
}
|
||||
|
||||
return (inline_signing);
|
||||
}
|
||||
|
||||
@@ -7,8 +7,7 @@ AM_CPPFLAGS += \
|
||||
$(LIBIRS_CFLAGS) \
|
||||
$(LIBBIND9_CFLAGS) \
|
||||
$(GSSAPI_CFLAGS) \
|
||||
$(KRB5_CFLAGS) \
|
||||
$(READLINE_CFLAGS)
|
||||
$(KRB5_CFLAGS)
|
||||
|
||||
AM_CPPFLAGS += \
|
||||
-DSESSION_KEYFILE=\"${localstatedir}/run/named/session.key\"
|
||||
@@ -28,7 +27,3 @@ LDADD += \
|
||||
endif
|
||||
|
||||
bin_PROGRAMS = nsupdate
|
||||
|
||||
nsupdate_SOURCES = \
|
||||
nsupdate.c \
|
||||
../dig/readline.h
|
||||
|
||||
+28
-25
@@ -29,7 +29,6 @@
|
||||
#include <isc/hash.h>
|
||||
#include <isc/lex.h>
|
||||
#include <isc/log.h>
|
||||
#include <isc/managers.h>
|
||||
#include <isc/mem.h>
|
||||
#include <isc/nonce.h>
|
||||
#include <isc/parseint.h>
|
||||
@@ -37,6 +36,7 @@
|
||||
#include <isc/portset.h>
|
||||
#include <isc/print.h>
|
||||
#include <isc/random.h>
|
||||
#include <isc/readline.h>
|
||||
#include <isc/region.h>
|
||||
#include <isc/sockaddr.h>
|
||||
#include <isc/socket.h>
|
||||
@@ -58,7 +58,6 @@
|
||||
#include <dns/masterdump.h>
|
||||
#include <dns/message.h>
|
||||
#include <dns/name.h>
|
||||
#include <dns/nsec3.h>
|
||||
#include <dns/rcode.h>
|
||||
#include <dns/rdata.h>
|
||||
#include <dns/rdataclass.h>
|
||||
@@ -96,8 +95,6 @@
|
||||
|
||||
#include <bind9/getaddresses.h>
|
||||
|
||||
#include "../dig/readline.h"
|
||||
|
||||
#define MAXCMD (128 * 1024)
|
||||
#define MAXWIRE (64 * 1024)
|
||||
#define PACKETSIZE ((64 * 1024) - 1)
|
||||
@@ -127,7 +124,6 @@ static bool usegsstsig = false;
|
||||
static bool use_win2k_gsstsig = false;
|
||||
static bool tried_other_gsstsig = false;
|
||||
static bool local_only = false;
|
||||
static isc_nm_t *netmgr = NULL;
|
||||
static isc_taskmgr_t *taskmgr = NULL;
|
||||
static isc_task_t *global_task = NULL;
|
||||
static isc_event_t *global_event = NULL;
|
||||
@@ -924,8 +920,14 @@ setup_system(void) {
|
||||
result = dns_dispatchmgr_create(gmctx, &dispatchmgr);
|
||||
check_result(result, "dns_dispatchmgr_create");
|
||||
|
||||
isc_managers_create(gmctx, 1, 0, 0, &netmgr, &taskmgr, &timermgr,
|
||||
&socketmgr);
|
||||
result = isc_socketmgr_create(gmctx, &socketmgr);
|
||||
check_result(result, "dns_socketmgr_create");
|
||||
|
||||
result = isc_timermgr_create(gmctx, &timermgr);
|
||||
check_result(result, "dns_timermgr_create");
|
||||
|
||||
result = isc_taskmgr_create(gmctx, 1, 0, NULL, &taskmgr);
|
||||
check_result(result, "isc_taskmgr_create");
|
||||
|
||||
result = isc_task_create(taskmgr, 0, &global_task);
|
||||
check_result(result, "isc_task_create");
|
||||
@@ -1264,6 +1266,7 @@ static uint16_t
|
||||
parse_name(char **cmdlinep, dns_message_t *msg, dns_name_t **namep) {
|
||||
isc_result_t result;
|
||||
char *word;
|
||||
isc_buffer_t *namebuf = NULL;
|
||||
isc_buffer_t source;
|
||||
|
||||
word = nsu_strsep(cmdlinep, " \t\r\n");
|
||||
@@ -1274,6 +1277,10 @@ parse_name(char **cmdlinep, dns_message_t *msg, dns_name_t **namep) {
|
||||
|
||||
result = dns_message_gettempname(msg, namep);
|
||||
check_result(result, "dns_message_gettempname");
|
||||
isc_buffer_allocate(gmctx, &namebuf, DNS_NAME_MAXWIRE);
|
||||
dns_name_init(*namep, NULL);
|
||||
dns_name_setbuffer(*namep, namebuf);
|
||||
dns_message_takebuffer(msg, &namebuf);
|
||||
isc_buffer_init(&source, word, strlen(word));
|
||||
isc_buffer_add(&source, strlen(word));
|
||||
result = dns_name_fromtext(*namep, &source, dns_rootname, 0, NULL);
|
||||
@@ -1957,19 +1964,6 @@ parseclass:
|
||||
}
|
||||
}
|
||||
|
||||
if (!isdelete && rdata->type == dns_rdatatype_nsec3param) {
|
||||
dns_rdata_nsec3param_t nsec3param;
|
||||
|
||||
result = dns_rdata_tostruct(rdata, &nsec3param, NULL);
|
||||
check_result(result, "dns_rdata_tostruct");
|
||||
if (nsec3param.iterations > dns_nsec3_maxiterations()) {
|
||||
fprintf(stderr,
|
||||
"NSEC3PARAM has excessive iterations (> %u)\n",
|
||||
dns_nsec3_maxiterations());
|
||||
goto failure;
|
||||
}
|
||||
}
|
||||
|
||||
doneparsing:
|
||||
|
||||
result = dns_message_gettemprdatalist(updatemsg, &rdatalist);
|
||||
@@ -2068,6 +2062,7 @@ setzone(dns_name_t *zonename) {
|
||||
if (zonename != NULL) {
|
||||
result = dns_message_gettempname(updatemsg, &name);
|
||||
check_result(result, "dns_message_gettempname");
|
||||
dns_name_init(name, NULL);
|
||||
dns_name_clone(zonename, name);
|
||||
result = dns_message_gettemprdataset(updatemsg, &rdataset);
|
||||
check_result(result, "dns_message_gettemprdataset");
|
||||
@@ -2730,7 +2725,7 @@ lookforsoa:
|
||||
* address.
|
||||
*/
|
||||
zname = dns_fixedname_initname(&fzname);
|
||||
dns_name_copy(name, zname);
|
||||
dns_name_copynf(name, zname);
|
||||
}
|
||||
|
||||
if (debugging) {
|
||||
@@ -2905,7 +2900,7 @@ failed_gssrequest(void) {
|
||||
|
||||
static void
|
||||
start_gssrequest(dns_name_t *master) {
|
||||
dns_gss_ctx_id_t context;
|
||||
gss_ctx_id_t context;
|
||||
isc_buffer_t buf;
|
||||
isc_result_t result;
|
||||
uint32_t val = 0;
|
||||
@@ -3050,7 +3045,7 @@ recvgss(isc_task_t *task, isc_event_t *event) {
|
||||
nsu_gssinfo_t *reqinfo;
|
||||
dns_message_t *tsigquery = NULL;
|
||||
isc_sockaddr_t *addr;
|
||||
dns_gss_ctx_id_t context;
|
||||
gss_ctx_id_t context;
|
||||
isc_buffer_t buf;
|
||||
dns_name_t *servname;
|
||||
dns_fixedname_t fname;
|
||||
@@ -3242,6 +3237,7 @@ start_update(void) {
|
||||
dns_rdataset_makequestion(rdataset, getzoneclass(), dns_rdatatype_soa);
|
||||
|
||||
if (userzone != NULL) {
|
||||
dns_name_init(name, NULL);
|
||||
dns_name_clone(userzone, name);
|
||||
} else {
|
||||
dns_rdataset_t *tmprdataset;
|
||||
@@ -3260,6 +3256,7 @@ start_update(void) {
|
||||
}
|
||||
firstname = NULL;
|
||||
dns_message_currentname(updatemsg, section, &firstname);
|
||||
dns_name_init(name, NULL);
|
||||
dns_name_clone(firstname, name);
|
||||
/*
|
||||
* Looks to see if the first name references a DS record
|
||||
@@ -3310,12 +3307,18 @@ cleanup(void) {
|
||||
dst_key_free(&sig0key);
|
||||
}
|
||||
|
||||
ddebug("Shutting down managers");
|
||||
isc_managers_destroy(&netmgr, &taskmgr, &timermgr, &socketmgr);
|
||||
ddebug("Shutting down task manager");
|
||||
isc_taskmgr_destroy(&taskmgr);
|
||||
|
||||
ddebug("Destroying event");
|
||||
isc_event_free(&global_event);
|
||||
|
||||
ddebug("Shutting down socket manager");
|
||||
isc_socketmgr_destroy(&socketmgr);
|
||||
|
||||
ddebug("Shutting down timer manager");
|
||||
isc_timermgr_destroy(&timermgr);
|
||||
|
||||
#ifdef HAVE_GSSAPI
|
||||
/*
|
||||
* Cleanup GSSAPI resources after taskmgr has been destroyed.
|
||||
|
||||
@@ -7,9 +7,6 @@ AM_CPPFLAGS += \
|
||||
$(LIBISCCFG_CFLAGS)
|
||||
|
||||
pkglib_LTLIBRARIES = filter-aaaa.la
|
||||
pkglib_LTLIBRARIES += filter-a.la
|
||||
|
||||
filter_aaaa_la_SOURCES = filter-aaaa.c
|
||||
filter_a_la_SOURCES = filter-a.c
|
||||
filter_aaaa_la_LDFLAGS = -avoid-version -module -shared -export-dynamic
|
||||
filter_a_la_LDFLAGS = -avoid-version -module -shared -export-dynamic
|
||||
|
||||
@@ -1,906 +0,0 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/*! \file */
|
||||
|
||||
/* aliases for the exported symbols */
|
||||
|
||||
#include <inttypes.h>
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <isc/buffer.h>
|
||||
#include <isc/hash.h>
|
||||
#include <isc/ht.h>
|
||||
#include <isc/lib.h>
|
||||
#include <isc/log.h>
|
||||
#include <isc/mem.h>
|
||||
#include <isc/netaddr.h>
|
||||
#include <isc/result.h>
|
||||
#include <isc/types.h>
|
||||
#include <isc/util.h>
|
||||
|
||||
#include <dns/acl.h>
|
||||
#include <dns/db.h>
|
||||
#include <dns/enumtype.h>
|
||||
#include <dns/log.h>
|
||||
#include <dns/message.h>
|
||||
#include <dns/rdataset.h>
|
||||
#include <dns/result.h>
|
||||
#include <dns/types.h>
|
||||
#include <dns/view.h>
|
||||
|
||||
#include <isccfg/aclconf.h>
|
||||
#include <isccfg/cfg.h>
|
||||
#include <isccfg/grammar.h>
|
||||
|
||||
#include <ns/client.h>
|
||||
#include <ns/hooks.h>
|
||||
#include <ns/log.h>
|
||||
#include <ns/query.h>
|
||||
#include <ns/types.h>
|
||||
|
||||
#define CHECK(op) \
|
||||
do { \
|
||||
result = (op); \
|
||||
if (result != ISC_R_SUCCESS) { \
|
||||
goto cleanup; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
* Possible values for the settings of filter-a-on-v6 and
|
||||
* filter-a-on-v4: "no" is NONE, "yes" is FILTER, "break-dnssec"
|
||||
* is BREAK_DNSSEC.
|
||||
*/
|
||||
typedef enum { NONE = 0, FILTER = 1, BREAK_DNSSEC = 2 } filter_a_t;
|
||||
|
||||
/*
|
||||
* Persistent data for use by this module. This will be associated
|
||||
* with client object address in the hash table, and will remain
|
||||
* accessible until the client object is detached.
|
||||
*/
|
||||
typedef struct filter_data {
|
||||
filter_a_t mode;
|
||||
uint32_t flags;
|
||||
} filter_data_t;
|
||||
|
||||
typedef struct filter_instance {
|
||||
ns_plugin_t *module;
|
||||
isc_mem_t *mctx;
|
||||
|
||||
/*
|
||||
* Memory pool for use with persistent data.
|
||||
*/
|
||||
isc_mempool_t *datapool;
|
||||
isc_mutex_t plock;
|
||||
|
||||
/*
|
||||
* Hash table associating a client object with its persistent data.
|
||||
*/
|
||||
isc_ht_t *ht;
|
||||
isc_mutex_t hlock;
|
||||
|
||||
/*
|
||||
* Values configured when the module is loaded.
|
||||
*/
|
||||
filter_a_t v4_a;
|
||||
filter_a_t v6_a;
|
||||
dns_acl_t *a_acl;
|
||||
} filter_instance_t;
|
||||
|
||||
/*
|
||||
* Per-client flags set by this module
|
||||
*/
|
||||
#define FILTER_A_RECURSING 0x0001 /* Recursing for AAAA */
|
||||
#define FILTER_A_FILTERED 0x0002 /* A was removed from answer */
|
||||
|
||||
/*
|
||||
* Client attribute tests.
|
||||
*/
|
||||
#define WANTDNSSEC(c) (((c)->attributes & NS_CLIENTATTR_WANTDNSSEC) != 0)
|
||||
#define RECURSIONOK(c) (((c)->query.attributes & NS_QUERYATTR_RECURSIONOK) != 0)
|
||||
|
||||
/*
|
||||
* Forward declarations of functions referenced in install_hooks().
|
||||
*/
|
||||
static ns_hookresult_t
|
||||
filter_qctx_initialize(void *arg, void *cbdata, isc_result_t *resp);
|
||||
static ns_hookresult_t
|
||||
filter_respond_begin(void *arg, void *cbdata, isc_result_t *resp);
|
||||
static ns_hookresult_t
|
||||
filter_respond_any_found(void *arg, void *cbdata, isc_result_t *resp);
|
||||
static ns_hookresult_t
|
||||
filter_prep_response_begin(void *arg, void *cbdata, isc_result_t *resp);
|
||||
static ns_hookresult_t
|
||||
filter_query_done_send(void *arg, void *cbdata, isc_result_t *resp);
|
||||
static ns_hookresult_t
|
||||
filter_qctx_destroy(void *arg, void *cbdata, isc_result_t *resp);
|
||||
|
||||
/*%
|
||||
* Register the functions to be called at each hook point in 'hooktable', using
|
||||
* memory context 'mctx' for allocating copies of stack-allocated structures
|
||||
* passed to ns_hook_add(). Make sure 'inst' will be passed as the 'cbdata'
|
||||
* argument to every callback.
|
||||
*/
|
||||
static void
|
||||
install_hooks(ns_hooktable_t *hooktable, isc_mem_t *mctx,
|
||||
filter_instance_t *inst) {
|
||||
const ns_hook_t filter_init = {
|
||||
.action = filter_qctx_initialize,
|
||||
.action_data = inst,
|
||||
};
|
||||
|
||||
const ns_hook_t filter_respbegin = {
|
||||
.action = filter_respond_begin,
|
||||
.action_data = inst,
|
||||
};
|
||||
|
||||
const ns_hook_t filter_respanyfound = {
|
||||
.action = filter_respond_any_found,
|
||||
.action_data = inst,
|
||||
};
|
||||
|
||||
const ns_hook_t filter_prepresp = {
|
||||
.action = filter_prep_response_begin,
|
||||
.action_data = inst,
|
||||
};
|
||||
|
||||
const ns_hook_t filter_donesend = {
|
||||
.action = filter_query_done_send,
|
||||
.action_data = inst,
|
||||
};
|
||||
|
||||
const ns_hook_t filter_destroy = {
|
||||
.action = filter_qctx_destroy,
|
||||
.action_data = inst,
|
||||
};
|
||||
|
||||
ns_hook_add(hooktable, mctx, NS_QUERY_QCTX_INITIALIZED, &filter_init);
|
||||
ns_hook_add(hooktable, mctx, NS_QUERY_RESPOND_BEGIN, &filter_respbegin);
|
||||
ns_hook_add(hooktable, mctx, NS_QUERY_RESPOND_ANY_FOUND,
|
||||
&filter_respanyfound);
|
||||
ns_hook_add(hooktable, mctx, NS_QUERY_PREP_RESPONSE_BEGIN,
|
||||
&filter_prepresp);
|
||||
ns_hook_add(hooktable, mctx, NS_QUERY_DONE_SEND, &filter_donesend);
|
||||
ns_hook_add(hooktable, mctx, NS_QUERY_QCTX_DESTROYED, &filter_destroy);
|
||||
}
|
||||
|
||||
/**
|
||||
** Support for parsing of parameters and configuration of the module.
|
||||
**/
|
||||
|
||||
/*
|
||||
* Support for parsing of parameters.
|
||||
*/
|
||||
static const char *filter_a_enums[] = { "break-dnssec", NULL };
|
||||
|
||||
static isc_result_t
|
||||
parse_filter_a(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
|
||||
return (cfg_parse_enum_or_other(pctx, type, &cfg_type_boolean, ret));
|
||||
}
|
||||
|
||||
static void
|
||||
doc_filter_a(cfg_printer_t *pctx, const cfg_type_t *type) {
|
||||
cfg_doc_enum_or_other(pctx, type, &cfg_type_boolean);
|
||||
}
|
||||
|
||||
static cfg_type_t cfg_type_filter_a = {
|
||||
"filter_a", parse_filter_a, cfg_print_ustring,
|
||||
doc_filter_a, &cfg_rep_string, filter_a_enums,
|
||||
};
|
||||
|
||||
static cfg_clausedef_t param_clauses[] = {
|
||||
{ "filter-a", &cfg_type_bracketed_aml, 0 },
|
||||
{ "filter-a-on-v6", &cfg_type_filter_a, 0 },
|
||||
{ "filter-a-on-v4", &cfg_type_filter_a, 0 },
|
||||
};
|
||||
|
||||
static cfg_clausedef_t *param_clausesets[] = { param_clauses, NULL };
|
||||
|
||||
static cfg_type_t cfg_type_parameters = { "filter-a-params", cfg_parse_mapbody,
|
||||
cfg_print_mapbody, cfg_doc_mapbody,
|
||||
&cfg_rep_map, param_clausesets };
|
||||
|
||||
static isc_result_t
|
||||
parse_filter_a_on(const cfg_obj_t *param_obj, const char *param_name,
|
||||
filter_a_t *dstp) {
|
||||
const cfg_obj_t *obj = NULL;
|
||||
isc_result_t result;
|
||||
|
||||
result = cfg_map_get(param_obj, param_name, &obj);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
return (ISC_R_SUCCESS);
|
||||
}
|
||||
|
||||
if (cfg_obj_isboolean(obj)) {
|
||||
if (cfg_obj_asboolean(obj)) {
|
||||
*dstp = FILTER;
|
||||
} else {
|
||||
*dstp = NONE;
|
||||
}
|
||||
} else if (strcasecmp(cfg_obj_asstring(obj), "break-dnssec") == 0) {
|
||||
*dstp = BREAK_DNSSEC;
|
||||
} else {
|
||||
result = ISC_R_UNEXPECTED;
|
||||
}
|
||||
|
||||
return (result);
|
||||
}
|
||||
|
||||
static isc_result_t
|
||||
check_syntax(cfg_obj_t *fmap, const void *cfg, isc_mem_t *mctx, isc_log_t *lctx,
|
||||
void *actx) {
|
||||
isc_result_t result = ISC_R_SUCCESS;
|
||||
const cfg_obj_t *aclobj = NULL;
|
||||
dns_acl_t *acl = NULL;
|
||||
filter_a_t f4 = NONE, f6 = NONE;
|
||||
|
||||
cfg_map_get(fmap, "filter-a", &aclobj);
|
||||
if (aclobj == NULL) {
|
||||
return (result);
|
||||
}
|
||||
|
||||
CHECK(cfg_acl_fromconfig(aclobj, (const cfg_obj_t *)cfg, lctx,
|
||||
(cfg_aclconfctx_t *)actx, mctx, 0, &acl));
|
||||
|
||||
CHECK(parse_filter_a_on(fmap, "filter-a-on-v6", &f6));
|
||||
CHECK(parse_filter_a_on(fmap, "filter-a-on-v4", &f4));
|
||||
|
||||
if ((f4 != NONE || f6 != NONE) && dns_acl_isnone(acl)) {
|
||||
cfg_obj_log(aclobj, lctx, ISC_LOG_WARNING,
|
||||
"\"filter-a\" is 'none;' but "
|
||||
"either filter-a-on-v6 or filter-a-on-v4 "
|
||||
"is enabled");
|
||||
result = ISC_R_FAILURE;
|
||||
} else if (f4 == NONE && f6 == NONE && !dns_acl_isnone(acl)) {
|
||||
cfg_obj_log(aclobj, lctx, ISC_LOG_WARNING,
|
||||
"\"filter-a\" is set but "
|
||||
"neither filter-a-on-v6 or filter-a-on-v4 "
|
||||
"is enabled");
|
||||
result = ISC_R_FAILURE;
|
||||
}
|
||||
|
||||
cleanup:
|
||||
if (acl != NULL) {
|
||||
dns_acl_detach(&acl);
|
||||
}
|
||||
|
||||
return (result);
|
||||
}
|
||||
|
||||
static isc_result_t
|
||||
parse_parameters(filter_instance_t *inst, const char *parameters,
|
||||
const void *cfg, const char *cfg_file, unsigned long cfg_line,
|
||||
isc_mem_t *mctx, isc_log_t *lctx, void *actx) {
|
||||
isc_result_t result = ISC_R_SUCCESS;
|
||||
cfg_parser_t *parser = NULL;
|
||||
cfg_obj_t *param_obj = NULL;
|
||||
const cfg_obj_t *obj = NULL;
|
||||
isc_buffer_t b;
|
||||
|
||||
CHECK(cfg_parser_create(mctx, lctx, &parser));
|
||||
|
||||
isc_buffer_constinit(&b, parameters, strlen(parameters));
|
||||
isc_buffer_add(&b, strlen(parameters));
|
||||
CHECK(cfg_parse_buffer(parser, &b, cfg_file, cfg_line,
|
||||
&cfg_type_parameters, 0, ¶m_obj));
|
||||
|
||||
CHECK(check_syntax(param_obj, cfg, mctx, lctx, actx));
|
||||
|
||||
CHECK(parse_filter_a_on(param_obj, "filter-a-on-v6", &inst->v6_a));
|
||||
CHECK(parse_filter_a_on(param_obj, "filter-a-on-v4", &inst->v4_a));
|
||||
|
||||
result = cfg_map_get(param_obj, "filter-a", &obj);
|
||||
if (result == ISC_R_SUCCESS) {
|
||||
CHECK(cfg_acl_fromconfig(obj, (const cfg_obj_t *)cfg, lctx,
|
||||
(cfg_aclconfctx_t *)actx, mctx, 0,
|
||||
&inst->a_acl));
|
||||
} else {
|
||||
CHECK(dns_acl_any(mctx, &inst->a_acl));
|
||||
}
|
||||
|
||||
cleanup:
|
||||
if (param_obj != NULL) {
|
||||
cfg_obj_destroy(parser, ¶m_obj);
|
||||
}
|
||||
if (parser != NULL) {
|
||||
cfg_parser_destroy(&parser);
|
||||
}
|
||||
return (result);
|
||||
}
|
||||
|
||||
/**
|
||||
** Mandatory plugin API functions:
|
||||
**
|
||||
** - plugin_destroy
|
||||
** - plugin_register
|
||||
** - plugin_version
|
||||
** - plugin_check
|
||||
**/
|
||||
|
||||
/*
|
||||
* Called by ns_plugin_register() to initialize the plugin and
|
||||
* register hook functions into the view hook table.
|
||||
*/
|
||||
isc_result_t
|
||||
plugin_register(const char *parameters, const void *cfg, const char *cfg_file,
|
||||
unsigned long cfg_line, isc_mem_t *mctx, isc_log_t *lctx,
|
||||
void *actx, ns_hooktable_t *hooktable, void **instp) {
|
||||
filter_instance_t *inst = NULL;
|
||||
isc_result_t result;
|
||||
|
||||
isc_log_write(lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_HOOKS,
|
||||
ISC_LOG_INFO,
|
||||
"registering 'filter-a' "
|
||||
"module from %s:%lu, %s parameters",
|
||||
cfg_file, cfg_line, parameters != NULL ? "with" : "no");
|
||||
|
||||
inst = isc_mem_get(mctx, sizeof(*inst));
|
||||
memset(inst, 0, sizeof(*inst));
|
||||
isc_mem_attach(mctx, &inst->mctx);
|
||||
|
||||
if (parameters != NULL) {
|
||||
CHECK(parse_parameters(inst, parameters, cfg, cfg_file,
|
||||
cfg_line, mctx, lctx, actx));
|
||||
}
|
||||
|
||||
isc_mempool_create(mctx, sizeof(filter_data_t), &inst->datapool);
|
||||
CHECK(isc_ht_init(&inst->ht, mctx, 16));
|
||||
isc_mutex_init(&inst->hlock);
|
||||
|
||||
/*
|
||||
* Fill the mempool with 1K filter_a state objects at
|
||||
* a time; ideally after a single allocation, the mempool will
|
||||
* have enough to handle all the simultaneous queries the system
|
||||
* requires and it won't be necessary to allocate more.
|
||||
*
|
||||
* We don't set any limit on the number of free state objects
|
||||
* so that they'll always be returned to the pool and not
|
||||
* freed until the pool is destroyed on shutdown.
|
||||
*/
|
||||
isc_mempool_setfillcount(inst->datapool, 1024);
|
||||
isc_mempool_setfreemax(inst->datapool, UINT_MAX);
|
||||
isc_mutex_init(&inst->plock);
|
||||
isc_mempool_associatelock(inst->datapool, &inst->plock);
|
||||
|
||||
/*
|
||||
* Set hook points in the view's hooktable.
|
||||
*/
|
||||
install_hooks(hooktable, mctx, inst);
|
||||
|
||||
*instp = inst;
|
||||
|
||||
cleanup:
|
||||
if (result != ISC_R_SUCCESS && inst != NULL) {
|
||||
plugin_destroy((void **)&inst);
|
||||
}
|
||||
|
||||
return (result);
|
||||
}
|
||||
|
||||
isc_result_t
|
||||
plugin_check(const char *parameters, const void *cfg, const char *cfg_file,
|
||||
unsigned long cfg_line, isc_mem_t *mctx, isc_log_t *lctx,
|
||||
void *actx) {
|
||||
isc_result_t result = ISC_R_SUCCESS;
|
||||
cfg_parser_t *parser = NULL;
|
||||
cfg_obj_t *param_obj = NULL;
|
||||
isc_buffer_t b;
|
||||
|
||||
CHECK(cfg_parser_create(mctx, lctx, &parser));
|
||||
|
||||
isc_buffer_constinit(&b, parameters, strlen(parameters));
|
||||
isc_buffer_add(&b, strlen(parameters));
|
||||
CHECK(cfg_parse_buffer(parser, &b, cfg_file, cfg_line,
|
||||
&cfg_type_parameters, 0, ¶m_obj));
|
||||
|
||||
CHECK(check_syntax(param_obj, cfg, mctx, lctx, actx));
|
||||
|
||||
cleanup:
|
||||
if (param_obj != NULL) {
|
||||
cfg_obj_destroy(parser, ¶m_obj);
|
||||
}
|
||||
if (parser != NULL) {
|
||||
cfg_parser_destroy(&parser);
|
||||
}
|
||||
return (result);
|
||||
}
|
||||
|
||||
/*
|
||||
* Called by ns_plugins_free(); frees memory allocated by
|
||||
* the module when it was registered.
|
||||
*/
|
||||
void
|
||||
plugin_destroy(void **instp) {
|
||||
filter_instance_t *inst = (filter_instance_t *)*instp;
|
||||
|
||||
if (inst->ht != NULL) {
|
||||
isc_ht_destroy(&inst->ht);
|
||||
isc_mutex_destroy(&inst->hlock);
|
||||
}
|
||||
if (inst->datapool != NULL) {
|
||||
isc_mempool_destroy(&inst->datapool);
|
||||
isc_mutex_destroy(&inst->plock);
|
||||
}
|
||||
if (inst->a_acl != NULL) {
|
||||
dns_acl_detach(&inst->a_acl);
|
||||
}
|
||||
|
||||
isc_mem_putanddetach(&inst->mctx, inst, sizeof(*inst));
|
||||
*instp = NULL;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns plugin API version for compatibility checks.
|
||||
*/
|
||||
int
|
||||
plugin_version(void) {
|
||||
return (NS_PLUGIN_VERSION);
|
||||
}
|
||||
|
||||
/**
|
||||
** "filter-a" feature implementation begins here.
|
||||
**/
|
||||
|
||||
/*%
|
||||
* Structure describing the filtering to be applied by process_section().
|
||||
*/
|
||||
typedef struct section_filter {
|
||||
query_ctx_t *qctx;
|
||||
filter_a_t mode;
|
||||
dns_section_t section;
|
||||
const dns_name_t *name;
|
||||
dns_rdatatype_t type;
|
||||
bool only_if_aaaa_exists;
|
||||
} section_filter_t;
|
||||
|
||||
/*
|
||||
* Check whether this is an IPv4 client.
|
||||
*/
|
||||
static bool
|
||||
is_v4_client(ns_client_t *client) {
|
||||
if (isc_sockaddr_pf(&client->peeraddr) == AF_INET) {
|
||||
return (true);
|
||||
}
|
||||
if (isc_sockaddr_pf(&client->peeraddr) == AF_INET6 &&
|
||||
IN6_IS_ADDR_V4MAPPED(&client->peeraddr.type.sin6.sin6_addr))
|
||||
{
|
||||
return (true);
|
||||
}
|
||||
return (false);
|
||||
}
|
||||
|
||||
/*
|
||||
* Check whether this is an IPv6 client.
|
||||
*/
|
||||
static bool
|
||||
is_v6_client(ns_client_t *client) {
|
||||
if (isc_sockaddr_pf(&client->peeraddr) == AF_INET6 &&
|
||||
!IN6_IS_ADDR_V4MAPPED(&client->peeraddr.type.sin6.sin6_addr))
|
||||
{
|
||||
return (true);
|
||||
}
|
||||
return (false);
|
||||
}
|
||||
|
||||
static filter_data_t *
|
||||
client_state_get(const query_ctx_t *qctx, filter_instance_t *inst) {
|
||||
filter_data_t *client_state = NULL;
|
||||
isc_result_t result;
|
||||
|
||||
LOCK(&inst->hlock);
|
||||
result = isc_ht_find(inst->ht, (const unsigned char *)&qctx->client,
|
||||
sizeof(qctx->client), (void **)&client_state);
|
||||
UNLOCK(&inst->hlock);
|
||||
|
||||
return (result == ISC_R_SUCCESS ? client_state : NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
client_state_create(const query_ctx_t *qctx, filter_instance_t *inst) {
|
||||
filter_data_t *client_state;
|
||||
isc_result_t result;
|
||||
|
||||
client_state = isc_mempool_get(inst->datapool);
|
||||
if (client_state == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
client_state->mode = NONE;
|
||||
client_state->flags = 0;
|
||||
|
||||
LOCK(&inst->hlock);
|
||||
result = isc_ht_add(inst->ht, (const unsigned char *)&qctx->client,
|
||||
sizeof(qctx->client), client_state);
|
||||
UNLOCK(&inst->hlock);
|
||||
RUNTIME_CHECK(result == ISC_R_SUCCESS);
|
||||
}
|
||||
|
||||
static void
|
||||
client_state_destroy(const query_ctx_t *qctx, filter_instance_t *inst) {
|
||||
filter_data_t *client_state = client_state_get(qctx, inst);
|
||||
isc_result_t result;
|
||||
|
||||
if (client_state == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
LOCK(&inst->hlock);
|
||||
result = isc_ht_delete(inst->ht, (const unsigned char *)&qctx->client,
|
||||
sizeof(qctx->client));
|
||||
UNLOCK(&inst->hlock);
|
||||
RUNTIME_CHECK(result == ISC_R_SUCCESS);
|
||||
|
||||
isc_mempool_put(inst->datapool, client_state);
|
||||
}
|
||||
|
||||
/*%
|
||||
* Mark 'rdataset' and 'sigrdataset' as rendered, gracefully handling NULL
|
||||
* pointers and non-associated rdatasets.
|
||||
*/
|
||||
static void
|
||||
mark_as_rendered(dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset) {
|
||||
if (rdataset != NULL && dns_rdataset_isassociated(rdataset)) {
|
||||
rdataset->attributes |= DNS_RDATASETATTR_RENDERED;
|
||||
}
|
||||
if (sigrdataset != NULL && dns_rdataset_isassociated(sigrdataset)) {
|
||||
sigrdataset->attributes |= DNS_RDATASETATTR_RENDERED;
|
||||
}
|
||||
}
|
||||
|
||||
/*%
|
||||
* Check whether an RRset of given 'type' is present at given 'name'. If
|
||||
* it is found and either it is not signed or the combination of query
|
||||
* flags and configured processing 'mode' allows it, mark the RRset and its
|
||||
* associated signatures as already rendered to prevent them from appearing
|
||||
* in the response message stored in 'qctx'. If 'only_if_aaaa_exists' is
|
||||
* true, an RRset of type AAAA must also exist at 'name' in order for the
|
||||
* above processing to happen.
|
||||
*/
|
||||
static bool
|
||||
process_name(query_ctx_t *qctx, filter_a_t mode, const dns_name_t *name,
|
||||
dns_rdatatype_t type, bool only_if_aaaa_exists) {
|
||||
dns_rdataset_t *rdataset = NULL, *sigrdataset = NULL;
|
||||
isc_result_t result;
|
||||
bool modified = false;
|
||||
|
||||
if (only_if_aaaa_exists) {
|
||||
CHECK(dns_message_findtype(name, dns_rdatatype_aaaa, 0, NULL));
|
||||
}
|
||||
|
||||
(void)dns_message_findtype(name, type, 0, &rdataset);
|
||||
(void)dns_message_findtype(name, dns_rdatatype_rrsig, type,
|
||||
&sigrdataset);
|
||||
|
||||
if (rdataset != NULL &&
|
||||
(sigrdataset == NULL || !WANTDNSSEC(qctx->client) ||
|
||||
mode == BREAK_DNSSEC))
|
||||
{
|
||||
/*
|
||||
* An RRset of given 'type' was found at 'name' and at least
|
||||
* one of the following is true:
|
||||
*
|
||||
* - the RRset is not signed,
|
||||
* - the client did not set the DO bit in its request,
|
||||
* - configuration allows us to tamper with signed responses.
|
||||
*
|
||||
* This means it is okay to filter out this RRset and its
|
||||
* signatures, if any, from the response.
|
||||
*/
|
||||
mark_as_rendered(rdataset, sigrdataset);
|
||||
modified = true;
|
||||
}
|
||||
|
||||
cleanup:
|
||||
return (modified);
|
||||
}
|
||||
|
||||
/*%
|
||||
* Apply the requested section filter, i.e. prevent (when possible, as
|
||||
* determined by process_name()) RRsets of given 'type' from being rendered
|
||||
* in the given 'section' of the response message stored in 'qctx'. Clear
|
||||
* the AD bit if the answer and/or authority section was modified. If
|
||||
* 'name' is NULL, all names in the given 'section' are processed;
|
||||
* otherwise, only 'name' is. 'only_if_aaaa_exists' is passed through to
|
||||
* process_name().
|
||||
*/
|
||||
static void
|
||||
process_section(const section_filter_t *filter) {
|
||||
query_ctx_t *qctx = filter->qctx;
|
||||
filter_a_t mode = filter->mode;
|
||||
dns_section_t section = filter->section;
|
||||
const dns_name_t *name = filter->name;
|
||||
dns_rdatatype_t type = filter->type;
|
||||
bool only_if_aaaa_exists = filter->only_if_aaaa_exists;
|
||||
|
||||
dns_message_t *message = qctx->client->message;
|
||||
isc_result_t result;
|
||||
|
||||
for (result = dns_message_firstname(message, section);
|
||||
result == ISC_R_SUCCESS;
|
||||
result = dns_message_nextname(message, section))
|
||||
{
|
||||
dns_name_t *cur = NULL;
|
||||
dns_message_currentname(message, section, &cur);
|
||||
if (name != NULL && !dns_name_equal(name, cur)) {
|
||||
/*
|
||||
* We only want to process 'name' and this is not it.
|
||||
*/
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!process_name(qctx, mode, cur, type, only_if_aaaa_exists)) {
|
||||
/*
|
||||
* Response was not modified, do not touch the AD bit.
|
||||
*/
|
||||
continue;
|
||||
}
|
||||
|
||||
if (section == DNS_SECTION_ANSWER ||
|
||||
section == DNS_SECTION_AUTHORITY) {
|
||||
message->flags &= ~DNS_MESSAGEFLAG_AD;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize filter state, fetching it from a memory pool and storing it
|
||||
* in a hash table keyed according to the client object; this enables us to
|
||||
* retrieve persistent data related to a client query for as long as the
|
||||
* object persists.
|
||||
*/
|
||||
static ns_hookresult_t
|
||||
filter_qctx_initialize(void *arg, void *cbdata, isc_result_t *resp) {
|
||||
query_ctx_t *qctx = (query_ctx_t *)arg;
|
||||
filter_instance_t *inst = (filter_instance_t *)cbdata;
|
||||
filter_data_t *client_state;
|
||||
|
||||
*resp = ISC_R_UNSET;
|
||||
|
||||
client_state = client_state_get(qctx, inst);
|
||||
if (client_state == NULL) {
|
||||
client_state_create(qctx, inst);
|
||||
}
|
||||
|
||||
return (NS_HOOK_CONTINUE);
|
||||
}
|
||||
|
||||
/*
|
||||
* Determine whether this client should have A filtered or not, based on
|
||||
* the client address family and the settings of filter-a-on-v6 and
|
||||
* filter-a-on-v4.
|
||||
*/
|
||||
static ns_hookresult_t
|
||||
filter_prep_response_begin(void *arg, void *cbdata, isc_result_t *resp) {
|
||||
query_ctx_t *qctx = (query_ctx_t *)arg;
|
||||
filter_instance_t *inst = (filter_instance_t *)cbdata;
|
||||
filter_data_t *client_state = client_state_get(qctx, inst);
|
||||
isc_result_t result;
|
||||
|
||||
*resp = ISC_R_UNSET;
|
||||
|
||||
if (client_state == NULL) {
|
||||
return (NS_HOOK_CONTINUE);
|
||||
}
|
||||
|
||||
if (inst->v4_a != NONE || inst->v6_a != NONE) {
|
||||
result = ns_client_checkaclsilent(qctx->client, NULL,
|
||||
inst->a_acl, true);
|
||||
if (result == ISC_R_SUCCESS && inst->v4_a != NONE &&
|
||||
is_v4_client(qctx->client)) {
|
||||
client_state->mode = inst->v4_a;
|
||||
} else if (result == ISC_R_SUCCESS && inst->v6_a != NONE &&
|
||||
is_v6_client(qctx->client))
|
||||
{
|
||||
client_state->mode = inst->v6_a;
|
||||
}
|
||||
}
|
||||
|
||||
return (NS_HOOK_CONTINUE);
|
||||
}
|
||||
|
||||
/*
|
||||
* Hide A rrsets if there is a matching AAAA. Trigger recursion if
|
||||
* necessary to find out whether an AAAA exists.
|
||||
*
|
||||
* (This version is for processing answers to explicit A queries; ANY
|
||||
* queries are handled in filter_respond_any_found().)
|
||||
*/
|
||||
static ns_hookresult_t
|
||||
filter_respond_begin(void *arg, void *cbdata, isc_result_t *resp) {
|
||||
query_ctx_t *qctx = (query_ctx_t *)arg;
|
||||
filter_instance_t *inst = (filter_instance_t *)cbdata;
|
||||
filter_data_t *client_state = client_state_get(qctx, inst);
|
||||
isc_result_t result = ISC_R_UNSET;
|
||||
|
||||
*resp = ISC_R_UNSET;
|
||||
|
||||
if (client_state == NULL) {
|
||||
return (NS_HOOK_CONTINUE);
|
||||
}
|
||||
|
||||
if (client_state->mode != BREAK_DNSSEC &&
|
||||
(client_state->mode != FILTER ||
|
||||
(WANTDNSSEC(qctx->client) && qctx->sigrdataset != NULL &&
|
||||
dns_rdataset_isassociated(qctx->sigrdataset))))
|
||||
{
|
||||
return (NS_HOOK_CONTINUE);
|
||||
}
|
||||
|
||||
if (qctx->qtype == dns_rdatatype_a) {
|
||||
dns_rdataset_t *trdataset;
|
||||
trdataset = ns_client_newrdataset(qctx->client);
|
||||
result = dns_db_findrdataset(
|
||||
qctx->db, qctx->node, qctx->version, dns_rdatatype_aaaa,
|
||||
0, qctx->client->now, trdataset, NULL);
|
||||
if (dns_rdataset_isassociated(trdataset)) {
|
||||
dns_rdataset_disassociate(trdataset);
|
||||
}
|
||||
ns_client_putrdataset(qctx->client, &trdataset);
|
||||
|
||||
/*
|
||||
* We found an A. If we also found an AAAA, then the A
|
||||
* must not be rendered.
|
||||
*
|
||||
* If the AAAA is not in our cache, then any result other than
|
||||
* DNS_R_DELEGATION or ISC_R_NOTFOUND means there is no AAAAA,
|
||||
* and so AAAAs are okay.
|
||||
*
|
||||
* We assume there is no AAAA if we can't recurse for this
|
||||
* client. That might be the wrong answer, but what else
|
||||
* can we do? Besides, the fact that we have the A and
|
||||
* are using this mechanism in the first place suggests
|
||||
* that we care more about AAAAs than As, and would have
|
||||
* cached an AAAA if it existed.
|
||||
*/
|
||||
if (result == ISC_R_SUCCESS) {
|
||||
mark_as_rendered(qctx->rdataset, qctx->sigrdataset);
|
||||
qctx->client->message->flags &= ~DNS_MESSAGEFLAG_AD;
|
||||
client_state->flags |= FILTER_A_FILTERED;
|
||||
} else if (!qctx->authoritative && RECURSIONOK(qctx->client) &&
|
||||
(result == DNS_R_DELEGATION ||
|
||||
result == ISC_R_NOTFOUND))
|
||||
{
|
||||
/*
|
||||
* This is an ugly kludge to recurse
|
||||
* for the AAAA and discard the result.???
|
||||
*
|
||||
* Continue to add the A now.
|
||||
* We'll make a note to not render it
|
||||
* if the recursion for the AAAA succeeds.
|
||||
*/
|
||||
result = ns_query_recurse(qctx->client,
|
||||
dns_rdatatype_aaaa,
|
||||
qctx->client->query.qname,
|
||||
NULL, NULL, qctx->resuming);
|
||||
if (result == ISC_R_SUCCESS) {
|
||||
client_state->flags |= FILTER_A_RECURSING;
|
||||
qctx->client->query.attributes |=
|
||||
NS_QUERYATTR_RECURSING;
|
||||
}
|
||||
}
|
||||
} else if (qctx->qtype == dns_rdatatype_aaaa &&
|
||||
(client_state->flags & FILTER_A_RECURSING) != 0)
|
||||
{
|
||||
const section_filter_t filter_answer = {
|
||||
.qctx = qctx,
|
||||
.mode = client_state->mode,
|
||||
.section = DNS_SECTION_ANSWER,
|
||||
.name = qctx->fname,
|
||||
.type = dns_rdatatype_a,
|
||||
};
|
||||
process_section(&filter_answer);
|
||||
|
||||
client_state->flags &= ~FILTER_A_RECURSING;
|
||||
|
||||
result = ns_query_done(qctx);
|
||||
|
||||
*resp = result;
|
||||
|
||||
return (NS_HOOK_RETURN);
|
||||
}
|
||||
|
||||
*resp = result;
|
||||
return (NS_HOOK_CONTINUE);
|
||||
}
|
||||
|
||||
/*
|
||||
* When answering an ANY query, remove A if AAAA is present.
|
||||
*/
|
||||
static ns_hookresult_t
|
||||
filter_respond_any_found(void *arg, void *cbdata, isc_result_t *resp) {
|
||||
query_ctx_t *qctx = (query_ctx_t *)arg;
|
||||
filter_instance_t *inst = (filter_instance_t *)cbdata;
|
||||
filter_data_t *client_state = client_state_get(qctx, inst);
|
||||
|
||||
*resp = ISC_R_UNSET;
|
||||
|
||||
if (client_state != NULL && client_state->mode != NONE) {
|
||||
/*
|
||||
* If we are authoritative, require an AAAA record to be
|
||||
* present before filtering out A records; otherwise,
|
||||
* just assume an AAAA record exists even if it was not in the
|
||||
* cache (and therefore is not in the response message),
|
||||
* thus proceeding with filtering out A records.
|
||||
*/
|
||||
const section_filter_t filter_answer = {
|
||||
.qctx = qctx,
|
||||
.mode = client_state->mode,
|
||||
.section = DNS_SECTION_ANSWER,
|
||||
.name = qctx->tname,
|
||||
.type = dns_rdatatype_a,
|
||||
.only_if_aaaa_exists = qctx->authoritative,
|
||||
};
|
||||
process_section(&filter_answer);
|
||||
}
|
||||
|
||||
return (NS_HOOK_CONTINUE);
|
||||
}
|
||||
|
||||
/*
|
||||
* Hide A rrsets in the additional section if there is a matching AAAA, and
|
||||
* hide NS in the authority section if A was filtered in the answer
|
||||
* section.
|
||||
*/
|
||||
static ns_hookresult_t
|
||||
filter_query_done_send(void *arg, void *cbdata, isc_result_t *resp) {
|
||||
query_ctx_t *qctx = (query_ctx_t *)arg;
|
||||
filter_instance_t *inst = (filter_instance_t *)cbdata;
|
||||
filter_data_t *client_state = client_state_get(qctx, inst);
|
||||
|
||||
*resp = ISC_R_UNSET;
|
||||
|
||||
if (client_state != NULL && client_state->mode != NONE) {
|
||||
const section_filter_t filter_additional = {
|
||||
.qctx = qctx,
|
||||
.mode = client_state->mode,
|
||||
.section = DNS_SECTION_ADDITIONAL,
|
||||
.type = dns_rdatatype_a,
|
||||
.only_if_aaaa_exists = true,
|
||||
};
|
||||
process_section(&filter_additional);
|
||||
|
||||
if ((client_state->flags & FILTER_A_FILTERED) != 0) {
|
||||
const section_filter_t filter_authority = {
|
||||
.qctx = qctx,
|
||||
.mode = client_state->mode,
|
||||
.section = DNS_SECTION_AUTHORITY,
|
||||
.type = dns_rdatatype_ns,
|
||||
};
|
||||
process_section(&filter_authority);
|
||||
}
|
||||
}
|
||||
|
||||
return (NS_HOOK_CONTINUE);
|
||||
}
|
||||
|
||||
/*
|
||||
* If the client is being detached, then we can delete our persistent data
|
||||
* from hash table and return it to the memory pool.
|
||||
*/
|
||||
static ns_hookresult_t
|
||||
filter_qctx_destroy(void *arg, void *cbdata, isc_result_t *resp) {
|
||||
query_ctx_t *qctx = (query_ctx_t *)arg;
|
||||
filter_instance_t *inst = (filter_instance_t *)cbdata;
|
||||
|
||||
*resp = ISC_R_UNSET;
|
||||
|
||||
if (!qctx->detach_client) {
|
||||
return (NS_HOOK_CONTINUE);
|
||||
}
|
||||
|
||||
client_state_destroy(qctx, inst);
|
||||
|
||||
return (NS_HOOK_CONTINUE);
|
||||
}
|
||||
@@ -1,95 +0,0 @@
|
||||
..
|
||||
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.
|
||||
|
||||
..
|
||||
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 http://mozilla.org/MPL/2.0/.
|
||||
|
||||
See the COPYRIGHT file distributed with this work for additional
|
||||
information regarding copyright ownership.
|
||||
|
||||
|
||||
.. highlight: console
|
||||
|
||||
.. _man_filter-a:
|
||||
|
||||
filter-a.so - filter A in DNS responses when AAAA is present
|
||||
---------------------------------------------------------------
|
||||
|
||||
Synopsis
|
||||
~~~~~~~~
|
||||
|
||||
:program:`plugin query` "filter-a.so" [{ parameters }];
|
||||
|
||||
Description
|
||||
~~~~~~~~~~~
|
||||
|
||||
``filter-a.so`` is a query plugin module for ``named``, enabling
|
||||
``named`` to omit some IPv4 addresses when responding to clients.
|
||||
|
||||
For example:
|
||||
|
||||
::
|
||||
|
||||
plugin query "/usr/local/lib/filter-a.so" {
|
||||
filter-a-on-v6 yes;
|
||||
filter-a-on-v4 yes;
|
||||
filter-a { 192.0.2.1; 2001:db8:2::1; };
|
||||
};
|
||||
|
||||
This module is intended to aid transition from IPv4 to IPv6 by
|
||||
withholding IPv4 addresses from DNS clients which are not connected to
|
||||
the IPv4 Internet, when the name being looked up has an IPv6 address
|
||||
available. Use of this module is not recommended unless absolutely
|
||||
necessary.
|
||||
|
||||
Note: This mechanism can erroneously cause other servers not to give
|
||||
A records to their clients. If a recursing server with both IPv6 and
|
||||
IPv4 network connections queries an authoritative server using this
|
||||
mechanism via IPv6, it is denied A records even if its client is
|
||||
using IPv4.
|
||||
|
||||
Options
|
||||
~~~~~~~
|
||||
|
||||
``filter-a``
|
||||
This option specifies a list of client addresses for which A filtering is to
|
||||
be applied. The default is ``any``.
|
||||
|
||||
``filter-a-on-v6``
|
||||
If set to ``yes``, this option indicates that the DNS client is at an IPv6 address, in
|
||||
``filter-a``. If the response does not include DNSSEC
|
||||
signatures, then all A records are deleted from the response. This
|
||||
filtering applies to all responses, not only authoritative
|
||||
ones.
|
||||
|
||||
If set to ``break-dnssec``, then A records are deleted even when
|
||||
DNSSEC is enabled. As suggested by the name, this causes the response
|
||||
to fail to verify, because the DNSSEC protocol is designed to detect
|
||||
deletions.
|
||||
|
||||
This mechanism can erroneously cause other servers not to give A
|
||||
records to their clients. If a recursing server with both IPv6 and IPv4
|
||||
network connections queries an authoritative server using this
|
||||
mechanism via IPv6, it is denied A records even if its client is
|
||||
using IPv4.
|
||||
|
||||
``filter-a-on-v4``
|
||||
This option is identical to ``filter-a-on-v6``, except that it filters A responses
|
||||
to queries from IPv4 clients instead of IPv6 clients. To filter all
|
||||
responses, set both options to ``yes``.
|
||||
|
||||
See Also
|
||||
~~~~~~~~
|
||||
|
||||
BIND 9 Administrator Reference Manual.
|
||||
+14
-6
@@ -22,7 +22,6 @@
|
||||
#include <isc/commandline.h>
|
||||
#include <isc/file.h>
|
||||
#include <isc/log.h>
|
||||
#include <isc/managers.h>
|
||||
#include <isc/mem.h>
|
||||
#include <isc/net.h>
|
||||
#include <isc/netmgr.h>
|
||||
@@ -60,7 +59,6 @@
|
||||
const char *progname = NULL;
|
||||
bool verbose;
|
||||
|
||||
static isc_nm_t *netmgr = NULL;
|
||||
static isc_taskmgr_t *taskmgr = NULL;
|
||||
static isc_task_t *rndc_task = NULL;
|
||||
|
||||
@@ -74,6 +72,7 @@ static bool local4set = false, local6set = false;
|
||||
static int nserveraddrs;
|
||||
static int currentaddr = 0;
|
||||
static unsigned int remoteport = 0;
|
||||
static isc_nm_t *netmgr = NULL;
|
||||
static isc_buffer_t *databuf = NULL;
|
||||
static isccc_ccmsg_t rndc_ccmsg;
|
||||
static uint32_t algorithm;
|
||||
@@ -575,6 +574,7 @@ rndc_connected(isc_nmhandle_t *handle, isc_result_t result, void *arg) {
|
||||
|
||||
static void
|
||||
rndc_startconnect(isc_sockaddr_t *addr) {
|
||||
isc_result_t result;
|
||||
char socktext[ISC_SOCKADDR_FORMATSIZE];
|
||||
isc_sockaddr_t *local = NULL;
|
||||
|
||||
@@ -600,8 +600,10 @@ rndc_startconnect(isc_sockaddr_t *addr) {
|
||||
}
|
||||
|
||||
atomic_fetch_add_relaxed(&connects, 1);
|
||||
isc_nm_tcpconnect(netmgr, local, addr, rndc_connected, &rndc_ccmsg,
|
||||
60000, 0);
|
||||
DO("create connection",
|
||||
isc_nm_tcpconnect(netmgr, (isc_nmiface_t *)local,
|
||||
(isc_nmiface_t *)addr, rndc_connected, &rndc_ccmsg,
|
||||
10000, 0));
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1031,7 +1033,9 @@ main(int argc, char **argv) {
|
||||
serial = isc_random32();
|
||||
|
||||
isc_mem_create(&rndc_mctx);
|
||||
isc_managers_create(rndc_mctx, 1, 0, 0, &netmgr, &taskmgr, NULL, NULL);
|
||||
netmgr = isc_nm_start(rndc_mctx, 1);
|
||||
DO("create task manager",
|
||||
isc_taskmgr_create(rndc_mctx, 1, 0, netmgr, &taskmgr));
|
||||
DO("create task", isc_task_create(taskmgr, 0, &rndc_task));
|
||||
isc_log_create(rndc_mctx, &log, &logconfig);
|
||||
isc_log_setcontext(log);
|
||||
@@ -1088,7 +1092,9 @@ main(int argc, char **argv) {
|
||||
}
|
||||
|
||||
isc_task_detach(&rndc_task);
|
||||
isc_managers_destroy(&netmgr, &taskmgr, NULL, NULL);
|
||||
isc_taskmgr_destroy(&taskmgr);
|
||||
|
||||
isc_nm_closedown(netmgr);
|
||||
|
||||
/*
|
||||
* Note: when TCP connections are shut down, there will be a final
|
||||
@@ -1098,6 +1104,8 @@ main(int argc, char **argv) {
|
||||
*/
|
||||
isccc_ccmsg_invalidate(&rndc_ccmsg);
|
||||
|
||||
isc_nm_destroy(&netmgr);
|
||||
|
||||
isc_log_destroy(&log);
|
||||
isc_log_setcontext(NULL);
|
||||
|
||||
|
||||
+1
-1
@@ -136,7 +136,7 @@ Currently supported commands are:
|
||||
This sample ``addzone`` command adds the zone ``example.com`` to
|
||||
the default view:
|
||||
|
||||
``rndc addzone example.com '{ type master; file "example.com.db"; };'``
|
||||
``$ \ rndc addzone example.com '{ type master; file "example.com.db"; };'``
|
||||
|
||||
(Note the brackets around and semi-colon after the zone configuration
|
||||
text.)
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
.libs
|
||||
headerdep_test.sh
|
||||
nxtify
|
||||
sdig
|
||||
*_test
|
||||
@@ -8,6 +9,3 @@ dlopen
|
||||
keycreate
|
||||
keydelete
|
||||
gssapi_krb
|
||||
/wire_test
|
||||
/test_client
|
||||
/test_server
|
||||
|
||||
+3
-23
@@ -2,33 +2,13 @@ include $(top_srcdir)/Makefile.top
|
||||
|
||||
SUBDIRS = system
|
||||
|
||||
noinst_PROGRAMS = \
|
||||
test_client \
|
||||
test_server \
|
||||
wire_test
|
||||
noinst_PROGRAMS = wire_test
|
||||
|
||||
test_client_CPPFLAGS = \
|
||||
$(AM_CPPFLAGS) \
|
||||
$(LIBISC_CFLAGS)
|
||||
|
||||
test_client_LDADD = \
|
||||
$(LIBISC_LIBS) \
|
||||
$(LIBDNS_LIBS)
|
||||
|
||||
test_server_CPPFLAGS = \
|
||||
$(AM_CPPFLAGS) \
|
||||
$(LIBISC_CFLAGS)
|
||||
|
||||
test_server_LDADD = \
|
||||
$(LIBISC_LIBS) \
|
||||
$(LIBDNS_LIBS)
|
||||
|
||||
wire_test_CPPFLAGS = \
|
||||
$(AM_CPPFLAGS) \
|
||||
AM_CPPFLAGS += \
|
||||
$(LIBISC_CFLAGS) \
|
||||
$(LIBDNS_CFLAGS)
|
||||
|
||||
wire_test_LDADD = \
|
||||
LDADD = \
|
||||
$(LIBISC_LIBS) \
|
||||
$(LIBDNS_LIBS)
|
||||
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# 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.
|
||||
|
||||
#
|
||||
# Check the installed bind9 headers to make sure that no header
|
||||
# depends on another header having been included first.
|
||||
#
|
||||
|
||||
prefix=@prefix@
|
||||
tmp=/tmp/thdr$$.tmp
|
||||
|
||||
status=0
|
||||
|
||||
echo "Checking for header interdependencies..."
|
||||
|
||||
# Make a list of header files.
|
||||
(cd $prefix/include; find . -name '*.h' -print | sed 's!^./!!') > $tmp
|
||||
|
||||
# Check each header.
|
||||
while read h
|
||||
do
|
||||
echo " - <$h>"
|
||||
|
||||
# Build a test program.
|
||||
cat <<EOF >test.c
|
||||
#include <$h>
|
||||
EOF
|
||||
|
||||
# Compile the test program.
|
||||
if
|
||||
gcc @STD_CWARNINGS@ @STD_CINCLUDES@ -I$prefix/include -c test.c 2>&1
|
||||
then
|
||||
:
|
||||
else
|
||||
status=1
|
||||
fi
|
||||
done <$tmp
|
||||
|
||||
rm -f test.c test.o $tmp
|
||||
|
||||
exit $status
|
||||
@@ -26,6 +26,9 @@
|
||||
// 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";
|
||||
@@ -262,6 +265,8 @@ view "test-view" in {
|
||||
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 master warn;
|
||||
check-names slave ignore;
|
||||
@@ -413,6 +418,9 @@ server 1.2.3.4 {
|
||||
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 {
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
.cache
|
||||
__pycache__
|
||||
dig.out*
|
||||
rndc.out*
|
||||
@@ -14,7 +13,8 @@ named.run
|
||||
parallel.mk
|
||||
/*.log
|
||||
/*.trs
|
||||
/resolve
|
||||
/get_ports.state
|
||||
/get_ports.lock
|
||||
/run.sh
|
||||
/run.log
|
||||
/start.sh
|
||||
|
||||
@@ -9,7 +9,7 @@ dist-hook:
|
||||
sed -n "s|^Would remove \(.*\)|$(distdir)/\1|p" | \
|
||||
xargs -I{} rm -rf "{}"
|
||||
|
||||
SUBDIRS = dyndb/driver dlzexternal/driver hooks/driver
|
||||
SUBDIRS = dyndb/driver dlzexternal/driver
|
||||
|
||||
AM_CPPFLAGS += \
|
||||
$(LIBISC_CFLAGS)
|
||||
@@ -23,7 +23,6 @@ check_PROGRAMS = \
|
||||
feature-test \
|
||||
makejournal \
|
||||
pipelined/pipequeries \
|
||||
resolve \
|
||||
rndc/gencheck \
|
||||
rpz/dnsrps \
|
||||
tkey/keycreate \
|
||||
@@ -49,14 +48,6 @@ pipelined_pipequeries_LDADD = \
|
||||
$(LDADD) \
|
||||
$(LIBDNS_LIBS)
|
||||
|
||||
resolve_CPPFLAGS = \
|
||||
$(AM_CPPFLAGS) \
|
||||
$(LIBISC_CFLAGS) \
|
||||
$(LIBDNS_CFLAGS) \
|
||||
$(LIBIRS_CFLAGS)
|
||||
|
||||
resolve_LDADD = $(LIBISC_LIBS) $(LIBIRS_LIBS) $(LIBDNS_LIBS)
|
||||
|
||||
tkey_keycreate_CPPFLAGS = \
|
||||
$(AM_CPPFLAGS) \
|
||||
$(LIBDNS_CFLAGS)
|
||||
@@ -99,17 +90,15 @@ TESTS += \
|
||||
checkconf \
|
||||
checknames \
|
||||
checkzone \
|
||||
cpu \
|
||||
cookie \
|
||||
database \
|
||||
dlz \
|
||||
dlzexternal \
|
||||
dns64 \
|
||||
doth \
|
||||
dscp \
|
||||
dsdigest \
|
||||
dyndb \
|
||||
ecdsa \
|
||||
eddsa \
|
||||
ednscompliance \
|
||||
emptyzones \
|
||||
filter-aaaa \
|
||||
@@ -120,8 +109,6 @@ TESTS += \
|
||||
include-multiplecfg \
|
||||
inline \
|
||||
integrity \
|
||||
hooks \
|
||||
journal \
|
||||
keepalive \
|
||||
legacy \
|
||||
limits \
|
||||
@@ -133,7 +120,6 @@ TESTS += \
|
||||
mkeys \
|
||||
names \
|
||||
notify \
|
||||
nsec3 \
|
||||
nslookup \
|
||||
padding \
|
||||
pending \
|
||||
@@ -165,6 +151,9 @@ TESTS += \
|
||||
xferquota \
|
||||
zonechecks
|
||||
|
||||
# eddsa test is broken
|
||||
# TESTS += eddsa
|
||||
|
||||
# The "stress" test is not run by default since it creates enough
|
||||
# load on the machine to make it unusable to other users.
|
||||
# The "dialup", "delzone", and "dupsigs" tests are also not run by
|
||||
@@ -185,6 +174,7 @@ TESTS += \
|
||||
nsupdate \
|
||||
resolver \
|
||||
statistics \
|
||||
dot \
|
||||
upforwd \
|
||||
zero
|
||||
|
||||
@@ -207,10 +197,10 @@ endif HAVE_PERLMOD_NET_DNS_NAMESERVER
|
||||
endif HAVE_PERLMOD_NET_DNS
|
||||
|
||||
if HAVE_PYTHON
|
||||
TESTS += kasp keymgr2kasp tcp pipelined
|
||||
TESTS += kasp tcp pipelined
|
||||
|
||||
if HAVE_PYMOD_DNS
|
||||
TESTS += qmin cookie timeouts
|
||||
TESTS += qmin
|
||||
|
||||
if HAVE_PERLMOD_NET_DNS
|
||||
TESTS += dnssec
|
||||
@@ -250,4 +240,7 @@ AM_LOG_FLAGS = -r
|
||||
|
||||
$(TESTS): run.sh
|
||||
|
||||
clean-local:
|
||||
-rm -f get_ports.state get_ports.lock
|
||||
|
||||
test-local: check
|
||||
|
||||
@@ -214,6 +214,9 @@ This indicates the type of message. This is one of:
|
||||
FAIL The test failed
|
||||
SKIPPED The test was not run, usually because some
|
||||
prerequisites required to run the test are missing.
|
||||
UNTESTED The test was not run for some other reason, e.g. a
|
||||
prerequisite is available but is not compatible with
|
||||
the platform on which the test is run.
|
||||
|
||||
<test-name>
|
||||
This is the name of the test from which the message emanated, which is also the
|
||||
@@ -267,9 +270,9 @@ As noted above, each test is in a separate directory. To interact with the
|
||||
test framework, the directories contain the following standard files:
|
||||
|
||||
prereq.sh Run at the beginning to determine whether the test can be run at
|
||||
all; if not, we see a R:SKIPPED result. This file is optional:
|
||||
if not present, the test is assumed to have all its prerequisites
|
||||
met.
|
||||
all; if not, we see a result of R:SKIPPED or R:UNTESTED. This file
|
||||
is optional: if not present, the test is assumed to have all its
|
||||
prerequisites met.
|
||||
|
||||
setup.sh Run after prereq.sh, this sets up the preconditions for the tests.
|
||||
Although optional, virtually all tests will require such a file to
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
@ IN SOA localhost. localhost.localhost. 1 10800 3600 605800 86400
|
||||
@ IN NS localhost.
|
||||
@@ -1,89 +0,0 @@
|
||||
############################################################################
|
||||
# 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.
|
||||
############################################################################
|
||||
|
||||
import concurrent.futures
|
||||
import os
|
||||
import subprocess
|
||||
import time
|
||||
|
||||
|
||||
def run_rndc(server, rndc_command):
|
||||
'''
|
||||
Send the specified 'rndc_command' to 'server' with a timeout of 2 seconds
|
||||
'''
|
||||
rndc = os.getenv('RNDC')
|
||||
port = os.getenv('CONTROLPORT')
|
||||
|
||||
cmdline = [rndc, '-c', '../common/rndc.conf', '-p', port, '-s', server]
|
||||
cmdline.extend(rndc_command)
|
||||
|
||||
subprocess.check_output(cmdline, stderr=subprocess.STDOUT, timeout=2)
|
||||
|
||||
|
||||
def rndc_loop(test_state, domain):
|
||||
'''
|
||||
Run "rndc addzone", "rndc modzone", and "rndc delzone" in a tight loop
|
||||
until the test is considered finished, ignoring errors
|
||||
'''
|
||||
rndc_commands = [
|
||||
['addzone', domain,
|
||||
'{ type master; file "example.db"; };'],
|
||||
['modzone', domain,
|
||||
'{ type master; file "example.db"; allow-transfer { any; }; };'],
|
||||
['delzone', domain],
|
||||
]
|
||||
|
||||
while not test_state['finished']:
|
||||
for command in rndc_commands:
|
||||
try:
|
||||
run_rndc('10.53.0.3', command)
|
||||
except subprocess.SubprocessError:
|
||||
pass
|
||||
|
||||
|
||||
def check_if_server_is_responsive():
|
||||
'''
|
||||
Check if server status can be successfully retrieved using "rndc status"
|
||||
'''
|
||||
try:
|
||||
run_rndc('10.53.0.3', ['status'])
|
||||
return True
|
||||
except subprocess.SubprocessError:
|
||||
return False
|
||||
|
||||
|
||||
def test_rndc_deadlock():
|
||||
'''
|
||||
Test whether running "rndc addzone", "rndc modzone", and "rndc delzone"
|
||||
commands concurrently does not trigger a deadlock
|
||||
'''
|
||||
test_state = {'finished': False}
|
||||
|
||||
# Create 4 worker threads running "rndc" commands in a loop.
|
||||
with concurrent.futures.ThreadPoolExecutor() as executor:
|
||||
for i in range(1, 5):
|
||||
domain = 'example%d' % i
|
||||
executor.submit(rndc_loop, test_state, domain)
|
||||
|
||||
# Run "rndc status" in 1-second intervals for a maximum of 10 seconds.
|
||||
# If any "rndc status" command fails, the loop will be interrupted.
|
||||
server_is_responsive = True
|
||||
attempts = 10
|
||||
while server_is_responsive and attempts > 0:
|
||||
server_is_responsive = check_if_server_is_responsive()
|
||||
attempts -= 1
|
||||
time.sleep(1)
|
||||
|
||||
# Signal worker threads that the test is finished.
|
||||
test_state['finished'] = True
|
||||
|
||||
# Check whether all "rndc status" commands succeeded.
|
||||
assert server_is_responsive
|
||||
@@ -20,4 +20,3 @@ ns A 10.53.0.1
|
||||
www CNAME server.example.net.
|
||||
inzone CNAME a.example.com.
|
||||
a A 10.53.0.1
|
||||
dname DNAME @
|
||||
|
||||
@@ -70,7 +70,7 @@ grep "server.example.net.*A.*10.53.0.100" dig.out.test$n > /dev/null && ret=1
|
||||
status=`expr $status + $ret`
|
||||
|
||||
n=`expr $n + 1`
|
||||
echo_i "check that cross-zone CNAME records return target data (rd=1/ra=1) ($n)"
|
||||
echo_i "check that cross-zone CNAME records returns target data (rd=1/ra=1) ($n)"
|
||||
ret=0
|
||||
$DIG $DIGOPTS @10.53.0.2 www.example.com > dig.out.test$n || ret=1
|
||||
grep "ANSWER: 2," dig.out.test$n > /dev/null || ret=1
|
||||
@@ -84,7 +84,7 @@ status=`expr $status + $ret`
|
||||
# In-zone CNAME records should always be followed regardless of RD and RA.
|
||||
#
|
||||
n=`expr $n + 1`
|
||||
echo_i "check that in-zone CNAME records return target data (rd=0/ra=0) ($n)"
|
||||
echo_i "check that in-zone CNAME records returns target data (rd=0/ra=0) ($n)"
|
||||
ret=0
|
||||
$DIG $DIGOPTS +norec @10.53.0.1 inzone.example.com > dig.out.test$n || ret=1
|
||||
grep "ANSWER: 2," dig.out.test$n > /dev/null || ret=1
|
||||
@@ -106,7 +106,7 @@ grep "a.example.com.*A.*10.53.0.1" dig.out.test$n > /dev/null || ret=1
|
||||
status=`expr $status + $ret`
|
||||
|
||||
n=`expr $n + 1`
|
||||
echo_i "check that in-zone CNAME records return target data (rd=0/ra=1) ($n)"
|
||||
echo_i "check that in-zone CNAME records returns target data (rd=0/ra=1) ($n)"
|
||||
ret=0
|
||||
$DIG $DIGOPTS +norec @10.53.0.2 inzone.example.com > dig.out.test$n || ret=1
|
||||
grep "ANSWER: 2," dig.out.test$n > /dev/null || ret=1
|
||||
@@ -117,7 +117,7 @@ grep "a.example.com.*A.*10.53.0.1" dig.out.test$n > /dev/null || ret=1
|
||||
status=`expr $status + $ret`
|
||||
|
||||
n=`expr $n + 1`
|
||||
echo_i "check that in-zone CNAME records return target data (rd=1/ra=1) ($n)"
|
||||
echo_i "check that in-zone CNAME records returns target data (rd=1/ra=1) ($n)"
|
||||
ret=0
|
||||
$DIG $DIGOPTS @10.53.0.2 inzone.example.com > dig.out.test$n || ret=1
|
||||
grep "ANSWER: 2," dig.out.test$n > /dev/null || ret=1
|
||||
@@ -127,54 +127,6 @@ grep "a.example.com.*A.*10.53.0.1" dig.out.test$n > /dev/null || ret=1
|
||||
[ $ret -eq 0 ] || echo_i "failed"
|
||||
status=`expr $status + $ret`
|
||||
|
||||
n=`expr $n + 1`
|
||||
echo_i "check that in-zone CNAME records does not return target data when QTYPE is CNAME (rd=1/ra=1) ($n)"
|
||||
ret=0
|
||||
$DIG $DIGOPTS @10.53.0.2 -t cname inzone.example.com > dig.out.test$n || ret=1
|
||||
grep 'ANSWER: 1,' dig.out.test$n > /dev/null || ret=1
|
||||
grep 'flags: qr aa rd ra;' dig.out.test$n > /dev/null || ret=1
|
||||
grep 'inzone\.example\.com\..*CNAME.a\.example\.com\.' dig.out.test$n > /dev/null || ret=1
|
||||
grep 'a\.example\.com\..*A.10\.53\.0\.1' dig.out.test$n > /dev/null && ret=1
|
||||
[ $ret -eq 0 ] || echo_i "failed"
|
||||
status=`expr $status + $ret`
|
||||
|
||||
n=`expr $n + 1`
|
||||
echo_i "check that in-zone CNAME records does not return target data when QTYPE is ANY (rd=1/ra=1) ($n)"
|
||||
ret=0
|
||||
$DIG $DIGOPTS @10.53.0.2 -t any inzone.example.com > dig.out.test$n || ret=1
|
||||
grep 'ANSWER: 1,' dig.out.test$n > /dev/null || ret=1
|
||||
grep 'flags: qr aa rd ra;' dig.out.test$n > /dev/null || ret=1
|
||||
grep 'inzone\.example\.com\..*CNAME.a\.example\.com\.' dig.out.test$n > /dev/null || ret=1
|
||||
grep 'a\.example\.com\..*A.10\.53\.0\.1' dig.out.test$n > /dev/null && ret=1
|
||||
[ $ret -eq 0 ] || echo_i "failed"
|
||||
status=`expr $status + $ret`
|
||||
|
||||
n=`expr $n + 1`
|
||||
echo_i "check that in-zone DNAME records does not return target data when QTYPE is CNAME (rd=1/ra=1) ($n)"
|
||||
ret=0
|
||||
$DIG $DIGOPTS @10.53.0.2 -t cname inzone.dname.example.com > dig.out.test$n || ret=1
|
||||
grep 'ANSWER: 2,' dig.out.test$n > /dev/null || ret=1
|
||||
grep 'flags: qr aa rd ra;' dig.out.test$n > /dev/null || ret=1
|
||||
grep 'dname\.example\.com\..*DNAME.example\.com\.' dig.out.test$n > /dev/null || ret=1
|
||||
grep 'inzone\.dname\.example\.com\..*CNAME.inzone\.example\.com\.' dig.out.test$n > /dev/null || ret=1
|
||||
grep 'inzone\.example\.com\..*CNAME.a\.example\.com\.' dig.out.test$n > /dev/null && ret=1
|
||||
grep 'a\.example\.com\..*A.10\.53\.0\.1' dig.out.test$n > /dev/null && ret=1
|
||||
[ $ret -eq 0 ] || echo_i "failed"
|
||||
status=`expr $status + $ret`
|
||||
|
||||
n=`expr $n + 1`
|
||||
echo_i "check that in-zone DNAME records does not return target data when QTYPE is ANY (rd=1/ra=1) ($n)"
|
||||
ret=0
|
||||
$DIG $DIGOPTS @10.53.0.2 -t any inzone.dname.example.com > dig.out.test$n || ret=1
|
||||
grep 'ANSWER: 2,' dig.out.test$n > /dev/null || ret=1
|
||||
grep 'flags: qr aa rd ra;' dig.out.test$n > /dev/null || ret=1
|
||||
grep 'dname\.example\.com\..*DNAME.example\.com\.' dig.out.test$n > /dev/null || ret=1
|
||||
grep 'inzone\.dname\.example\.com\..*CNAME.inzone\.example\.com\.' dig.out.test$n > /dev/null || ret=1
|
||||
grep 'inzone\.example\.com.*CNAME.a\.example\.com\.' dig.out.test$n > /dev/null && ret=1
|
||||
grep 'a\.example\.com.*A.10\.53\.0\.1' dig.out.test$n > /dev/null && ret=1
|
||||
[ $ret -eq 0 ] || echo_i "failed"
|
||||
status=`expr $status + $ret`
|
||||
|
||||
n=`expr $n + 1`
|
||||
echo_i "check that CHAOS addresses are compared correctly ($n)"
|
||||
ret=0
|
||||
|
||||
@@ -1590,7 +1590,7 @@ status=`expr $status + $ret`
|
||||
echo_i "check that DNAME at apex with NSEC3 is correctly signed (auto-dnssec maintain) ($n)"
|
||||
ret=0
|
||||
$DIG $DIGOPTS txt dname-at-apex-nsec3.example @10.53.0.3 > dig.out.ns3.test$n || ret=1
|
||||
grep "RRSIG NSEC3 7 3 600" dig.out.ns3.test$n > /dev/null || ret=1
|
||||
grep "RRSIG NSEC3 7 3 3600" dig.out.ns3.test$n > /dev/null || ret=1
|
||||
n=`expr $n + 1`
|
||||
if [ $ret != 0 ]; then echo_i "failed"; fi
|
||||
status=`expr $status + $ret`
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
-m record,size,mctx -c named.conf -d 1 -D cacheclean-ns1 -X named.lock -g -T maxcachesize=2097152
|
||||
@@ -1 +0,0 @@
|
||||
-m record,size,mctx -c named.conf -d 3 -D cacheclean-ns2 -X named.lock -g -T maxcachesize=2097152
|
||||
@@ -1,20 +0,0 @@
|
||||
/*
|
||||
* 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 http://mozilla.org/MPL/2.0/.
|
||||
*
|
||||
* See the COPYRIGHT file distributed with this work for additional
|
||||
* information regarding copyright ownership.
|
||||
*/
|
||||
|
||||
tls local-tls {
|
||||
key-file "key.pem";
|
||||
cert-file "cert.pem";
|
||||
};
|
||||
|
||||
# undefined 'http' specification
|
||||
options {
|
||||
listen-on port 8080 http unknown tls local-tls { 10.53.0.1; };
|
||||
};
|
||||
@@ -1,19 +0,0 @@
|
||||
/*
|
||||
* 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 http://mozilla.org/MPL/2.0/.
|
||||
*
|
||||
* See the COPYRIGHT file distributed with this work for additional
|
||||
* information regarding copyright ownership.
|
||||
*/
|
||||
|
||||
http local-http-server {
|
||||
endpoints { "/dns-query"; };
|
||||
};
|
||||
|
||||
# no 'tls' specification
|
||||
options {
|
||||
listen-on port 8080 http unknown { 10.53.0.1; };
|
||||
};
|
||||
+1
-2
@@ -9,7 +9,6 @@
|
||||
* information regarding copyright ownership.
|
||||
*/
|
||||
|
||||
# undefined 'tls' specification
|
||||
options {
|
||||
listen-on port 853 tls local-tls { 10.53.0.1; };
|
||||
geoip-use-ecs yes;
|
||||
};
|
||||
@@ -1,29 +0,0 @@
|
||||
/*
|
||||
* 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 http://mozilla.org/MPL/2.0/.
|
||||
*
|
||||
* See the COPYRIGHT file distributed with this work for additional
|
||||
* information regarding copyright ownership.
|
||||
*/
|
||||
|
||||
/*
|
||||
* inline-signing not allowed at view level.
|
||||
*/
|
||||
view "a" {
|
||||
inline-signing yes;
|
||||
|
||||
zone "." {
|
||||
type primary;
|
||||
file "root.db.signed";
|
||||
};
|
||||
};
|
||||
|
||||
view "b" {
|
||||
zone "." {
|
||||
type primary;
|
||||
file "root.db";
|
||||
};
|
||||
};
|
||||
@@ -1,21 +0,0 @@
|
||||
/*
|
||||
* 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 http://mozilla.org/MPL/2.0/.
|
||||
*
|
||||
* See the COPYRIGHT file distributed with this work for additional
|
||||
* information regarding copyright ownership.
|
||||
*/
|
||||
|
||||
// 'insecure' is a built-in policy, redefinition not allowed.
|
||||
dnssec-policy "insecure" {
|
||||
signatures-refresh P5D;
|
||||
};
|
||||
|
||||
zone "example.net" {
|
||||
type master;
|
||||
file "example.db";
|
||||
dnssec-policy "insecure";
|
||||
};
|
||||
@@ -1,42 +0,0 @@
|
||||
/*
|
||||
* 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 http://mozilla.org/MPL/2.0/.
|
||||
*
|
||||
* See the COPYRIGHT file distributed with this work for additional
|
||||
* information regarding copyright ownership.
|
||||
*/
|
||||
|
||||
key "keyforview1" {
|
||||
algorithm "hmac-sha1";
|
||||
secret "YPfMoAk6h+3iN8MDRQC004iSNHY=";
|
||||
};
|
||||
|
||||
key "keyforview2" {
|
||||
algorithm "hmac-sha1";
|
||||
secret "4xILSZQnuO1UKubXHkYUsvBRPu8=";
|
||||
};
|
||||
|
||||
view "example1" {
|
||||
match-clients { key "keyforview1"; };
|
||||
|
||||
zone "example.net" {
|
||||
type primary;
|
||||
dnssec-policy "default";
|
||||
key-directory ".";
|
||||
file "example1.db";
|
||||
};
|
||||
};
|
||||
|
||||
view "example2" {
|
||||
match-clients { key "keyforview2"; };
|
||||
|
||||
zone "example.net" {
|
||||
type primary;
|
||||
dnssec-policy "insecure";
|
||||
key-directory ".";
|
||||
file "example2.db";
|
||||
};
|
||||
};
|
||||
@@ -1,40 +0,0 @@
|
||||
/*
|
||||
* 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 http://mozilla.org/MPL/2.0/.
|
||||
*
|
||||
* See the COPYRIGHT file distributed with this work for additional
|
||||
* information regarding copyright ownership.
|
||||
*/
|
||||
|
||||
key "keyforview1" {
|
||||
algorithm "hmac-sha1";
|
||||
secret "YPfMoAk6h+3iN8MDRQC004iSNHY=";
|
||||
};
|
||||
|
||||
key "keyforview2" {
|
||||
algorithm "hmac-sha1";
|
||||
secret "4xILSZQnuO1UKubXHkYUsvBRPu8=";
|
||||
};
|
||||
|
||||
view "example1" {
|
||||
match-clients { key "keyforview1"; };
|
||||
|
||||
zone "example.net" {
|
||||
type primary;
|
||||
dnssec-policy "default";
|
||||
file "example1.db";
|
||||
};
|
||||
};
|
||||
|
||||
view "example2" {
|
||||
match-clients { key "keyforview2"; };
|
||||
|
||||
zone "example.net" {
|
||||
type primary;
|
||||
dnssec-policy "insecure";
|
||||
file "example2.db";
|
||||
};
|
||||
};
|
||||
+2
-1
@@ -9,7 +9,7 @@
|
||||
* information regarding copyright ownership.
|
||||
*/
|
||||
|
||||
// 'default' is a built-in policy, redefinition not allowed.
|
||||
// Using the keyword 'default' is not allowed.
|
||||
dnssec-policy "default" {
|
||||
signatures-refresh P5D;
|
||||
};
|
||||
@@ -19,3 +19,4 @@ zone "example.net" {
|
||||
file "example.db";
|
||||
dnssec-policy "default";
|
||||
};
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
/*
|
||||
* 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 http://mozilla.org/MPL/2.0/.
|
||||
*
|
||||
* See the COPYRIGHT file distributed with this work for additional
|
||||
* information regarding copyright ownership.
|
||||
*/
|
||||
|
||||
// One zone with dnssec-policy 'none', one zone with dnssec-policy 'insecure',
|
||||
// both using the same zone file.
|
||||
|
||||
zone "example1.net" {
|
||||
type master;
|
||||
file "example.db";
|
||||
dnssec-policy "none";
|
||||
};
|
||||
|
||||
zone "example2.net" {
|
||||
type master;
|
||||
file "example.db";
|
||||
dnssec-policy "insecure";
|
||||
};
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
/*
|
||||
* 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 http://mozilla.org/MPL/2.0/.
|
||||
*
|
||||
* See the COPYRIGHT file distributed with this work for additional
|
||||
* information regarding copyright ownership.
|
||||
*/
|
||||
|
||||
// One zone with a dnssec-policy, the other with allow-update,
|
||||
// with the same zone file.
|
||||
|
||||
zone "example1.net" {
|
||||
type master;
|
||||
file "example.db";
|
||||
dnssec-policy "default";
|
||||
};
|
||||
|
||||
zone "example2.net" {
|
||||
type master;
|
||||
file "example.db";
|
||||
allow-update { any; };
|
||||
};
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
/*
|
||||
* 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 http://mozilla.org/MPL/2.0/.
|
||||
*
|
||||
* See the COPYRIGHT file distributed with this work for additional
|
||||
* information regarding copyright ownership.
|
||||
*/
|
||||
|
||||
// One zone with a dnssec-policy, the other with update-policy,
|
||||
// with the same zone file.
|
||||
|
||||
zone "example1.net" {
|
||||
type master;
|
||||
file "example.db";
|
||||
dnssec-policy "default";
|
||||
};
|
||||
|
||||
zone "example2.net" {
|
||||
type master;
|
||||
file "example.db";
|
||||
update-policy {
|
||||
grant * self * TXT;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
/*
|
||||
* 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 http://mozilla.org/MPL/2.0/.
|
||||
*
|
||||
* See the COPYRIGHT file distributed with this work for additional
|
||||
* information regarding copyright ownership.
|
||||
*/
|
||||
|
||||
// One zone transitioning to insecure, the other with allow-update,
|
||||
// with the same zone file.
|
||||
|
||||
zone "example1.net" {
|
||||
type master;
|
||||
file "example.db";
|
||||
dnssec-policy "insecure";
|
||||
};
|
||||
|
||||
zone "example2.net" {
|
||||
type master;
|
||||
file "example.db";
|
||||
allow-update { any; };
|
||||
};
|
||||
|
||||
+2
-1
@@ -9,7 +9,7 @@
|
||||
* information regarding copyright ownership.
|
||||
*/
|
||||
|
||||
// 'none' is a built-in policy, redefinition not allowed.
|
||||
// Using the keyword 'none' is not allowed.
|
||||
dnssec-policy "none" {
|
||||
signatures-refresh P5D;
|
||||
};
|
||||
@@ -19,3 +19,4 @@ zone "example.net" {
|
||||
file "example.db";
|
||||
dnssec-policy "none";
|
||||
};
|
||||
|
||||
@@ -1,25 +0,0 @@
|
||||
/*
|
||||
* 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 http://mozilla.org/MPL/2.0/.
|
||||
*
|
||||
* See the COPYRIGHT file distributed with this work for additional
|
||||
* information regarding copyright ownership.
|
||||
*/
|
||||
|
||||
// Two zones with dnssec-policy with the same zone file.
|
||||
|
||||
zone "example1.net" {
|
||||
type master;
|
||||
file "example.db";
|
||||
dnssec-policy "default";
|
||||
};
|
||||
|
||||
zone "example2.net" {
|
||||
type master;
|
||||
file "example.db";
|
||||
dnssec-policy "default";
|
||||
};
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
/*
|
||||
* 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 http://mozilla.org/MPL/2.0/.
|
||||
*
|
||||
* See the COPYRIGHT file distributed with this work for additional
|
||||
* information regarding copyright ownership.
|
||||
*/
|
||||
|
||||
// Two zones with dnssec-policy 'insecure' (transitioning to insecure)
|
||||
// with the same zone file.
|
||||
|
||||
zone "example1.net" {
|
||||
type master;
|
||||
file "example.db";
|
||||
dnssec-policy "insecure";
|
||||
};
|
||||
|
||||
zone "example2.net" {
|
||||
type master;
|
||||
file "example.db";
|
||||
dnssec-policy "insecure";
|
||||
};
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
/*
|
||||
* 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 http://mozilla.org/MPL/2.0/.
|
||||
*
|
||||
* See the COPYRIGHT file distributed with this work for additional
|
||||
* information regarding copyright ownership.
|
||||
*/
|
||||
|
||||
// One zone with dnssec-policy, the other zone has 'dnssec-policy none',
|
||||
// both with the same zone file.
|
||||
|
||||
zone "example1.net" {
|
||||
type master;
|
||||
file "example.db";
|
||||
dnssec-policy "default";
|
||||
};
|
||||
|
||||
zone "example2.net" {
|
||||
type master;
|
||||
file "example.db";
|
||||
dnssec-policy "none";
|
||||
};
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
/*
|
||||
* 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 http://mozilla.org/MPL/2.0/.
|
||||
*
|
||||
* See the COPYRIGHT file distributed with this work for additional
|
||||
* information regarding copyright ownership.
|
||||
*/
|
||||
|
||||
// One zone with dnssec-policy, the other zone has 'dnssec-policy insecure'
|
||||
// (transitioning to inseure), both with the same zone file.
|
||||
|
||||
zone "example1.net" {
|
||||
type master;
|
||||
file "example.db";
|
||||
dnssec-policy "default";
|
||||
};
|
||||
|
||||
zone "example2.net" {
|
||||
type master;
|
||||
file "example.db";
|
||||
dnssec-policy "insecure";
|
||||
};
|
||||
|
||||
@@ -9,17 +9,6 @@
|
||||
* information regarding copyright ownership.
|
||||
*/
|
||||
|
||||
view view1 {
|
||||
match-clients { any; };
|
||||
dnssec-validation yes;
|
||||
};
|
||||
|
||||
view view2 {
|
||||
match-clients { none; };
|
||||
dnssec-validation auto;
|
||||
};
|
||||
|
||||
view view3 {
|
||||
match-clients { none; };
|
||||
auto-dnssec maintain;
|
||||
options {
|
||||
dnssec-enable no;
|
||||
};
|
||||
|
||||
@@ -11,22 +11,15 @@
|
||||
|
||||
view view1 {
|
||||
match-clients { any; };
|
||||
dnssec-validation yes;
|
||||
};
|
||||
|
||||
view view2 {
|
||||
match-clients { none; };
|
||||
dnssec-validation auto;
|
||||
};
|
||||
|
||||
view view3 {
|
||||
match-clients { none; };
|
||||
dnssec-validation auto;
|
||||
};
|
||||
|
||||
view view4 {
|
||||
match-clients { none; };
|
||||
};
|
||||
|
||||
view view5 {
|
||||
match-clients { none; };
|
||||
auto-dnssec off;
|
||||
auto-dnssec maintain;
|
||||
};
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user