2001-03-04 21:21:39 +00:00
|
|
|
/*
|
2018-02-23 09:53:12 +01:00
|
|
|
* Copyright (C) Internet Systems Consortium, Inc. ("ISC")
|
2001-03-04 21:21:39 +00:00
|
|
|
*
|
2016-06-27 14:56:38 +10:00
|
|
|
* 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
|
2020-09-14 16:20:40 -07:00
|
|
|
* file, you can obtain one at https://mozilla.org/MPL/2.0/.
|
2018-02-23 09:53:12 +01:00
|
|
|
*
|
|
|
|
* See the COPYRIGHT file distributed with this work for additional
|
|
|
|
* information regarding copyright ownership.
|
2001-03-04 21:21:39 +00:00
|
|
|
*/
|
|
|
|
|
2005-04-27 04:57:32 +00:00
|
|
|
/*! \file */
|
2001-03-04 22:28:32 +00:00
|
|
|
|
2020-02-12 13:59:18 +01:00
|
|
|
#include <bind.keys.h>
|
2018-03-28 14:19:37 +02:00
|
|
|
#include <inttypes.h>
|
2001-03-04 21:21:39 +00:00
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
#include <isc/buffer.h>
|
|
|
|
#include <isc/log.h>
|
|
|
|
#include <isc/mem.h>
|
2006-01-27 02:35:15 +00:00
|
|
|
#include <isc/parseint.h>
|
2001-03-04 21:21:39 +00:00
|
|
|
#include <isc/region.h>
|
|
|
|
#include <isc/result.h>
|
|
|
|
#include <isc/sockaddr.h>
|
2007-09-13 04:45:18 +00:00
|
|
|
#include <isc/string.h>
|
2001-03-04 21:21:39 +00:00
|
|
|
#include <isc/util.h>
|
|
|
|
|
2020-03-09 16:17:26 +01:00
|
|
|
#include <pk11/site.h>
|
|
|
|
|
2001-03-04 21:21:39 +00:00
|
|
|
#include <dns/fixedname.h>
|
|
|
|
#include <dns/name.h>
|
|
|
|
#include <dns/rdataclass.h>
|
2002-03-07 13:46:41 +00:00
|
|
|
#include <dns/rdatatype.h>
|
2001-08-03 18:12:08 +00:00
|
|
|
#include <dns/tsig.h>
|
2001-03-04 21:21:39 +00:00
|
|
|
#include <dns/zone.h>
|
|
|
|
|
2020-03-09 16:17:26 +01:00
|
|
|
#include <dst/dst.h>
|
|
|
|
|
2020-02-12 13:59:18 +01:00
|
|
|
#include <isccfg/grammar.h>
|
|
|
|
#include <isccfg/namedconf.h>
|
2009-06-10 00:27:22 +00:00
|
|
|
|
2001-03-04 21:21:39 +00:00
|
|
|
#include <named/config.h>
|
|
|
|
#include <named/globals.h>
|
2009-03-04 02:42:31 +00:00
|
|
|
|
2005-04-27 04:57:32 +00:00
|
|
|
/*% default configuration */
|
2001-03-05 13:43:14 +00:00
|
|
|
static char defaultconf[] = "\
|
|
|
|
options {\n\
|
2018-03-19 18:09:05 +05:30
|
|
|
answer-cookie true;\n\
|
2014-02-07 17:16:37 +11:00
|
|
|
automatic-interface-scan yes;\n\
|
2017-09-08 13:39:09 -07:00
|
|
|
bindkeys-file \"" NAMED_SYSCONFDIR "/bind.keys\";\n\
|
2004-04-19 23:09:51 +00:00
|
|
|
# blackhole {none;};\n"
|
2020-02-12 13:59:18 +01:00
|
|
|
" cookie-algorithm siphash24;\n"
|
2004-04-19 23:09:51 +00:00
|
|
|
#ifndef WIN32
|
2020-02-12 13:59:18 +01:00
|
|
|
" coresize default;\n\
|
2017-09-06 09:58:29 +10:00
|
|
|
datasize default;\n"
|
2020-02-13 21:48:23 +01:00
|
|
|
#endif /* ifndef WIN32 */
|
2020-02-12 13:59:18 +01:00
|
|
|
"\
|
2015-05-21 23:04:29 -07:00
|
|
|
# deallocate-on-exit <obsolete>;\n\
|
2001-03-05 13:43:14 +00:00
|
|
|
# directory <none>\n\
|
2019-11-05 17:22:35 +01:00
|
|
|
dnssec-policy \"none\";\n\
|
2001-03-05 13:43:14 +00:00
|
|
|
dump-file \"named_dump.db\";\n\
|
2020-09-23 14:47:26 +02:00
|
|
|
edns-udp-size 1232;\n\
|
2017-09-06 09:58:29 +10:00
|
|
|
# fake-iquery <obsolete>;\n"
|
|
|
|
#ifndef WIN32
|
2020-02-12 13:59:18 +01:00
|
|
|
" files unlimited;\n"
|
2020-02-13 21:48:23 +01:00
|
|
|
#endif /* ifndef WIN32 */
|
2019-07-02 16:27:42 -07:00
|
|
|
#if defined(HAVE_GEOIP2) && !defined(WIN32)
|
2020-02-12 13:59:18 +01:00
|
|
|
" geoip-directory \"" MAXMINDDB_PREFIX "/share/"
|
|
|
|
"GeoIP\";"
|
|
|
|
"\n"
|
2019-07-02 16:27:42 -07:00
|
|
|
#elif defined(HAVE_GEOIP2)
|
2020-02-12 13:59:18 +01:00
|
|
|
" geoip-directory \".\";\n"
|
2020-02-13 21:48:23 +01:00
|
|
|
#endif /* if defined(HAVE_GEOIP2) && !defined(WIN32) */
|
2020-02-12 13:59:18 +01:00
|
|
|
"\
|
2015-05-21 23:04:29 -07:00
|
|
|
# has-old-clients <obsolete>;\n\
|
2001-06-04 21:51:27 +00:00
|
|
|
heartbeat-interval 60;\n\
|
2015-05-21 23:04:29 -07:00
|
|
|
# host-statistics <obsolete>;\n\
|
2001-06-04 21:51:27 +00:00
|
|
|
interface-interval 60;\n\
|
2015-01-20 16:10:30 -08:00
|
|
|
# keep-response-order {none;};\n\
|
2001-03-05 13:43:14 +00:00
|
|
|
listen-on {any;};\n\
|
2013-03-21 10:16:12 +11:00
|
|
|
listen-on-v6 {any;};\n\
|
2017-09-08 13:39:09 -07:00
|
|
|
# lock-file \"" NAMED_LOCALSTATEDIR "/run/named/named.lock\";\n\
|
2001-03-26 21:33:07 +00:00
|
|
|
match-mapped-addresses no;\n\
|
2020-02-21 10:53:08 -08:00
|
|
|
max-ixfr-ratio 100%;\n\
|
2012-06-14 15:44:20 +10:00
|
|
|
max-rsa-exponent-size 0; /* no limit */\n\
|
2020-09-23 14:47:26 +02:00
|
|
|
max-udp-size 1232;\n\
|
2001-03-05 13:43:14 +00:00
|
|
|
memstatistics-file \"named.memstats\";\n\
|
2015-05-21 23:04:29 -07:00
|
|
|
# multiple-cnames <obsolete>;\n\
|
2001-03-20 21:54:29 +00:00
|
|
|
# named-xfer <obsolete>;\n\
|
2020-12-01 18:53:26 +01:00
|
|
|
nocookie-udp-size 4096;\n\
|
2017-09-06 09:58:29 +10:00
|
|
|
notify-rate 20;\n\
|
2014-06-18 16:47:22 -07:00
|
|
|
nta-lifetime 3600;\n\
|
|
|
|
nta-recheck 300;\n\
|
2017-09-08 13:39:09 -07:00
|
|
|
# pid-file \"" NAMED_LOCALSTATEDIR "/run/named/named.pid\"; \n\
|
2001-03-05 13:43:14 +00:00
|
|
|
port 53;\n\
|
2020-10-12 23:06:55 +02:00
|
|
|
tls-port 853;\n\
|
2018-04-22 14:56:28 +02:00
|
|
|
prefetch 2 9;\n\
|
|
|
|
recursing-file \"named.recursing\";\n\
|
2001-03-05 13:43:14 +00:00
|
|
|
recursive-clients 1000;\n\
|
2017-09-06 09:58:29 +10:00
|
|
|
request-nsid false;\n\
|
|
|
|
reserved-sockets 512;\n\
|
2012-06-08 12:34:33 +10:00
|
|
|
resolver-query-timeout 10;\n\
|
2018-06-15 13:34:27 +10:00
|
|
|
rrset-order { order random; };\n\
|
2017-09-06 09:58:29 +10:00
|
|
|
secroots-file \"named.secroots\";\n\
|
|
|
|
send-cookie true;\n\
|
2015-05-21 23:04:29 -07:00
|
|
|
# serial-queries <obsolete>;\n\
|
2001-03-19 22:34:14 +00:00
|
|
|
serial-query-rate 20;\n\
|
2003-01-20 05:46:11 +00:00
|
|
|
server-id none;\n\
|
2017-09-06 09:58:29 +10:00
|
|
|
session-keyalg hmac-sha256;\n\
|
2017-09-08 13:39:09 -07:00
|
|
|
# session-keyfile \"" NAMED_LOCALSTATEDIR "/run/named/session.key\";\n\
|
2017-09-06 09:58:29 +10:00
|
|
|
session-keyname local-ddns;\n"
|
|
|
|
#ifndef WIN32
|
2020-02-12 13:59:18 +01:00
|
|
|
" stacksize default;\n"
|
2020-02-13 21:48:23 +01:00
|
|
|
#endif /* ifndef WIN32 */
|
2020-02-12 13:59:18 +01:00
|
|
|
" startup-notify-rate 20;\n\
|
2001-03-05 13:43:14 +00:00
|
|
|
statistics-file \"named.stats\";\n\
|
2015-05-21 23:04:29 -07:00
|
|
|
# statistics-interval <obsolete>;\n\
|
2017-01-04 09:16:30 -08:00
|
|
|
tcp-advertised-timeout 300;\n\
|
2015-01-20 16:10:30 -08:00
|
|
|
tcp-clients 150;\n\
|
2017-01-04 09:16:30 -08:00
|
|
|
tcp-idle-timeout 300;\n\
|
|
|
|
tcp-initial-timeout 300;\n\
|
|
|
|
tcp-keepalive-timeout 300;\n\
|
2013-06-03 14:00:03 -05:00
|
|
|
tcp-listen-queue 10;\n\
|
2001-03-05 13:43:14 +00:00
|
|
|
# tkey-dhkey <none>\n\
|
|
|
|
# tkey-domain <none>\n\
|
2017-09-06 09:58:29 +10:00
|
|
|
# tkey-gssapi-credential <none>\n\
|
2015-12-15 13:22:15 +05:30
|
|
|
transfer-message-size 20480;\n\
|
2001-03-05 13:43:14 +00:00
|
|
|
transfers-in 10;\n\
|
|
|
|
transfers-out 10;\n\
|
2017-09-06 09:58:29 +10:00
|
|
|
transfers-per-ns 2;\n\
|
2015-05-21 23:04:29 -07:00
|
|
|
# treat-cr-as-space <obsolete>;\n\
|
2016-07-22 20:02:17 +10:00
|
|
|
trust-anchor-telemetry yes;\n\
|
2015-05-21 23:04:29 -07:00
|
|
|
# use-id-pool <obsolete>;\n\
|
2001-03-05 13:43:14 +00:00
|
|
|
\n\
|
|
|
|
/* view */\n\
|
2017-08-31 07:57:50 +10:00
|
|
|
allow-new-zones no;\n\
|
2001-03-05 13:43:14 +00:00
|
|
|
allow-notify {none;};\n\
|
2006-03-09 03:30:18 +00:00
|
|
|
allow-query-cache { localnets; localhost; };\n\
|
2007-03-29 06:36:31 +00:00
|
|
|
allow-query-cache-on { any; };\n\
|
2006-03-09 03:30:18 +00:00
|
|
|
allow-recursion { localnets; localhost; };\n\
|
2007-03-29 06:36:31 +00:00
|
|
|
allow-recursion-on { any; };\n\
|
2017-08-31 07:57:50 +10:00
|
|
|
allow-update-forwarding {none;};\n\
|
2001-03-05 13:43:14 +00:00
|
|
|
auth-nxdomain false;\n\
|
2009-12-04 21:09:34 +00:00
|
|
|
check-dup-records warn;\n\
|
2005-05-19 04:59:05 +00:00
|
|
|
check-mx warn;\n\
|
2017-08-31 07:57:50 +10:00
|
|
|
check-names master fail;\n\
|
|
|
|
check-names response ignore;\n\
|
|
|
|
check-names slave warn;\n\
|
2013-04-30 13:49:41 +10:00
|
|
|
check-spf warn;\n\
|
2017-08-31 07:57:50 +10:00
|
|
|
clients-per-query 10;\n\
|
|
|
|
dnssec-accept-expired no;\n\
|
2018-05-16 11:58:15 -07:00
|
|
|
dnssec-validation " VALIDATION_DEFAULT "; \n"
|
2017-09-06 09:58:29 +10:00
|
|
|
#ifdef HAVE_DNSTAP
|
2020-02-12 13:59:18 +01:00
|
|
|
" dnstap-identity hostname;\n"
|
2020-02-13 21:48:23 +01:00
|
|
|
#endif /* ifdef HAVE_DNSTAP */
|
2020-02-12 13:59:18 +01:00
|
|
|
"\
|
2017-08-31 07:57:50 +10:00
|
|
|
# fetch-glue <obsolete>;\n\
|
2015-07-08 22:53:39 -07:00
|
|
|
fetch-quota-params 100 0.1 0.3 0.7;\n\
|
2017-08-31 07:57:50 +10:00
|
|
|
fetches-per-server 0;\n\
|
2019-06-12 16:50:03 +10:00
|
|
|
fetches-per-zone 0;\n\
|
|
|
|
glue-cache yes;\n\
|
2017-09-06 09:58:29 +10:00
|
|
|
lame-ttl 600;\n"
|
2017-07-28 16:02:52 +10:00
|
|
|
#ifdef HAVE_LMDB
|
2020-02-12 13:59:18 +01:00
|
|
|
" lmdb-mapsize 32M;\n"
|
2020-02-13 21:48:23 +01:00
|
|
|
#endif /* ifdef HAVE_LMDB */
|
2020-02-12 13:59:18 +01:00
|
|
|
" max-cache-size 90%;\n\
|
2017-08-31 07:57:50 +10:00
|
|
|
max-cache-ttl 604800; /* 1 week */\n\
|
|
|
|
max-clients-per-query 100;\n\
|
|
|
|
max-ncache-ttl 10800; /* 3 hours */\n\
|
|
|
|
max-recursion-depth 7;\n\
|
2020-11-26 15:59:14 +11:00
|
|
|
max-recursion-queries 100;\n\
|
2020-12-08 15:58:45 +01:00
|
|
|
max-stale-ttl 86400; /* 1 day */\n\
|
2017-08-31 07:57:50 +10:00
|
|
|
message-compression yes;\n\
|
2018-10-24 15:17:18 +02:00
|
|
|
min-ncache-ttl 0; /* 0 hours */\n\
|
|
|
|
min-cache-ttl 0; /* 0 seconds */\n\
|
2017-08-31 07:57:50 +10:00
|
|
|
# min-roots <obsolete>;\n\
|
|
|
|
minimal-any false;\n\
|
2017-09-19 19:49:02 +05:30
|
|
|
minimal-responses no-auth-recursive;\n\
|
2017-08-31 07:57:50 +10:00
|
|
|
notify-source *;\n\
|
|
|
|
notify-source-v6 *;\n\
|
|
|
|
nsec3-test-zone no;\n\
|
|
|
|
provide-ixfr true;\n\
|
2018-05-29 10:22:34 +02:00
|
|
|
qname-minimization relaxed;\n\
|
2017-08-31 07:57:50 +10:00
|
|
|
query-source address *;\n\
|
|
|
|
query-source-v6 address *;\n\
|
|
|
|
recursion true;\n\
|
|
|
|
request-expire true;\n\
|
|
|
|
request-ixfr true;\n\
|
2015-08-13 08:26:23 +10:00
|
|
|
require-server-cookie no;\n\
|
2017-09-06 09:58:29 +10:00
|
|
|
resolver-nonbackoff-tries 3;\n\
|
|
|
|
resolver-retry-interval 800; /* in milliseconds */\n\
|
2017-08-31 07:57:50 +10:00
|
|
|
# rfc2308-type1 <obsolete>;\n\
|
2018-03-13 15:17:22 +11:00
|
|
|
root-key-sentinel yes;\n\
|
2017-08-31 07:57:50 +10:00
|
|
|
servfail-ttl 1;\n\
|
|
|
|
# sortlist <none>\n\
|
2017-09-06 09:58:29 +10:00
|
|
|
stale-answer-enable false;\n\
|
Add stale-refresh-time option
Before this update, BIND would attempt to do a full recursive resolution
process for each query received if the requested rrset had its ttl
expired. If the resolution fails for any reason, only then BIND would
check for stale rrset in cache (if 'stale-cache-enable' and
'stale-answer-enable' is on).
The problem with this approach is that if an authoritative server is
unreachable or is failing to respond, it is very unlikely that the
problem will be fixed in the next seconds.
A better approach to improve performance in those cases, is to mark the
moment in which a resolution failed, and if new queries arrive for that
same rrset, try to respond directly from the stale cache, and do that
for a window of time configured via 'stale-refresh-time'.
Only when this interval expires we then try to do a normal refresh of
the rrset.
The logic behind this commit is as following:
- In query.c / query_gotanswer(), if the test of 'result' variable falls
to the default case, an error is assumed to have happened, and a call
to 'query_usestale()' is made to check if serving of stale rrset is
enabled in configuration.
- If serving of stale answers is enabled, a flag will be turned on in
the query context to look for stale records:
query.c:6839
qctx->client->query.dboptions |= DNS_DBFIND_STALEOK;
- A call to query_lookup() will be made again, inside it a call to
'dns_db_findext()' is made, which in turn will invoke rbdb.c /
cache_find().
- In rbtdb.c / cache_find() the important bits of this change is the
call to 'check_stale_header()', which is a function that yields true
if we should skip the stale entry, or false if we should consider it.
- In check_stale_header() we now check if the DNS_DBFIND_STALEOK option
is set, if that is the case we know that this new search for stale
records was made due to a failure in a normal resolution, so we keep
track of the time in which the failured occured in rbtdb.c:4559:
header->last_refresh_fail_ts = search->now;
- In check_stale_header(), if DNS_DBFIND_STALEOK is not set, then we
know this is a normal lookup, if the record is stale and the query
time is between last failure time + stale-refresh-time window, then
we return false so cache_find() knows it can consider this stale
rrset entry to return as a response.
The last additions are two new methods to the database interface:
- setservestale_refresh
- getservestale_refresh
Those were added so rbtdb can be aware of the value set in configuration
option, since in that level we have no access to the view object.
2020-10-19 17:02:03 -03:00
|
|
|
stale-refresh-time 30; /* 30 seconds */\n\
|
2020-12-08 15:58:45 +01:00
|
|
|
stale-answer-ttl 30; /* 30 seconds */\n\
|
2020-07-21 10:38:55 +02:00
|
|
|
stale-cache-enable false;\n\
|
2019-10-28 15:04:38 -05:00
|
|
|
synth-from-dnssec no;\n\
|
2017-08-31 07:57:50 +10:00
|
|
|
# topology <none>\n\
|
|
|
|
transfer-format many-answers;\n\
|
2015-09-28 18:57:19 +10:00
|
|
|
v6-bias 50;\n\
|
2017-08-31 07:57:50 +10:00
|
|
|
zero-no-soa-ttl-cache no;\n\
|
2017-09-06 09:58:29 +10:00
|
|
|
\n\
|
|
|
|
/* zone */\n\
|
2001-03-05 13:43:14 +00:00
|
|
|
allow-query {any;};\n\
|
2007-03-29 06:36:31 +00:00
|
|
|
allow-query-on {any;};\n\
|
2001-03-05 13:43:14 +00:00
|
|
|
allow-transfer {any;};\n\
|
|
|
|
# also-notify <none>\n\
|
2017-09-06 09:58:29 +10:00
|
|
|
alt-transfer-source *;\n\
|
|
|
|
alt-transfer-source-v6 *;\n\
|
|
|
|
check-integrity yes;\n\
|
|
|
|
check-mx-cname warn;\n\
|
|
|
|
check-sibling yes;\n\
|
|
|
|
check-srv-cname warn;\n\
|
|
|
|
check-wildcard yes;\n\
|
2001-03-05 13:43:14 +00:00
|
|
|
dialup no;\n\
|
2017-09-06 09:58:29 +10:00
|
|
|
dnssec-dnskey-kskonly no;\n\
|
|
|
|
dnssec-loadkeys-interval 60;\n\
|
|
|
|
dnssec-secure-to-insecure no;\n\
|
|
|
|
dnssec-update-mode maintain;\n\
|
2001-03-05 13:43:14 +00:00
|
|
|
# forward <none>\n\
|
|
|
|
# forwarders <none>\n\
|
2017-09-06 09:58:29 +10:00
|
|
|
inline-signing no;\n\
|
|
|
|
ixfr-from-differences false;\n\
|
2015-05-21 23:04:29 -07:00
|
|
|
# maintain-ixfr-base <obsolete>;\n\
|
2001-03-05 13:43:14 +00:00
|
|
|
# max-ixfr-log-size <obsolete>\n\
|
2017-09-06 09:58:29 +10:00
|
|
|
max-journal-size default;\n\
|
2016-11-02 17:31:27 +11:00
|
|
|
max-records 0;\n\
|
2001-03-05 13:43:14 +00:00
|
|
|
max-refresh-time 2419200; /* 4 weeks */\n\
|
2017-09-06 09:58:29 +10:00
|
|
|
max-retry-time 1209600; /* 2 weeks */\n\
|
|
|
|
max-transfer-idle-in 60;\n\
|
|
|
|
max-transfer-idle-out 60;\n\
|
|
|
|
max-transfer-time-in 120;\n\
|
|
|
|
max-transfer-time-out 120;\n\
|
2001-03-05 13:43:14 +00:00
|
|
|
min-refresh-time 300;\n\
|
2017-09-06 09:58:29 +10:00
|
|
|
min-retry-time 500;\n\
|
2002-08-01 03:23:36 +00:00
|
|
|
multi-master no;\n\
|
2017-09-06 09:58:29 +10:00
|
|
|
notify yes;\n\
|
|
|
|
notify-delay 5;\n\
|
|
|
|
notify-to-soa no;\n\
|
|
|
|
serial-update-method increment;\n\
|
2008-04-02 02:37:42 +00:00
|
|
|
sig-signing-nodes 100;\n\
|
|
|
|
sig-signing-signatures 10;\n\
|
2009-03-16 23:41:21 +00:00
|
|
|
sig-signing-type 65534;\n\
|
2017-09-06 09:58:29 +10:00
|
|
|
sig-validity-interval 30; /* days */\n\
|
2018-03-12 22:14:26 -07:00
|
|
|
dnskey-sig-validity 0; /* default: sig-validity-interval */\n\
|
2017-09-06 09:58:29 +10:00
|
|
|
transfer-source *;\n\
|
|
|
|
transfer-source-v6 *;\n\
|
2006-06-04 23:17:07 +00:00
|
|
|
try-tcp-refresh yes; /* BIND 8 compat */\n\
|
2017-09-06 09:58:29 +10:00
|
|
|
update-check-ksk yes;\n\
|
|
|
|
zero-no-soa-ttl yes;\n\
|
|
|
|
zone-statistics terse;\n\
|
2001-11-20 18:46:43 +00:00
|
|
|
};\n\
|
2004-03-16 05:52:24 +00:00
|
|
|
"
|
|
|
|
|
2020-02-12 13:59:18 +01:00
|
|
|
"#\n\
|
2007-06-17 23:52:28 +00:00
|
|
|
# Zones in the \"_bind\" view are NOT counted in the count of zones.\n\
|
2003-04-17 12:11:39 +00:00
|
|
|
#\n\
|
2001-11-20 18:46:43 +00:00
|
|
|
view \"_bind\" chaos {\n\
|
|
|
|
recursion no;\n\
|
2004-08-28 05:42:12 +00:00
|
|
|
notify no;\n\
|
2010-08-11 18:14:20 +00:00
|
|
|
allow-new-zones no;\n\
|
2013-02-25 10:49:30 -08:00
|
|
|
\n\
|
|
|
|
# Prevent use of this zone in DNS amplified reflection DoS attacks\n\
|
|
|
|
rate-limit {\n\
|
|
|
|
responses-per-second 3;\n\
|
|
|
|
slip 0;\n\
|
|
|
|
min-table-size 10;\n\
|
|
|
|
};\n\
|
2001-11-20 18:46:43 +00:00
|
|
|
\n\
|
|
|
|
zone \"version.bind\" chaos {\n\
|
|
|
|
type master;\n\
|
|
|
|
database \"_builtin version\";\n\
|
|
|
|
};\n\
|
|
|
|
\n\
|
|
|
|
zone \"hostname.bind\" chaos {\n\
|
|
|
|
type master;\n\
|
|
|
|
database \"_builtin hostname\";\n\
|
|
|
|
};\n\
|
|
|
|
\n\
|
|
|
|
zone \"authors.bind\" chaos {\n\
|
|
|
|
type master;\n\
|
|
|
|
database \"_builtin authors\";\n\
|
|
|
|
};\n\
|
2009-06-30 02:53:46 +00:00
|
|
|
\n\
|
2003-01-20 05:46:11 +00:00
|
|
|
zone \"id.server\" chaos {\n\
|
|
|
|
type master;\n\
|
|
|
|
database \"_builtin id\";\n\
|
|
|
|
};\n\
|
2001-11-20 18:46:43 +00:00
|
|
|
};\n\
|
2009-03-04 02:42:31 +00:00
|
|
|
"
|
2020-02-12 13:59:18 +01:00
|
|
|
"#\n\
|
2017-10-03 00:28:31 -07:00
|
|
|
# Default trusted key(s), used if \n\
|
|
|
|
# \"dnssec-validation auto;\" is set and\n\
|
2009-03-04 02:42:31 +00:00
|
|
|
# sysconfdir/bind.keys doesn't exist).\n\
|
|
|
|
#\n\
|
2018-10-05 12:00:42 -07:00
|
|
|
# BEGIN DNSSEC KEYS\n"
|
2009-03-04 02:42:31 +00:00
|
|
|
|
2020-02-12 13:59:18 +01:00
|
|
|
/* Imported from bind.keys.h: */
|
|
|
|
TRUST_ANCHORS
|
2009-03-04 02:42:31 +00:00
|
|
|
|
2020-02-12 13:59:18 +01:00
|
|
|
"# END MANAGED KEYS\n\
|
2018-10-09 10:54:51 +02:00
|
|
|
\n\
|
2020-06-17 02:02:27 -07:00
|
|
|
primaries " DEFAULT_IANA_ROOT_ZONE_PRIMARIES " {\n\
|
2018-10-09 10:54:51 +02:00
|
|
|
2001:500:84::b; # b.root-servers.net\n\
|
|
|
|
2001:500:2f::f; # f.root-servers.net\n\
|
|
|
|
2001:7fd::1; # k.root-servers.net\n\
|
|
|
|
2620:0:2830:202::132; # xfr.cjr.dns.icann.org\n\
|
|
|
|
2620:0:2d0:202::132; # xfr.lax.dns.icann.org\n\
|
|
|
|
192.228.79.201; # b.root-servers.net\n\
|
|
|
|
192.33.4.12; # c.root-servers.net\n\
|
|
|
|
192.5.5.241; # f.root-servers.net\n\
|
|
|
|
192.112.36.4; # g.root-servers.net\n\
|
|
|
|
193.0.14.129; # k.root-servers.net\n\
|
|
|
|
192.0.47.132; # xfr.cjr.dns.icann.org\n\
|
|
|
|
192.0.32.132; # xfr.lax.dns.icann.org\n\
|
|
|
|
};\n\
|
2001-11-20 01:18:15 +00:00
|
|
|
";
|
2001-03-04 21:21:39 +00:00
|
|
|
|
|
|
|
isc_result_t
|
2020-02-13 14:44:37 -08:00
|
|
|
named_config_parsedefaults(cfg_parser_t *parser, cfg_obj_t **conf) {
|
2001-03-04 21:21:39 +00:00
|
|
|
isc_buffer_t b;
|
|
|
|
|
|
|
|
isc_buffer_init(&b, defaultconf, sizeof(defaultconf) - 1);
|
|
|
|
isc_buffer_add(&b, sizeof(defaultconf) - 1);
|
2020-02-12 13:59:18 +01:00
|
|
|
return (cfg_parse_buffer(parser, &b, __FILE__, 0, &cfg_type_namedconf,
|
2019-01-21 20:03:45 -08:00
|
|
|
CFG_PCTX_NODEPRECATED, conf));
|
2001-03-04 21:21:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
isc_result_t
|
2020-02-12 13:59:18 +01:00
|
|
|
named_config_get(cfg_obj_t const *const *maps, const char *name,
|
2020-02-13 14:44:37 -08:00
|
|
|
const cfg_obj_t **obj) {
|
2001-03-04 21:21:39 +00:00
|
|
|
int i;
|
|
|
|
|
2001-11-27 00:56:32 +00:00
|
|
|
for (i = 0;; i++) {
|
2020-02-13 21:48:23 +01:00
|
|
|
if (maps[i] == NULL) {
|
2001-03-04 21:21:39 +00:00
|
|
|
return (ISC_R_NOTFOUND);
|
2020-02-13 21:48:23 +01:00
|
|
|
}
|
|
|
|
if (cfg_map_get(maps[i], name, obj) == ISC_R_SUCCESS) {
|
2001-03-04 21:21:39 +00:00
|
|
|
return (ISC_R_SUCCESS);
|
2020-02-13 21:48:23 +01:00
|
|
|
}
|
2001-03-04 21:21:39 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-04-20 14:11:47 +00:00
|
|
|
isc_result_t
|
2017-09-08 13:39:09 -07:00
|
|
|
named_checknames_get(const cfg_obj_t **maps, const char *which,
|
2020-02-13 14:44:37 -08:00
|
|
|
const cfg_obj_t **obj) {
|
2006-02-28 02:39:52 +00:00
|
|
|
const cfg_listelt_t *element;
|
2020-02-13 14:44:37 -08:00
|
|
|
const cfg_obj_t *checknames;
|
|
|
|
const cfg_obj_t *type;
|
|
|
|
const cfg_obj_t *value;
|
|
|
|
int i;
|
2004-04-20 14:11:47 +00:00
|
|
|
|
2020-05-20 11:56:37 +10:00
|
|
|
REQUIRE(maps != NULL);
|
|
|
|
REQUIRE(which != NULL);
|
|
|
|
REQUIRE(obj != NULL && *obj == NULL);
|
|
|
|
|
2004-04-20 14:11:47 +00:00
|
|
|
for (i = 0;; i++) {
|
2020-02-13 21:48:23 +01:00
|
|
|
if (maps[i] == NULL) {
|
2004-04-20 14:11:47 +00:00
|
|
|
return (ISC_R_NOTFOUND);
|
2020-02-13 21:48:23 +01:00
|
|
|
}
|
2004-04-20 14:11:47 +00:00
|
|
|
checknames = NULL;
|
2020-02-12 13:59:18 +01:00
|
|
|
if (cfg_map_get(maps[i], "check-names", &checknames) ==
|
|
|
|
ISC_R_SUCCESS) {
|
2004-04-20 14:11:47 +00:00
|
|
|
/*
|
|
|
|
* Zone map entry is not a list.
|
|
|
|
*/
|
|
|
|
if (checknames != NULL && !cfg_obj_islist(checknames)) {
|
|
|
|
*obj = checknames;
|
|
|
|
return (ISC_R_SUCCESS);
|
|
|
|
}
|
|
|
|
for (element = cfg_list_first(checknames);
|
2020-02-13 14:44:37 -08:00
|
|
|
element != NULL; element = cfg_list_next(element))
|
|
|
|
{
|
2004-04-20 14:11:47 +00:00
|
|
|
value = cfg_listelt_value(element);
|
|
|
|
type = cfg_tuple_get(value, "type");
|
2020-02-12 13:59:18 +01:00
|
|
|
if (strcasecmp(cfg_obj_asstring(type), which) ==
|
|
|
|
0) {
|
2004-04-20 14:11:47 +00:00
|
|
|
*obj = cfg_tuple_get(value, "mode");
|
|
|
|
return (ISC_R_SUCCESS);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2001-03-04 21:21:39 +00:00
|
|
|
int
|
2020-02-13 14:44:37 -08:00
|
|
|
named_config_listcount(const cfg_obj_t *list) {
|
2006-02-28 02:39:52 +00:00
|
|
|
const cfg_listelt_t *e;
|
2020-02-13 14:44:37 -08:00
|
|
|
int i = 0;
|
2001-03-04 21:21:39 +00:00
|
|
|
|
2020-02-13 21:48:23 +01:00
|
|
|
for (e = cfg_list_first(list); e != NULL; e = cfg_list_next(e)) {
|
2001-03-04 21:21:39 +00:00
|
|
|
i++;
|
2020-02-13 21:48:23 +01:00
|
|
|
}
|
2001-03-04 21:21:39 +00:00
|
|
|
|
|
|
|
return (i);
|
|
|
|
}
|
|
|
|
|
|
|
|
isc_result_t
|
2017-09-08 13:39:09 -07:00
|
|
|
named_config_getclass(const cfg_obj_t *classobj, dns_rdataclass_t defclass,
|
2020-02-13 14:44:37 -08:00
|
|
|
dns_rdataclass_t *classp) {
|
2001-03-04 21:21:39 +00:00
|
|
|
isc_textregion_t r;
|
2020-02-13 14:44:37 -08:00
|
|
|
isc_result_t result;
|
2001-03-04 21:21:39 +00:00
|
|
|
|
|
|
|
if (!cfg_obj_isstring(classobj)) {
|
2001-08-07 01:58:59 +00:00
|
|
|
*classp = defclass;
|
2001-03-04 21:21:39 +00:00
|
|
|
return (ISC_R_SUCCESS);
|
|
|
|
}
|
2005-08-23 02:36:11 +00:00
|
|
|
DE_CONST(cfg_obj_asstring(classobj), r.base);
|
|
|
|
r.length = strlen(r.base);
|
2001-09-17 00:33:52 +00:00
|
|
|
result = dns_rdataclass_fromtext(classp, &r);
|
2020-02-13 21:48:23 +01:00
|
|
|
if (result != ISC_R_SUCCESS) {
|
2017-09-08 13:39:09 -07:00
|
|
|
cfg_obj_log(classobj, named_g_lctx, ISC_LOG_ERROR,
|
2005-08-23 02:36:11 +00:00
|
|
|
"unknown class '%s'", r.base);
|
2020-02-13 21:48:23 +01:00
|
|
|
}
|
2001-09-17 00:33:52 +00:00
|
|
|
return (result);
|
2001-03-04 21:21:39 +00:00
|
|
|
}
|
|
|
|
|
2002-03-07 13:46:41 +00:00
|
|
|
isc_result_t
|
2017-09-08 13:39:09 -07:00
|
|
|
named_config_gettype(const cfg_obj_t *typeobj, dns_rdatatype_t deftype,
|
2020-02-13 14:44:37 -08:00
|
|
|
dns_rdatatype_t *typep) {
|
2002-03-07 13:46:41 +00:00
|
|
|
isc_textregion_t r;
|
2020-02-13 14:44:37 -08:00
|
|
|
isc_result_t result;
|
2002-03-07 13:46:41 +00:00
|
|
|
|
|
|
|
if (!cfg_obj_isstring(typeobj)) {
|
|
|
|
*typep = deftype;
|
|
|
|
return (ISC_R_SUCCESS);
|
|
|
|
}
|
2005-08-23 02:36:11 +00:00
|
|
|
DE_CONST(cfg_obj_asstring(typeobj), r.base);
|
|
|
|
r.length = strlen(r.base);
|
2002-03-07 13:46:41 +00:00
|
|
|
result = dns_rdatatype_fromtext(typep, &r);
|
2020-02-13 21:48:23 +01:00
|
|
|
if (result != ISC_R_SUCCESS) {
|
2017-09-08 13:39:09 -07:00
|
|
|
cfg_obj_log(typeobj, named_g_lctx, ISC_LOG_ERROR,
|
2005-08-23 02:36:11 +00:00
|
|
|
"unknown type '%s'", r.base);
|
2020-02-13 21:48:23 +01:00
|
|
|
}
|
2002-03-07 13:46:41 +00:00
|
|
|
return (result);
|
|
|
|
}
|
|
|
|
|
2001-03-05 13:43:14 +00:00
|
|
|
dns_zonetype_t
|
2020-02-13 14:44:37 -08:00
|
|
|
named_config_getzonetype(const cfg_obj_t *zonetypeobj) {
|
2001-03-05 11:49:15 +00:00
|
|
|
dns_zonetype_t ztype = dns_zone_none;
|
2020-02-13 14:44:37 -08:00
|
|
|
const char *str;
|
2001-03-04 21:21:39 +00:00
|
|
|
|
|
|
|
str = cfg_obj_asstring(zonetypeobj);
|
2020-02-12 13:59:18 +01:00
|
|
|
if (strcasecmp(str, "primary") == 0 || strcasecmp(str, "master") == 0) {
|
2001-03-04 21:21:39 +00:00
|
|
|
ztype = dns_zone_master;
|
2017-12-15 01:47:05 -08:00
|
|
|
} else if (strcasecmp(str, "secondary") == 0 ||
|
2020-02-12 13:59:18 +01:00
|
|
|
strcasecmp(str, "slave") == 0) {
|
2001-03-04 21:21:39 +00:00
|
|
|
ztype = dns_zone_slave;
|
2018-10-09 10:54:51 +02:00
|
|
|
} else if (strcasecmp(str, "mirror") == 0) {
|
|
|
|
ztype = dns_zone_mirror;
|
2017-12-15 01:47:05 -08:00
|
|
|
} else if (strcasecmp(str, "stub") == 0) {
|
2001-03-04 21:21:39 +00:00
|
|
|
ztype = dns_zone_stub;
|
2017-12-15 01:47:05 -08:00
|
|
|
} else if (strcasecmp(str, "static-stub") == 0) {
|
2010-12-16 09:51:30 +00:00
|
|
|
ztype = dns_zone_staticstub;
|
2017-12-15 01:47:05 -08:00
|
|
|
} else if (strcasecmp(str, "redirect") == 0) {
|
2011-02-23 03:08:11 +00:00
|
|
|
ztype = dns_zone_redirect;
|
2017-12-15 01:47:05 -08:00
|
|
|
} else {
|
2001-03-04 21:21:39 +00:00
|
|
|
INSIST(0);
|
2018-11-07 15:00:07 +07:00
|
|
|
ISC_UNREACHABLE();
|
2017-12-15 01:47:05 -08:00
|
|
|
}
|
2001-03-04 21:21:39 +00:00
|
|
|
return (ztype);
|
|
|
|
}
|
|
|
|
|
|
|
|
isc_result_t
|
2017-09-08 13:39:09 -07:00
|
|
|
named_config_getiplist(const cfg_obj_t *config, const cfg_obj_t *list,
|
2020-02-12 13:59:18 +01:00
|
|
|
in_port_t defport, isc_mem_t *mctx,
|
|
|
|
isc_sockaddr_t **addrsp, isc_dscp_t **dscpsp,
|
2020-02-13 14:44:37 -08:00
|
|
|
uint32_t *countp) {
|
|
|
|
int count, i = 0;
|
|
|
|
const cfg_obj_t *addrlist;
|
|
|
|
const cfg_obj_t *portobj, *dscpobj;
|
2006-02-28 02:39:52 +00:00
|
|
|
const cfg_listelt_t *element;
|
2020-02-13 14:44:37 -08:00
|
|
|
isc_sockaddr_t *addrs;
|
|
|
|
in_port_t port;
|
|
|
|
isc_dscp_t dscp = -1, *dscps = NULL;
|
|
|
|
isc_result_t result;
|
2001-03-04 21:21:39 +00:00
|
|
|
|
|
|
|
INSIST(addrsp != NULL && *addrsp == NULL);
|
2013-03-22 12:27:54 -07:00
|
|
|
INSIST(dscpsp == NULL || *dscpsp == NULL);
|
2002-01-23 02:12:24 +00:00
|
|
|
INSIST(countp != NULL);
|
2001-03-04 21:21:39 +00:00
|
|
|
|
|
|
|
addrlist = cfg_tuple_get(list, "addresses");
|
2017-09-08 13:39:09 -07:00
|
|
|
count = named_config_listcount(addrlist);
|
2001-03-04 21:21:39 +00:00
|
|
|
|
|
|
|
portobj = cfg_tuple_get(list, "port");
|
|
|
|
if (cfg_obj_isuint32(portobj)) {
|
2018-03-28 14:19:37 +02:00
|
|
|
uint32_t val = cfg_obj_asuint32(portobj);
|
|
|
|
if (val > UINT16_MAX) {
|
2017-09-08 13:39:09 -07:00
|
|
|
cfg_obj_log(portobj, named_g_lctx, ISC_LOG_ERROR,
|
2001-03-04 21:21:39 +00:00
|
|
|
"port '%u' out of range", val);
|
|
|
|
return (ISC_R_RANGE);
|
|
|
|
}
|
2020-02-12 13:59:18 +01:00
|
|
|
port = (in_port_t)val;
|
2020-02-13 21:48:23 +01:00
|
|
|
} else if (defport != 0) {
|
2001-03-04 21:21:39 +00:00
|
|
|
port = defport;
|
2020-02-13 21:48:23 +01:00
|
|
|
} else {
|
2020-10-01 13:18:47 +02:00
|
|
|
result = named_config_getport(config, "port", &port);
|
2020-02-13 21:48:23 +01:00
|
|
|
if (result != ISC_R_SUCCESS) {
|
2001-03-04 21:21:39 +00:00
|
|
|
return (result);
|
2020-02-13 21:48:23 +01:00
|
|
|
}
|
2001-03-04 21:21:39 +00:00
|
|
|
}
|
|
|
|
|
2013-03-22 12:27:54 -07:00
|
|
|
if (dscpsp != NULL) {
|
|
|
|
dscpobj = cfg_tuple_get(list, "dscp");
|
|
|
|
if (dscpobj != NULL && cfg_obj_isuint32(dscpobj)) {
|
|
|
|
if (cfg_obj_asuint32(dscpobj) > 63) {
|
2017-09-08 13:39:09 -07:00
|
|
|
cfg_obj_log(dscpobj, named_g_lctx,
|
|
|
|
ISC_LOG_ERROR,
|
2013-03-22 12:27:54 -07:00
|
|
|
"dscp value '%u' is out of range",
|
|
|
|
cfg_obj_asuint32(dscpobj));
|
|
|
|
return (ISC_R_RANGE);
|
|
|
|
}
|
|
|
|
dscp = (isc_dscp_t)cfg_obj_asuint32(dscpobj);
|
|
|
|
}
|
2015-04-29 03:16:50 +10:00
|
|
|
|
|
|
|
dscps = isc_mem_get(mctx, count * sizeof(isc_dscp_t));
|
2013-03-22 12:27:54 -07:00
|
|
|
}
|
|
|
|
|
2001-03-04 21:21:39 +00:00
|
|
|
addrs = isc_mem_get(mctx, count * sizeof(isc_sockaddr_t));
|
|
|
|
|
2020-02-12 13:59:18 +01:00
|
|
|
for (element = cfg_list_first(addrlist); element != NULL;
|
2020-02-13 14:44:37 -08:00
|
|
|
element = cfg_list_next(element), i++)
|
|
|
|
{
|
2013-03-22 12:27:54 -07:00
|
|
|
const cfg_obj_t *addr;
|
2001-03-04 21:21:39 +00:00
|
|
|
INSIST(i < count);
|
2013-03-22 12:27:54 -07:00
|
|
|
addr = cfg_listelt_value(element);
|
|
|
|
addrs[i] = *cfg_obj_assockaddr(addr);
|
|
|
|
if (dscpsp != NULL) {
|
|
|
|
isc_dscp_t innerdscp;
|
|
|
|
innerdscp = cfg_obj_getdscp(addr);
|
2020-02-13 21:48:23 +01:00
|
|
|
if (innerdscp == -1) {
|
2013-03-22 12:27:54 -07:00
|
|
|
innerdscp = dscp;
|
2020-02-13 21:48:23 +01:00
|
|
|
}
|
2013-03-22 12:27:54 -07:00
|
|
|
dscps[i] = innerdscp;
|
|
|
|
}
|
2020-02-13 21:48:23 +01:00
|
|
|
if (isc_sockaddr_getport(&addrs[i]) == 0) {
|
2001-03-04 21:21:39 +00:00
|
|
|
isc_sockaddr_setport(&addrs[i], port);
|
2020-02-13 21:48:23 +01:00
|
|
|
}
|
2001-03-04 21:21:39 +00:00
|
|
|
}
|
|
|
|
INSIST(i == count);
|
|
|
|
|
|
|
|
*addrsp = addrs;
|
|
|
|
*countp = count;
|
|
|
|
|
2020-02-13 21:48:23 +01:00
|
|
|
if (dscpsp != NULL) {
|
2013-03-22 12:27:54 -07:00
|
|
|
*dscpsp = dscps;
|
2020-02-13 21:48:23 +01:00
|
|
|
}
|
2013-03-22 12:27:54 -07:00
|
|
|
|
2001-03-04 21:21:39 +00:00
|
|
|
return (ISC_R_SUCCESS);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2017-09-08 13:39:09 -07:00
|
|
|
named_config_putiplist(isc_mem_t *mctx, isc_sockaddr_t **addrsp,
|
2020-02-13 14:44:37 -08:00
|
|
|
isc_dscp_t **dscpsp, uint32_t count) {
|
2001-03-04 21:21:39 +00:00
|
|
|
INSIST(addrsp != NULL && *addrsp != NULL);
|
2013-03-22 12:27:54 -07:00
|
|
|
INSIST(dscpsp == NULL || *dscpsp != NULL);
|
2001-03-04 21:21:39 +00:00
|
|
|
|
|
|
|
isc_mem_put(mctx, *addrsp, count * sizeof(isc_sockaddr_t));
|
|
|
|
*addrsp = NULL;
|
2013-03-22 12:27:54 -07:00
|
|
|
|
|
|
|
if (dscpsp != NULL) {
|
|
|
|
isc_mem_put(mctx, *dscpsp, count * sizeof(isc_dscp_t));
|
|
|
|
*dscpsp = NULL;
|
|
|
|
}
|
2001-03-04 21:21:39 +00:00
|
|
|
}
|
|
|
|
|
2020-06-25 21:59:56 -07:00
|
|
|
static isc_result_t
|
|
|
|
getprimariesdef(const cfg_obj_t *cctx, const char *list, const char *name,
|
|
|
|
const cfg_obj_t **ret) {
|
2020-02-13 14:44:37 -08:00
|
|
|
isc_result_t result;
|
2020-06-25 21:59:56 -07:00
|
|
|
const cfg_obj_t *obj = NULL;
|
2006-02-28 02:39:52 +00:00
|
|
|
const cfg_listelt_t *elt;
|
2003-02-26 06:04:03 +00:00
|
|
|
|
2020-06-25 21:59:56 -07:00
|
|
|
REQUIRE(cctx != NULL);
|
|
|
|
REQUIRE(name != NULL);
|
|
|
|
REQUIRE(ret != NULL && *ret == NULL);
|
|
|
|
|
|
|
|
result = cfg_map_get(cctx, list, &obj);
|
2020-02-13 21:48:23 +01:00
|
|
|
if (result != ISC_R_SUCCESS) {
|
2003-02-26 06:04:03 +00:00
|
|
|
return (result);
|
2020-02-13 21:48:23 +01:00
|
|
|
}
|
2020-06-25 21:59:56 -07:00
|
|
|
elt = cfg_list_first(obj);
|
|
|
|
while (elt != NULL) {
|
|
|
|
obj = cfg_listelt_value(elt);
|
|
|
|
if (strcasecmp(cfg_obj_asstring(cfg_tuple_get(obj, "name")),
|
|
|
|
name) == 0) {
|
|
|
|
*ret = obj;
|
2003-02-26 06:04:03 +00:00
|
|
|
return (ISC_R_SUCCESS);
|
|
|
|
}
|
2020-06-25 21:59:56 -07:00
|
|
|
elt = cfg_list_next(elt);
|
2003-02-26 06:04:03 +00:00
|
|
|
}
|
|
|
|
return (ISC_R_NOTFOUND);
|
|
|
|
}
|
|
|
|
|
2020-06-25 21:59:56 -07:00
|
|
|
isc_result_t
|
|
|
|
named_config_getprimariesdef(const cfg_obj_t *cctx, const char *name,
|
|
|
|
const cfg_obj_t **ret) {
|
|
|
|
isc_result_t result;
|
|
|
|
|
|
|
|
result = getprimariesdef(cctx, "primaries", name, ret);
|
|
|
|
if (result != ISC_R_SUCCESS) {
|
|
|
|
result = getprimariesdef(cctx, "masters", name, ret);
|
|
|
|
}
|
|
|
|
return (result);
|
|
|
|
}
|
|
|
|
|
2001-03-04 21:21:39 +00:00
|
|
|
isc_result_t
|
2017-09-08 13:39:09 -07:00
|
|
|
named_config_getipandkeylist(const cfg_obj_t *config, const cfg_obj_t *list,
|
2020-02-13 14:44:37 -08:00
|
|
|
isc_mem_t *mctx, dns_ipkeylist_t *ipkl) {
|
|
|
|
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;
|
2006-02-28 02:39:52 +00:00
|
|
|
const cfg_listelt_t *element;
|
2020-02-13 14:44:37 -08:00
|
|
|
const cfg_obj_t *addrlist;
|
|
|
|
const cfg_obj_t *portobj;
|
|
|
|
const cfg_obj_t *dscpobj;
|
|
|
|
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;
|
2020-02-12 13:59:18 +01:00
|
|
|
struct {
|
|
|
|
const char *name;
|
|
|
|
} *lists = NULL;
|
2003-02-26 06:04:03 +00:00
|
|
|
struct {
|
2006-02-28 02:39:52 +00:00
|
|
|
const cfg_listelt_t *element;
|
2020-02-13 14:44:37 -08:00
|
|
|
in_port_t port;
|
|
|
|
isc_dscp_t dscp;
|
2003-02-26 06:04:03 +00:00
|
|
|
} *stack = NULL;
|
2001-03-04 21:21:39 +00:00
|
|
|
|
2016-05-26 21:23:19 +02:00
|
|
|
REQUIRE(ipkl != NULL);
|
2016-06-22 10:49:25 +02:00
|
|
|
REQUIRE(ipkl->count == 0);
|
2016-05-26 21:23:19 +02:00
|
|
|
REQUIRE(ipkl->addrs == NULL);
|
|
|
|
REQUIRE(ipkl->keys == NULL);
|
|
|
|
REQUIRE(ipkl->dscps == NULL);
|
2016-06-22 10:49:25 +02:00
|
|
|
REQUIRE(ipkl->labels == NULL);
|
|
|
|
REQUIRE(ipkl->allocated == 0);
|
2001-03-04 21:21:39 +00:00
|
|
|
|
2014-11-24 11:25:06 +11:00
|
|
|
/*
|
|
|
|
* Get system defaults.
|
|
|
|
*/
|
2020-10-01 13:18:47 +02:00
|
|
|
result = named_config_getport(config, "port", &port);
|
2020-02-13 21:48:23 +01:00
|
|
|
if (result != ISC_R_SUCCESS) {
|
2014-11-24 11:25:06 +11:00
|
|
|
goto cleanup;
|
2020-02-13 21:48:23 +01:00
|
|
|
}
|
2014-11-24 11:25:06 +11:00
|
|
|
|
2017-09-08 13:39:09 -07:00
|
|
|
result = named_config_getdscp(config, &dscp);
|
2020-02-13 21:48:23 +01:00
|
|
|
if (result != ISC_R_SUCCESS) {
|
2014-11-24 11:25:06 +11:00
|
|
|
goto cleanup;
|
2020-02-13 21:48:23 +01:00
|
|
|
}
|
2014-11-24 11:25:06 +11:00
|
|
|
|
2020-02-12 13:59:18 +01:00
|
|
|
newlist:
|
2001-03-04 21:21:39 +00:00
|
|
|
addrlist = cfg_tuple_get(list, "addresses");
|
|
|
|
portobj = cfg_tuple_get(list, "port");
|
2013-03-22 12:27:54 -07:00
|
|
|
dscpobj = cfg_tuple_get(list, "dscp");
|
|
|
|
|
2001-03-04 21:21:39 +00:00
|
|
|
if (cfg_obj_isuint32(portobj)) {
|
2018-03-28 14:19:37 +02:00
|
|
|
uint32_t val = cfg_obj_asuint32(portobj);
|
|
|
|
if (val > UINT16_MAX) {
|
2017-09-08 13:39:09 -07:00
|
|
|
cfg_obj_log(portobj, named_g_lctx, ISC_LOG_ERROR,
|
2001-03-04 21:21:39 +00:00
|
|
|
"port '%u' out of range", val);
|
2005-11-30 03:33:49 +00:00
|
|
|
result = ISC_R_RANGE;
|
|
|
|
goto cleanup;
|
2001-03-04 21:21:39 +00:00
|
|
|
}
|
2020-02-12 13:59:18 +01:00
|
|
|
port = (in_port_t)val;
|
2001-03-04 21:21:39 +00:00
|
|
|
}
|
|
|
|
|
2013-03-22 12:27:54 -07:00
|
|
|
if (dscpobj != NULL && cfg_obj_isuint32(dscpobj)) {
|
|
|
|
if (cfg_obj_asuint32(dscpobj) > 63) {
|
2017-09-08 13:39:09 -07:00
|
|
|
cfg_obj_log(dscpobj, named_g_lctx, ISC_LOG_ERROR,
|
2013-03-22 12:27:54 -07:00
|
|
|
"dscp value '%u' is out of range",
|
|
|
|
cfg_obj_asuint32(dscpobj));
|
2015-04-29 03:16:50 +10:00
|
|
|
result = ISC_R_RANGE;
|
|
|
|
goto cleanup;
|
2013-03-22 12:27:54 -07:00
|
|
|
}
|
|
|
|
dscp = (isc_dscp_t)cfg_obj_asuint32(dscpobj);
|
|
|
|
}
|
|
|
|
|
2001-03-04 21:21:39 +00:00
|
|
|
result = ISC_R_NOMEMORY;
|
|
|
|
|
2003-02-26 06:04:03 +00:00
|
|
|
element = cfg_list_first(addrlist);
|
2020-02-12 13:59:18 +01:00
|
|
|
resume:
|
|
|
|
for (; element != NULL; element = cfg_list_next(element)) {
|
2006-02-28 02:39:52 +00:00
|
|
|
const cfg_obj_t *addr;
|
|
|
|
const cfg_obj_t *key;
|
2020-02-13 14:44:37 -08:00
|
|
|
const char *keystr;
|
|
|
|
isc_buffer_t b;
|
2001-03-04 21:21:39 +00:00
|
|
|
|
2020-02-17 12:05:39 -08:00
|
|
|
addr = cfg_tuple_get(cfg_listelt_value(element),
|
2020-06-17 02:02:27 -07:00
|
|
|
"primarieselement");
|
2001-03-04 21:21:39 +00:00
|
|
|
key = cfg_tuple_get(cfg_listelt_value(element), "key");
|
|
|
|
|
2003-02-26 06:04:03 +00:00
|
|
|
if (!cfg_obj_issockaddr(addr)) {
|
2020-02-13 14:44:37 -08:00
|
|
|
const char *listname = cfg_obj_asstring(addr);
|
2003-02-26 06:04:03 +00:00
|
|
|
isc_result_t tresult;
|
|
|
|
|
|
|
|
/* Grow lists? */
|
|
|
|
if (listcount == l) {
|
2020-02-13 14:44:37 -08:00
|
|
|
void *tmp;
|
2018-03-28 14:19:37 +02:00
|
|
|
uint32_t newlen = listcount + 16;
|
2020-02-13 14:44:37 -08:00
|
|
|
size_t newsize, oldsize;
|
2003-02-26 06:04:03 +00:00
|
|
|
|
|
|
|
newsize = newlen * sizeof(*lists);
|
|
|
|
oldsize = listcount * sizeof(*lists);
|
2017-07-21 11:52:24 +10:00
|
|
|
tmp = isc_mem_get(mctx, newsize);
|
2003-02-26 06:04:03 +00:00
|
|
|
if (listcount != 0) {
|
2017-07-21 11:52:24 +10:00
|
|
|
memmove(tmp, lists, oldsize);
|
2003-02-26 06:04:03 +00:00
|
|
|
isc_mem_put(mctx, lists, oldsize);
|
|
|
|
}
|
2017-07-21 11:52:24 +10:00
|
|
|
lists = tmp;
|
2003-02-26 06:04:03 +00:00
|
|
|
listcount = newlen;
|
|
|
|
}
|
|
|
|
/* Seen? */
|
2020-02-13 18:16:57 +01:00
|
|
|
for (j = 0; j < l; j++) {
|
|
|
|
if (strcasecmp(lists[j].name, listname) == 0) {
|
2003-02-26 06:04:03 +00:00
|
|
|
break;
|
2020-02-13 18:16:57 +01:00
|
|
|
}
|
|
|
|
}
|
2020-02-13 21:48:23 +01:00
|
|
|
if (j < l) {
|
2003-02-26 06:04:03 +00:00
|
|
|
continue;
|
2020-02-13 21:48:23 +01:00
|
|
|
}
|
2020-06-25 21:59:56 -07:00
|
|
|
list = NULL;
|
2020-06-17 02:02:27 -07:00
|
|
|
tresult = named_config_getprimariesdef(config, listname,
|
|
|
|
&list);
|
2003-02-26 06:04:03 +00:00
|
|
|
if (tresult == ISC_R_NOTFOUND) {
|
2017-09-08 13:39:09 -07:00
|
|
|
cfg_obj_log(addr, named_g_lctx, ISC_LOG_ERROR,
|
2020-06-17 02:02:27 -07:00
|
|
|
"primaries \"%s\" not found",
|
2020-02-12 13:59:18 +01:00
|
|
|
listname);
|
2003-02-26 06:04:03 +00:00
|
|
|
|
|
|
|
result = tresult;
|
|
|
|
goto cleanup;
|
|
|
|
}
|
2020-02-13 21:48:23 +01:00
|
|
|
if (tresult != ISC_R_SUCCESS) {
|
2003-02-26 06:04:03 +00:00
|
|
|
goto cleanup;
|
2020-02-13 21:48:23 +01:00
|
|
|
}
|
2005-09-05 02:54:38 +00:00
|
|
|
lists[l++].name = listname;
|
2003-02-26 06:04:03 +00:00
|
|
|
/* Grow stack? */
|
|
|
|
if (stackcount == pushed) {
|
2020-02-13 14:44:37 -08:00
|
|
|
void *tmp;
|
2018-03-28 14:19:37 +02:00
|
|
|
uint32_t newlen = stackcount + 16;
|
2020-02-13 14:44:37 -08:00
|
|
|
size_t newsize, oldsize;
|
2003-02-26 06:04:03 +00:00
|
|
|
|
|
|
|
newsize = newlen * sizeof(*stack);
|
|
|
|
oldsize = stackcount * sizeof(*stack);
|
2017-07-21 11:52:24 +10:00
|
|
|
tmp = isc_mem_get(mctx, newsize);
|
2003-02-26 06:04:03 +00:00
|
|
|
if (stackcount != 0) {
|
2017-07-21 11:52:24 +10:00
|
|
|
memmove(tmp, stack, oldsize);
|
2003-02-26 06:04:03 +00:00
|
|
|
isc_mem_put(mctx, stack, oldsize);
|
|
|
|
}
|
2017-07-21 11:52:24 +10:00
|
|
|
stack = tmp;
|
2003-02-26 06:04:03 +00:00
|
|
|
stackcount = newlen;
|
|
|
|
}
|
|
|
|
/*
|
|
|
|
* We want to resume processing this list on the
|
|
|
|
* next element.
|
|
|
|
*/
|
|
|
|
stack[pushed].element = cfg_list_next(element);
|
|
|
|
stack[pushed].port = port;
|
2013-03-22 12:27:54 -07:00
|
|
|
stack[pushed].dscp = dscp;
|
2003-02-26 06:04:03 +00:00
|
|
|
pushed++;
|
|
|
|
goto newlist;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (i == addrcount) {
|
2020-02-13 14:44:37 -08:00
|
|
|
void *tmp;
|
2018-03-28 14:19:37 +02:00
|
|
|
uint32_t newlen = addrcount + 16;
|
2020-02-13 14:44:37 -08:00
|
|
|
size_t newsize, oldsize;
|
2003-02-26 06:04:03 +00:00
|
|
|
|
|
|
|
newsize = newlen * sizeof(isc_sockaddr_t);
|
|
|
|
oldsize = addrcount * sizeof(isc_sockaddr_t);
|
2017-07-21 11:52:24 +10:00
|
|
|
tmp = isc_mem_get(mctx, newsize);
|
2003-02-26 06:04:03 +00:00
|
|
|
if (addrcount != 0) {
|
2017-07-21 11:52:24 +10:00
|
|
|
memmove(tmp, addrs, oldsize);
|
2003-02-26 06:04:03 +00:00
|
|
|
isc_mem_put(mctx, addrs, oldsize);
|
|
|
|
}
|
2017-07-21 11:52:24 +10:00
|
|
|
addrs = tmp;
|
2003-02-26 06:04:03 +00:00
|
|
|
addrcount = newlen;
|
|
|
|
|
2013-03-22 12:27:54 -07:00
|
|
|
newsize = newlen * sizeof(isc_dscp_t);
|
|
|
|
oldsize = dscpcount * sizeof(isc_dscp_t);
|
2017-07-21 11:52:24 +10:00
|
|
|
tmp = isc_mem_get(mctx, newsize);
|
2013-03-22 12:27:54 -07:00
|
|
|
if (dscpcount != 0) {
|
2017-07-21 11:52:24 +10:00
|
|
|
memmove(tmp, dscps, oldsize);
|
2013-03-22 12:27:54 -07:00
|
|
|
isc_mem_put(mctx, dscps, oldsize);
|
|
|
|
}
|
2017-07-21 11:52:24 +10:00
|
|
|
dscps = tmp;
|
2013-03-22 12:27:54 -07:00
|
|
|
dscpcount = newlen;
|
|
|
|
|
2003-02-26 06:04:03 +00:00
|
|
|
newsize = newlen * sizeof(dns_name_t *);
|
|
|
|
oldsize = keycount * sizeof(dns_name_t *);
|
2017-07-21 11:52:24 +10:00
|
|
|
tmp = isc_mem_get(mctx, newsize);
|
2003-02-26 06:04:03 +00:00
|
|
|
if (keycount != 0) {
|
2017-07-21 11:52:24 +10:00
|
|
|
memmove(tmp, keys, oldsize);
|
2004-10-05 02:47:50 +00:00
|
|
|
isc_mem_put(mctx, keys, oldsize);
|
2003-02-26 06:04:03 +00:00
|
|
|
}
|
2017-07-21 11:52:24 +10:00
|
|
|
keys = tmp;
|
2003-02-26 06:04:03 +00:00
|
|
|
keycount = newlen;
|
|
|
|
}
|
|
|
|
|
2001-03-04 21:21:39 +00:00
|
|
|
addrs[i] = *cfg_obj_assockaddr(addr);
|
2020-02-13 21:48:23 +01:00
|
|
|
if (isc_sockaddr_getport(&addrs[i]) == 0) {
|
2001-03-04 21:21:39 +00:00
|
|
|
isc_sockaddr_setport(&addrs[i], port);
|
2020-02-13 21:48:23 +01:00
|
|
|
}
|
2013-03-22 12:27:54 -07:00
|
|
|
dscps[i] = cfg_obj_getdscp(addr);
|
2020-02-13 21:48:23 +01:00
|
|
|
if (dscps[i] == -1) {
|
2013-03-22 12:27:54 -07:00
|
|
|
dscps[i] = dscp;
|
2020-02-13 21:48:23 +01:00
|
|
|
}
|
2001-03-04 21:21:39 +00:00
|
|
|
keys[i] = NULL;
|
2020-02-12 13:59:18 +01:00
|
|
|
i++; /* Increment here so that cleanup on error works. */
|
2020-02-13 21:48:23 +01:00
|
|
|
if (!cfg_obj_isstring(key)) {
|
2001-03-04 21:21:39 +00:00
|
|
|
continue;
|
2020-02-13 21:48:23 +01:00
|
|
|
}
|
2012-09-26 15:28:46 +10:00
|
|
|
keys[i - 1] = isc_mem_get(mctx, sizeof(dns_name_t));
|
|
|
|
dns_name_init(keys[i - 1], NULL);
|
2008-01-22 23:28:04 +00:00
|
|
|
|
2001-03-04 21:21:39 +00:00
|
|
|
keystr = cfg_obj_asstring(key);
|
2012-12-08 12:48:57 +11:00
|
|
|
isc_buffer_constinit(&b, keystr, strlen(keystr));
|
2001-03-04 21:21:39 +00:00
|
|
|
isc_buffer_add(&b, strlen(keystr));
|
|
|
|
dns_fixedname_init(&fname);
|
|
|
|
result = dns_name_fromtext(dns_fixedname_name(&fname), &b,
|
2009-09-01 00:22:28 +00:00
|
|
|
dns_rootname, 0, NULL);
|
2020-02-13 21:48:23 +01:00
|
|
|
if (result != ISC_R_SUCCESS) {
|
2001-03-04 21:21:39 +00:00
|
|
|
goto cleanup;
|
2020-02-13 21:48:23 +01:00
|
|
|
}
|
2019-11-01 08:31:13 -05:00
|
|
|
dns_name_dup(dns_fixedname_name(&fname), mctx, keys[i - 1]);
|
2003-02-26 06:04:03 +00:00
|
|
|
}
|
|
|
|
if (pushed != 0) {
|
|
|
|
pushed--;
|
|
|
|
element = stack[pushed].element;
|
|
|
|
port = stack[pushed].port;
|
2013-03-22 12:27:54 -07:00
|
|
|
dscp = stack[pushed].dscp;
|
2003-02-26 06:04:03 +00:00
|
|
|
goto resume;
|
|
|
|
}
|
|
|
|
if (i < addrcount) {
|
2020-02-13 14:44:37 -08:00
|
|
|
void *tmp;
|
2003-02-26 06:04:03 +00:00
|
|
|
size_t newsize, oldsize;
|
|
|
|
|
|
|
|
newsize = i * sizeof(isc_sockaddr_t);
|
|
|
|
oldsize = addrcount * sizeof(isc_sockaddr_t);
|
|
|
|
if (i != 0) {
|
2017-07-21 11:52:24 +10:00
|
|
|
tmp = isc_mem_get(mctx, newsize);
|
|
|
|
memmove(tmp, addrs, newsize);
|
2020-02-13 21:48:23 +01:00
|
|
|
} else {
|
2017-07-21 11:52:24 +10:00
|
|
|
tmp = NULL;
|
2020-02-13 21:48:23 +01:00
|
|
|
}
|
2005-11-30 03:33:49 +00:00
|
|
|
isc_mem_put(mctx, addrs, oldsize);
|
2017-07-21 11:52:24 +10:00
|
|
|
addrs = tmp;
|
2003-02-26 06:04:03 +00:00
|
|
|
addrcount = i;
|
|
|
|
|
2013-03-22 12:27:54 -07:00
|
|
|
newsize = i * sizeof(isc_dscp_t);
|
|
|
|
oldsize = dscpcount * sizeof(isc_dscp_t);
|
|
|
|
if (i != 0) {
|
2017-07-21 11:52:24 +10:00
|
|
|
tmp = isc_mem_get(mctx, newsize);
|
|
|
|
memmove(tmp, dscps, newsize);
|
2020-02-13 21:48:23 +01:00
|
|
|
} else {
|
2017-07-21 11:52:24 +10:00
|
|
|
tmp = NULL;
|
2020-02-13 21:48:23 +01:00
|
|
|
}
|
2013-03-22 12:27:54 -07:00
|
|
|
isc_mem_put(mctx, dscps, oldsize);
|
2017-07-21 11:52:24 +10:00
|
|
|
dscps = tmp;
|
2013-03-22 12:27:54 -07:00
|
|
|
dscpcount = i;
|
|
|
|
|
2003-02-26 06:04:03 +00:00
|
|
|
newsize = i * sizeof(dns_name_t *);
|
|
|
|
oldsize = keycount * sizeof(dns_name_t *);
|
|
|
|
if (i != 0) {
|
2017-07-21 11:52:24 +10:00
|
|
|
tmp = isc_mem_get(mctx, newsize);
|
2020-02-12 13:59:18 +01:00
|
|
|
memmove(tmp, keys, newsize);
|
2020-02-13 21:48:23 +01:00
|
|
|
} else {
|
2017-07-21 11:52:24 +10:00
|
|
|
tmp = NULL;
|
2020-02-13 21:48:23 +01:00
|
|
|
}
|
2005-11-30 03:33:49 +00:00
|
|
|
isc_mem_put(mctx, keys, oldsize);
|
2017-07-21 11:52:24 +10:00
|
|
|
keys = tmp;
|
2003-02-26 06:04:03 +00:00
|
|
|
keycount = i;
|
2001-03-04 21:21:39 +00:00
|
|
|
}
|
2003-02-26 06:04:03 +00:00
|
|
|
|
2020-02-13 21:48:23 +01:00
|
|
|
if (lists != NULL) {
|
2003-02-26 06:04:03 +00:00
|
|
|
isc_mem_put(mctx, lists, listcount * sizeof(*lists));
|
2020-02-13 21:48:23 +01:00
|
|
|
}
|
|
|
|
if (stack != NULL) {
|
2003-02-26 06:04:03 +00:00
|
|
|
isc_mem_put(mctx, stack, stackcount * sizeof(*stack));
|
2020-02-13 21:48:23 +01:00
|
|
|
}
|
2008-01-22 23:28:04 +00:00
|
|
|
|
2019-08-08 13:52:44 +10:00
|
|
|
INSIST(dscpcount == addrcount);
|
2003-02-26 06:04:03 +00:00
|
|
|
INSIST(keycount == addrcount);
|
2019-09-06 11:32:32 +10:00
|
|
|
INSIST(keycount == dscpcount);
|
2001-03-04 21:21:39 +00:00
|
|
|
|
2016-05-26 21:23:19 +02:00
|
|
|
ipkl->addrs = addrs;
|
|
|
|
ipkl->dscps = dscps;
|
|
|
|
ipkl->keys = keys;
|
|
|
|
ipkl->count = addrcount;
|
2016-06-22 10:49:25 +02:00
|
|
|
ipkl->allocated = addrcount;
|
2001-03-04 21:21:39 +00:00
|
|
|
|
|
|
|
return (ISC_R_SUCCESS);
|
|
|
|
|
2020-02-12 13:59:18 +01:00
|
|
|
cleanup:
|
2020-02-13 21:48:23 +01:00
|
|
|
if (addrs != NULL) {
|
2003-02-26 06:04:03 +00:00
|
|
|
isc_mem_put(mctx, addrs, addrcount * sizeof(isc_sockaddr_t));
|
2020-02-13 21:48:23 +01:00
|
|
|
}
|
|
|
|
if (dscps != NULL) {
|
2013-03-22 12:27:54 -07:00
|
|
|
isc_mem_put(mctx, dscps, dscpcount * sizeof(isc_dscp_t));
|
2020-02-13 21:48:23 +01:00
|
|
|
}
|
2001-03-04 21:21:39 +00:00
|
|
|
if (keys != NULL) {
|
2012-09-26 15:28:46 +10:00
|
|
|
for (j = 0; j < i; j++) {
|
2020-02-13 21:48:23 +01:00
|
|
|
if (keys[j] == NULL) {
|
2001-03-04 21:21:39 +00:00
|
|
|
continue;
|
2020-02-13 21:48:23 +01:00
|
|
|
}
|
|
|
|
if (dns_name_dynamic(keys[j])) {
|
2001-03-04 21:21:39 +00:00
|
|
|
dns_name_free(keys[j], mctx);
|
2020-02-13 21:48:23 +01:00
|
|
|
}
|
2001-03-04 21:21:39 +00:00
|
|
|
isc_mem_put(mctx, keys[j], sizeof(dns_name_t));
|
|
|
|
}
|
2003-02-26 06:04:03 +00:00
|
|
|
isc_mem_put(mctx, keys, keycount * sizeof(dns_name_t *));
|
2001-03-04 21:21:39 +00:00
|
|
|
}
|
2020-02-13 21:48:23 +01:00
|
|
|
if (lists != NULL) {
|
2003-02-26 06:04:03 +00:00
|
|
|
isc_mem_put(mctx, lists, listcount * sizeof(*lists));
|
2020-02-13 21:48:23 +01:00
|
|
|
}
|
|
|
|
if (stack != NULL) {
|
2003-02-26 06:04:03 +00:00
|
|
|
isc_mem_put(mctx, stack, stackcount * sizeof(*stack));
|
2020-02-13 21:48:23 +01:00
|
|
|
}
|
2001-03-04 21:21:39 +00:00
|
|
|
return (result);
|
|
|
|
}
|
|
|
|
|
|
|
|
isc_result_t
|
2020-10-01 13:18:47 +02:00
|
|
|
named_config_getport(const cfg_obj_t *config, const char *type,
|
|
|
|
in_port_t *portp) {
|
2006-02-28 02:39:52 +00:00
|
|
|
const cfg_obj_t *maps[3];
|
|
|
|
const cfg_obj_t *options = NULL;
|
|
|
|
const cfg_obj_t *portobj = NULL;
|
2020-02-13 14:44:37 -08:00
|
|
|
isc_result_t result;
|
|
|
|
int i;
|
2001-03-04 21:21:39 +00:00
|
|
|
|
2001-11-30 01:59:49 +00:00
|
|
|
(void)cfg_map_get(config, "options", &options);
|
2001-03-04 21:21:39 +00:00
|
|
|
i = 0;
|
2020-02-13 21:48:23 +01:00
|
|
|
if (options != NULL) {
|
2001-03-04 21:21:39 +00:00
|
|
|
maps[i++] = options;
|
2020-02-13 21:48:23 +01:00
|
|
|
}
|
2017-09-08 13:39:09 -07:00
|
|
|
maps[i++] = named_g_defaults;
|
2001-03-04 21:21:39 +00:00
|
|
|
maps[i] = NULL;
|
|
|
|
|
2020-10-01 13:18:47 +02:00
|
|
|
result = named_config_get(maps, type, &portobj);
|
2001-03-04 21:21:39 +00:00
|
|
|
INSIST(result == ISC_R_SUCCESS);
|
2018-03-28 14:19:37 +02:00
|
|
|
if (cfg_obj_asuint32(portobj) >= UINT16_MAX) {
|
2017-09-08 13:39:09 -07:00
|
|
|
cfg_obj_log(portobj, named_g_lctx, ISC_LOG_ERROR,
|
2001-03-04 21:21:39 +00:00
|
|
|
"port '%u' out of range",
|
|
|
|
cfg_obj_asuint32(portobj));
|
|
|
|
return (ISC_R_RANGE);
|
|
|
|
}
|
|
|
|
*portp = (in_port_t)cfg_obj_asuint32(portobj);
|
|
|
|
return (ISC_R_SUCCESS);
|
|
|
|
}
|
2001-08-03 18:12:08 +00:00
|
|
|
|
2013-03-22 12:27:54 -07:00
|
|
|
isc_result_t
|
2020-02-13 14:44:37 -08:00
|
|
|
named_config_getdscp(const cfg_obj_t *config, isc_dscp_t *dscpp) {
|
2013-03-22 12:27:54 -07:00
|
|
|
const cfg_obj_t *options = NULL;
|
|
|
|
const cfg_obj_t *dscpobj = NULL;
|
2020-02-13 14:44:37 -08:00
|
|
|
isc_result_t result;
|
2013-03-22 12:27:54 -07:00
|
|
|
|
|
|
|
(void)cfg_map_get(config, "options", &options);
|
2020-02-13 21:48:23 +01:00
|
|
|
if (options == NULL) {
|
2013-04-19 12:36:02 +10:00
|
|
|
return (ISC_R_SUCCESS);
|
2020-02-13 21:48:23 +01:00
|
|
|
}
|
2013-03-22 12:27:54 -07:00
|
|
|
|
2013-04-19 12:36:02 +10:00
|
|
|
result = cfg_map_get(options, "dscp", &dscpobj);
|
2013-03-23 19:40:20 +11:00
|
|
|
if (result != ISC_R_SUCCESS || dscpobj == NULL) {
|
2013-03-22 12:27:54 -07:00
|
|
|
*dscpp = -1;
|
|
|
|
return (ISC_R_SUCCESS);
|
|
|
|
}
|
|
|
|
if (cfg_obj_asuint32(dscpobj) >= 64) {
|
2017-09-08 13:39:09 -07:00
|
|
|
cfg_obj_log(dscpobj, named_g_lctx, ISC_LOG_ERROR,
|
2013-03-22 12:27:54 -07:00
|
|
|
"dscp '%u' out of range",
|
|
|
|
cfg_obj_asuint32(dscpobj));
|
|
|
|
return (ISC_R_RANGE);
|
|
|
|
}
|
|
|
|
*dscpp = (isc_dscp_t)cfg_obj_asuint32(dscpobj);
|
|
|
|
return (ISC_R_SUCCESS);
|
|
|
|
}
|
|
|
|
|
2006-01-27 02:35:15 +00:00
|
|
|
struct keyalgorithms {
|
|
|
|
const char *str;
|
2020-08-24 09:23:19 +02:00
|
|
|
enum {
|
|
|
|
hmacnone,
|
|
|
|
hmacmd5,
|
|
|
|
hmacsha1,
|
|
|
|
hmacsha224,
|
|
|
|
hmacsha256,
|
|
|
|
hmacsha384,
|
|
|
|
hmacsha512
|
|
|
|
} hmac;
|
2009-06-10 00:27:22 +00:00
|
|
|
unsigned int type;
|
2020-02-13 14:44:37 -08:00
|
|
|
uint16_t size;
|
2020-02-12 13:59:18 +01:00
|
|
|
} algorithms[] = { { "hmac-md5", hmacmd5, DST_ALG_HMACMD5, 128 },
|
|
|
|
{ "hmac-md5.sig-alg.reg.int", hmacmd5, DST_ALG_HMACMD5, 0 },
|
|
|
|
{ "hmac-md5.sig-alg.reg.int.", hmacmd5, DST_ALG_HMACMD5, 0 },
|
|
|
|
{ "hmac-sha1", hmacsha1, DST_ALG_HMACSHA1, 160 },
|
|
|
|
{ "hmac-sha224", hmacsha224, DST_ALG_HMACSHA224, 224 },
|
|
|
|
{ "hmac-sha256", hmacsha256, DST_ALG_HMACSHA256, 256 },
|
|
|
|
{ "hmac-sha384", hmacsha384, DST_ALG_HMACSHA384, 384 },
|
|
|
|
{ "hmac-sha512", hmacsha512, DST_ALG_HMACSHA512, 512 },
|
|
|
|
{ NULL, hmacnone, DST_ALG_UNKNOWN, 0 } };
|
2006-01-27 02:35:15 +00:00
|
|
|
|
2001-08-03 18:12:08 +00:00
|
|
|
isc_result_t
|
2017-09-08 13:39:09 -07:00
|
|
|
named_config_getkeyalgorithm(const char *str, const dns_name_t **name,
|
2020-02-13 14:44:37 -08:00
|
|
|
uint16_t *digestbits) {
|
2017-09-08 13:39:09 -07:00
|
|
|
return (named_config_getkeyalgorithm2(str, name, NULL, digestbits));
|
2009-06-10 00:27:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
isc_result_t
|
2017-09-08 13:39:09 -07:00
|
|
|
named_config_getkeyalgorithm2(const char *str, const dns_name_t **name,
|
2020-02-13 14:44:37 -08:00
|
|
|
unsigned int *typep, uint16_t *digestbits) {
|
|
|
|
int i;
|
|
|
|
size_t len = 0;
|
|
|
|
uint16_t bits;
|
2006-01-27 02:35:15 +00:00
|
|
|
isc_result_t result;
|
|
|
|
|
|
|
|
for (i = 0; algorithms[i].str != NULL; i++) {
|
|
|
|
len = strlen(algorithms[i].str);
|
|
|
|
if (strncasecmp(algorithms[i].str, str, len) == 0 &&
|
|
|
|
(str[len] == '\0' ||
|
2020-02-13 14:44:37 -08:00
|
|
|
(algorithms[i].size != 0 && str[len] == '-')))
|
|
|
|
{
|
2006-01-27 02:35:15 +00:00
|
|
|
break;
|
2020-02-13 21:48:23 +01:00
|
|
|
}
|
2001-08-03 18:12:08 +00:00
|
|
|
}
|
2020-02-13 21:48:23 +01:00
|
|
|
if (algorithms[i].str == NULL) {
|
2006-01-27 02:35:15 +00:00
|
|
|
return (ISC_R_NOTFOUND);
|
2020-02-13 21:48:23 +01:00
|
|
|
}
|
2006-01-27 02:35:15 +00:00
|
|
|
if (str[len] == '-') {
|
|
|
|
result = isc_parse_uint16(&bits, str + len + 1, 10);
|
2020-02-13 21:48:23 +01:00
|
|
|
if (result != ISC_R_SUCCESS) {
|
2006-01-27 02:35:15 +00:00
|
|
|
return (result);
|
2020-02-13 21:48:23 +01:00
|
|
|
}
|
|
|
|
if (bits > algorithms[i].size) {
|
2006-01-27 02:35:15 +00:00
|
|
|
return (ISC_R_RANGE);
|
2020-02-13 21:48:23 +01:00
|
|
|
}
|
|
|
|
} else if (algorithms[i].size == 0) {
|
2006-01-27 02:35:15 +00:00
|
|
|
bits = 128;
|
2020-02-13 21:48:23 +01:00
|
|
|
} else {
|
2006-01-27 02:35:15 +00:00
|
|
|
bits = algorithms[i].size;
|
2020-02-13 21:48:23 +01:00
|
|
|
}
|
2006-01-27 02:35:15 +00:00
|
|
|
|
|
|
|
if (name != NULL) {
|
|
|
|
switch (algorithms[i].hmac) {
|
2020-02-12 13:59:18 +01:00
|
|
|
case hmacmd5:
|
|
|
|
*name = dns_tsig_hmacmd5_name;
|
|
|
|
break;
|
|
|
|
case hmacsha1:
|
|
|
|
*name = dns_tsig_hmacsha1_name;
|
|
|
|
break;
|
|
|
|
case hmacsha224:
|
|
|
|
*name = dns_tsig_hmacsha224_name;
|
|
|
|
break;
|
|
|
|
case hmacsha256:
|
|
|
|
*name = dns_tsig_hmacsha256_name;
|
|
|
|
break;
|
|
|
|
case hmacsha384:
|
|
|
|
*name = dns_tsig_hmacsha384_name;
|
|
|
|
break;
|
|
|
|
case hmacsha512:
|
|
|
|
*name = dns_tsig_hmacsha512_name;
|
|
|
|
break;
|
2006-01-27 02:35:15 +00:00
|
|
|
default:
|
|
|
|
INSIST(0);
|
2018-11-07 15:00:07 +07:00
|
|
|
ISC_UNREACHABLE();
|
2006-01-27 02:35:15 +00:00
|
|
|
}
|
|
|
|
}
|
2020-02-13 21:48:23 +01:00
|
|
|
if (typep != NULL) {
|
2009-06-10 00:27:22 +00:00
|
|
|
*typep = algorithms[i].type;
|
2020-02-13 21:48:23 +01:00
|
|
|
}
|
|
|
|
if (digestbits != NULL) {
|
2006-01-27 02:35:15 +00:00
|
|
|
*digestbits = bits;
|
2020-02-13 21:48:23 +01:00
|
|
|
}
|
2006-01-27 02:35:15 +00:00
|
|
|
return (ISC_R_SUCCESS);
|
2001-08-03 18:12:08 +00:00
|
|
|
}
|