import unbound 1.5.10
This commit is contained in:
parent
a6533d8899
commit
27c2fff0f2
42
Makefile.in
42
Makefile.in
@ -81,7 +81,7 @@ LINTFLAGS+=@NETBSD_LINTFLAGS@
|
||||
# compat with OpenBSD
|
||||
LINTFLAGS+="-Dsigset_t=long"
|
||||
# FreeBSD
|
||||
LINTFLAGS+="-D__uint16_t=uint16_t" "-DEVP_PKEY_ASN1_METHOD=int" "-D_RuneLocale=int" "-D__va_list=va_list"
|
||||
LINTFLAGS+="-D__uint16_t=uint16_t" "-DEVP_PKEY_ASN1_METHOD=int" "-D_RuneLocale=int" "-D__va_list=va_list" "-D__uint32_t=uint32_t"
|
||||
|
||||
INSTALL=$(SHELL) $(srcdir)/install-sh
|
||||
|
||||
@ -228,7 +228,7 @@ SVCUNINST_OBJ_LINK=$(SVCUNINST_OBJ) w_inst.lo rsrc_svcuninst.o \
|
||||
$(COMPAT_OBJ_WITHOUT_CTIMEARC4)
|
||||
ANCHORUPD_SRC=winrc/anchor-update.c
|
||||
ANCHORUPD_OBJ=anchor-update.lo
|
||||
ANCHORUPD_OBJ_LINK=$(ANCHORUPD_OBJ) rsrc_anchorupd.o $(COMPAT_OBJ_WITHOUT_CTIMEARC4)
|
||||
ANCHORUPD_OBJ_LINK=$(ANCHORUPD_OBJ) rsrc_anchorupd.o $(COMPAT_OBJ_WITHOUT_CTIMEARC4) wire2str.lo str2wire.lo parseutil.lo sbuffer.lo rrdef.lo keyraw.lo parse.lo
|
||||
RSRC_OBJ=rsrc_svcinst.o rsrc_svcuninst.o rsrc_anchorupd.o rsrc_unbound.o \
|
||||
rsrc_unbound_host.o rsrc_unbound_anchor.o rsrc_unbound_control.o \
|
||||
rsrc_unbound_checkconf.o
|
||||
@ -704,11 +704,12 @@ listen_dnsport.lo listen_dnsport.o: $(srcdir)/services/listen_dnsport.c config.h
|
||||
$(srcdir)/util/rbtree.h $(srcdir)/util/log.h $(srcdir)/util/config_file.h \
|
||||
$(srcdir)/util/net_help.h $(srcdir)/sldns/sbuffer.h
|
||||
localzone.lo localzone.o: $(srcdir)/services/localzone.c config.h $(srcdir)/services/localzone.h \
|
||||
$(srcdir)/util/rbtree.h $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/sldns/str2wire.h $(srcdir)/sldns/rrdef.h \
|
||||
$(srcdir)/sldns/sbuffer.h $(srcdir)/util/regional.h $(srcdir)/util/config_file.h $(srcdir)/util/data/dname.h \
|
||||
$(srcdir)/util/storage/lruhash.h $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/data/msgencode.h \
|
||||
$(srcdir)/util/net_help.h $(srcdir)/util/netevent.h $(srcdir)/util/data/msgreply.h \
|
||||
$(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h $(srcdir)/util/as112.h
|
||||
$(srcdir)/util/rbtree.h $(srcdir)/util/locks.h $(srcdir)/util/log.h $(srcdir)/util/storage/dnstree.h \
|
||||
$(srcdir)/sldns/str2wire.h $(srcdir)/sldns/rrdef.h $(srcdir)/sldns/sbuffer.h $(srcdir)/util/regional.h \
|
||||
$(srcdir)/util/config_file.h $(srcdir)/util/data/dname.h $(srcdir)/util/storage/lruhash.h \
|
||||
$(srcdir)/util/data/packed_rrset.h $(srcdir)/util/data/msgencode.h $(srcdir)/util/net_help.h \
|
||||
$(srcdir)/util/netevent.h $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h \
|
||||
$(srcdir)/util/as112.h
|
||||
mesh.lo mesh.o: $(srcdir)/services/mesh.c config.h $(srcdir)/services/mesh.h $(srcdir)/util/rbtree.h \
|
||||
$(srcdir)/util/netevent.h $(srcdir)/util/data/msgparse.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h \
|
||||
$(srcdir)/util/log.h $(srcdir)/sldns/pkthdr.h $(srcdir)/sldns/rrdef.h $(srcdir)/util/module.h \
|
||||
@ -759,7 +760,7 @@ fptr_wlist.lo fptr_wlist.o: $(srcdir)/util/fptr_wlist.c config.h $(srcdir)/util/
|
||||
$(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h $(srcdir)/sldns/rrdef.h $(srcdir)/util/tube.h \
|
||||
$(srcdir)/services/mesh.h $(srcdir)/util/rbtree.h $(srcdir)/services/modstack.h $(srcdir)/util/mini_event.h \
|
||||
$(srcdir)/util/rbtree.h $(srcdir)/services/outside_network.h \
|
||||
$(srcdir)/services/localzone.h $(srcdir)/services/cache/infra.h $(srcdir)/util/storage/dnstree.h \
|
||||
$(srcdir)/services/localzone.h $(srcdir)/util/storage/dnstree.h $(srcdir)/services/cache/infra.h \
|
||||
$(srcdir)/util/rtt.h $(srcdir)/services/cache/rrset.h $(srcdir)/util/storage/slabhash.h $(srcdir)/dns64/dns64.h \
|
||||
$(srcdir)/iterator/iterator.h $(srcdir)/services/outbound_list.h $(srcdir)/iterator/iter_fwd.h \
|
||||
$(srcdir)/validator/validator.h $(srcdir)/validator/val_utils.h $(srcdir)/validator/val_anchor.h \
|
||||
@ -956,7 +957,8 @@ unitldns.lo unitldns.o: $(srcdir)/testcode/unitldns.c config.h $(srcdir)/util/lo
|
||||
$(srcdir)/sldns/sbuffer.h $(srcdir)/sldns/str2wire.h $(srcdir)/sldns/rrdef.h $(srcdir)/sldns/wire2str.h
|
||||
acl_list.lo acl_list.o: $(srcdir)/daemon/acl_list.c config.h $(srcdir)/daemon/acl_list.h \
|
||||
$(srcdir)/util/storage/dnstree.h $(srcdir)/util/rbtree.h $(srcdir)/util/regional.h $(srcdir)/util/log.h \
|
||||
$(srcdir)/util/config_file.h $(srcdir)/util/net_help.h
|
||||
$(srcdir)/util/config_file.h $(srcdir)/util/net_help.h $(srcdir)/services/localzone.h $(srcdir)/util/locks.h \
|
||||
$(srcdir)/sldns/str2wire.h $(srcdir)/sldns/rrdef.h
|
||||
cachedump.lo cachedump.o: $(srcdir)/daemon/cachedump.c config.h $(srcdir)/daemon/cachedump.h \
|
||||
$(srcdir)/daemon/remote.h $(srcdir)/daemon/worker.h $(srcdir)/libunbound/worker.h $(srcdir)/sldns/sbuffer.h \
|
||||
$(srcdir)/util/data/packed_rrset.h $(srcdir)/util/storage/lruhash.h $(srcdir)/util/locks.h $(srcdir)/util/log.h \
|
||||
@ -1063,7 +1065,8 @@ worker.lo worker.o: $(srcdir)/daemon/worker.c config.h $(srcdir)/util/log.h $(sr
|
||||
$(srcdir)/libunbound/libworker.h
|
||||
acl_list.lo acl_list.o: $(srcdir)/daemon/acl_list.c config.h $(srcdir)/daemon/acl_list.h \
|
||||
$(srcdir)/util/storage/dnstree.h $(srcdir)/util/rbtree.h $(srcdir)/util/regional.h $(srcdir)/util/log.h \
|
||||
$(srcdir)/util/config_file.h $(srcdir)/util/net_help.h
|
||||
$(srcdir)/util/config_file.h $(srcdir)/util/net_help.h $(srcdir)/services/localzone.h $(srcdir)/util/locks.h \
|
||||
$(srcdir)/sldns/str2wire.h $(srcdir)/sldns/rrdef.h
|
||||
daemon.lo daemon.o: $(srcdir)/daemon/daemon.c config.h $(srcdir)/daemon/daemon.h $(srcdir)/util/locks.h \
|
||||
$(srcdir)/util/log.h $(srcdir)/util/alloc.h $(srcdir)/services/modstack.h \
|
||||
$(srcdir)/daemon/worker.h $(srcdir)/libunbound/worker.h $(srcdir)/sldns/sbuffer.h \
|
||||
@ -1134,8 +1137,8 @@ context.lo context.o: $(srcdir)/libunbound/context.c config.h $(srcdir)/libunbou
|
||||
$(srcdir)/libunbound/unbound.h $(srcdir)/util/data/packed_rrset.h $(srcdir)/util/storage/lruhash.h \
|
||||
$(srcdir)/util/module.h $(srcdir)/util/data/msgreply.h $(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h \
|
||||
$(srcdir)/sldns/rrdef.h $(srcdir)/util/config_file.h $(srcdir)/util/net_help.h $(srcdir)/services/localzone.h \
|
||||
$(srcdir)/services/cache/rrset.h $(srcdir)/util/storage/slabhash.h $(srcdir)/services/cache/infra.h \
|
||||
$(srcdir)/util/storage/dnstree.h $(srcdir)/util/rtt.h $(srcdir)/sldns/sbuffer.h
|
||||
$(srcdir)/util/storage/dnstree.h $(srcdir)/services/cache/rrset.h $(srcdir)/util/storage/slabhash.h \
|
||||
$(srcdir)/services/cache/infra.h $(srcdir)/util/rtt.h $(srcdir)/sldns/sbuffer.h
|
||||
libunbound.lo libunbound.o: $(srcdir)/libunbound/libunbound.c $(srcdir)/libunbound/unbound.h \
|
||||
$(srcdir)/libunbound/unbound-event.h config.h $(srcdir)/libunbound/context.h $(srcdir)/util/locks.h \
|
||||
$(srcdir)/util/log.h $(srcdir)/util/alloc.h $(srcdir)/util/rbtree.h $(srcdir)/services/modstack.h \
|
||||
@ -1143,7 +1146,7 @@ libunbound.lo libunbound.o: $(srcdir)/libunbound/libunbound.c $(srcdir)/libunbou
|
||||
$(srcdir)/util/config_file.h $(srcdir)/util/module.h $(srcdir)/util/data/msgreply.h \
|
||||
$(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h $(srcdir)/sldns/rrdef.h $(srcdir)/util/regional.h \
|
||||
$(srcdir)/util/random.h $(srcdir)/util/net_help.h $(srcdir)/util/tube.h $(srcdir)/util/ub_event.h \
|
||||
$(srcdir)/services/localzone.h $(srcdir)/services/cache/infra.h $(srcdir)/util/storage/dnstree.h \
|
||||
$(srcdir)/services/localzone.h $(srcdir)/util/storage/dnstree.h $(srcdir)/services/cache/infra.h \
|
||||
$(srcdir)/util/rtt.h $(srcdir)/services/cache/rrset.h $(srcdir)/util/storage/slabhash.h \
|
||||
$(srcdir)/sldns/sbuffer.h
|
||||
libworker.lo libworker.o: $(srcdir)/libunbound/libworker.c config.h $(srcdir)/libunbound/libworker.h \
|
||||
@ -1153,11 +1156,12 @@ libworker.lo libworker.o: $(srcdir)/libunbound/libworker.c config.h $(srcdir)/li
|
||||
$(srcdir)/libunbound/unbound-event.h $(srcdir)/services/outside_network.h $(srcdir)/util/netevent.h \
|
||||
$(srcdir)/services/mesh.h $(srcdir)/util/data/msgparse.h \
|
||||
$(srcdir)/sldns/pkthdr.h $(srcdir)/sldns/rrdef.h $(srcdir)/util/module.h $(srcdir)/util/data/msgreply.h \
|
||||
$(srcdir)/services/localzone.h $(srcdir)/services/cache/rrset.h $(srcdir)/util/storage/slabhash.h \
|
||||
$(srcdir)/services/outbound_list.h $(srcdir)/util/fptr_wlist.h $(srcdir)/util/tube.h $(srcdir)/util/regional.h \
|
||||
$(srcdir)/util/random.h $(srcdir)/util/config_file.h $(srcdir)/util/storage/lookup3.h $(srcdir)/util/net_help.h \
|
||||
$(srcdir)/util/data/dname.h $(srcdir)/util/data/msgencode.h $(srcdir)/iterator/iter_fwd.h \
|
||||
$(srcdir)/iterator/iter_hints.h $(srcdir)/util/storage/dnstree.h $(srcdir)/sldns/str2wire.h
|
||||
$(srcdir)/services/localzone.h $(srcdir)/util/storage/dnstree.h $(srcdir)/services/cache/rrset.h \
|
||||
$(srcdir)/util/storage/slabhash.h $(srcdir)/services/outbound_list.h $(srcdir)/util/fptr_wlist.h \
|
||||
$(srcdir)/util/tube.h $(srcdir)/util/regional.h $(srcdir)/util/random.h $(srcdir)/util/config_file.h \
|
||||
$(srcdir)/util/storage/lookup3.h $(srcdir)/util/net_help.h $(srcdir)/util/data/dname.h \
|
||||
$(srcdir)/util/data/msgencode.h $(srcdir)/iterator/iter_fwd.h $(srcdir)/iterator/iter_hints.h \
|
||||
$(srcdir)/sldns/str2wire.h
|
||||
unbound-host.lo unbound-host.o: $(srcdir)/smallapp/unbound-host.c config.h $(srcdir)/libunbound/unbound.h \
|
||||
$(srcdir)/sldns/rrdef.h $(srcdir)/sldns/wire2str.h
|
||||
asynclook.lo asynclook.o: $(srcdir)/testcode/asynclook.c config.h $(srcdir)/libunbound/unbound.h \
|
||||
@ -1225,7 +1229,6 @@ snprintf.lo snprintf.o: $(srcdir)/compat/snprintf.c config.h
|
||||
strlcat.lo strlcat.o: $(srcdir)/compat/strlcat.c config.h
|
||||
strlcpy.lo strlcpy.o: $(srcdir)/compat/strlcpy.c config.h
|
||||
strptime.lo strptime.o: $(srcdir)/compat/strptime.c config.h
|
||||
strsep.lo strsep.o: $(srcdir)/compat/strsep.c config.h
|
||||
getentropy_linux.lo getentropy_linux.o: $(srcdir)/compat/getentropy_linux.c config.h
|
||||
getentropy_osx.lo getentropy_osx.o: $(srcdir)/compat/getentropy_osx.c config.h
|
||||
getentropy_solaris.lo getentropy_solaris.o: $(srcdir)/compat/getentropy_solaris.c config.h
|
||||
@ -1237,3 +1240,4 @@ arc4_lock.lo arc4_lock.o: $(srcdir)/compat/arc4_lock.c config.h $(srcdir)/util/l
|
||||
sha512.lo sha512.o: $(srcdir)/compat/sha512.c config.h
|
||||
reallocarray.lo reallocarray.o: $(srcdir)/compat/reallocarray.c config.h
|
||||
isblank.lo isblank.o: $(srcdir)/compat/isblank.c config.h
|
||||
strsep.lo strsep.o: $(srcdir)/compat/strsep.c config.h
|
||||
|
@ -54,7 +54,7 @@ $ac_distutils_result])
|
||||
AC_MSG_CHECKING([for Python library path])
|
||||
if test -z "$PYTHON_LDFLAGS"; then
|
||||
PYTHON_LDFLAGS=`$PYTHON -c "from distutils.sysconfig import *; \
|
||||
print(get_config_var('BLDLIBRARY'));"`
|
||||
print('-L'+get_config_var('LIBDIR')+' -L'+get_config_var('LIBDEST')+' '+get_config_var('BLDLIBRARY'));"`
|
||||
fi
|
||||
AC_MSG_RESULT([$PYTHON_LDFLAGS])
|
||||
AC_SUBST([PYTHON_LDFLAGS])
|
||||
|
@ -48,6 +48,9 @@
|
||||
#else /* !__GNUC__ */
|
||||
#define inline
|
||||
#endif /* !__GNUC__ */
|
||||
#ifndef MAP_ANON
|
||||
#define MAP_ANON MAP_ANONYMOUS
|
||||
#endif
|
||||
|
||||
#define KEYSZ 32
|
||||
#define IVSZ 8
|
||||
|
@ -60,6 +60,9 @@
|
||||
#include <sys/auxv.h>
|
||||
#endif
|
||||
#include <sys/vfs.h>
|
||||
#ifndef MAP_ANON
|
||||
#define MAP_ANON MAP_ANONYMOUS
|
||||
#endif
|
||||
|
||||
#define REPEAT 5
|
||||
#define min(a, b) (((a) < (b)) ? (a) : (b))
|
||||
|
51
config.h.in
51
config.h.in
@ -51,6 +51,9 @@
|
||||
/* Define to 1 if you have the `chroot' function. */
|
||||
#undef HAVE_CHROOT
|
||||
|
||||
/* Define to 1 if you have the `CRYPTO_cleanup_all_ex_data' function. */
|
||||
#undef HAVE_CRYPTO_CLEANUP_ALL_EX_DATA
|
||||
|
||||
/* Define to 1 if you have the `ctime_r' function. */
|
||||
#undef HAVE_CTIME_R
|
||||
|
||||
@ -110,9 +113,18 @@
|
||||
/* Define to 1 if you have the `endprotoent' function. */
|
||||
#undef HAVE_ENDPROTOENT
|
||||
|
||||
/* Define to 1 if you have the `endpwent' function. */
|
||||
#undef HAVE_ENDPWENT
|
||||
|
||||
/* Define to 1 if you have the `endservent' function. */
|
||||
#undef HAVE_ENDSERVENT
|
||||
|
||||
/* Define to 1 if you have the `ERR_free_strings' function. */
|
||||
#undef HAVE_ERR_FREE_STRINGS
|
||||
|
||||
/* Define to 1 if you have the `ERR_load_crypto_strings' function. */
|
||||
#undef HAVE_ERR_LOAD_CRYPTO_STRINGS
|
||||
|
||||
/* Define to 1 if you have the `event_base_free' function. */
|
||||
#undef HAVE_EVENT_BASE_FREE
|
||||
|
||||
@ -128,6 +140,9 @@
|
||||
/* Define to 1 if you have the <event.h> header file. */
|
||||
#undef HAVE_EVENT_H
|
||||
|
||||
/* Define to 1 if you have the `EVP_cleanup' function. */
|
||||
#undef HAVE_EVP_CLEANUP
|
||||
|
||||
/* Define to 1 if you have the `EVP_MD_CTX_new' function. */
|
||||
#undef HAVE_EVP_MD_CTX_NEW
|
||||
|
||||
@ -254,24 +269,48 @@
|
||||
/* Use libnettle for crypto */
|
||||
#undef HAVE_NETTLE
|
||||
|
||||
/* Define to 1 if you have the <nettle/dsa-compat.h> header file. */
|
||||
#undef HAVE_NETTLE_DSA_COMPAT_H
|
||||
|
||||
/* Use libnss for crypto */
|
||||
#undef HAVE_NSS
|
||||
|
||||
/* Define to 1 if you have the `OpenSSL_add_all_digests' function. */
|
||||
#undef HAVE_OPENSSL_ADD_ALL_DIGESTS
|
||||
|
||||
/* Define to 1 if you have the <openssl/bn.h> header file. */
|
||||
#undef HAVE_OPENSSL_BN_H
|
||||
|
||||
/* Define to 1 if you have the `OPENSSL_config' function. */
|
||||
#undef HAVE_OPENSSL_CONFIG
|
||||
|
||||
/* Define to 1 if you have the <openssl/conf.h> header file. */
|
||||
#undef HAVE_OPENSSL_CONF_H
|
||||
|
||||
/* Define to 1 if you have the <openssl/dh.h> header file. */
|
||||
#undef HAVE_OPENSSL_DH_H
|
||||
|
||||
/* Define to 1 if you have the <openssl/dsa.h> header file. */
|
||||
#undef HAVE_OPENSSL_DSA_H
|
||||
|
||||
/* Define to 1 if you have the <openssl/engine.h> header file. */
|
||||
#undef HAVE_OPENSSL_ENGINE_H
|
||||
|
||||
/* Define to 1 if you have the <openssl/err.h> header file. */
|
||||
#undef HAVE_OPENSSL_ERR_H
|
||||
|
||||
/* Define to 1 if you have the `OPENSSL_init_crypto' function. */
|
||||
#undef HAVE_OPENSSL_INIT_CRYPTO
|
||||
|
||||
/* Define to 1 if you have the `OPENSSL_init_ssl' function. */
|
||||
#undef HAVE_OPENSSL_INIT_SSL
|
||||
|
||||
/* Define to 1 if you have the <openssl/rand.h> header file. */
|
||||
#undef HAVE_OPENSSL_RAND_H
|
||||
|
||||
/* Define to 1 if you have the <openssl/rsa.h> header file. */
|
||||
#undef HAVE_OPENSSL_RSA_H
|
||||
|
||||
/* Define to 1 if you have the <openssl/ssl.h> header file. */
|
||||
#undef HAVE_OPENSSL_SSL_H
|
||||
|
||||
@ -296,6 +335,9 @@
|
||||
/* Define to 1 if you have the `random' function. */
|
||||
#undef HAVE_RANDOM
|
||||
|
||||
/* Define to 1 if you have the `RAND_cleanup' function. */
|
||||
#undef HAVE_RAND_CLEANUP
|
||||
|
||||
/* Define to 1 if you have the `reallocarray' function. */
|
||||
#undef HAVE_REALLOCARRAY
|
||||
|
||||
@ -610,6 +652,12 @@
|
||||
/* Define if you want to use internal select based events */
|
||||
#undef USE_MINI_EVENT
|
||||
|
||||
/* Define this to enable client TCP Fast Open. */
|
||||
#undef USE_MSG_FASTOPEN
|
||||
|
||||
/* Define this to enable client TCP Fast Open. */
|
||||
#undef USE_OSX_MSG_FASTOPEN
|
||||
|
||||
/* Define this to enable SHA256 and SHA512 support. */
|
||||
#undef USE_SHA2
|
||||
|
||||
@ -635,6 +683,9 @@
|
||||
#endif
|
||||
|
||||
|
||||
/* Define this to enable server TCP Fast Open. */
|
||||
#undef USE_TCP_FASTOPEN
|
||||
|
||||
/* Whether the windows socket API is used */
|
||||
#undef USE_WINSOCK
|
||||
|
||||
|
221
configure
vendored
221
configure
vendored
@ -1,6 +1,6 @@
|
||||
#! /bin/sh
|
||||
# Guess values for system-dependent variables and create Makefiles.
|
||||
# Generated by GNU Autoconf 2.69 for unbound 1.5.9.
|
||||
# Generated by GNU Autoconf 2.69 for unbound 1.5.10.
|
||||
#
|
||||
# Report bugs to <unbound-bugs@nlnetlabs.nl>.
|
||||
#
|
||||
@ -590,8 +590,8 @@ MAKEFLAGS=
|
||||
# Identity of this package.
|
||||
PACKAGE_NAME='unbound'
|
||||
PACKAGE_TARNAME='unbound'
|
||||
PACKAGE_VERSION='1.5.9'
|
||||
PACKAGE_STRING='unbound 1.5.9'
|
||||
PACKAGE_VERSION='1.5.10'
|
||||
PACKAGE_STRING='unbound 1.5.10'
|
||||
PACKAGE_BUGREPORT='unbound-bugs@nlnetlabs.nl'
|
||||
PACKAGE_URL=''
|
||||
|
||||
@ -834,6 +834,8 @@ enable_gost
|
||||
enable_ecdsa
|
||||
enable_dsa
|
||||
enable_event_api
|
||||
enable_tfo_client
|
||||
enable_tfo_server
|
||||
with_libevent
|
||||
with_libexpat
|
||||
enable_static_exe
|
||||
@ -1399,7 +1401,7 @@ if test "$ac_init_help" = "long"; then
|
||||
# Omit some internal or obsolete options to make the list less imposing.
|
||||
# This message is too long to be a string in the A/UX 3.1 sh.
|
||||
cat <<_ACEOF
|
||||
\`configure' configures unbound 1.5.9 to adapt to many kinds of systems.
|
||||
\`configure' configures unbound 1.5.10 to adapt to many kinds of systems.
|
||||
|
||||
Usage: $0 [OPTION]... [VAR=VALUE]...
|
||||
|
||||
@ -1464,7 +1466,7 @@ fi
|
||||
|
||||
if test -n "$ac_init_help"; then
|
||||
case $ac_init_help in
|
||||
short | recursive ) echo "Configuration of unbound 1.5.9:";;
|
||||
short | recursive ) echo "Configuration of unbound 1.5.10:";;
|
||||
esac
|
||||
cat <<\_ACEOF
|
||||
|
||||
@ -1500,6 +1502,8 @@ Optional Features:
|
||||
--disable-dsa Disable DSA support
|
||||
--enable-event-api Enable (experimental) pluggable event base
|
||||
libunbound API installed to unbound-event.h
|
||||
--enable-tfo-client Enable TCP Fast Open for client mode
|
||||
--enable-tfo-server Enable TCP Fast Open for server mode
|
||||
--enable-static-exe enable to compile executables statically against
|
||||
(event) libs, for debug purposes
|
||||
--enable-lock-checks enable to check lock and unlock calls, for debug
|
||||
@ -1652,7 +1656,7 @@ fi
|
||||
test -n "$ac_init_help" && exit $ac_status
|
||||
if $ac_init_version; then
|
||||
cat <<\_ACEOF
|
||||
unbound configure 1.5.9
|
||||
unbound configure 1.5.10
|
||||
generated by GNU Autoconf 2.69
|
||||
|
||||
Copyright (C) 2012 Free Software Foundation, Inc.
|
||||
@ -2361,7 +2365,7 @@ cat >config.log <<_ACEOF
|
||||
This file contains any messages produced by compilers while
|
||||
running configure, to aid debugging if configure makes a mistake.
|
||||
|
||||
It was created by unbound $as_me 1.5.9, which was
|
||||
It was created by unbound $as_me 1.5.10, which was
|
||||
generated by GNU Autoconf 2.69. Invocation command line was
|
||||
|
||||
$ $0 $@
|
||||
@ -2713,11 +2717,11 @@ UNBOUND_VERSION_MAJOR=1
|
||||
|
||||
UNBOUND_VERSION_MINOR=5
|
||||
|
||||
UNBOUND_VERSION_MICRO=9
|
||||
UNBOUND_VERSION_MICRO=10
|
||||
|
||||
|
||||
LIBUNBOUND_CURRENT=6
|
||||
LIBUNBOUND_REVISION=1
|
||||
LIBUNBOUND_REVISION=2
|
||||
LIBUNBOUND_AGE=4
|
||||
# 1.0.0 had 0:12:0
|
||||
# 1.0.1 had 0:13:0
|
||||
@ -2766,6 +2770,7 @@ LIBUNBOUND_AGE=4
|
||||
# 1.5.7 had 5:10:3
|
||||
# 1.5.8 had 6:0:4 # adds ub_ctx_set_stub
|
||||
# 1.5.9 had 6:1:4
|
||||
# 1.5.10 had 6:2:4
|
||||
|
||||
# Current -- the number of the binary API that we're implementing
|
||||
# Revision -- which iteration of the implementation of the binary
|
||||
@ -4054,7 +4059,7 @@ esac
|
||||
# are we on MinGW?
|
||||
if uname -s 2>&1 | grep MINGW32 >/dev/null; then on_mingw="yes"
|
||||
else
|
||||
if echo $target | grep mingw32 >/dev/null; then on_mingw="yes"
|
||||
if echo $host $target | grep mingw32 >/dev/null; then on_mingw="yes"
|
||||
else on_mingw="no"; fi
|
||||
fi
|
||||
|
||||
@ -4064,7 +4069,7 @@ fi
|
||||
if test $on_mingw = "no"; then
|
||||
ub_conf_file=`eval echo "${sysconfdir}/unbound/unbound.conf"`
|
||||
else
|
||||
ub_conf_file="C:\\Program Files\\Unbound\\service.conf"
|
||||
ub_conf_file="C:\\Program Files (x86)\\Unbound\\service.conf"
|
||||
fi
|
||||
|
||||
# Check whether --with-conf_file was given.
|
||||
@ -4195,7 +4200,7 @@ else
|
||||
if test $on_mingw = no; then
|
||||
UNBOUND_ROOTKEY_FILE="$UNBOUND_RUN_DIR/root.key"
|
||||
else
|
||||
UNBOUND_ROOTKEY_FILE="C:\\Program Files\\Unbound\\root.key"
|
||||
UNBOUND_ROOTKEY_FILE="C:\\Program Files (x86)\\Unbound\\root.key"
|
||||
fi
|
||||
|
||||
fi
|
||||
@ -4217,7 +4222,7 @@ else
|
||||
if test $on_mingw = no; then
|
||||
UNBOUND_ROOTCERT_FILE="$UNBOUND_RUN_DIR/icannbundle.pem"
|
||||
else
|
||||
UNBOUND_ROOTCERT_FILE="C:\\Program Files\\Unbound\\icannbundle.pem"
|
||||
UNBOUND_ROOTCERT_FILE="C:\\Program Files (x86)\\Unbound\\icannbundle.pem"
|
||||
fi
|
||||
|
||||
fi
|
||||
@ -16714,7 +16719,7 @@ $as_echo "$PYTHON_CPPFLAGS" >&6; }
|
||||
$as_echo_n "checking for Python library path... " >&6; }
|
||||
if test -z "$PYTHON_LDFLAGS"; then
|
||||
PYTHON_LDFLAGS=`$PYTHON -c "from distutils.sysconfig import *; \
|
||||
print(get_config_var('BLDLIBRARY'));"`
|
||||
print('-L'+get_config_var('LIBDIR')+' -L'+get_config_var('LIBDEST')+' '+get_config_var('BLDLIBRARY'));"`
|
||||
fi
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_LDFLAGS" >&5
|
||||
$as_echo "$PYTHON_LDFLAGS" >&6; }
|
||||
@ -17033,6 +17038,19 @@ if test "${with_nettle+set}" = set; then :
|
||||
|
||||
$as_echo "#define HAVE_NETTLE 1" >>confdefs.h
|
||||
|
||||
for ac_header in nettle/dsa-compat.h
|
||||
do :
|
||||
ac_fn_c_check_header_compile "$LINENO" "nettle/dsa-compat.h" "ac_cv_header_nettle_dsa_compat_h" "$ac_includes_default
|
||||
"
|
||||
if test "x$ac_cv_header_nettle_dsa_compat_h" = xyes; then :
|
||||
cat >>confdefs.h <<_ACEOF
|
||||
#define HAVE_NETTLE_DSA_COMPAT_H 1
|
||||
_ACEOF
|
||||
|
||||
fi
|
||||
|
||||
done
|
||||
|
||||
if test "$withval" != "" -a "$withval" != "yes"; then
|
||||
CPPFLAGS="$CPPFLAGS -I$withval/include/nettle"
|
||||
LDFLAGS="$LDFLAGS -L$withval/lib"
|
||||
@ -17397,6 +17415,47 @@ fi
|
||||
rm -f core conftest.err conftest.$ac_objext \
|
||||
conftest$ac_exeext conftest.$ac_ext
|
||||
SSLLIB="-lssl"
|
||||
|
||||
# check if -lcrypt32 is needed because CAPIENG needs that. (on windows)
|
||||
BAKLIBS="$LIBS"
|
||||
LIBS="-lssl $LIBS"
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if libssl needs -lcrypt32" >&5
|
||||
$as_echo_n "checking if libssl needs -lcrypt32... " >&6; }
|
||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||
/* end confdefs.h. */
|
||||
|
||||
/* Override any GCC internal prototype to avoid an error.
|
||||
Use char because int might match the return type of a GCC
|
||||
builtin and then its argument prototype would still apply. */
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
#endif
|
||||
char HMAC_Update ();
|
||||
int
|
||||
main ()
|
||||
{
|
||||
return HMAC_Update ();
|
||||
;
|
||||
return 0;
|
||||
}
|
||||
_ACEOF
|
||||
if ac_fn_c_try_link "$LINENO"; then :
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
$as_echo "no" >&6; }
|
||||
LIBS="$BAKLIBS"
|
||||
|
||||
else
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
||||
$as_echo "yes" >&6; }
|
||||
LIBS="$BAKLIBS"
|
||||
LIBS="$LIBS -lcrypt32"
|
||||
|
||||
fi
|
||||
rm -f core conftest.err conftest.$ac_objext \
|
||||
conftest$ac_exeext conftest.$ac_ext
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LibreSSL" >&5
|
||||
$as_echo_n "checking for LibreSSL... " >&6; }
|
||||
if grep VERSION_TEXT $ssldir/include/openssl/opensslv.h | grep "LibreSSL" >/dev/null; then
|
||||
@ -17462,33 +17521,21 @@ else
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
$as_echo "no" >&6; }
|
||||
fi
|
||||
for ac_header in openssl/conf.h
|
||||
for ac_header in openssl/conf.h openssl/engine.h openssl/bn.h openssl/dh.h openssl/dsa.h openssl/rsa.h
|
||||
do :
|
||||
ac_fn_c_check_header_compile "$LINENO" "openssl/conf.h" "ac_cv_header_openssl_conf_h" "$ac_includes_default
|
||||
as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
|
||||
ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
|
||||
"
|
||||
if test "x$ac_cv_header_openssl_conf_h" = xyes; then :
|
||||
if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
|
||||
cat >>confdefs.h <<_ACEOF
|
||||
#define HAVE_OPENSSL_CONF_H 1
|
||||
#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
|
||||
_ACEOF
|
||||
|
||||
fi
|
||||
|
||||
done
|
||||
|
||||
for ac_header in openssl/engine.h
|
||||
do :
|
||||
ac_fn_c_check_header_compile "$LINENO" "openssl/engine.h" "ac_cv_header_openssl_engine_h" "$ac_includes_default
|
||||
"
|
||||
if test "x$ac_cv_header_openssl_engine_h" = xyes; then :
|
||||
cat >>confdefs.h <<_ACEOF
|
||||
#define HAVE_OPENSSL_ENGINE_H 1
|
||||
_ACEOF
|
||||
|
||||
fi
|
||||
|
||||
done
|
||||
|
||||
for ac_func in OPENSSL_config EVP_sha1 EVP_sha256 EVP_sha512 FIPS_mode EVP_MD_CTX_new
|
||||
for ac_func in OPENSSL_config EVP_sha1 EVP_sha256 EVP_sha512 FIPS_mode EVP_MD_CTX_new OpenSSL_add_all_digests OPENSSL_init_crypto EVP_cleanup ERR_load_crypto_strings CRYPTO_cleanup_all_ex_data ERR_free_strings RAND_cleanup
|
||||
do :
|
||||
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
|
||||
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
|
||||
@ -17500,6 +17547,23 @@ _ACEOF
|
||||
fi
|
||||
done
|
||||
|
||||
|
||||
# these check_funcs need -lssl
|
||||
BAKLIBS="$LIBS"
|
||||
LIBS="-lssl $LIBS"
|
||||
for ac_func in OPENSSL_init_ssl
|
||||
do :
|
||||
ac_fn_c_check_func "$LINENO" "OPENSSL_init_ssl" "ac_cv_func_OPENSSL_init_ssl"
|
||||
if test "x$ac_cv_func_OPENSSL_init_ssl" = xyes; then :
|
||||
cat >>confdefs.h <<_ACEOF
|
||||
#define HAVE_OPENSSL_INIT_SSL 1
|
||||
_ACEOF
|
||||
|
||||
fi
|
||||
done
|
||||
|
||||
LIBS="$BAKLIBS"
|
||||
|
||||
ac_fn_c_check_decl "$LINENO" "SSL_COMP_get_compression_methods" "ac_cv_have_decl_SSL_COMP_get_compression_methods" "
|
||||
$ac_includes_default
|
||||
#ifdef HAVE_OPENSSL_ERR_H
|
||||
@ -17900,6 +17964,82 @@ case "$enable_event_api" in
|
||||
;;
|
||||
esac
|
||||
|
||||
# Check whether --enable-tfo-client was given.
|
||||
if test "${enable_tfo_client+set}" = set; then :
|
||||
enableval=$enable_tfo_client;
|
||||
fi
|
||||
|
||||
case "$enable_tfo_client" in
|
||||
yes)
|
||||
case `uname` in
|
||||
Linux) ac_fn_c_check_decl "$LINENO" "MSG_FASTOPEN" "ac_cv_have_decl_MSG_FASTOPEN" "$ac_includes_default
|
||||
#include <netinet/tcp.h>
|
||||
|
||||
"
|
||||
if test "x$ac_cv_have_decl_MSG_FASTOPEN" = xyes; then :
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Check the platform specific TFO kernel parameters are correctly configured to support client mode TFO" >&5
|
||||
$as_echo "$as_me: WARNING: Check the platform specific TFO kernel parameters are correctly configured to support client mode TFO" >&2;}
|
||||
else
|
||||
as_fn_error $? "TCP Fast Open is not available for client mode: please rerun without --enable-tfo-client" "$LINENO" 5
|
||||
fi
|
||||
|
||||
|
||||
cat >>confdefs.h <<_ACEOF
|
||||
#define USE_MSG_FASTOPEN 1
|
||||
_ACEOF
|
||||
|
||||
;;
|
||||
Darwin) ac_fn_c_check_decl "$LINENO" "CONNECT_RESUME_ON_READ_WRITE" "ac_cv_have_decl_CONNECT_RESUME_ON_READ_WRITE" "$ac_includes_default
|
||||
#include <sys/socket.h>
|
||||
|
||||
"
|
||||
if test "x$ac_cv_have_decl_CONNECT_RESUME_ON_READ_WRITE" = xyes; then :
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Check the platform specific TFO kernel parameters are correctly configured to support client mode TFO" >&5
|
||||
$as_echo "$as_me: WARNING: Check the platform specific TFO kernel parameters are correctly configured to support client mode TFO" >&2;}
|
||||
else
|
||||
as_fn_error $? "TCP Fast Open is not available for client mode: please rerun without --enable-tfo-client" "$LINENO" 5
|
||||
fi
|
||||
|
||||
|
||||
cat >>confdefs.h <<_ACEOF
|
||||
#define USE_OSX_MSG_FASTOPEN 1
|
||||
_ACEOF
|
||||
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
no|*)
|
||||
;;
|
||||
esac
|
||||
|
||||
# Check whether --enable-tfo-server was given.
|
||||
if test "${enable_tfo_server+set}" = set; then :
|
||||
enableval=$enable_tfo_server;
|
||||
fi
|
||||
|
||||
case "$enable_tfo_server" in
|
||||
yes)
|
||||
ac_fn_c_check_decl "$LINENO" "TCP_FASTOPEN" "ac_cv_have_decl_TCP_FASTOPEN" "$ac_includes_default
|
||||
#include <netinet/tcp.h>
|
||||
|
||||
"
|
||||
if test "x$ac_cv_have_decl_TCP_FASTOPEN" = xyes; then :
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Check the platform specific TFO kernel parameters are correctly configured to support server mode TFO" >&5
|
||||
$as_echo "$as_me: WARNING: Check the platform specific TFO kernel parameters are correctly configured to support server mode TFO" >&2;}
|
||||
else
|
||||
as_fn_error $? "TCP Fast Open is not available for server mode: please rerun without --enable-tfo-server" "$LINENO" 5
|
||||
fi
|
||||
|
||||
|
||||
cat >>confdefs.h <<_ACEOF
|
||||
#define USE_TCP_FASTOPEN 1
|
||||
_ACEOF
|
||||
|
||||
;;
|
||||
no|*)
|
||||
;;
|
||||
esac
|
||||
|
||||
# check for libevent
|
||||
|
||||
# Check whether --with-libevent was given.
|
||||
@ -18314,10 +18454,8 @@ if test x_$enable_static_exe = x_yes; then
|
||||
staticexe="-static"
|
||||
if test "$on_mingw" = yes; then
|
||||
staticexe="-all-static"
|
||||
# for static crosscompile, include gdi32 and zlib here.
|
||||
if test "`uname`" = "Linux"; then
|
||||
LIBS="$LIBS -lgdi32 -lz"
|
||||
fi
|
||||
# for static compile, include gdi32 and zlib here.
|
||||
LIBS="$LIBS -lgdi32 -lz"
|
||||
fi
|
||||
fi
|
||||
|
||||
@ -18762,7 +18900,7 @@ if test "$ac_res" != no; then :
|
||||
|
||||
fi
|
||||
|
||||
for ac_func in tzset sigprocmask fcntl getpwnam getrlimit setrlimit setsid chroot kill chown sleep usleep random srandom recvmsg sendmsg writev socketpair glob initgroups strftime localtime_r setusercontext _beginthreadex endservent endprotoent fsync
|
||||
for ac_func in tzset sigprocmask fcntl getpwnam endpwent getrlimit setrlimit setsid chroot kill chown sleep usleep random srandom recvmsg sendmsg writev socketpair glob initgroups strftime localtime_r setusercontext _beginthreadex endservent endprotoent fsync
|
||||
do :
|
||||
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
|
||||
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
|
||||
@ -19801,12 +19939,12 @@ _ACEOF
|
||||
|
||||
|
||||
|
||||
version=1.5.9
|
||||
version=1.5.10
|
||||
|
||||
date=`date +'%b %e, %Y'`
|
||||
|
||||
|
||||
ac_config_files="$ac_config_files Makefile doc/example.conf doc/libunbound.3 doc/unbound.8 doc/unbound-anchor.8 doc/unbound-checkconf.8 doc/unbound.conf.5 doc/unbound-control.8 doc/unbound-host.1 smallapp/unbound-control-setup.sh dnstap/dnstap_config.h"
|
||||
ac_config_files="$ac_config_files Makefile doc/example.conf doc/libunbound.3 doc/unbound.8 doc/unbound-anchor.8 doc/unbound-checkconf.8 doc/unbound.conf.5 doc/unbound-control.8 doc/unbound-host.1 smallapp/unbound-control-setup.sh dnstap/dnstap_config.h contrib/libunbound.pc"
|
||||
|
||||
ac_config_headers="$ac_config_headers config.h"
|
||||
|
||||
@ -20316,7 +20454,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
|
||||
# report actual input values of CONFIG_FILES etc. instead of their
|
||||
# values after options handling.
|
||||
ac_log="
|
||||
This file was extended by unbound $as_me 1.5.9, which was
|
||||
This file was extended by unbound $as_me 1.5.10, which was
|
||||
generated by GNU Autoconf 2.69. Invocation command line was
|
||||
|
||||
CONFIG_FILES = $CONFIG_FILES
|
||||
@ -20382,7 +20520,7 @@ _ACEOF
|
||||
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
||||
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
|
||||
ac_cs_version="\\
|
||||
unbound config.status 1.5.9
|
||||
unbound config.status 1.5.10
|
||||
configured by $0, generated by GNU Autoconf 2.69,
|
||||
with options \\"\$ac_cs_config\\"
|
||||
|
||||
@ -20804,6 +20942,7 @@ do
|
||||
"doc/unbound-host.1") CONFIG_FILES="$CONFIG_FILES doc/unbound-host.1" ;;
|
||||
"smallapp/unbound-control-setup.sh") CONFIG_FILES="$CONFIG_FILES smallapp/unbound-control-setup.sh" ;;
|
||||
"dnstap/dnstap_config.h") CONFIG_FILES="$CONFIG_FILES dnstap/dnstap_config.h" ;;
|
||||
"contrib/libunbound.pc") CONFIG_FILES="$CONFIG_FILES contrib/libunbound.pc" ;;
|
||||
"config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
|
||||
|
||||
*) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
|
||||
|
86
configure.ac
86
configure.ac
@ -10,14 +10,14 @@ sinclude(dnstap/dnstap.m4)
|
||||
# must be numbers. ac_defun because of later processing
|
||||
m4_define([VERSION_MAJOR],[1])
|
||||
m4_define([VERSION_MINOR],[5])
|
||||
m4_define([VERSION_MICRO],[9])
|
||||
m4_define([VERSION_MICRO],[10])
|
||||
AC_INIT(unbound, m4_defn([VERSION_MAJOR]).m4_defn([VERSION_MINOR]).m4_defn([VERSION_MICRO]), unbound-bugs@nlnetlabs.nl, unbound)
|
||||
AC_SUBST(UNBOUND_VERSION_MAJOR, [VERSION_MAJOR])
|
||||
AC_SUBST(UNBOUND_VERSION_MINOR, [VERSION_MINOR])
|
||||
AC_SUBST(UNBOUND_VERSION_MICRO, [VERSION_MICRO])
|
||||
|
||||
LIBUNBOUND_CURRENT=6
|
||||
LIBUNBOUND_REVISION=1
|
||||
LIBUNBOUND_REVISION=2
|
||||
LIBUNBOUND_AGE=4
|
||||
# 1.0.0 had 0:12:0
|
||||
# 1.0.1 had 0:13:0
|
||||
@ -66,6 +66,7 @@ LIBUNBOUND_AGE=4
|
||||
# 1.5.7 had 5:10:3
|
||||
# 1.5.8 had 6:0:4 # adds ub_ctx_set_stub
|
||||
# 1.5.9 had 6:1:4
|
||||
# 1.5.10 had 6:2:4
|
||||
|
||||
# Current -- the number of the binary API that we're implementing
|
||||
# Revision -- which iteration of the implementation of the binary
|
||||
@ -107,7 +108,7 @@ esac
|
||||
# are we on MinGW?
|
||||
if uname -s 2>&1 | grep MINGW32 >/dev/null; then on_mingw="yes"
|
||||
else
|
||||
if echo $target | grep mingw32 >/dev/null; then on_mingw="yes"
|
||||
if echo $host $target | grep mingw32 >/dev/null; then on_mingw="yes"
|
||||
else on_mingw="no"; fi
|
||||
fi
|
||||
|
||||
@ -117,7 +118,7 @@ fi
|
||||
if test $on_mingw = "no"; then
|
||||
ub_conf_file=`eval echo "${sysconfdir}/unbound/unbound.conf"`
|
||||
else
|
||||
ub_conf_file="C:\\Program Files\\Unbound\\service.conf"
|
||||
ub_conf_file="C:\\Program Files (x86)\\Unbound\\service.conf"
|
||||
fi
|
||||
AC_ARG_WITH([conf_file],
|
||||
AC_HELP_STRING([--with-conf-file=path],
|
||||
@ -187,7 +188,7 @@ AC_ARG_WITH(rootkey-file,
|
||||
if test $on_mingw = no; then
|
||||
UNBOUND_ROOTKEY_FILE="$UNBOUND_RUN_DIR/root.key"
|
||||
else
|
||||
UNBOUND_ROOTKEY_FILE="C:\\Program Files\\Unbound\\root.key"
|
||||
UNBOUND_ROOTKEY_FILE="C:\\Program Files (x86)\\Unbound\\root.key"
|
||||
fi
|
||||
)
|
||||
AC_SUBST(UNBOUND_ROOTKEY_FILE)
|
||||
@ -201,7 +202,7 @@ AC_ARG_WITH(rootcert-file,
|
||||
if test $on_mingw = no; then
|
||||
UNBOUND_ROOTCERT_FILE="$UNBOUND_RUN_DIR/icannbundle.pem"
|
||||
else
|
||||
UNBOUND_ROOTCERT_FILE="C:\\Program Files\\Unbound\\icannbundle.pem"
|
||||
UNBOUND_ROOTCERT_FILE="C:\\Program Files (x86)\\Unbound\\icannbundle.pem"
|
||||
fi
|
||||
)
|
||||
AC_SUBST(UNBOUND_ROOTCERT_FILE)
|
||||
@ -629,6 +630,7 @@ AC_ARG_WITH([nettle], AC_HELP_STRING([--with-nettle=path],
|
||||
[
|
||||
USE_NETTLE="yes"
|
||||
AC_DEFINE(HAVE_NETTLE, 1, [Use libnettle for crypto])
|
||||
AC_CHECK_HEADERS([nettle/dsa-compat.h],,, [AC_INCLUDES_DEFAULT])
|
||||
if test "$withval" != "" -a "$withval" != "yes"; then
|
||||
CPPFLAGS="$CPPFLAGS -I$withval/include/nettle"
|
||||
LDFLAGS="$LDFLAGS -L$withval/lib"
|
||||
@ -646,6 +648,20 @@ if test $USE_NSS = "no" -a $USE_NETTLE = "no"; then
|
||||
ACX_WITH_SSL
|
||||
ACX_LIB_SSL
|
||||
SSLLIB="-lssl"
|
||||
|
||||
# check if -lcrypt32 is needed because CAPIENG needs that. (on windows)
|
||||
BAKLIBS="$LIBS"
|
||||
LIBS="-lssl $LIBS"
|
||||
AC_MSG_CHECKING([if libssl needs -lcrypt32])
|
||||
AC_TRY_LINK_FUNC([HMAC_Update], [
|
||||
AC_MSG_RESULT([no])
|
||||
LIBS="$BAKLIBS"
|
||||
], [
|
||||
AC_MSG_RESULT([yes])
|
||||
LIBS="$BAKLIBS"
|
||||
LIBS="$LIBS -lcrypt32"
|
||||
])
|
||||
|
||||
AC_MSG_CHECKING([for LibreSSL])
|
||||
if grep VERSION_TEXT $ssldir/include/openssl/opensslv.h | grep "LibreSSL" >/dev/null; then
|
||||
AC_MSG_RESULT([yes])
|
||||
@ -656,9 +672,15 @@ if grep VERSION_TEXT $ssldir/include/openssl/opensslv.h | grep "LibreSSL" >/dev/
|
||||
else
|
||||
AC_MSG_RESULT([no])
|
||||
fi
|
||||
AC_CHECK_HEADERS([openssl/conf.h],,, [AC_INCLUDES_DEFAULT])
|
||||
AC_CHECK_HEADERS([openssl/engine.h],,, [AC_INCLUDES_DEFAULT])
|
||||
AC_CHECK_FUNCS([OPENSSL_config EVP_sha1 EVP_sha256 EVP_sha512 FIPS_mode EVP_MD_CTX_new])
|
||||
AC_CHECK_HEADERS([openssl/conf.h openssl/engine.h openssl/bn.h openssl/dh.h openssl/dsa.h openssl/rsa.h],,, [AC_INCLUDES_DEFAULT])
|
||||
AC_CHECK_FUNCS([OPENSSL_config EVP_sha1 EVP_sha256 EVP_sha512 FIPS_mode EVP_MD_CTX_new OpenSSL_add_all_digests OPENSSL_init_crypto EVP_cleanup ERR_load_crypto_strings CRYPTO_cleanup_all_ex_data ERR_free_strings RAND_cleanup])
|
||||
|
||||
# these check_funcs need -lssl
|
||||
BAKLIBS="$LIBS"
|
||||
LIBS="-lssl $LIBS"
|
||||
AC_CHECK_FUNCS([OPENSSL_init_ssl])
|
||||
LIBS="$BAKLIBS"
|
||||
|
||||
AC_CHECK_DECLS([SSL_COMP_get_compression_methods,sk_SSL_COMP_pop_free,SSL_CTX_set_ecdh_auto], [], [], [
|
||||
AC_INCLUDES_DEFAULT
|
||||
#ifdef HAVE_OPENSSL_ERR_H
|
||||
@ -865,6 +887,42 @@ case "$enable_event_api" in
|
||||
;;
|
||||
esac
|
||||
|
||||
AC_ARG_ENABLE(tfo-client, AC_HELP_STRING([--enable-tfo-client], [Enable TCP Fast Open for client mode]))
|
||||
case "$enable_tfo_client" in
|
||||
yes)
|
||||
case `uname` in
|
||||
Linux) AC_CHECK_DECL([MSG_FASTOPEN], [AC_MSG_WARN([Check the platform specific TFO kernel parameters are correctly configured to support client mode TFO])],
|
||||
[AC_MSG_ERROR([TCP Fast Open is not available for client mode: please rerun without --enable-tfo-client])],
|
||||
[AC_INCLUDES_DEFAULT
|
||||
#include <netinet/tcp.h>
|
||||
])
|
||||
AC_DEFINE_UNQUOTED([USE_MSG_FASTOPEN], [1], [Define this to enable client TCP Fast Open.])
|
||||
;;
|
||||
Darwin) AC_CHECK_DECL([CONNECT_RESUME_ON_READ_WRITE], [AC_MSG_WARN([Check the platform specific TFO kernel parameters are correctly configured to support client mode TFO])],
|
||||
[AC_MSG_ERROR([TCP Fast Open is not available for client mode: please rerun without --enable-tfo-client])],
|
||||
[AC_INCLUDES_DEFAULT
|
||||
#include <sys/socket.h>
|
||||
])
|
||||
AC_DEFINE_UNQUOTED([USE_OSX_MSG_FASTOPEN], [1], [Define this to enable client TCP Fast Open.])
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
no|*)
|
||||
;;
|
||||
esac
|
||||
|
||||
AC_ARG_ENABLE(tfo-server, AC_HELP_STRING([--enable-tfo-server], [Enable TCP Fast Open for server mode]))
|
||||
case "$enable_tfo_server" in
|
||||
yes)
|
||||
AC_CHECK_DECL([TCP_FASTOPEN], [AC_MSG_WARN([Check the platform specific TFO kernel parameters are correctly configured to support server mode TFO])], [AC_MSG_ERROR([TCP Fast Open is not available for server mode: please rerun without --enable-tfo-server])], [AC_INCLUDES_DEFAULT
|
||||
#include <netinet/tcp.h>
|
||||
])
|
||||
AC_DEFINE_UNQUOTED([USE_TCP_FASTOPEN], [1], [Define this to enable server TCP Fast Open.])
|
||||
;;
|
||||
no|*)
|
||||
;;
|
||||
esac
|
||||
|
||||
# check for libevent
|
||||
AC_ARG_WITH(libevent, AC_HELP_STRING([--with-libevent=pathname],
|
||||
[use libevent (will check /usr/local /opt/local /usr/lib /usr/pkg /usr/sfw /usr or you can specify an explicit path). Slower, but allows use of large outgoing port ranges.]),
|
||||
@ -985,10 +1043,8 @@ if test x_$enable_static_exe = x_yes; then
|
||||
staticexe="-static"
|
||||
if test "$on_mingw" = yes; then
|
||||
staticexe="-all-static"
|
||||
# for static crosscompile, include gdi32 and zlib here.
|
||||
if test "`uname`" = "Linux"; then
|
||||
LIBS="$LIBS -lgdi32 -lz"
|
||||
fi
|
||||
# for static compile, include gdi32 and zlib here.
|
||||
LIBS="$LIBS -lgdi32 -lz"
|
||||
fi
|
||||
fi
|
||||
|
||||
@ -1082,7 +1138,7 @@ AC_INCLUDES_DEFAULT
|
||||
#endif
|
||||
])
|
||||
AC_SEARCH_LIBS([setusercontext], [util])
|
||||
AC_CHECK_FUNCS([tzset sigprocmask fcntl getpwnam getrlimit setrlimit setsid chroot kill chown sleep usleep random srandom recvmsg sendmsg writev socketpair glob initgroups strftime localtime_r setusercontext _beginthreadex endservent endprotoent fsync])
|
||||
AC_CHECK_FUNCS([tzset sigprocmask fcntl getpwnam endpwent getrlimit setrlimit setsid chroot kill chown sleep usleep random srandom recvmsg sendmsg writev socketpair glob initgroups strftime localtime_r setusercontext _beginthreadex endservent endprotoent fsync])
|
||||
AC_CHECK_FUNCS([setresuid],,[AC_CHECK_FUNCS([setreuid])])
|
||||
AC_CHECK_FUNCS([setresgid],,[AC_CHECK_FUNCS([setregid])])
|
||||
|
||||
@ -1523,6 +1579,6 @@ dnl if this is a distro tarball, that was already done by makedist.sh
|
||||
AC_SUBST(version, [VERSION_MAJOR.VERSION_MINOR.VERSION_MICRO])
|
||||
AC_SUBST(date, [`date +'%b %e, %Y'`])
|
||||
|
||||
AC_CONFIG_FILES([Makefile doc/example.conf doc/libunbound.3 doc/unbound.8 doc/unbound-anchor.8 doc/unbound-checkconf.8 doc/unbound.conf.5 doc/unbound-control.8 doc/unbound-host.1 smallapp/unbound-control-setup.sh dnstap/dnstap_config.h])
|
||||
AC_CONFIG_FILES([Makefile doc/example.conf doc/libunbound.3 doc/unbound.8 doc/unbound-anchor.8 doc/unbound-checkconf.8 doc/unbound.conf.5 doc/unbound-control.8 doc/unbound-host.1 smallapp/unbound-control-setup.sh dnstap/dnstap_config.h contrib/libunbound.pc])
|
||||
AC_CONFIG_HEADER([config.h])
|
||||
AC_OUTPUT
|
||||
|
13
contrib/libunbound.pc.in
Normal file
13
contrib/libunbound.pc.in
Normal file
@ -0,0 +1,13 @@
|
||||
prefix=@prefix@
|
||||
exec_prefix=@exec_prefix@
|
||||
libdir=@libdir@
|
||||
includedir=@includedir@
|
||||
|
||||
Name: unbound
|
||||
Description: Library with validating, recursive, and caching DNS resolver
|
||||
URL: http://www.unbound.net
|
||||
Version: @PACKAGE_VERSION@
|
||||
Requires:
|
||||
Libs: -L${libdir} -lunbound @SSLLIB@ @LIBS@
|
||||
Libs.private: @LDFLAGS@
|
||||
Cflags: -I${includedir}
|
@ -45,6 +45,8 @@
|
||||
#include "util/log.h"
|
||||
#include "util/config_file.h"
|
||||
#include "util/net_help.h"
|
||||
#include "services/localzone.h"
|
||||
#include "sldns/str2wire.h"
|
||||
|
||||
struct acl_list*
|
||||
acl_list_create(void)
|
||||
@ -71,21 +73,21 @@ acl_list_delete(struct acl_list* acl)
|
||||
}
|
||||
|
||||
/** insert new address into acl_list structure */
|
||||
static int
|
||||
static struct acl_addr*
|
||||
acl_list_insert(struct acl_list* acl, struct sockaddr_storage* addr,
|
||||
socklen_t addrlen, int net, enum acl_access control,
|
||||
int complain_duplicates)
|
||||
{
|
||||
struct acl_addr* node = regional_alloc(acl->region,
|
||||
struct acl_addr* node = regional_alloc_zero(acl->region,
|
||||
sizeof(struct acl_addr));
|
||||
if(!node)
|
||||
return 0;
|
||||
return NULL;
|
||||
node->control = control;
|
||||
if(!addr_tree_insert(&acl->tree, &node->node, addr, addrlen, net)) {
|
||||
if(complain_duplicates)
|
||||
verbose(VERB_QUERY, "duplicate acl address ignored.");
|
||||
}
|
||||
return 1;
|
||||
return node;
|
||||
}
|
||||
|
||||
/** apply acl_list string */
|
||||
@ -125,6 +127,156 @@ acl_list_str_cfg(struct acl_list* acl, const char* str, const char* s2,
|
||||
return 1;
|
||||
}
|
||||
|
||||
/** find or create node (NULL on parse or error) */
|
||||
static struct acl_addr*
|
||||
acl_find_or_create(struct acl_list* acl, const char* str)
|
||||
{
|
||||
struct acl_addr* node;
|
||||
struct sockaddr_storage addr;
|
||||
int net;
|
||||
socklen_t addrlen;
|
||||
if(!netblockstrtoaddr(str, UNBOUND_DNS_PORT, &addr, &addrlen, &net)) {
|
||||
log_err("cannot parse netblock: %s", str);
|
||||
return NULL;
|
||||
}
|
||||
/* find or create node */
|
||||
if(!(node=(struct acl_addr*)addr_tree_find(&acl->tree, &addr,
|
||||
addrlen, net))) {
|
||||
/* create node, type 'allow' since otherwise tags are
|
||||
* pointless, can override with specific access-control: cfg */
|
||||
if(!(node=(struct acl_addr*)acl_list_insert(acl, &addr,
|
||||
addrlen, net, acl_allow, 1))) {
|
||||
log_err("out of memory");
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
return node;
|
||||
}
|
||||
|
||||
/** apply acl_tag string */
|
||||
static int
|
||||
acl_list_tags_cfg(struct acl_list* acl, const char* str, uint8_t* bitmap,
|
||||
size_t bitmaplen)
|
||||
{
|
||||
struct acl_addr* node;
|
||||
if(!(node=acl_find_or_create(acl, str)))
|
||||
return 0;
|
||||
node->taglen = bitmaplen;
|
||||
node->taglist = regional_alloc_init(acl->region, bitmap, bitmaplen);
|
||||
if(!node->taglist) {
|
||||
log_err("out of memory");
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/** apply acl_tag_action string */
|
||||
static int
|
||||
acl_list_tag_action_cfg(struct acl_list* acl, struct config_file* cfg,
|
||||
const char* str, const char* tag, const char* action)
|
||||
{
|
||||
struct acl_addr* node;
|
||||
int tagid;
|
||||
enum localzone_type t;
|
||||
if(!(node=acl_find_or_create(acl, str)))
|
||||
return 0;
|
||||
/* allocate array if not yet */
|
||||
if(!node->tag_actions) {
|
||||
node->tag_actions = (uint8_t*)regional_alloc_zero(acl->region,
|
||||
sizeof(*node->tag_actions)*cfg->num_tags);
|
||||
if(!node->tag_actions) {
|
||||
log_err("out of memory");
|
||||
return 0;
|
||||
}
|
||||
node->tag_actions_size = (size_t)cfg->num_tags;
|
||||
}
|
||||
/* parse tag */
|
||||
if((tagid=find_tag_id(cfg, tag)) == -1) {
|
||||
log_err("cannot parse tag (define-tag it): %s %s", str, tag);
|
||||
return 0;
|
||||
}
|
||||
if((size_t)tagid >= node->tag_actions_size) {
|
||||
log_err("tagid too large for array %s %s", str, tag);
|
||||
return 0;
|
||||
}
|
||||
if(!local_zone_str2type(action, &t)) {
|
||||
log_err("cannot parse access control action type: %s %s %s",
|
||||
str, tag, action);
|
||||
return 0;
|
||||
}
|
||||
node->tag_actions[tagid] = (uint8_t)t;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/** check wire data parse */
|
||||
static int
|
||||
check_data(const char* data)
|
||||
{
|
||||
char buf[65536];
|
||||
uint8_t rr[LDNS_RR_BUF_SIZE];
|
||||
size_t len = sizeof(rr);
|
||||
int res;
|
||||
snprintf(buf, sizeof(buf), "%s %s", "example.com.", data);
|
||||
res = sldns_str2wire_rr_buf(buf, rr, &len, NULL, 3600, NULL, 0,
|
||||
NULL, 0);
|
||||
if(res == 0)
|
||||
return 1;
|
||||
log_err("rr data [char %d] parse error %s",
|
||||
(int)LDNS_WIREPARSE_OFFSET(res)-13,
|
||||
sldns_get_errorstr_parse(res));
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** apply acl_tag_data string */
|
||||
static int
|
||||
acl_list_tag_data_cfg(struct acl_list* acl, struct config_file* cfg,
|
||||
const char* str, const char* tag, const char* data)
|
||||
{
|
||||
struct acl_addr* node;
|
||||
int tagid;
|
||||
char* dupdata;
|
||||
if(!(node=acl_find_or_create(acl, str)))
|
||||
return 0;
|
||||
/* allocate array if not yet */
|
||||
if(!node->tag_datas) {
|
||||
node->tag_datas = (struct config_strlist**)regional_alloc_zero(
|
||||
acl->region, sizeof(*node->tag_datas)*cfg->num_tags);
|
||||
if(!node->tag_datas) {
|
||||
log_err("out of memory");
|
||||
return 0;
|
||||
}
|
||||
node->tag_datas_size = (size_t)cfg->num_tags;
|
||||
}
|
||||
/* parse tag */
|
||||
if((tagid=find_tag_id(cfg, tag)) == -1) {
|
||||
log_err("cannot parse tag (define-tag it): %s %s", str, tag);
|
||||
return 0;
|
||||
}
|
||||
if((size_t)tagid >= node->tag_datas_size) {
|
||||
log_err("tagid too large for array %s %s", str, tag);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* check data? */
|
||||
if(!check_data(data)) {
|
||||
log_err("cannot parse access-control-tag data: %s %s '%s'",
|
||||
str, tag, data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
dupdata = regional_strdup(acl->region, data);
|
||||
if(!dupdata) {
|
||||
log_err("out of memory");
|
||||
return 0;
|
||||
}
|
||||
if(!cfg_region_strlist_insert(acl->region,
|
||||
&(node->tag_datas[tagid]), dupdata)) {
|
||||
log_err("out of memory");
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/** read acl_list config */
|
||||
static int
|
||||
read_acl_list(struct acl_list* acl, struct config_file* cfg)
|
||||
@ -138,6 +290,77 @@ read_acl_list(struct acl_list* acl, struct config_file* cfg)
|
||||
return 1;
|
||||
}
|
||||
|
||||
/** read acl tags config */
|
||||
static int
|
||||
read_acl_tags(struct acl_list* acl, struct config_file* cfg)
|
||||
{
|
||||
struct config_strbytelist* np, *p = cfg->acl_tags;
|
||||
cfg->acl_tags = NULL;
|
||||
while(p) {
|
||||
log_assert(p->str && p->str2);
|
||||
if(!acl_list_tags_cfg(acl, p->str, p->str2, p->str2len)) {
|
||||
config_del_strbytelist(p);
|
||||
return 0;
|
||||
}
|
||||
/* free the items as we go to free up memory */
|
||||
np = p->next;
|
||||
free(p->str);
|
||||
free(p->str2);
|
||||
free(p);
|
||||
p = np;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/** read acl tag actions config */
|
||||
static int
|
||||
read_acl_tag_actions(struct acl_list* acl, struct config_file* cfg)
|
||||
{
|
||||
struct config_str3list* p, *np;
|
||||
p = cfg->acl_tag_actions;
|
||||
cfg->acl_tag_actions = NULL;
|
||||
while(p) {
|
||||
log_assert(p->str && p->str2 && p->str3);
|
||||
if(!acl_list_tag_action_cfg(acl, cfg, p->str, p->str2,
|
||||
p->str3)) {
|
||||
config_deltrplstrlist(p);
|
||||
return 0;
|
||||
}
|
||||
/* free the items as we go to free up memory */
|
||||
np = p->next;
|
||||
free(p->str);
|
||||
free(p->str2);
|
||||
free(p->str3);
|
||||
free(p);
|
||||
p = np;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/** read acl tag datas config */
|
||||
static int
|
||||
read_acl_tag_datas(struct acl_list* acl, struct config_file* cfg)
|
||||
{
|
||||
struct config_str3list* p, *np;
|
||||
p = cfg->acl_tag_datas;
|
||||
cfg->acl_tag_datas = NULL;
|
||||
while(p) {
|
||||
log_assert(p->str && p->str2 && p->str3);
|
||||
if(!acl_list_tag_data_cfg(acl, cfg, p->str, p->str2, p->str3)) {
|
||||
config_deltrplstrlist(p);
|
||||
return 0;
|
||||
}
|
||||
/* free the items as we go to free up memory */
|
||||
np = p->next;
|
||||
free(p->str);
|
||||
free(p->str2);
|
||||
free(p->str3);
|
||||
free(p);
|
||||
p = np;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
acl_list_apply_cfg(struct acl_list* acl, struct config_file* cfg)
|
||||
{
|
||||
@ -145,6 +368,12 @@ acl_list_apply_cfg(struct acl_list* acl, struct config_file* cfg)
|
||||
addr_tree_init(&acl->tree);
|
||||
if(!read_acl_list(acl, cfg))
|
||||
return 0;
|
||||
if(!read_acl_tags(acl, cfg))
|
||||
return 0;
|
||||
if(!read_acl_tag_actions(acl, cfg))
|
||||
return 0;
|
||||
if(!read_acl_tag_datas(acl, cfg))
|
||||
return 0;
|
||||
/* insert defaults, with '0' to ignore them if they are duplicates */
|
||||
if(!acl_list_str_cfg(acl, "0.0.0.0/0", "refuse", 0))
|
||||
return 0;
|
||||
@ -163,13 +392,18 @@ acl_list_apply_cfg(struct acl_list* acl, struct config_file* cfg)
|
||||
}
|
||||
|
||||
enum acl_access
|
||||
acl_list_lookup(struct acl_list* acl, struct sockaddr_storage* addr,
|
||||
acl_get_control(struct acl_addr* acl)
|
||||
{
|
||||
if(acl) return acl->control;
|
||||
return acl_deny;
|
||||
}
|
||||
|
||||
struct acl_addr*
|
||||
acl_addr_lookup(struct acl_list* acl, struct sockaddr_storage* addr,
|
||||
socklen_t addrlen)
|
||||
{
|
||||
struct acl_addr* r = (struct acl_addr*)addr_tree_lookup(&acl->tree,
|
||||
return (struct acl_addr*)addr_tree_lookup(&acl->tree,
|
||||
addr, addrlen);
|
||||
if(r) return r->control;
|
||||
return acl_deny;
|
||||
}
|
||||
|
||||
size_t
|
||||
|
@ -87,6 +87,19 @@ struct acl_addr {
|
||||
struct addr_tree_node node;
|
||||
/** access control on this netblock */
|
||||
enum acl_access control;
|
||||
/** tag bitlist */
|
||||
uint8_t* taglist;
|
||||
/** length of the taglist (in bytes) */
|
||||
size_t taglen;
|
||||
/** array per tagnumber of localzonetype(in one byte). NULL if none. */
|
||||
uint8_t* tag_actions;
|
||||
/** size of the tag_actions_array */
|
||||
size_t tag_actions_size;
|
||||
/** array per tagnumber, with per tag a list of rdata strings.
|
||||
* NULL if none. strings are like 'A 127.0.0.1' 'AAAA ::1' */
|
||||
struct config_strlist** tag_datas;
|
||||
/** size of the tag_datas array */
|
||||
size_t tag_datas_size;
|
||||
};
|
||||
|
||||
/**
|
||||
@ -110,14 +123,22 @@ void acl_list_delete(struct acl_list* acl);
|
||||
int acl_list_apply_cfg(struct acl_list* acl, struct config_file* cfg);
|
||||
|
||||
/**
|
||||
* Lookup address to see its access control status.
|
||||
* Lookup access control status for acl structure.
|
||||
* @param acl: structure for acl storage.
|
||||
* @return: what to do with message from this address.
|
||||
*/
|
||||
enum acl_access acl_get_control(struct acl_addr* acl);
|
||||
|
||||
/**
|
||||
* Lookup address to see its acl structure
|
||||
* @param acl: structure for address storage.
|
||||
* @param addr: address to check
|
||||
* @param addrlen: length of addr.
|
||||
* @return: what to do with message from this address.
|
||||
* @return: acl structure from this address.
|
||||
*/
|
||||
enum acl_access acl_list_lookup(struct acl_list* acl,
|
||||
struct sockaddr_storage* addr, socklen_t addrlen);
|
||||
struct acl_addr*
|
||||
acl_addr_lookup(struct acl_list* acl, struct sockaddr_storage* addr,
|
||||
socklen_t addrlen);
|
||||
|
||||
/**
|
||||
* Get memory used by acl structure.
|
||||
|
@ -204,17 +204,29 @@ daemon_init(void)
|
||||
signal_handling_record();
|
||||
checklock_start();
|
||||
#ifdef HAVE_SSL
|
||||
# ifdef HAVE_ERR_LOAD_CRYPTO_STRINGS
|
||||
ERR_load_crypto_strings();
|
||||
# endif
|
||||
ERR_load_SSL_strings();
|
||||
# ifdef USE_GOST
|
||||
(void)sldns_key_EVP_load_gost_id();
|
||||
# endif
|
||||
# if OPENSSL_VERSION_NUMBER < 0x10100000 || !defined(HAVE_OPENSSL_INIT_CRYPTO)
|
||||
OpenSSL_add_all_algorithms();
|
||||
# else
|
||||
OPENSSL_init_crypto(OPENSSL_INIT_ADD_ALL_CIPHERS
|
||||
| OPENSSL_INIT_ADD_ALL_DIGESTS
|
||||
| OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL);
|
||||
# endif
|
||||
# if HAVE_DECL_SSL_COMP_GET_COMPRESSION_METHODS
|
||||
/* grab the COMP method ptr because openssl leaks it */
|
||||
comp_meth = (void*)SSL_COMP_get_compression_methods();
|
||||
# endif
|
||||
# if OPENSSL_VERSION_NUMBER < 0x10100000 || !defined(HAVE_OPENSSL_INIT_SSL)
|
||||
(void)SSL_library_init();
|
||||
# else
|
||||
(void)OPENSSL_init_ssl(0, NULL);
|
||||
# endif
|
||||
# if defined(HAVE_SSL) && defined(OPENSSL_THREADS) && !defined(THREADS_DISABLED)
|
||||
if(!ub_openssl_lock_init())
|
||||
fatal_exit("could not init openssl locks");
|
||||
@ -404,6 +416,8 @@ daemon_create_workers(struct daemon* daemon)
|
||||
}
|
||||
daemon->workers = (struct worker**)calloc((size_t)daemon->num,
|
||||
sizeof(struct worker*));
|
||||
if(!daemon->workers)
|
||||
fatal_exit("out of memory during daemon init");
|
||||
if(daemon->cfg->dnstap) {
|
||||
#ifdef USE_DNSTAP
|
||||
daemon->dtenv = dt_create(daemon->cfg->dnstap_socket_path,
|
||||
@ -586,13 +600,12 @@ daemon_cleanup(struct daemon* daemon)
|
||||
log_thread_set(NULL);
|
||||
/* clean up caches because
|
||||
* a) RRset IDs will be recycled after a reload, causing collisions
|
||||
* b) validation config can change, thus rrset, msg, keycache clear
|
||||
* The infra cache is kept, the timing and edns info is still valid */
|
||||
* b) validation config can change, thus rrset, msg, keycache clear */
|
||||
slabhash_clear(&daemon->env->rrset_cache->table);
|
||||
slabhash_clear(daemon->env->msg_cache);
|
||||
local_zones_delete(daemon->local_zones);
|
||||
daemon->local_zones = NULL;
|
||||
/* key cache is cleared by module desetup during next daemon_init() */
|
||||
/* key cache is cleared by module desetup during next daemon_fork() */
|
||||
daemon_remote_clear(daemon->rc);
|
||||
for(i=0; i<daemon->num; i++)
|
||||
worker_delete(daemon->workers[i]);
|
||||
@ -656,8 +669,12 @@ daemon_delete(struct daemon* daemon)
|
||||
# endif
|
||||
CONF_modules_free();
|
||||
# endif
|
||||
# ifdef HAVE_CRYPTO_CLEANUP_ALL_EX_DATA
|
||||
CRYPTO_cleanup_all_ex_data(); /* safe, no more threads right now */
|
||||
# endif
|
||||
# ifdef HAVE_ERR_FREE_STRINGS
|
||||
ERR_free_strings();
|
||||
# endif
|
||||
# if OPENSSL_VERSION_NUMBER < 0x10100000
|
||||
RAND_cleanup();
|
||||
# endif
|
||||
|
@ -46,9 +46,12 @@
|
||||
#ifdef HAVE_OPENSSL_ERR_H
|
||||
#include <openssl/err.h>
|
||||
#endif
|
||||
#ifndef HEADER_DH_H
|
||||
#ifdef HAVE_OPENSSL_DH_H
|
||||
#include <openssl/dh.h>
|
||||
#endif
|
||||
#ifdef HAVE_OPENSSL_BN_H
|
||||
#include <openssl/bn.h>
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include "daemon/remote.h"
|
||||
@ -144,7 +147,7 @@ timeval_divide(struct timeval* avg, const struct timeval* sum, size_t d)
|
||||
* (some openssl versions reject DH that is 'too small', eg. 512).
|
||||
*/
|
||||
#ifndef S_SPLINT_S
|
||||
DH *get_dh2048()
|
||||
static DH *get_dh2048(void)
|
||||
{
|
||||
static unsigned char dh2048_p[]={
|
||||
0xE7,0x36,0x28,0x3B,0xE4,0xC3,0x32,0x1C,0x01,0xC3,0x67,0xD6,
|
||||
@ -173,14 +176,31 @@ DH *get_dh2048()
|
||||
static unsigned char dh2048_g[]={
|
||||
0x02,
|
||||
};
|
||||
DH *dh;
|
||||
DH *dh = NULL;
|
||||
BIGNUM *p = NULL, *g = NULL;
|
||||
|
||||
if ((dh=DH_new()) == NULL) return(NULL);
|
||||
dh->p=BN_bin2bn(dh2048_p,sizeof(dh2048_p),NULL);
|
||||
dh->g=BN_bin2bn(dh2048_g,sizeof(dh2048_g),NULL);
|
||||
if ((dh->p == NULL) || (dh->g == NULL))
|
||||
{ DH_free(dh); return(NULL); }
|
||||
return(dh);
|
||||
dh = DH_new();
|
||||
p = BN_bin2bn(dh2048_p, sizeof(dh2048_p), NULL);
|
||||
g = BN_bin2bn(dh2048_g, sizeof(dh2048_g), NULL);
|
||||
if (!dh || !p || !g)
|
||||
goto err;
|
||||
|
||||
#if OPENSSL_VERSION_NUMBER < 0x10100000 || defined(HAVE_LIBRESSL)
|
||||
dh->p = p;
|
||||
dh->g = g;
|
||||
#else
|
||||
if (!DH_set0_pqg(dh, p, NULL, g))
|
||||
goto err;
|
||||
#endif
|
||||
return dh;
|
||||
err:
|
||||
if (p)
|
||||
BN_free(p);
|
||||
if (g)
|
||||
BN_free(g);
|
||||
if (dh)
|
||||
DH_free(dh);
|
||||
return NULL;
|
||||
}
|
||||
#endif /* SPLINT */
|
||||
|
||||
@ -225,6 +245,7 @@ daemon_remote_create(struct config_file* cfg)
|
||||
/* No certificates are requested */
|
||||
if(!SSL_CTX_set_cipher_list(rc->ctx, "aNULL")) {
|
||||
log_crypto_err("Failed to set aNULL cipher list");
|
||||
daemon_remote_delete(rc);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -233,6 +254,7 @@ daemon_remote_create(struct config_file* cfg)
|
||||
*/
|
||||
if(!SSL_CTX_set_tmp_dh(rc->ctx,get_dh2048())) {
|
||||
log_crypto_err("Wanted to set DH param, but failed");
|
||||
daemon_remote_delete(rc);
|
||||
return NULL;
|
||||
}
|
||||
return rc;
|
||||
@ -359,8 +381,12 @@ add_open(const char* ip, int nr, struct listen_port** list, int noproto_is_err,
|
||||
if(fd != -1) {
|
||||
#ifdef HAVE_CHOWN
|
||||
if (cfg->username && cfg->username[0] &&
|
||||
cfg_uid != (uid_t)-1)
|
||||
chown(ip, cfg_uid, cfg_gid);
|
||||
cfg_uid != (uid_t)-1) {
|
||||
if(chown(ip, cfg_uid, cfg_gid) == -1)
|
||||
log_err("cannot chown %u.%u %s: %s",
|
||||
(unsigned)cfg_uid, (unsigned)cfg_gid,
|
||||
ip, strerror(errno));
|
||||
}
|
||||
chmod(ip, (mode_t)(S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP));
|
||||
#else
|
||||
(void)cfg;
|
||||
|
@ -56,8 +56,8 @@ struct comm_reply;
|
||||
struct comm_point;
|
||||
struct daemon_remote;
|
||||
|
||||
/** number of seconds timeout on incoming remote control handshake */
|
||||
#define REMOTE_CONTROL_TCP_TIMEOUT 120
|
||||
/** number of milliseconds timeout on incoming remote control handshake */
|
||||
#define REMOTE_CONTROL_TCP_TIMEOUT 120000
|
||||
|
||||
/**
|
||||
* a busy control command connection, SSL state
|
||||
|
@ -93,10 +93,13 @@ void* unbound_start_brk = 0;
|
||||
#endif
|
||||
|
||||
/** print usage. */
|
||||
static void usage()
|
||||
static void usage(void)
|
||||
{
|
||||
const char** m;
|
||||
const char *evnm="event", *evsys="", *evmethod="";
|
||||
time_t t;
|
||||
struct timeval now;
|
||||
struct ub_event_base* base;
|
||||
printf("usage: unbound [options]\n");
|
||||
printf(" start unbound daemon DNS resolver.\n");
|
||||
printf("-h this help\n");
|
||||
@ -110,11 +113,16 @@ static void usage()
|
||||
printf(" service - used to start from services control panel\n");
|
||||
#endif
|
||||
printf("Version %s\n", PACKAGE_VERSION);
|
||||
ub_get_event_sys(NULL, &evnm, &evsys, &evmethod);
|
||||
base = ub_default_event_base(0,&t,&now);
|
||||
ub_get_event_sys(base, &evnm, &evsys, &evmethod);
|
||||
printf("linked libs: %s %s (it uses %s), %s\n",
|
||||
evnm, evsys, evmethod,
|
||||
#ifdef HAVE_SSL
|
||||
# ifdef SSLEAY_VERSION
|
||||
SSLeay_version(SSLEAY_VERSION)
|
||||
# else
|
||||
OpenSSL_version(OPENSSL_VERSION)
|
||||
# endif
|
||||
#elif defined(HAVE_NSS)
|
||||
NSS_GetVersion()
|
||||
#elif defined(HAVE_NETTLE)
|
||||
@ -127,6 +135,7 @@ static void usage()
|
||||
printf("\n");
|
||||
printf("BSD licensed, see LICENSE in source package for details.\n");
|
||||
printf("Report bugs to %s\n", PACKAGE_BUGREPORT);
|
||||
ub_event_base_free(base);
|
||||
}
|
||||
|
||||
#ifndef unbound_testbound
|
||||
@ -539,7 +548,9 @@ perform_setup(struct daemon* daemon, struct config_file* cfg, int debug_mode,
|
||||
log_warn("unable to initgroups %s: %s",
|
||||
cfg->username, strerror(errno));
|
||||
# endif /* HAVE_INITGROUPS */
|
||||
# ifdef HAVE_ENDPWENT
|
||||
endpwent();
|
||||
# endif
|
||||
|
||||
#ifdef HAVE_SETRESGID
|
||||
if(setresgid(cfg_gid,cfg_gid,cfg_gid) != 0)
|
||||
|
@ -773,6 +773,8 @@ deny_refuse(struct comm_point* c, enum acl_access acl,
|
||||
LDNS_QR_SET(sldns_buffer_begin(c->buffer));
|
||||
LDNS_RCODE_SET(sldns_buffer_begin(c->buffer),
|
||||
LDNS_RCODE_REFUSED);
|
||||
sldns_buffer_set_position(c->buffer, LDNS_HEADER_SIZE);
|
||||
sldns_buffer_flip(c->buffer);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -804,6 +806,7 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
|
||||
struct query_info qinfo;
|
||||
struct edns_data edns;
|
||||
enum acl_access acl;
|
||||
struct acl_addr* acladdr;
|
||||
int rc = 0;
|
||||
|
||||
if(error != NETEVENT_NOERROR) {
|
||||
@ -816,8 +819,9 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
|
||||
dt_msg_send_client_query(&worker->dtenv, &repinfo->addr, c->type,
|
||||
c->buffer);
|
||||
#endif
|
||||
acl = acl_list_lookup(worker->daemon->acl, &repinfo->addr,
|
||||
acladdr = acl_addr_lookup(worker->daemon->acl, &repinfo->addr,
|
||||
repinfo->addrlen);
|
||||
acl = acl_get_control(acladdr);
|
||||
if((ret=deny_refuse_all(c, acl, worker, repinfo)) != -1)
|
||||
{
|
||||
if(ret == 1)
|
||||
@ -941,7 +945,11 @@ worker_handle_request(struct comm_point* c, void* arg, int error,
|
||||
goto send_reply;
|
||||
}
|
||||
if(local_zones_answer(worker->daemon->local_zones, &qinfo, &edns,
|
||||
c->buffer, worker->scratchpad, repinfo)) {
|
||||
c->buffer, worker->scratchpad, repinfo,
|
||||
acladdr->taglist, acladdr->taglen, acladdr->tag_actions,
|
||||
acladdr->tag_actions_size, acladdr->tag_datas,
|
||||
acladdr->tag_datas_size, worker->daemon->cfg->tagname,
|
||||
worker->daemon->cfg->num_tags)) {
|
||||
regional_free_all(worker->scratchpad);
|
||||
if(sldns_buffer_limit(c->buffer) == 0) {
|
||||
comm_point_drop_reply(repinfo);
|
||||
|
@ -872,7 +872,7 @@ static struct module_func_block dns64_block = {
|
||||
* Function for returning the above function block.
|
||||
*/
|
||||
struct module_func_block *
|
||||
dns64_get_funcblock()
|
||||
dns64_get_funcblock(void)
|
||||
{
|
||||
return &dns64_block;
|
||||
}
|
||||
|
211
doc/Changelog
211
doc/Changelog
@ -1,8 +1,219 @@
|
||||
20 September 2016: Wouter
|
||||
- iana portlist update.
|
||||
- Fix #835: fix --disable-dsa with nettle verify.
|
||||
- tag for 1.5.10rc1 release.
|
||||
|
||||
15 September 2016: Wouter
|
||||
- Fix 883: error for duplicate local zone entry.
|
||||
- Test for openssl init_crypto and init_ssl functions.
|
||||
|
||||
15 September 2016: Ralph
|
||||
- fix potential memory leak in daemon/remote.c and nullpointer
|
||||
dereference in validator/autotrust.
|
||||
- iana portlist update.
|
||||
|
||||
13 September 2016: Wouter
|
||||
- Silenced flex-generated sign-unsigned warning print with gcc
|
||||
diagnostic pragma.
|
||||
- Fix for new splint on FreeBSD. Fix cast for sockaddr_un.sun_len.
|
||||
|
||||
9 September 2016: Wouter
|
||||
- Fix #831: workaround for spurious fread_chk warning against petal.c
|
||||
|
||||
5 September 2016: Ralph
|
||||
- Take configured minimum TTL into consideration when reducing TTL
|
||||
to original TTL from RRSIG.
|
||||
|
||||
5 September 2016: Wouter
|
||||
- Fix #829: doc of sldns_wire2str_rdata_buf() return value has an
|
||||
off-by-one typo, from Jinmei Tatuya (Infoblox).
|
||||
- Fix incomplete prototypes reported by Dag-Erling Smørgrav.
|
||||
- Fix #828: missing type in access-control-tag-action redirect results
|
||||
in NXDOMAIN.
|
||||
|
||||
2 September 2016: Wouter
|
||||
- Fix compile with openssl 1.1.0 with api=1.1.0.
|
||||
|
||||
1 September 2016: Wouter
|
||||
- RFC 7958 is now out, updated docs for unbound-anchor.
|
||||
- Fix for compile without warnings with openssl 1.1.0.
|
||||
- Fix #826: Fix refuse_non_local could result in a broken response.
|
||||
- iana portlist update.
|
||||
|
||||
29 August 2016: Wouter
|
||||
- Fix #777: OpenSSL 1.1.0 compatibility, patch from Sebastian A.
|
||||
Siewior.
|
||||
- Add default root hints for IPv6 E.ROOT-SERVERS.NET, 2001:500:a8::e.
|
||||
|
||||
25 August 2016: Ralph
|
||||
- Clarify local-zone-override entry in unbound.conf.5
|
||||
|
||||
25 August 2016: Wouter
|
||||
- 64bit build option for makedist windows compile, -w64.
|
||||
|
||||
24 August 2016: Ralph
|
||||
- Fix #820: set sldns_str2wire_rr_buf() dual meaning len parameter
|
||||
in each iteration in find_tag_datas().
|
||||
- unbound.conf.5 entries for define-tag, access-control-tag,
|
||||
access-control-tag-action, access-control-tag-data, local-zone-tag,
|
||||
and local-zone-override.
|
||||
|
||||
23 August 2016: Wouter
|
||||
- Fix #804: unbound stops responding after outage. Fixes queries
|
||||
that attempt to wait for an empty list of subqueries.
|
||||
- Fix #804: lower num_target_queries for iterator also for failed
|
||||
lookups.
|
||||
|
||||
8 August 2016: Wouter
|
||||
- Note that OPENPGPKEY type is RFC 7929.
|
||||
|
||||
4 August 2016: Wouter
|
||||
- Fix #807: workaround for possible some "unused" function parameters
|
||||
in test code, from Jinmei Tatuya.
|
||||
|
||||
3 August 2016: Wouter
|
||||
- use sendmsg instead of sendto for TFO.
|
||||
|
||||
28 July 2016: Wouter
|
||||
- Fix #806: wrong comment removed.
|
||||
|
||||
26 July 2016: Wouter
|
||||
- nicer ratelimit-below-domain explanation.
|
||||
|
||||
22 July 2016: Wouter
|
||||
- Fix #801: missing error condition handling in
|
||||
daemon_create_workers().
|
||||
- Fix #802: workaround for function parameters that are "unused"
|
||||
without log_assert.
|
||||
- Fix #803: confusing (and incorrect) code comment in daemon_cleanup().
|
||||
|
||||
20 July 2016: Wouter
|
||||
- Fix typo in unbound.conf.
|
||||
|
||||
18 July 2016: Wouter
|
||||
- Fix #798: Client-side TCP fast open fails (Linux).
|
||||
|
||||
14 July 2016: Wouter
|
||||
- TCP Fast open patch from Sara Dickinson.
|
||||
- Fixed unbound.doxygen for 1.8.11.
|
||||
|
||||
7 July 2016: Wouter
|
||||
- access-control-tag-data implemented. verbose(4) prints tag debug.
|
||||
|
||||
5 July 2016: Wouter
|
||||
- Fix dynamic link of anchor-update.exe on windows.
|
||||
- Fix detect of mingw for MXE package build.
|
||||
- Fixes for 64bit windows compile.
|
||||
- Fix #788 for nettle 3.0: Failed to build with Nettle >= 3.0 and
|
||||
--with-libunbound-only --with-nettle.
|
||||
|
||||
4 July 2016: Wouter
|
||||
- For #787: prefer-ip6 option for unbound.conf prefers to send
|
||||
upstream queries to ipv6 servers.
|
||||
- Fix #787: outgoing-interface netblock/64 ipv6 option to use linux
|
||||
freebind to use 64bits of entropy for every query with random local
|
||||
part.
|
||||
|
||||
30 June 2016: Wouter
|
||||
- Document always_transparent, always_refuse, always_nxdomain types.
|
||||
|
||||
29 June 2016: Wouter
|
||||
- Fix static compile on windows missing gdi32.
|
||||
|
||||
28 June 2016: Wouter
|
||||
- Create a pkg-config file for libunbound in contrib.
|
||||
|
||||
27 June 2016: Wouter
|
||||
- Fix #784: Build configure assumess that having getpwnam means there
|
||||
is endpwent function available.
|
||||
- Updated repository with newer flex and bison output.
|
||||
|
||||
24 June 2016: Ralph
|
||||
- Possibility to specify local-zone type for an acl/tag pair
|
||||
- Possibility to specify (override) local-zone type for a source address
|
||||
block
|
||||
16 June 2016: Ralph
|
||||
- Decrease dp attempts at each QNAME minimisation iteration
|
||||
|
||||
16 June 2016: Wouter
|
||||
- Fix tcp timeouts in tv.usec.
|
||||
|
||||
15 June 2016: Wouter
|
||||
- TCP_TIMEOUT is specified in milliseconds.
|
||||
- If more than half of tcp connections are in use, a shorter timeout
|
||||
is used (200 msec, vs 2 minutes) to pressure tcp for new connects.
|
||||
|
||||
14 June 2016: Ralph
|
||||
- QNAME minimisation unit test for dropped QTYPE=A queries.
|
||||
|
||||
14 June 2016: Wouter
|
||||
- Fix 775: unbound-host and unbound-anchor crash on windows, ignore
|
||||
null delete for wsaevent.
|
||||
- Fix spelling in freebind option man page text.
|
||||
- Fix windows link of ssl with crypt32.
|
||||
- Fix 779: Union casting is non-portable.
|
||||
- Fix 780: MAP_ANON not defined in HP-UX 11.31.
|
||||
- Fix 781: prealloc() is an HP-UX system library call.
|
||||
|
||||
13 June 2016: Ralph
|
||||
- Use QTYPE=A for QNAME minimisation.
|
||||
- Keep track of number of time-outs when performing QNAME minimisation.
|
||||
Stop minimising when number of time-outs for a QNAME/QTYPE pair is
|
||||
more than three.
|
||||
|
||||
13 June 2016: Wouter
|
||||
- Fix #778: unbound 1.5.9: -h segfault (null deref).
|
||||
- Fix directory: fix for unbound-checkconf, it restores cwd.
|
||||
|
||||
10 June 2016: Wouter
|
||||
- And delete service.conf.shipped on uninstall.
|
||||
- In unbound.conf directory: dir immediately changes to that directory,
|
||||
so that include: file below that is relative to that directory.
|
||||
With chroot, make the directory an absolute path inside chroot.
|
||||
- keep debug symbols in windows build.
|
||||
- do not delete service.conf on windows uninstall.
|
||||
- document directory immediate fix and allow EXECUTABLE syntax in it
|
||||
on windows.
|
||||
|
||||
9 June 2016: Wouter
|
||||
- Trunk is called 1.5.10 (with previous fixes already in there to 2
|
||||
june).
|
||||
- Revert fix for NetworkService account on windows due to breakage
|
||||
it causes.
|
||||
- Fix that windows install will not overwrite existing service.conf
|
||||
file (and ignore gui config choices if it exists).
|
||||
|
||||
7 June 2016: Ralph
|
||||
- Lookup localzones by taglist from acl.
|
||||
- Possibility to lookup local_zone, regardless the taglist.
|
||||
- Added local_zone/taglist/acl unit test.
|
||||
|
||||
7 June 2016: Wouter
|
||||
- Fix #773: Non-standard Python location build failure with pyunbound.
|
||||
- Improve threadsafety for openssl 0.9.8 ecdsa dnssec signatures.
|
||||
|
||||
6 June 2016: Wouter
|
||||
- Better help text from -h (from Ray Griffith).
|
||||
- access-control-tag config directive.
|
||||
- local-zone-override config directive.
|
||||
- access-control-tag-action and access-control-tag-data config
|
||||
directives.
|
||||
- free acl-tags, acltag-action and acltag-data config lists during
|
||||
initialisation to free up memory for more entries.
|
||||
|
||||
3 June 2016: Wouter
|
||||
- Fix to not ignore return value of chown() in daemon startup.
|
||||
|
||||
2 June 2016: Wouter
|
||||
- Fix libubound for edns optlist feature.
|
||||
- Fix distinction between free and CRYPTO_free in dsa and ecdsa alloc.
|
||||
- Fix #752: retry resource temporarily unavailable on control pipe.
|
||||
- un-document localzone tags.
|
||||
- tag for release 1.5.9rc1.
|
||||
And this also became release 1.5.9.
|
||||
- Fix (for 1.5.10): Fix unbound-anchor.exe file location defaults to
|
||||
Program Files with (x86) appended.
|
||||
- re-documented localzone tags in example.conf.
|
||||
|
||||
31 May 2016: Wouter
|
||||
- Fix windows service to be created run with limited rights, as a
|
||||
|
@ -1,4 +1,4 @@
|
||||
README for Unbound 1.5.9
|
||||
README for Unbound 1.5.10
|
||||
Copyright 2007 NLnet Labs
|
||||
http://unbound.net
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
#
|
||||
# Example configuration file.
|
||||
#
|
||||
# See unbound.conf(5) man page, version 1.5.9.
|
||||
# See unbound.conf(5) man page, version 1.5.10.
|
||||
#
|
||||
# this is a comment.
|
||||
|
||||
@ -52,6 +52,15 @@ server:
|
||||
# outgoing-interface: 192.0.2.153
|
||||
# outgoing-interface: 2001:DB8::5
|
||||
# outgoing-interface: 2001:DB8::6
|
||||
|
||||
# Specify a netblock to use remainder 64 bits as random bits for
|
||||
# upstream queries. Uses freebind option (Linux).
|
||||
# outgoing-interface: 2001:DB8::/64
|
||||
# Also (Linux:) ip -6 addr add 2001:db8::/64 dev lo
|
||||
# And: ip -6 route add local 2001:db8::/64 dev lo
|
||||
# And set prefer-ip6: yes to use the ip6 randomness from a netblock.
|
||||
# Set this to yes to prefer ipv6 upstream servers over ipv4.
|
||||
# prefer-ip6: no
|
||||
|
||||
# number of ports to allocate per thread, determines the size of the
|
||||
# port range that can be open simultaneously. About double the
|
||||
@ -162,6 +171,10 @@ server:
|
||||
|
||||
# the maximum number of hosts that are cached (roundtrip, EDNS, lame).
|
||||
# infra-cache-numhosts: 10000
|
||||
|
||||
# define a number of tags here, use with local-zone, access-control.
|
||||
# repeat the define-tag statement to add additional tags.
|
||||
# define-tag: "tag1 tag2 tag3"
|
||||
|
||||
# Enable IPv4, "yes" or "no".
|
||||
# do-ip4: yes
|
||||
@ -203,6 +216,20 @@ server:
|
||||
# access-control: ::1 allow
|
||||
# access-control: ::ffff:127.0.0.1 allow
|
||||
|
||||
# tag access-control with list of tags (in "" with spaces between)
|
||||
# Clients using this access control element use localzones that
|
||||
# are tagged with one of these tags.
|
||||
# access-control-tag: 192.0.2.0/24 "tag2 tag3"
|
||||
|
||||
# set action for particular tag for given access control element
|
||||
# if you have multiple tag values, the tag used to lookup the action
|
||||
# is the first tag match between access-control-tag and local-zone-tag
|
||||
# where "first" comes from the order of the define-tag values.
|
||||
# access-control-tag-action: 192.0.2.0/24 tag3 refuse
|
||||
|
||||
# set redirect data for particular tag for access control element
|
||||
# access-control-tag-data: 192.0.2.0/24 tag2 "A 127.0.0.1"
|
||||
|
||||
# if given, a chroot(2) is done to the given directory.
|
||||
# i.e. you can chroot to the working directory, for example,
|
||||
# for extra security, but make sure all files are in that directory.
|
||||
@ -236,6 +263,8 @@ server:
|
||||
# the working directory. The relative files in this config are
|
||||
# relative to this directory. If you give "" the working directory
|
||||
# is not changed.
|
||||
# If you give a server: directory: dir before include: file statements
|
||||
# then those includes can be relative to the working directory.
|
||||
# directory: "@UNBOUND_RUN_DIR@"
|
||||
|
||||
# the log file, "" means log to stderr.
|
||||
@ -322,6 +351,7 @@ server:
|
||||
# Domains (and domains in them) without support for dns-0x20 and
|
||||
# the fallback fails because they keep sending different answers.
|
||||
# caps-whitelist: "licdn.com"
|
||||
# caps-whitelist: "senderbase.org"
|
||||
|
||||
# Enforce privacy of these addresses. Strips them away from answers.
|
||||
# It may cause DNSSEC validation to additionally mark it as bogus.
|
||||
@ -550,6 +580,8 @@ server:
|
||||
# o typetransparent resolves normally for other types and other names
|
||||
# o inform resolves normally, but logs client IP address
|
||||
# o inform_deny drops queries and logs client IP address
|
||||
# o always_transparent, always_refuse, always_nxdomain, resolve in
|
||||
# that way but ignore local data for that name.
|
||||
#
|
||||
# defaults are localhost address, reverse for 127.0.0.1 and ::1
|
||||
# and nxdomain for AS112 zones. If you configure one of these zones
|
||||
@ -576,6 +608,12 @@ server:
|
||||
# you need to do the reverse notation yourself.
|
||||
# local-data-ptr: "192.0.2.3 www.example.com"
|
||||
|
||||
# tag a localzone with a list of tag names (in "" with spaces between)
|
||||
# local-zone-tag: "example.com" "tag2 tag3"
|
||||
|
||||
# add a netblock specific override to a localzone, with zone type
|
||||
# local-zone-override: "example.com" 192.0.2.0/24 refuse
|
||||
|
||||
# service clients over SSL (on the TCP sockets), with plain DNS inside
|
||||
# the SSL stream. Give the certificate to use and private key.
|
||||
# default is "" (disabled). requires restart to take effect.
|
||||
@ -609,7 +647,7 @@ server:
|
||||
# ratelimit-for-domain: example.com 1000
|
||||
# override the ratelimits for all domains below a domain name
|
||||
# can give this multiple times, the name closest to the zone is used.
|
||||
# ratelimit-below-domain: example 1000
|
||||
# ratelimit-below-domain: com 1000
|
||||
|
||||
# Python config section. To enable:
|
||||
# o use --with-pythonmodule to configure before compiling.
|
||||
|
@ -1,4 +1,4 @@
|
||||
.TH "libunbound" "3" "Jun 9, 2016" "NLnet Labs" "unbound 1.5.9"
|
||||
.TH "libunbound" "3" "Sep 27, 2016" "NLnet Labs" "unbound 1.5.10"
|
||||
.\"
|
||||
.\" libunbound.3 -- unbound library functions manual
|
||||
.\"
|
||||
@ -43,7 +43,7 @@
|
||||
.B ub_ctx_zone_remove,
|
||||
.B ub_ctx_data_add,
|
||||
.B ub_ctx_data_remove
|
||||
\- Unbound DNS validating resolver 1.5.9 functions.
|
||||
\- Unbound DNS validating resolver 1.5.10 functions.
|
||||
.SH "SYNOPSIS"
|
||||
.B #include <unbound.h>
|
||||
.LP
|
||||
|
@ -1,4 +1,4 @@
|
||||
.TH "unbound-anchor" "8" "Jun 9, 2016" "NLnet Labs" "unbound 1.5.9"
|
||||
.TH "unbound-anchor" "8" "Sep 27, 2016" "NLnet Labs" "unbound 1.5.10"
|
||||
.\"
|
||||
.\" unbound-anchor.8 -- unbound anchor maintenance utility manual
|
||||
.\"
|
||||
@ -16,6 +16,8 @@
|
||||
.SH "DESCRIPTION"
|
||||
.B Unbound\-anchor
|
||||
performs setup or update of the root trust anchor for DNSSEC validation.
|
||||
The program fetches the trust anchor with the method from RFC7958 when
|
||||
regular RFC5011 update fails to bring it up to date.
|
||||
It can be run (as root) from the commandline, or run as part of startup
|
||||
scripts. Before you start the \fIunbound\fR(8) DNS server.
|
||||
.P
|
||||
@ -39,8 +41,8 @@ update certificate files.
|
||||
.P
|
||||
It tests if the root anchor file works, and if not, and an update is possible,
|
||||
attempts to update the root anchor using the root update certificate.
|
||||
It performs a https fetch of root-anchors.xml and checks the results, if
|
||||
all checks are successful, it updates the root anchor file. Otherwise
|
||||
It performs a https fetch of root-anchors.xml and checks the results (RFC7958),
|
||||
if all checks are successful, it updates the root anchor file. Otherwise
|
||||
the root anchor file is unchanged. It performs RFC5011 tracking if the
|
||||
DNSSEC information available via the DNS makes that possible.
|
||||
.P
|
||||
|
@ -1,4 +1,4 @@
|
||||
.TH "unbound-checkconf" "8" "Jun 9, 2016" "NLnet Labs" "unbound 1.5.9"
|
||||
.TH "unbound-checkconf" "8" "Sep 27, 2016" "NLnet Labs" "unbound 1.5.10"
|
||||
.\"
|
||||
.\" unbound-checkconf.8 -- unbound configuration checker manual
|
||||
.\"
|
||||
|
@ -1,4 +1,4 @@
|
||||
.TH "unbound-control" "8" "Jun 9, 2016" "NLnet Labs" "unbound 1.5.9"
|
||||
.TH "unbound-control" "8" "Sep 27, 2016" "NLnet Labs" "unbound 1.5.10"
|
||||
.\"
|
||||
.\" unbound-control.8 -- unbound remote control manual
|
||||
.\"
|
||||
|
@ -1,4 +1,4 @@
|
||||
.TH "unbound\-host" "1" "Jun 9, 2016" "NLnet Labs" "unbound 1.5.9"
|
||||
.TH "unbound\-host" "1" "Sep 27, 2016" "NLnet Labs" "unbound 1.5.10"
|
||||
.\"
|
||||
.\" unbound-host.1 -- unbound DNS lookup utility
|
||||
.\"
|
||||
|
@ -1,4 +1,4 @@
|
||||
.TH "unbound" "8" "Jun 9, 2016" "NLnet Labs" "unbound 1.5.9"
|
||||
.TH "unbound" "8" "Sep 27, 2016" "NLnet Labs" "unbound 1.5.10"
|
||||
.\"
|
||||
.\" unbound.8 -- unbound manual
|
||||
.\"
|
||||
@ -9,7 +9,7 @@
|
||||
.\"
|
||||
.SH "NAME"
|
||||
.B unbound
|
||||
\- Unbound DNS validating resolver 1.5.9.
|
||||
\- Unbound DNS validating resolver 1.5.10.
|
||||
.SH "SYNOPSIS"
|
||||
.B unbound
|
||||
.RB [ \-h ]
|
||||
|
@ -1,4 +1,4 @@
|
||||
.TH "unbound.conf" "5" "Jun 9, 2016" "NLnet Labs" "unbound 1.5.9"
|
||||
.TH "unbound.conf" "5" "Sep 27, 2016" "NLnet Labs" "unbound 1.5.10"
|
||||
.\"
|
||||
.\" unbound.conf.5 -- unbound.conf manual
|
||||
.\"
|
||||
@ -72,7 +72,8 @@ Processing continues as if the text from the included file was copied into
|
||||
the config file at that point. If also using chroot, using full path names
|
||||
for the included files works, relative pathnames for the included names work
|
||||
if the directory where the daemon is started equals its chroot/working
|
||||
directory. Wildcards can be used to include multiple files, see \fIglob\fR(7).
|
||||
directory or is specified before the include statement with directory: dir.
|
||||
Wildcards can be used to include multiple files, see \fIglob\fR(7).
|
||||
.SS "Server Options"
|
||||
These options are part of the
|
||||
.B server:
|
||||
@ -126,7 +127,7 @@ Detect source interface on UDP queries and copy them to replies. This
|
||||
feature is experimental, and needs support in your OS for particular socket
|
||||
options. Default value is no.
|
||||
.TP
|
||||
.B outgoing\-interface: \fI<ip address>
|
||||
.B outgoing\-interface: \fI<ip address or ip6 netblock>
|
||||
Interface to use to connect to the network. This interface is used to send
|
||||
queries to authoritative servers and receive their replies. Can be given
|
||||
multiple times to work on several interfaces. If none are given the
|
||||
@ -136,12 +137,28 @@ and
|
||||
.B outgoing\-interface:
|
||||
lines, the interfaces are then used for both purposes. Outgoing queries are
|
||||
sent via a random outgoing interface to counter spoofing.
|
||||
.IP
|
||||
If an IPv6 netblock is specified instead of an individual IPv6 address,
|
||||
outgoing UDP queries will use a randomised source address taken from the
|
||||
netblock to counter spoofing. Requires the IPv6 netblock to be routed to the
|
||||
host running unbound, and requires OS support for unprivileged non-local binds
|
||||
(currently only supported on Linux). Several netblocks may be specified with
|
||||
multiple
|
||||
.B outgoing\-interface:
|
||||
options, but do not specify both an individual IPv6 address and an IPv6
|
||||
netblock, or the randomisation will be compromised. Consider combining with
|
||||
.B prefer\-ip6: yes
|
||||
to increase the likelihood of IPv6 nameservers being selected for queries.
|
||||
On Linux you need these two commands to be able to use the freebind socket
|
||||
option to receive traffic for the ip6 netblock:
|
||||
ip -6 addr add mynetblock/64 dev lo &&
|
||||
ip -6 route add local mynetblock/64 dev lo
|
||||
.TP
|
||||
.B outgoing\-range: \fI<number>
|
||||
Number of ports to open. This number of file descriptors can be opened per
|
||||
thread. Must be at least 1. Default depends on compile options. Larger
|
||||
numbers need extra resources from the operating system. For performance a
|
||||
a very large value is best, use libevent to make this possible.
|
||||
very large value is best, use libevent to make this possible.
|
||||
.TP
|
||||
.B outgoing\-port\-permit: \fI<port number or range>
|
||||
Permit unbound to open this port or range of ports for use to send queries.
|
||||
@ -281,7 +298,7 @@ permissions on some systems. The option uses IP_BINDANY on FreeBSD systems.
|
||||
If yes, then use IP_FREEBIND socket option on sockets where unbound
|
||||
is listening to incoming traffic. Default no. Allows you to bind to
|
||||
IP addresses that are nonlocal or do not exist, like when the network
|
||||
interface or IP adress is down. Exists only on Linux, where the similar
|
||||
interface or IP address is down. Exists only on Linux, where the similar
|
||||
ip\-transparent option is also available.
|
||||
.TP
|
||||
.B rrset\-cache\-size: \fI<number>
|
||||
@ -329,6 +346,10 @@ Lower limit for dynamic retransmit timeout calculation in infrastructure
|
||||
cache. Default is 50 milliseconds. Increase this value if using forwarders
|
||||
needing more time to do recursive name resolution.
|
||||
.TP
|
||||
.B define\-tag: \fI<"list of tags">
|
||||
Define the tags that can be used with local\-zone and access\-control.
|
||||
Enclose the list between quotes ("") and put spaces between tags.
|
||||
.TP
|
||||
.B do\-ip4: \fI<yes or no>
|
||||
Enable or disable whether ip4 queries are answered or issued. Default is yes.
|
||||
.TP
|
||||
@ -339,6 +360,10 @@ IPv6 to the internet nameservers. With this option you can disable the
|
||||
ipv6 transport for sending DNS traffic, it does not impact the contents of
|
||||
the DNS traffic, which may have ip4 and ip6 addresses in it.
|
||||
.TP
|
||||
.B prefer\-ip6: \fI<yes or no>
|
||||
If enabled, prefer IPv6 transport for sending DNS queries to internet
|
||||
nameservers. Default is no.
|
||||
.TP
|
||||
.B do\-udp: \fI<yes or no>
|
||||
Enable or disable whether UDP queries are answered or issued. Default is yes.
|
||||
.TP
|
||||
@ -432,6 +457,23 @@ allowed full recursion but only the static data. With deny_non_local,
|
||||
messages that are disallowed are dropped, with refuse_non_local they
|
||||
receive error code REFUSED.
|
||||
.TP
|
||||
.B access\-control\-tag: \fI<IP netblock> <"list of tags">
|
||||
Assign tags to access-control elements. Clients using this access control
|
||||
element use localzones that are tagged with one of these tags. Tags must be
|
||||
defined in \fIdefine\-tags\fR. Enclose list of tags in quotes ("") and put
|
||||
spaces between tags. If access\-control\-tag is configured for a netblock that
|
||||
does not have an access\-control, an access\-control element with action
|
||||
\fIallow\fR is configured for this netblock.
|
||||
.TP
|
||||
.B access\-control\-tag\-action: \fI<IP netblock> <tag> <action>
|
||||
Set action for particular tag for given access control element. If you have
|
||||
multiple tag values, the tag used to lookup the action is the first tag match
|
||||
between access\-control\-tag and local\-zone\-tag where "first" comes from the
|
||||
order of the define-tag values.
|
||||
.TP
|
||||
.B access\-control\-tag\-data: \fI<IP netblock> <tag> <"resource record string">
|
||||
Set redirect data for particular tag for given access control element.
|
||||
.TP
|
||||
.B chroot: \fI<directory>
|
||||
If chroot is enabled, you should pass the configfile (from the
|
||||
commandline) as a full path from the original root. After the
|
||||
@ -469,6 +511,8 @@ requires privileges, then a reload will fail; a restart is needed.
|
||||
Sets the working directory for the program. Default is "@UNBOUND_RUN_DIR@".
|
||||
On Windows the string "%EXECUTABLE%" tries to change to the directory
|
||||
that unbound.exe resides in.
|
||||
If you give a server: directory: dir before include: file statements
|
||||
then those includes can be relative to the working directory.
|
||||
.TP
|
||||
.B logfile: \fI<filename>
|
||||
If "" is given, logging goes to stderr, or nowhere once daemonized.
|
||||
@ -883,6 +927,7 @@ address space are not validated. This is usually required whenever
|
||||
Configure a local zone. The type determines the answer to give if
|
||||
there is no match from local\-data. The types are deny, refuse, static,
|
||||
transparent, redirect, nodefault, typetransparent, inform, inform_deny,
|
||||
always_transparent, always_refuse, always_nxdomain,
|
||||
and are explained below. After that the default settings are listed. Use
|
||||
local\-data: to enter data into the local zone. Answers for local zones
|
||||
are authoritative DNS answers. By default the zones are class IN.
|
||||
@ -943,6 +988,15 @@ logged, eg. to run antivirus on them.
|
||||
The query is dropped, like 'deny', and logged, like 'inform'. Ie. find
|
||||
infected machines without answering the queries.
|
||||
.TP 10
|
||||
\h'5'\fIalways_transparent\fR
|
||||
Like transparent, but ignores local data and resolves normally.
|
||||
.TP 10
|
||||
\h'5'\fIalways_refuse\fR
|
||||
Like refuse, but ignores local data and refuses the query.
|
||||
.TP 10
|
||||
\h'5'\fIalways_nxdomain\fR
|
||||
Like static, but ignores local data and returns nxdomain for the query.
|
||||
.TP 10
|
||||
\h'5'\fInodefault\fR
|
||||
Used to turn off default contents for AS112 zones. The other types
|
||||
also turn off default contents for the zone. The 'nodefault' option
|
||||
@ -1060,6 +1114,18 @@ Configure local data shorthand for a PTR record with the reversed IPv4 or
|
||||
IPv6 address and the host name. For example "192.0.2.4 www.example.com".
|
||||
TTL can be inserted like this: "2001:DB8::4 7200 www.example.com"
|
||||
.TP 5
|
||||
.B local\-zone\-tag: \fI<zone> <"list of tags">
|
||||
Assign tags to localzones. Tagged localzones will only be applied when the
|
||||
used access-control element has a matching tag. Tags must be defined in
|
||||
\fIdefine\-tags\fR. Enclose list of tags in quotes ("") and put spaces between
|
||||
tags.
|
||||
.TP 5
|
||||
.B local\-zone\-override: \fI<zone> <IP netblock> <type>
|
||||
Override the localzone type for queries from addresses matching netblock.
|
||||
Use this localzone type, regardless the type configured for the local-zone
|
||||
(both tagged and untagged) and regardless the type configured using
|
||||
access\-control\-tag\-action.
|
||||
.TP 5
|
||||
.B ratelimit: \fI<number or 0>
|
||||
Enable ratelimiting of queries sent to nameserver for performing recursion.
|
||||
If 0, the default, it is disabled. This option is experimental at this time.
|
||||
|
@ -623,7 +623,9 @@ EXCLUDE = ./build \
|
||||
pythonmod/examples/resip.py \
|
||||
libunbound/python/unbound.py \
|
||||
libunbound/python/libunbound_wrap.c \
|
||||
./ldns-src
|
||||
./ldns-src \
|
||||
doc/control_proto_spec.txt \
|
||||
doc/requirements.txt
|
||||
|
||||
# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
|
||||
# directories that are symbolic links (a Unix filesystem feature) are excluded
|
||||
|
@ -147,6 +147,7 @@ compile_time_root_prime(int do_ip4, int do_ip6)
|
||||
if(!ah(dp, "B.ROOT-SERVERS.NET.", "2001:500:84::b")) goto failed;
|
||||
if(!ah(dp, "C.ROOT-SERVERS.NET.", "2001:500:2::c")) goto failed;
|
||||
if(!ah(dp, "D.ROOT-SERVERS.NET.", "2001:500:2d::d")) goto failed;
|
||||
if(!ah(dp, "E.ROOT-SERVERS.NET.", "2001:500:a8::e")) goto failed;
|
||||
if(!ah(dp, "F.ROOT-SERVERS.NET.", "2001:500:2f::f")) goto failed;
|
||||
if(!ah(dp, "H.ROOT-SERVERS.NET.", "2001:500:1::53")) goto failed;
|
||||
if(!ah(dp, "I.ROOT-SERVERS.NET.", "2001:7fe::53")) goto failed;
|
||||
|
@ -360,6 +360,39 @@ iter_filter_order(struct iter_env* iter_env, struct module_env* env,
|
||||
}
|
||||
}
|
||||
*selected_rtt = low_rtt;
|
||||
|
||||
if (env->cfg->prefer_ip6) {
|
||||
int got_num6 = 0;
|
||||
int low_rtt6 = 0;
|
||||
int i;
|
||||
prev = NULL;
|
||||
a = dp->result_list;
|
||||
for(i = 0; i < got_num; i++) {
|
||||
swap_to_front = 0;
|
||||
if(a->addr.ss_family == AF_INET6) {
|
||||
got_num6++;
|
||||
swap_to_front = 1;
|
||||
if(low_rtt6 == 0 || a->sel_rtt < low_rtt6) {
|
||||
low_rtt6 = a->sel_rtt;
|
||||
}
|
||||
}
|
||||
/* swap to front if IPv6, or move to next result */
|
||||
if(swap_to_front && prev) {
|
||||
n = a->next_result;
|
||||
prev->next_result = n;
|
||||
a->next_result = dp->result_list;
|
||||
dp->result_list = a;
|
||||
a = n;
|
||||
} else {
|
||||
prev = a;
|
||||
a = a->next_result;
|
||||
}
|
||||
}
|
||||
if(got_num6 > 0) {
|
||||
got_num = got_num6;
|
||||
*selected_rtt = low_rtt6;
|
||||
}
|
||||
}
|
||||
return got_num;
|
||||
}
|
||||
|
||||
|
@ -148,6 +148,7 @@ iter_new(struct module_qstate* qstate, int id)
|
||||
iq->qchase = qstate->qinfo;
|
||||
outbound_list_init(&iq->outlist);
|
||||
iq->minimise_count = 0;
|
||||
iq->minimise_timeout_count = 0;
|
||||
if (qstate->env->cfg->qname_minimisation)
|
||||
iq->minimisation_state = INIT_MINIMISE_STATE;
|
||||
else
|
||||
@ -215,6 +216,7 @@ error_supers(struct module_qstate* qstate, int id, struct module_qstate* super)
|
||||
qstate->qinfo.qtype == LDNS_RR_TYPE_AAAA) {
|
||||
/* mark address as failed. */
|
||||
struct delegpt_ns* dpns = NULL;
|
||||
super_iq->num_target_queries--;
|
||||
if(super_iq->dp)
|
||||
dpns = delegpt_find_ns(super_iq->dp,
|
||||
qstate->qinfo.qname, qstate->qinfo.qname_len);
|
||||
@ -234,7 +236,6 @@ error_supers(struct module_qstate* qstate, int id, struct module_qstate* super)
|
||||
log_err("out of memory adding missing");
|
||||
}
|
||||
dpns->resolved = 1; /* mark as failed */
|
||||
super_iq->num_target_queries--;
|
||||
}
|
||||
if(qstate->qinfo.qtype == LDNS_RR_TYPE_NS) {
|
||||
/* prime failed to get delegation */
|
||||
@ -2008,7 +2009,7 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
|
||||
iq->dp->name))) {
|
||||
iq->qinfo_out.qname = iq->dp->name;
|
||||
iq->qinfo_out.qname_len = iq->dp->namelen;
|
||||
iq->qinfo_out.qtype = LDNS_RR_TYPE_NS;
|
||||
iq->qinfo_out.qtype = LDNS_RR_TYPE_A;
|
||||
iq->qinfo_out.qclass = iq->qchase.qclass;
|
||||
iq->minimise_count = 0;
|
||||
}
|
||||
@ -2023,6 +2024,9 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
|
||||
iq->qinfo_out.qname = iq->qchase.qname;
|
||||
iq->qinfo_out.qname_len = iq->qchase.qname_len;
|
||||
iq->minimise_count++;
|
||||
iq->minimise_timeout_count = 0;
|
||||
|
||||
iter_dec_attempts(iq->dp, 1);
|
||||
|
||||
/* Limit number of iterations for QNAMEs with more
|
||||
* than MAX_MINIMISE_COUNT labels. Send first MINIMISE_ONE_LAB
|
||||
@ -2059,8 +2063,9 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
|
||||
&iq->qinfo_out.qname_len,
|
||||
labdiff-1);
|
||||
}
|
||||
if(labdiff < 1 ||
|
||||
(labdiff < 2 && iq->qchase.qtype == LDNS_RR_TYPE_DS))
|
||||
if(labdiff < 1 || (labdiff < 2
|
||||
&& (iq->qchase.qtype == LDNS_RR_TYPE_DS
|
||||
|| iq->qchase.qtype == LDNS_RR_TYPE_A)))
|
||||
/* Stop minimising this query, resolve "as usual" */
|
||||
iq->minimisation_state = DONOT_MINIMISE_STATE;
|
||||
else {
|
||||
@ -2077,10 +2082,17 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
if(iq->minimisation_state == SKIP_MINIMISE_STATE)
|
||||
/* Do not increment qname, continue incrementing next
|
||||
* iteration */
|
||||
iq->minimisation_state = MINIMISE_STATE;
|
||||
if(iq->minimisation_state == SKIP_MINIMISE_STATE) {
|
||||
iq->minimise_timeout_count++;
|
||||
if(iq->minimise_timeout_count < MAX_MINIMISE_TIMEOUT_COUNT)
|
||||
/* Do not increment qname, continue incrementing next
|
||||
* iteration */
|
||||
iq->minimisation_state = MINIMISE_STATE;
|
||||
else
|
||||
/* Too many time-outs detected for this QNAME and QTYPE.
|
||||
* We give up, disable QNAME minimisation. */
|
||||
iq->minimisation_state = DONOT_MINIMISE_STATE;
|
||||
}
|
||||
if(iq->minimisation_state == DONOT_MINIMISE_STATE)
|
||||
iq->qinfo_out = iq->qchase;
|
||||
|
||||
@ -2158,7 +2170,7 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
|
||||
iq->num_current_queries--;
|
||||
if(iq->response == NULL) {
|
||||
/* Don't increment qname when QNAME minimisation is enabled */
|
||||
if (qstate->env->cfg->qname_minimisation)
|
||||
if(qstate->env->cfg->qname_minimisation)
|
||||
iq->minimisation_state = SKIP_MINIMISE_STATE;
|
||||
iq->chase_to_rd = 0;
|
||||
iq->dnssec_lame_query = 0;
|
||||
@ -2649,6 +2661,10 @@ processTargetResponse(struct module_qstate* qstate, int id,
|
||||
log_query_info(VERB_ALGO, "processTargetResponse", &qstate->qinfo);
|
||||
log_query_info(VERB_ALGO, "processTargetResponse super", &forq->qinfo);
|
||||
|
||||
/* Tell the originating event that this target query has finished
|
||||
* (regardless if it succeeded or not). */
|
||||
foriq->num_target_queries--;
|
||||
|
||||
/* check to see if parent event is still interested (in orig name). */
|
||||
if(!foriq->dp) {
|
||||
verbose(VERB_ALGO, "subq: parent not interested, was reset");
|
||||
@ -2664,10 +2680,6 @@ processTargetResponse(struct module_qstate* qstate, int id,
|
||||
return;
|
||||
}
|
||||
|
||||
/* Tell the originating event that this target query has finished
|
||||
* (regardless if it succeeded or not). */
|
||||
foriq->num_target_queries--;
|
||||
|
||||
/* if iq->query_for_pside_glue then add the pside_glue (marked lame) */
|
||||
if(iq->pside_glue) {
|
||||
/* if the pside_glue is NULL, then it could not be found,
|
||||
|
@ -69,6 +69,9 @@ struct rbtree_t;
|
||||
* QNAMEs with a lot of labels.
|
||||
*/
|
||||
#define MAX_MINIMISE_COUNT 10
|
||||
/* max number of time-outs for minimised query. Prevents resolving failures
|
||||
* when the QNAME minimisation QTYPE is blocked. */
|
||||
#define MAX_MINIMISE_TIMEOUT_COUNT 3
|
||||
/**
|
||||
* number of labels from QNAME that are always send individually when using
|
||||
* QNAME minimisation, even when the number of labels of the QNAME is bigger
|
||||
@ -377,6 +380,11 @@ struct iter_qstate {
|
||||
* outgoing queries when QNAME minimisation is enabled.
|
||||
*/
|
||||
int minimise_count;
|
||||
|
||||
/**
|
||||
* Count number of time-outs. Used to prevent resolving failures when
|
||||
* the QNAME minimisation QTYPE is blocked. */
|
||||
int minimise_timeout_count;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -608,7 +608,8 @@ int libworker_fg(struct ub_ctx* ctx, struct ctx_query* q)
|
||||
sldns_buffer_write_u16_at(w->back->udp_buff, 0, qid);
|
||||
sldns_buffer_write_u16_at(w->back->udp_buff, 2, qflags);
|
||||
if(local_zones_answer(ctx->local_zones, &qinfo, &edns,
|
||||
w->back->udp_buff, w->env->scratch, NULL)) {
|
||||
w->back->udp_buff, w->env->scratch, NULL, NULL, 0, NULL, 0,
|
||||
NULL, 0, NULL, 0)) {
|
||||
regional_free_all(w->env->scratch);
|
||||
libworker_fillup_fg(q, LDNS_RCODE_NOERROR,
|
||||
w->back->udp_buff, sec_status_insecure, NULL);
|
||||
@ -678,7 +679,8 @@ int libworker_attach_mesh(struct ub_ctx* ctx, struct ctx_query* q,
|
||||
sldns_buffer_write_u16_at(w->back->udp_buff, 0, qid);
|
||||
sldns_buffer_write_u16_at(w->back->udp_buff, 2, qflags);
|
||||
if(local_zones_answer(ctx->local_zones, &qinfo, &edns,
|
||||
w->back->udp_buff, w->env->scratch, NULL)) {
|
||||
w->back->udp_buff, w->env->scratch, NULL, NULL, 0, NULL, 0,
|
||||
NULL, 0, NULL, 0)) {
|
||||
regional_free_all(w->env->scratch);
|
||||
free(qinfo.qname);
|
||||
libworker_event_done_cb(q, LDNS_RCODE_NOERROR,
|
||||
@ -798,7 +800,8 @@ handle_newq(struct libworker* w, uint8_t* buf, uint32_t len)
|
||||
sldns_buffer_write_u16_at(w->back->udp_buff, 0, qid);
|
||||
sldns_buffer_write_u16_at(w->back->udp_buff, 2, qflags);
|
||||
if(local_zones_answer(w->ctx->local_zones, &qinfo, &edns,
|
||||
w->back->udp_buff, w->env->scratch, NULL)) {
|
||||
w->back->udp_buff, w->env->scratch, NULL, NULL, 0, NULL, 0,
|
||||
NULL, 0, NULL, 0)) {
|
||||
regional_free_all(w->env->scratch);
|
||||
q->msg_security = sec_status_insecure;
|
||||
add_bg_result(w, q, w->back->udp_buff, UB_NOERROR, NULL);
|
||||
|
@ -43,6 +43,9 @@
|
||||
# include <sys/types.h>
|
||||
#endif
|
||||
#include <sys/time.h>
|
||||
#ifdef USE_TCP_FASTOPEN
|
||||
#include <netinet/tcp.h>
|
||||
#endif
|
||||
#include "services/listen_dnsport.h"
|
||||
#include "services/outside_network.h"
|
||||
#include "util/netevent.h"
|
||||
@ -184,14 +187,6 @@ create_udp_sock(int family, int socktype, struct sockaddr* addr,
|
||||
#else
|
||||
(void)reuseport;
|
||||
#endif /* defined(SO_REUSEPORT) */
|
||||
#ifdef IP_FREEBIND
|
||||
if (freebind &&
|
||||
setsockopt(s, IPPROTO_IP, IP_FREEBIND, (void*)&on,
|
||||
(socklen_t)sizeof(on)) < 0) {
|
||||
log_warn("setsockopt(.. IP_FREEBIND ..) failed: %s",
|
||||
strerror(errno));
|
||||
}
|
||||
#endif /* IP_FREEBIND */
|
||||
#ifdef IP_TRANSPARENT
|
||||
if (transparent &&
|
||||
setsockopt(s, IPPROTO_IP, IP_TRANSPARENT, (void*)&on,
|
||||
@ -209,6 +204,14 @@ create_udp_sock(int family, int socktype, struct sockaddr* addr,
|
||||
}
|
||||
#endif /* IP_TRANSPARENT || IP_BINDANY */
|
||||
}
|
||||
#ifdef IP_FREEBIND
|
||||
if(freebind &&
|
||||
setsockopt(s, IPPROTO_IP, IP_FREEBIND, (void*)&on,
|
||||
(socklen_t)sizeof(on)) < 0) {
|
||||
log_warn("setsockopt(.. IP_FREEBIND ..) failed: %s",
|
||||
strerror(errno));
|
||||
}
|
||||
#endif /* IP_FREEBIND */
|
||||
if(rcv) {
|
||||
#ifdef SO_RCVBUF
|
||||
int got;
|
||||
@ -509,6 +512,9 @@ create_tcp_accept_sock(struct addrinfo *addr, int v6only, int* noproto,
|
||||
#if defined(SO_REUSEADDR) || defined(SO_REUSEPORT) || defined(IPV6_V6ONLY) || defined(IP_TRANSPARENT) || defined(IP_BINDANY) || defined(IP_FREEBIND)
|
||||
int on = 1;
|
||||
#endif
|
||||
#ifdef USE_TCP_FASTOPEN
|
||||
int qlen;
|
||||
#endif
|
||||
#if !defined(IP_TRANSPARENT) && !defined(IP_BINDANY)
|
||||
(void)transparent;
|
||||
#endif
|
||||
@ -669,6 +675,22 @@ create_tcp_accept_sock(struct addrinfo *addr, int v6only, int* noproto,
|
||||
#endif
|
||||
return -1;
|
||||
}
|
||||
#ifdef USE_TCP_FASTOPEN
|
||||
/* qlen specifies how many outstanding TFO requests to allow. Limit is a defense
|
||||
against IP spoofing attacks as suggested in RFC7413 */
|
||||
#ifdef __APPLE__
|
||||
/* OS X implementation only supports qlen of 1 via this call. Actual
|
||||
value is configured by the net.inet.tcp.fastopen_backlog kernel parm. */
|
||||
qlen = 1;
|
||||
#else
|
||||
/* 5 is recommended on linux */
|
||||
qlen = 5;
|
||||
#endif
|
||||
if ((setsockopt(s, IPPROTO_TCP, TCP_FASTOPEN, &qlen,
|
||||
sizeof(qlen))) == -1 ) {
|
||||
log_err("Setting TCP Fast Open as server failed: %s", strerror(errno));
|
||||
}
|
||||
#endif
|
||||
return s;
|
||||
}
|
||||
|
||||
@ -682,7 +704,7 @@ create_local_accept_sock(const char *path, int* noproto)
|
||||
verbose(VERB_ALGO, "creating unix socket %s", path);
|
||||
#ifdef HAVE_STRUCT_SOCKADDR_UN_SUN_LEN
|
||||
/* this member exists on BSDs, not Linux */
|
||||
usock.sun_len = (socklen_t)sizeof(usock);
|
||||
usock.sun_len = (unsigned)sizeof(usock);
|
||||
#endif
|
||||
usock.sun_family = AF_LOCAL;
|
||||
/* length is 92-108, 104 on FreeBSD */
|
||||
|
@ -184,8 +184,11 @@ lz_enter_zone_dname(struct local_zones* zones, uint8_t* nm, size_t len,
|
||||
log_warn("duplicate local-zone");
|
||||
lock_rw_unlock(&z->lock);
|
||||
local_zone_delete(z);
|
||||
/* find the correct zone, so not an error for duplicate */
|
||||
z = local_zones_find(zones, nm, len, labs, c);
|
||||
lock_rw_wrlock(&z->lock);
|
||||
lock_rw_unlock(&zones->lock);
|
||||
return NULL;
|
||||
return z;
|
||||
}
|
||||
lock_rw_unlock(&zones->lock);
|
||||
return z;
|
||||
@ -525,7 +528,7 @@ lz_enter_zone_tag(struct local_zones* zones, char* zname, uint8_t* list,
|
||||
dname_labs = dname_count_labels(dname);
|
||||
|
||||
lock_rw_rdlock(&zones->lock);
|
||||
z = local_zones_lookup(zones, dname, dname_len, dname_labs, rr_class);
|
||||
z = local_zones_find(zones, dname, dname_len, dname_labs, rr_class);
|
||||
if(!z) {
|
||||
lock_rw_unlock(&zones->lock);
|
||||
log_err("no local-zone for tag %s", zname);
|
||||
@ -542,6 +545,89 @@ lz_enter_zone_tag(struct local_zones* zones, char* zname, uint8_t* list,
|
||||
return r;
|
||||
}
|
||||
|
||||
/** enter override into zone */
|
||||
static int
|
||||
lz_enter_override(struct local_zones* zones, char* zname, char* netblock,
|
||||
char* type, uint16_t rr_class)
|
||||
{
|
||||
uint8_t dname[LDNS_MAX_DOMAINLEN+1];
|
||||
size_t dname_len = sizeof(dname);
|
||||
int dname_labs;
|
||||
struct sockaddr_storage addr;
|
||||
int net;
|
||||
socklen_t addrlen;
|
||||
struct local_zone* z;
|
||||
enum localzone_type t;
|
||||
|
||||
/* parse zone name */
|
||||
if(sldns_str2wire_dname_buf(zname, dname, &dname_len) != 0) {
|
||||
log_err("cannot parse zone name in local-zone-override: %s %s",
|
||||
zname, netblock);
|
||||
return 0;
|
||||
}
|
||||
dname_labs = dname_count_labels(dname);
|
||||
|
||||
/* parse netblock */
|
||||
if(!netblockstrtoaddr(netblock, UNBOUND_DNS_PORT, &addr, &addrlen,
|
||||
&net)) {
|
||||
log_err("cannot parse netblock in local-zone-override: %s %s",
|
||||
zname, netblock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* parse zone type */
|
||||
if(!local_zone_str2type(type, &t)) {
|
||||
log_err("cannot parse type in local-zone-override: %s %s %s",
|
||||
zname, netblock, type);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* find localzone entry */
|
||||
lock_rw_rdlock(&zones->lock);
|
||||
z = local_zones_find(zones, dname, dname_len, dname_labs, rr_class);
|
||||
if(!z) {
|
||||
lock_rw_unlock(&zones->lock);
|
||||
log_err("no local-zone for local-zone-override %s", zname);
|
||||
return 0;
|
||||
}
|
||||
lock_rw_wrlock(&z->lock);
|
||||
lock_rw_unlock(&zones->lock);
|
||||
|
||||
/* create netblock addr_tree if not present yet */
|
||||
if(!z->override_tree) {
|
||||
z->override_tree = (struct rbtree_t*)regional_alloc_zero(
|
||||
z->region, sizeof(*z->override_tree));
|
||||
if(!z->override_tree) {
|
||||
lock_rw_unlock(&z->lock);
|
||||
log_err("out of memory");
|
||||
return 0;
|
||||
}
|
||||
addr_tree_init(z->override_tree);
|
||||
}
|
||||
/* add new elem to tree */
|
||||
if(z->override_tree) {
|
||||
struct local_zone_override* n;
|
||||
n = (struct local_zone_override*)regional_alloc_zero(
|
||||
z->region, sizeof(*n));
|
||||
if(!n) {
|
||||
lock_rw_unlock(&z->lock);
|
||||
log_err("out of memory");
|
||||
return 0;
|
||||
}
|
||||
n->type = t;
|
||||
if(!addr_tree_insert(z->override_tree,
|
||||
(struct addr_tree_node*)n, &addr, addrlen, net)) {
|
||||
lock_rw_unlock(&z->lock);
|
||||
log_err("duplicate local-zone-override %s %s",
|
||||
zname, netblock);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
lock_rw_unlock(&z->lock);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/** parse local-zone: statements */
|
||||
static int
|
||||
lz_enter_zones(struct local_zones* zones, struct config_file* cfg)
|
||||
@ -720,6 +806,19 @@ lz_enter_defaults(struct local_zones* zones, struct config_file* cfg)
|
||||
return 1;
|
||||
}
|
||||
|
||||
/** parse local-zone-override: statements */
|
||||
static int
|
||||
lz_enter_overrides(struct local_zones* zones, struct config_file* cfg)
|
||||
{
|
||||
struct config_str3list* p;
|
||||
for(p = cfg->local_zone_overrides; p; p = p->next) {
|
||||
if(!lz_enter_override(zones, p->str, p->str2, p->str3,
|
||||
LDNS_RR_CLASS_IN))
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/** setup parent pointers, so that a lookup can be done for closest match */
|
||||
static void
|
||||
init_parents(struct local_zones* zones)
|
||||
@ -749,6 +848,9 @@ init_parents(struct local_zones* zones)
|
||||
break;
|
||||
}
|
||||
prev = node;
|
||||
|
||||
if(node->override_tree)
|
||||
addr_tree_init_parents(node->override_tree);
|
||||
lock_rw_unlock(&node->lock);
|
||||
}
|
||||
lock_rw_unlock(&zones->lock);
|
||||
@ -887,6 +989,10 @@ local_zones_apply_cfg(struct local_zones* zones, struct config_file* cfg)
|
||||
if(!lz_enter_defaults(zones, cfg)) {
|
||||
return 0;
|
||||
}
|
||||
/* enter local zone overrides */
|
||||
if(!lz_enter_overrides(zones, cfg)) {
|
||||
return 0;
|
||||
}
|
||||
/* create implicit transparent zone from data. */
|
||||
if(!lz_setup_implicit(zones, cfg)) {
|
||||
return 0;
|
||||
@ -910,34 +1016,42 @@ local_zones_apply_cfg(struct local_zones* zones, struct config_file* cfg)
|
||||
struct local_zone*
|
||||
local_zones_lookup(struct local_zones* zones,
|
||||
uint8_t* name, size_t len, int labs, uint16_t dclass)
|
||||
{
|
||||
return local_zones_tags_lookup(zones, name, len, labs,
|
||||
dclass, NULL, 0, 1);
|
||||
}
|
||||
|
||||
struct local_zone*
|
||||
local_zones_tags_lookup(struct local_zones* zones,
|
||||
uint8_t* name, size_t len, int labs, uint16_t dclass,
|
||||
uint8_t* taglist, size_t taglen, int ignoretags)
|
||||
{
|
||||
rbnode_t* res = NULL;
|
||||
struct local_zone *result;
|
||||
struct local_zone key;
|
||||
int m;
|
||||
key.node.key = &key;
|
||||
key.dclass = dclass;
|
||||
key.name = name;
|
||||
key.namelen = len;
|
||||
key.namelabs = labs;
|
||||
if(rbtree_find_less_equal(&zones->ztree, &key, &res)) {
|
||||
/* exact */
|
||||
return (struct local_zone*)res;
|
||||
} else {
|
||||
/* smaller element (or no element) */
|
||||
int m;
|
||||
result = (struct local_zone*)res;
|
||||
if(!result || result->dclass != dclass)
|
||||
return NULL;
|
||||
/* count number of labels matched */
|
||||
(void)dname_lab_cmp(result->name, result->namelabs, key.name,
|
||||
key.namelabs, &m);
|
||||
while(result) { /* go up until qname is subdomain of zone */
|
||||
if(result->namelabs <= m)
|
||||
break;
|
||||
result = result->parent;
|
||||
}
|
||||
return result;
|
||||
rbtree_find_less_equal(&zones->ztree, &key, &res);
|
||||
result = (struct local_zone*)res;
|
||||
/* exact or smaller element (or no element) */
|
||||
if(!result || result->dclass != dclass)
|
||||
return NULL;
|
||||
/* count number of labels matched */
|
||||
(void)dname_lab_cmp(result->name, result->namelabs, key.name,
|
||||
key.namelabs, &m);
|
||||
while(result) { /* go up until qname is zone or subdomain of zone */
|
||||
if(result->namelabs <= m)
|
||||
if(ignoretags || !result->taglist ||
|
||||
taglist_intersect(result->taglist,
|
||||
result->taglen, taglist, taglen))
|
||||
break;
|
||||
result = result->parent;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
struct local_zone*
|
||||
@ -1009,6 +1123,18 @@ void local_zones_print(struct local_zones* zones)
|
||||
log_nametypeclass(0, "inform_deny zone",
|
||||
z->name, 0, z->dclass);
|
||||
break;
|
||||
case local_zone_always_transparent:
|
||||
log_nametypeclass(0, "always_transparent zone",
|
||||
z->name, 0, z->dclass);
|
||||
break;
|
||||
case local_zone_always_refuse:
|
||||
log_nametypeclass(0, "always_refuse zone",
|
||||
z->name, 0, z->dclass);
|
||||
break;
|
||||
case local_zone_always_nxdomain:
|
||||
log_nametypeclass(0, "always_nxdomain zone",
|
||||
z->name, 0, z->dclass);
|
||||
break;
|
||||
default:
|
||||
log_nametypeclass(0, "badtyped zone",
|
||||
z->name, 0, z->dclass);
|
||||
@ -1054,11 +1180,99 @@ local_encode(struct query_info* qinfo, struct edns_data* edns,
|
||||
return 1;
|
||||
}
|
||||
|
||||
/** find local data tag string match for the given type in the list */
|
||||
static int
|
||||
find_tag_datas(struct query_info* qinfo, struct config_strlist* list,
|
||||
struct ub_packed_rrset_key* r, struct regional* temp,
|
||||
uint8_t* zname, size_t zlen)
|
||||
{
|
||||
struct config_strlist* p;
|
||||
char buf[65536];
|
||||
uint8_t rr[LDNS_RR_BUF_SIZE];
|
||||
size_t len;
|
||||
int res;
|
||||
struct packed_rrset_data* d;
|
||||
for(p=list; p; p=p->next) {
|
||||
len = sizeof(rr);
|
||||
/* does this element match the type? */
|
||||
snprintf(buf, sizeof(buf), ". %s", p->str);
|
||||
res = sldns_str2wire_rr_buf(buf, rr, &len, NULL, 3600,
|
||||
zname, zlen, NULL, 0);
|
||||
if(res != 0)
|
||||
/* parse errors are already checked before, in
|
||||
* acllist check_data, skip this for robustness */
|
||||
continue;
|
||||
if(len < 1 /* . */ + 8 /* typeclassttl*/ + 2 /*rdatalen*/)
|
||||
continue;
|
||||
if(sldns_wirerr_get_type(rr, len, 1) != qinfo->qtype)
|
||||
continue;
|
||||
|
||||
/* do we have entries already? if not setup key */
|
||||
if(r->rk.dname == NULL) {
|
||||
r->entry.key = r;
|
||||
r->rk.dname = qinfo->qname;
|
||||
r->rk.dname_len = qinfo->qname_len;
|
||||
r->rk.type = htons(qinfo->qtype);
|
||||
r->rk.rrset_class = htons(qinfo->qclass);
|
||||
r->rk.flags = 0;
|
||||
d = (struct packed_rrset_data*)regional_alloc_zero(
|
||||
temp, sizeof(struct packed_rrset_data)
|
||||
+ sizeof(size_t) + sizeof(uint8_t*) +
|
||||
sizeof(time_t));
|
||||
if(!d) return 0; /* out of memory */
|
||||
r->entry.data = d;
|
||||
d->ttl = sldns_wirerr_get_ttl(rr, len, 1);
|
||||
d->rr_len = (size_t*)((uint8_t*)d +
|
||||
sizeof(struct packed_rrset_data));
|
||||
d->rr_data = (uint8_t**)&(d->rr_len[1]);
|
||||
d->rr_ttl = (time_t*)&(d->rr_data[1]);
|
||||
}
|
||||
d = (struct packed_rrset_data*)r->entry.data;
|
||||
/* add entry to the data */
|
||||
if(d->count != 0) {
|
||||
size_t* oldlen = d->rr_len;
|
||||
uint8_t** olddata = d->rr_data;
|
||||
time_t* oldttl = d->rr_ttl;
|
||||
/* increase arrays for lookup */
|
||||
/* this is of course slow for very many records,
|
||||
* but most redirects are expected with few records */
|
||||
d->rr_len = (size_t*)regional_alloc_zero(temp,
|
||||
(d->count+1)*sizeof(size_t));
|
||||
d->rr_data = (uint8_t**)regional_alloc_zero(temp,
|
||||
(d->count+1)*sizeof(uint8_t*));
|
||||
d->rr_ttl = (time_t*)regional_alloc_zero(temp,
|
||||
(d->count+1)*sizeof(time_t));
|
||||
if(!d->rr_len || !d->rr_data || !d->rr_ttl)
|
||||
return 0; /* out of memory */
|
||||
/* first one was allocated after struct d, but new
|
||||
* ones get their own array increment alloc, so
|
||||
* copy old content */
|
||||
memmove(d->rr_len, oldlen, d->count*sizeof(size_t));
|
||||
memmove(d->rr_data, olddata, d->count*sizeof(uint8_t*));
|
||||
memmove(d->rr_ttl, oldttl, d->count*sizeof(time_t));
|
||||
}
|
||||
|
||||
d->rr_len[d->count] = sldns_wirerr_get_rdatalen(rr, len, 1)+2;
|
||||
d->rr_ttl[d->count] = sldns_wirerr_get_ttl(rr, len, 1);
|
||||
d->rr_data[d->count] = regional_alloc_init(temp,
|
||||
sldns_wirerr_get_rdatawl(rr, len, 1),
|
||||
d->rr_len[d->count]);
|
||||
if(!d->rr_data[d->count])
|
||||
if(!d) return 0; /* out of memory */
|
||||
d->count++;
|
||||
}
|
||||
if(r->rk.dname)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** answer local data match */
|
||||
static int
|
||||
local_data_answer(struct local_zone* z, struct query_info* qinfo,
|
||||
struct edns_data* edns, sldns_buffer* buf, struct regional* temp,
|
||||
int labs, struct local_data** ldp)
|
||||
int labs, struct local_data** ldp, enum localzone_type lz_type,
|
||||
int tag, struct config_strlist** tag_datas, size_t tag_datas_size,
|
||||
char** tagname, int num_tags)
|
||||
{
|
||||
struct local_data key;
|
||||
struct local_data* ld;
|
||||
@ -1067,10 +1281,21 @@ local_data_answer(struct local_zone* z, struct query_info* qinfo,
|
||||
key.name = qinfo->qname;
|
||||
key.namelen = qinfo->qname_len;
|
||||
key.namelabs = labs;
|
||||
if(z->type == local_zone_redirect) {
|
||||
if(lz_type == local_zone_redirect) {
|
||||
key.name = z->name;
|
||||
key.namelen = z->namelen;
|
||||
key.namelabs = z->namelabs;
|
||||
if(tag != -1 && (size_t)tag<tag_datas_size && tag_datas[tag]) {
|
||||
struct ub_packed_rrset_key r;
|
||||
memset(&r, 0, sizeof(r));
|
||||
if(find_tag_datas(qinfo, tag_datas[tag], &r, temp,
|
||||
z->name, z->namelen)) {
|
||||
verbose(VERB_ALGO, "redirect with tag data [%d] %s",
|
||||
tag, (tag<num_tags?tagname[tag]:"null"));
|
||||
return local_encode(qinfo, edns, buf, temp,
|
||||
&r, 1, LDNS_RCODE_NOERROR);
|
||||
}
|
||||
}
|
||||
}
|
||||
ld = (struct local_data*)rbtree_search(&z->data, &key.node);
|
||||
*ldp = ld;
|
||||
@ -1080,7 +1305,7 @@ local_data_answer(struct local_zone* z, struct query_info* qinfo,
|
||||
lr = local_data_find_type(ld, qinfo->qtype);
|
||||
if(!lr)
|
||||
return 0;
|
||||
if(z->type == local_zone_redirect) {
|
||||
if(lz_type == local_zone_redirect) {
|
||||
/* convert rrset name to query name; like a wildcard */
|
||||
struct ub_packed_rrset_key r = *lr->rrset;
|
||||
r.rk.dname = qinfo->qname;
|
||||
@ -1100,25 +1325,28 @@ local_data_answer(struct local_zone* z, struct query_info* qinfo,
|
||||
* @param buf: buffer for answer.
|
||||
* @param temp: temp region for encoding
|
||||
* @param ld: local data, if NULL, no such name exists in localdata.
|
||||
* @param lz_type: type of the local zone
|
||||
* @return 1 if a reply is to be sent, 0 if not.
|
||||
*/
|
||||
static int
|
||||
lz_zone_answer(struct local_zone* z, struct query_info* qinfo,
|
||||
struct edns_data* edns, sldns_buffer* buf, struct regional* temp,
|
||||
struct local_data* ld)
|
||||
struct local_data* ld, enum localzone_type lz_type)
|
||||
{
|
||||
if(z->type == local_zone_deny || z->type == local_zone_inform_deny) {
|
||||
if(lz_type == local_zone_deny || lz_type == local_zone_inform_deny) {
|
||||
/** no reply at all, signal caller by clearing buffer. */
|
||||
sldns_buffer_clear(buf);
|
||||
sldns_buffer_flip(buf);
|
||||
return 1;
|
||||
} else if(z->type == local_zone_refuse) {
|
||||
} else if(lz_type == local_zone_refuse
|
||||
|| lz_type == local_zone_always_refuse) {
|
||||
error_encode(buf, (LDNS_RCODE_REFUSED|BIT_AA), qinfo,
|
||||
*(uint16_t*)sldns_buffer_begin(buf),
|
||||
sldns_buffer_read_u16_at(buf, 2), edns);
|
||||
return 1;
|
||||
} else if(z->type == local_zone_static ||
|
||||
z->type == local_zone_redirect) {
|
||||
} else if(lz_type == local_zone_static ||
|
||||
lz_type == local_zone_redirect ||
|
||||
lz_type == local_zone_always_nxdomain) {
|
||||
/* for static, reply nodata or nxdomain
|
||||
* for redirect, reply nodata */
|
||||
/* no additional section processing,
|
||||
@ -1126,7 +1354,8 @@ lz_zone_answer(struct local_zone* z, struct query_info* qinfo,
|
||||
* or using closest match for NSEC.
|
||||
* or using closest match for returning delegation downwards
|
||||
*/
|
||||
int rcode = ld?LDNS_RCODE_NOERROR:LDNS_RCODE_NXDOMAIN;
|
||||
int rcode = (ld || lz_type == local_zone_redirect)?
|
||||
LDNS_RCODE_NOERROR:LDNS_RCODE_NXDOMAIN;
|
||||
if(z->soa)
|
||||
return local_encode(qinfo, edns, buf, temp,
|
||||
z->soa, 0, rcode);
|
||||
@ -1134,11 +1363,12 @@ lz_zone_answer(struct local_zone* z, struct query_info* qinfo,
|
||||
*(uint16_t*)sldns_buffer_begin(buf),
|
||||
sldns_buffer_read_u16_at(buf, 2), edns);
|
||||
return 1;
|
||||
} else if(z->type == local_zone_typetransparent) {
|
||||
} else if(lz_type == local_zone_typetransparent
|
||||
|| lz_type == local_zone_always_transparent) {
|
||||
/* no NODATA or NXDOMAINS for this zone type */
|
||||
return 0;
|
||||
}
|
||||
/* else z->type == local_zone_transparent */
|
||||
/* else lz_type == local_zone_transparent */
|
||||
|
||||
/* if the zone is transparent and the name exists, but the type
|
||||
* does not, then we should make this noerror/nodata */
|
||||
@ -1172,21 +1402,70 @@ lz_inform_print(struct local_zone* z, struct query_info* qinfo,
|
||||
log_nametypeclass(0, txt, qinfo->qname, qinfo->qtype, qinfo->qclass);
|
||||
}
|
||||
|
||||
enum localzone_type
|
||||
lz_type(uint8_t *taglist, size_t taglen, uint8_t *taglist2, size_t taglen2,
|
||||
uint8_t *tagactions, size_t tagactionssize, enum localzone_type lzt,
|
||||
struct comm_reply* repinfo, struct rbtree_t* override_tree, int* tag,
|
||||
char** tagname, int num_tags)
|
||||
{
|
||||
size_t i, j;
|
||||
uint8_t tagmatch;
|
||||
struct local_zone_override* lzo;
|
||||
if(repinfo && override_tree) {
|
||||
lzo = (struct local_zone_override*)addr_tree_lookup(
|
||||
override_tree, &repinfo->addr, repinfo->addrlen);
|
||||
if(lzo && lzo->type) {
|
||||
verbose(VERB_ALGO, "local zone override to type %s",
|
||||
local_zone_type2str(lzo->type));
|
||||
return lzo->type;
|
||||
}
|
||||
}
|
||||
if(!taglist || !taglist2)
|
||||
return lzt;
|
||||
for(i=0; i<taglen && i<taglen2; i++) {
|
||||
tagmatch = (taglist[i] & taglist2[i]);
|
||||
for(j=0; j<8 && tagmatch>0; j++) {
|
||||
if((tagmatch & 0x1)) {
|
||||
*tag = (int)(i*8+j);
|
||||
verbose(VERB_ALGO, "matched tag [%d] %s",
|
||||
*tag, (*tag<num_tags?tagname[*tag]:"null"));
|
||||
/* does this tag have a tag action? */
|
||||
if(i*8+j < tagactionssize && tagactions
|
||||
&& tagactions[i*8+j] != 0) {
|
||||
verbose(VERB_ALGO, "tag action [%d] %s to type %s",
|
||||
*tag, (*tag<num_tags?tagname[*tag]:"null"),
|
||||
local_zone_type2str(
|
||||
(enum localzone_type)
|
||||
tagactions[i*8+j]));
|
||||
return (enum localzone_type)tagactions[i*8+j];
|
||||
}
|
||||
return lzt;
|
||||
}
|
||||
tagmatch >>= 1;
|
||||
}
|
||||
}
|
||||
return lzt;
|
||||
}
|
||||
|
||||
int
|
||||
local_zones_answer(struct local_zones* zones, struct query_info* qinfo,
|
||||
struct edns_data* edns, sldns_buffer* buf, struct regional* temp,
|
||||
struct comm_reply* repinfo)
|
||||
struct comm_reply* repinfo, uint8_t* taglist, size_t taglen,
|
||||
uint8_t* tagactions, size_t tagactionssize,
|
||||
struct config_strlist** tag_datas, size_t tag_datas_size,
|
||||
char** tagname, int num_tags)
|
||||
{
|
||||
/* see if query is covered by a zone,
|
||||
* if so: - try to match (exact) local data
|
||||
* - look at zone type for negative response. */
|
||||
int labs = dname_count_labels(qinfo->qname);
|
||||
struct local_data* ld;
|
||||
struct local_data* ld = NULL;
|
||||
struct local_zone* z;
|
||||
int r;
|
||||
enum localzone_type lzt;
|
||||
int r, tag = -1;
|
||||
lock_rw_rdlock(&zones->lock);
|
||||
z = local_zones_lookup(zones, qinfo->qname,
|
||||
qinfo->qname_len, labs, qinfo->qclass);
|
||||
z = local_zones_tags_lookup(zones, qinfo->qname,
|
||||
qinfo->qname_len, labs, qinfo->qclass, taglist, taglen, 0);
|
||||
if(!z) {
|
||||
lock_rw_unlock(&zones->lock);
|
||||
return 0;
|
||||
@ -1194,15 +1473,22 @@ local_zones_answer(struct local_zones* zones, struct query_info* qinfo,
|
||||
lock_rw_rdlock(&z->lock);
|
||||
lock_rw_unlock(&zones->lock);
|
||||
|
||||
if((z->type == local_zone_inform || z->type == local_zone_inform_deny)
|
||||
lzt = lz_type(taglist, taglen, z->taglist, z->taglen, tagactions,
|
||||
tagactionssize, z->type, repinfo, z->override_tree, &tag,
|
||||
tagname, num_tags);
|
||||
|
||||
if((lzt == local_zone_inform || lzt == local_zone_inform_deny)
|
||||
&& repinfo)
|
||||
lz_inform_print(z, qinfo, repinfo);
|
||||
|
||||
if(local_data_answer(z, qinfo, edns, buf, temp, labs, &ld)) {
|
||||
if(lzt != local_zone_always_refuse && lzt != local_zone_always_transparent
|
||||
&& lzt != local_zone_always_nxdomain
|
||||
&& local_data_answer(z, qinfo, edns, buf, temp, labs, &ld, lzt,
|
||||
tag, tag_datas, tag_datas_size, tagname, num_tags)) {
|
||||
lock_rw_unlock(&z->lock);
|
||||
return 1;
|
||||
}
|
||||
r = lz_zone_answer(z, qinfo, edns, buf, temp, ld);
|
||||
r = lz_zone_answer(z, qinfo, edns, buf, temp, ld, lzt);
|
||||
lock_rw_unlock(&z->lock);
|
||||
return r;
|
||||
}
|
||||
@ -1219,6 +1505,9 @@ const char* local_zone_type2str(enum localzone_type t)
|
||||
case local_zone_nodefault: return "nodefault";
|
||||
case local_zone_inform: return "inform";
|
||||
case local_zone_inform_deny: return "inform_deny";
|
||||
case local_zone_always_transparent: return "always_transparent";
|
||||
case local_zone_always_refuse: return "always_refuse";
|
||||
case local_zone_always_nxdomain: return "always_nxdomain";
|
||||
}
|
||||
return "badtyped";
|
||||
}
|
||||
@ -1241,6 +1530,12 @@ int local_zone_str2type(const char* type, enum localzone_type* t)
|
||||
*t = local_zone_inform;
|
||||
else if(strcmp(type, "inform_deny") == 0)
|
||||
*t = local_zone_inform_deny;
|
||||
else if(strcmp(type, "always_transparent") == 0)
|
||||
*t = local_zone_always_transparent;
|
||||
else if(strcmp(type, "always_refuse") == 0)
|
||||
*t = local_zone_always_refuse;
|
||||
else if(strcmp(type, "always_nxdomain") == 0)
|
||||
*t = local_zone_always_nxdomain;
|
||||
else return 0;
|
||||
return 1;
|
||||
}
|
||||
|
@ -43,6 +43,7 @@
|
||||
#define SERVICES_LOCALZONE_H
|
||||
#include "util/rbtree.h"
|
||||
#include "util/locks.h"
|
||||
#include "util/storage/dnstree.h"
|
||||
struct ub_packed_rrset_key;
|
||||
struct regional;
|
||||
struct config_file;
|
||||
@ -50,6 +51,7 @@ struct edns_data;
|
||||
struct query_info;
|
||||
struct sldns_buffer;
|
||||
struct comm_reply;
|
||||
struct config_strlist;
|
||||
|
||||
/**
|
||||
* Local zone type
|
||||
@ -75,7 +77,13 @@ enum localzone_type {
|
||||
/** log client address, but no block (transparent) */
|
||||
local_zone_inform,
|
||||
/** log client address, and block (drop) */
|
||||
local_zone_inform_deny
|
||||
local_zone_inform_deny,
|
||||
/** resolve normally, even when there is local data */
|
||||
local_zone_always_transparent,
|
||||
/** answer with error, even when there is local data */
|
||||
local_zone_always_refuse,
|
||||
/** answer with nxdomain, even when there is local data */
|
||||
local_zone_always_nxdomain
|
||||
};
|
||||
|
||||
/**
|
||||
@ -119,6 +127,9 @@ struct local_zone {
|
||||
uint8_t* taglist;
|
||||
/** length of the taglist (in bytes) */
|
||||
size_t taglen;
|
||||
/** netblock addr_tree with struct local_zone_override information
|
||||
* or NULL if there are no override elements */
|
||||
struct rbtree_t* override_tree;
|
||||
|
||||
/** in this region the zone's data is allocated.
|
||||
* the struct local_zone itself is malloced. */
|
||||
@ -157,6 +168,16 @@ struct local_rrset {
|
||||
struct ub_packed_rrset_key* rrset;
|
||||
};
|
||||
|
||||
/**
|
||||
* Local zone override information
|
||||
*/
|
||||
struct local_zone_override {
|
||||
/** node in addrtree */
|
||||
struct addr_tree_node node;
|
||||
/** override for local zone type */
|
||||
enum localzone_type type;
|
||||
};
|
||||
|
||||
/**
|
||||
* Create local zones storage
|
||||
* @return new struct or NULL on error.
|
||||
@ -201,6 +222,24 @@ int local_data_cmp(const void* d1, const void* d2);
|
||||
*/
|
||||
void local_zone_delete(struct local_zone* z);
|
||||
|
||||
/**
|
||||
* Lookup zone that contains the given name, class and taglist.
|
||||
* User must lock the tree or result zone.
|
||||
* @param zones: the zones tree
|
||||
* @param name: dname to lookup
|
||||
* @param len: length of name.
|
||||
* @param labs: labelcount of name.
|
||||
* @param dclass: class to lookup.
|
||||
* @param taglist: taglist to lookup.
|
||||
* @param taglen: lenth of taglist.
|
||||
* @param ignoretags: lookup zone by name and class, regardless the
|
||||
* local-zone's tags.
|
||||
* @return closest local_zone or NULL if no covering zone is found.
|
||||
*/
|
||||
struct local_zone* local_zones_tags_lookup(struct local_zones* zones,
|
||||
uint8_t* name, size_t len, int labs, uint16_t dclass,
|
||||
uint8_t* taglist, size_t taglen, int ignoretags);
|
||||
|
||||
/**
|
||||
* Lookup zone that contains the given name, class.
|
||||
* User must lock the tree or result zone.
|
||||
@ -230,13 +269,24 @@ void local_zones_print(struct local_zones* zones);
|
||||
* @param buf: buffer with query ID and flags, also for reply.
|
||||
* @param temp: temporary storage region.
|
||||
* @param repinfo: source address for checks. may be NULL.
|
||||
* @param taglist: taglist for checks. May be NULL.
|
||||
* @param taglen: length of the taglist.
|
||||
* @param tagactions: local zone actions for tags. May be NULL.
|
||||
* @param tagactionssize: length of the tagactions.
|
||||
* @param tag_datas: array per tag of strlist with rdata strings. or NULL.
|
||||
* @param tag_datas_size: size of tag_datas array.
|
||||
* @param tagname: array of tag name strings (for debug output).
|
||||
* @param num_tags: number of items in tagname array.
|
||||
* @return true if answer is in buffer. false if query is not answered
|
||||
* by authority data. If the reply should be dropped altogether, the return
|
||||
* value is true, but the buffer is cleared (empty).
|
||||
*/
|
||||
int local_zones_answer(struct local_zones* zones, struct query_info* qinfo,
|
||||
struct edns_data* edns, struct sldns_buffer* buf, struct regional* temp,
|
||||
struct comm_reply* repinfo);
|
||||
struct comm_reply* repinfo, uint8_t* taglist, size_t taglen,
|
||||
uint8_t* tagactions, size_t tagactionssize,
|
||||
struct config_strlist** tag_datas, size_t tag_datas_size,
|
||||
char** tagname, int num_tags);
|
||||
|
||||
/**
|
||||
* Parse the string into localzone type.
|
||||
|
@ -1069,6 +1069,12 @@ mesh_continue(struct mesh_area* mesh, struct mesh_state* mstate,
|
||||
*ev = module_event_pass;
|
||||
return 1;
|
||||
}
|
||||
if(s == module_wait_subquery && mstate->sub_set.count == 0) {
|
||||
log_err("module cannot wait for subquery, subquery list empty");
|
||||
log_query_info(VERB_QUERY, "pass error for qstate",
|
||||
&mstate->s.qinfo);
|
||||
s = module_error;
|
||||
}
|
||||
if(s == module_error && mstate->s.return_rcode == LDNS_RCODE_NOERROR) {
|
||||
/* error is bad, handle pass back up below */
|
||||
mstate->s.return_rcode = LDNS_RCODE_SERVFAIL;
|
||||
|
@ -243,7 +243,33 @@ outnet_tcp_take_into_use(struct waiting_tcp* w, uint8_t* pkt, size_t pkt_len)
|
||||
return 0;
|
||||
|
||||
fd_set_nonblock(s);
|
||||
#ifdef USE_OSX_MSG_FASTOPEN
|
||||
/* API for fast open is different here. We use a connectx() function and
|
||||
then writes can happen as normal even using SSL.*/
|
||||
/* connectx requires that the len be set in the sockaddr struct*/
|
||||
struct sockaddr_in *addr_in = (struct sockaddr_in *)&w->addr;
|
||||
addr_in->sin_len = w->addrlen;
|
||||
sa_endpoints_t endpoints;
|
||||
endpoints.sae_srcif = 0;
|
||||
endpoints.sae_srcaddr = NULL;
|
||||
endpoints.sae_srcaddrlen = 0;
|
||||
endpoints.sae_dstaddr = (struct sockaddr *)&w->addr;
|
||||
endpoints.sae_dstaddrlen = w->addrlen;
|
||||
if (connectx(s, &endpoints, SAE_ASSOCID_ANY,
|
||||
CONNECT_DATA_IDEMPOTENT | CONNECT_RESUME_ON_READ_WRITE,
|
||||
NULL, 0, NULL, NULL) == -1) {
|
||||
#else /* USE_OSX_MSG_FASTOPEN*/
|
||||
#ifdef USE_MSG_FASTOPEN
|
||||
pend->c->tcp_do_fastopen = 1;
|
||||
/* Only do TFO for TCP in which case no connect() is required here.
|
||||
Don't combine client TFO with SSL, since OpenSSL can't
|
||||
currently support doing a handshake on fd that already isn't connected*/
|
||||
if (w->outnet->sslctx && w->ssl_upstream) {
|
||||
if(connect(s, (struct sockaddr*)&w->addr, w->addrlen) == -1) {
|
||||
#else /* USE_MSG_FASTOPEN*/
|
||||
if(connect(s, (struct sockaddr*)&w->addr, w->addrlen) == -1) {
|
||||
#endif /* USE_MSG_FASTOPEN*/
|
||||
#endif /* USE_OSX_MSG_FASTOPEN*/
|
||||
#ifndef USE_WINSOCK
|
||||
#ifdef EINPROGRESS
|
||||
if(errno != EINPROGRESS) {
|
||||
@ -263,6 +289,9 @@ outnet_tcp_take_into_use(struct waiting_tcp* w, uint8_t* pkt, size_t pkt_len)
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
#ifdef USE_MSG_FASTOPEN
|
||||
}
|
||||
#endif /* USE_MSG_FASTOPEN */
|
||||
if(w->outnet->sslctx && w->ssl_upstream) {
|
||||
pend->c->ssl = outgoing_ssl_fd(w->outnet->sslctx, s);
|
||||
if(!pend->c->ssl) {
|
||||
@ -591,7 +620,9 @@ static int setup_if(struct port_if* pif, const char* addrstr,
|
||||
pif->avail_ports = (int*)memdup(avail, (size_t)numavail*sizeof(int));
|
||||
if(!pif->avail_ports)
|
||||
return 0;
|
||||
if(!ipstrtoaddr(addrstr, UNBOUND_DNS_PORT, &pif->addr, &pif->addrlen))
|
||||
if(!ipstrtoaddr(addrstr, UNBOUND_DNS_PORT, &pif->addr, &pif->addrlen) &&
|
||||
!netblockstrtoaddr(addrstr, UNBOUND_DNS_PORT,
|
||||
&pif->addr, &pif->addrlen, &pif->pfxlen))
|
||||
return 0;
|
||||
pif->maxout = (int)numfd;
|
||||
pif->inuse = 0;
|
||||
@ -893,26 +924,49 @@ pending_delete(struct outside_network* outnet, struct pending* p)
|
||||
free(p);
|
||||
}
|
||||
|
||||
static void
|
||||
sai6_putrandom(struct sockaddr_in6 *sa, int pfxlen, struct ub_randstate *rnd)
|
||||
{
|
||||
int i, last;
|
||||
if(!(pfxlen > 0 && pfxlen < 128))
|
||||
return;
|
||||
for(i = 0; i < (128 - pfxlen) / 8; i++) {
|
||||
sa->sin6_addr.s6_addr[15-i] = (uint8_t)ub_random_max(rnd, 256);
|
||||
}
|
||||
last = pfxlen & 7;
|
||||
if(last != 0) {
|
||||
sa->sin6_addr.s6_addr[15-i] |=
|
||||
((0xFF >> last) & ub_random_max(rnd, 256));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Try to open a UDP socket for outgoing communication.
|
||||
* Sets sockets options as needed.
|
||||
* @param addr: socket address.
|
||||
* @param addrlen: length of address.
|
||||
* @param pfxlen: length of network prefix (for address randomisation).
|
||||
* @param port: port override for addr.
|
||||
* @param inuse: if -1 is returned, this bool means the port was in use.
|
||||
* @param rnd: random state (for address randomisation).
|
||||
* @return fd or -1
|
||||
*/
|
||||
static int
|
||||
udp_sockport(struct sockaddr_storage* addr, socklen_t addrlen, int port,
|
||||
int* inuse)
|
||||
udp_sockport(struct sockaddr_storage* addr, socklen_t addrlen, int pfxlen,
|
||||
int port, int* inuse, struct ub_randstate* rnd)
|
||||
{
|
||||
int fd, noproto;
|
||||
if(addr_is_ip6(addr, addrlen)) {
|
||||
struct sockaddr_in6* sa = (struct sockaddr_in6*)addr;
|
||||
sa->sin6_port = (in_port_t)htons((uint16_t)port);
|
||||
int freebind = 0;
|
||||
struct sockaddr_in6 sa = *(struct sockaddr_in6*)addr;
|
||||
sa.sin6_port = (in_port_t)htons((uint16_t)port);
|
||||
if(pfxlen != 0) {
|
||||
freebind = 1;
|
||||
sai6_putrandom(&sa, pfxlen, rnd);
|
||||
}
|
||||
fd = create_udp_sock(AF_INET6, SOCK_DGRAM,
|
||||
(struct sockaddr*)addr, addrlen, 1, inuse, &noproto,
|
||||
0, 0, 0, NULL, 0, 0);
|
||||
(struct sockaddr*)&sa, addrlen, 1, inuse, &noproto,
|
||||
0, 0, 0, NULL, 0, freebind);
|
||||
} else {
|
||||
struct sockaddr_in* sa = (struct sockaddr_in*)addr;
|
||||
sa->sin_port = (in_port_t)htons((uint16_t)port);
|
||||
@ -978,7 +1032,8 @@ select_ifport(struct outside_network* outnet, struct pending* pend,
|
||||
/* try to open new port, if fails, loop to try again */
|
||||
log_assert(pif->inuse < pif->maxout);
|
||||
portno = pif->avail_ports[my_port - pif->inuse];
|
||||
fd = udp_sockport(&pif->addr, pif->addrlen, portno, &inuse);
|
||||
fd = udp_sockport(&pif->addr, pif->addrlen, pif->pfxlen,
|
||||
portno, &inuse, outnet->rnd);
|
||||
if(fd == -1 && !inuse) {
|
||||
/* nonrecoverable error making socket */
|
||||
return 0;
|
||||
@ -1361,6 +1416,7 @@ serviced_perturb_qname(struct ub_randstate* rnd, uint8_t* qbuf, size_t len)
|
||||
long int random = 0;
|
||||
int bits = 0;
|
||||
log_assert(len >= 10 + 5 /* offset qname, root, qtype, qclass */);
|
||||
(void)len;
|
||||
lablen = *d++;
|
||||
while(lablen) {
|
||||
while(lablen--) {
|
||||
|
@ -165,6 +165,10 @@ struct port_if {
|
||||
/** length of addr field */
|
||||
socklen_t addrlen;
|
||||
|
||||
/** prefix length of network address (in bits), for randomisation.
|
||||
* if 0, no randomisation. */
|
||||
int pfxlen;
|
||||
|
||||
/** the available ports array. These are unused.
|
||||
* Only the first total-inuse part is filled. */
|
||||
int* avail_ports;
|
||||
|
@ -23,6 +23,15 @@
|
||||
#ifdef HAVE_OPENSSL_ENGINE_H
|
||||
# include <openssl/engine.h>
|
||||
#endif
|
||||
#ifdef HAVE_OPENSSL_BN_H
|
||||
#include <openssl/bn.h>
|
||||
#endif
|
||||
#ifdef HAVE_OPENSSL_RSA_H
|
||||
#include <openssl/rsa.h>
|
||||
#endif
|
||||
#ifdef HAVE_OPENSSL_DSA_H
|
||||
#include <openssl/dsa.h>
|
||||
#endif
|
||||
#endif /* HAVE_SSL */
|
||||
|
||||
size_t
|
||||
@ -215,6 +224,7 @@ sldns_key_buf2dsa_raw(unsigned char* key, size_t len)
|
||||
BN_free(Y);
|
||||
return NULL;
|
||||
}
|
||||
#if OPENSSL_VERSION_NUMBER < 0x10100000 || defined(HAVE_LIBRESSL)
|
||||
#ifndef S_SPLINT_S
|
||||
dsa->p = P;
|
||||
dsa->q = Q;
|
||||
@ -222,6 +232,25 @@ sldns_key_buf2dsa_raw(unsigned char* key, size_t len)
|
||||
dsa->pub_key = Y;
|
||||
#endif /* splint */
|
||||
|
||||
#else /* OPENSSL_VERSION_NUMBER */
|
||||
if (!DSA_set0_pqg(dsa, P, Q, G)) {
|
||||
/* QPG not yet attached, need to free */
|
||||
BN_free(Q);
|
||||
BN_free(P);
|
||||
BN_free(G);
|
||||
|
||||
DSA_free(dsa);
|
||||
BN_free(Y);
|
||||
return NULL;
|
||||
}
|
||||
if (!DSA_set0_key(dsa, Y, NULL)) {
|
||||
/* QPG attached, cleaned up by DSA_fre() */
|
||||
DSA_free(dsa);
|
||||
BN_free(Y);
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
return dsa;
|
||||
}
|
||||
|
||||
@ -273,11 +302,21 @@ sldns_key_buf2rsa_raw(unsigned char* key, size_t len)
|
||||
BN_free(modulus);
|
||||
return NULL;
|
||||
}
|
||||
#if OPENSSL_VERSION_NUMBER < 0x10100000 || defined(HAVE_LIBRESSL)
|
||||
#ifndef S_SPLINT_S
|
||||
rsa->n = modulus;
|
||||
rsa->e = exponent;
|
||||
#endif /* splint */
|
||||
|
||||
#else /* OPENSSL_VERSION_NUMBER */
|
||||
if (!RSA_set0_key(rsa, modulus, exponent, NULL)) {
|
||||
BN_free(exponent);
|
||||
BN_free(modulus);
|
||||
RSA_free(rsa);
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
return rsa;
|
||||
}
|
||||
|
||||
|
@ -195,7 +195,7 @@ enum sldns_enum_rr_type
|
||||
LDNS_RR_TYPE_TALINK = 58,
|
||||
LDNS_RR_TYPE_CDS = 59, /** RFC 7344 */
|
||||
LDNS_RR_TYPE_CDNSKEY = 60, /** RFC 7344 */
|
||||
LDNS_RR_TYPE_OPENPGPKEY = 61, /* draft-ietf-dane-openpgpkey */
|
||||
LDNS_RR_TYPE_OPENPGPKEY = 61, /* RFC 7929 */
|
||||
LDNS_RR_TYPE_CSYNC = 62, /* RFC 7477 */
|
||||
|
||||
LDNS_RR_TYPE_SPF = 99, /* RFC 4408 */
|
||||
|
@ -118,7 +118,7 @@ int sldns_str_print(char** str, size_t* slen, const char* format, ...)
|
||||
* @param str_len: the size of the string buffer. If more is needed, it'll
|
||||
* silently truncate the output to fit in the buffer.
|
||||
* @return the number of characters for this element, excluding zerobyte.
|
||||
* Is larger than str_len if output was truncated.
|
||||
* Is larger or equal than str_len if output was truncated.
|
||||
*/
|
||||
int sldns_wire2str_pkt_buf(uint8_t* data, size_t data_len, char* str,
|
||||
size_t str_len);
|
||||
@ -351,7 +351,7 @@ int sldns_wire2str_edns_option_code_print(char** str, size_t* str_len,
|
||||
* @param str_len: the size of the string buffer. If more is needed, it'll
|
||||
* silently truncate the output to fit in the buffer.
|
||||
* @return the number of characters for this element, excluding zerobyte.
|
||||
* Is larger than str_len if output was truncated.
|
||||
* Is larger or equal than str_len if output was truncated.
|
||||
*/
|
||||
int sldns_wire2str_rr_buf(uint8_t* rr, size_t rr_len, char* str,
|
||||
size_t str_len);
|
||||
@ -369,7 +369,7 @@ int sldns_wire2str_rr_buf(uint8_t* rr, size_t rr_len, char* str,
|
||||
* @param str_len: the size of the string buffer. If more is needed, it'll
|
||||
* silently truncate the output to fit in the buffer.
|
||||
* @return the number of characters for this element, excluding zerobyte.
|
||||
* Is larger than str_len if output was truncated.
|
||||
* Is larger or equal than str_len if output was truncated.
|
||||
*/
|
||||
int sldns_wire2str_rr_unknown_buf(uint8_t* rr, size_t rr_len, char* str,
|
||||
size_t str_len);
|
||||
@ -389,7 +389,7 @@ int sldns_wire2str_rr_unknown_buf(uint8_t* rr, size_t rr_len, char* str,
|
||||
* @param str_len: the size of the string buffer. If more is needed, it'll
|
||||
* silently truncate the output to fit in the buffer.
|
||||
* @return the number of characters for this element, excluding zerobyte.
|
||||
* Is larger than str_len if output was truncated.
|
||||
* Is larger or equal than str_len if output was truncated.
|
||||
*/
|
||||
int sldns_wire2str_rr_comment_buf(uint8_t* rr, size_t rr_len, size_t dname_len,
|
||||
char* str, size_t str_len);
|
||||
@ -406,7 +406,7 @@ int sldns_wire2str_rr_comment_buf(uint8_t* rr, size_t rr_len, size_t dname_len,
|
||||
* silently truncate the output to fit in the buffer.
|
||||
* @param rrtype: rr type of the data
|
||||
* @return the number of characters for this element, excluding zerobyte.
|
||||
* Is larger than str_len if output was truncated.
|
||||
* Is larger or equal than str_len if output was truncated.
|
||||
*/
|
||||
int sldns_wire2str_rdata_buf(uint8_t* rdata, size_t rdata_len, char* str,
|
||||
size_t str_len, uint16_t rrtype);
|
||||
@ -417,7 +417,7 @@ int sldns_wire2str_rdata_buf(uint8_t* rdata, size_t rdata_len, char* str,
|
||||
* @param str: the string to write to.
|
||||
* @param len: length of str.
|
||||
* @return the number of characters for this element, excluding zerobyte.
|
||||
* Is larger than str_len if output was truncated.
|
||||
* Is larger or equal than str_len if output was truncated.
|
||||
*/
|
||||
int sldns_wire2str_type_buf(uint16_t rrtype, char* str, size_t len);
|
||||
|
||||
@ -427,7 +427,7 @@ int sldns_wire2str_type_buf(uint16_t rrtype, char* str, size_t len);
|
||||
* @param str: the string to write to.
|
||||
* @param len: length of str.
|
||||
* @return the number of characters for this element, excluding zerobyte.
|
||||
* Is larger than str_len if output was truncated.
|
||||
* Is larger or equal than str_len if output was truncated.
|
||||
*/
|
||||
int sldns_wire2str_class_buf(uint16_t rrclass, char* str, size_t len);
|
||||
|
||||
@ -437,7 +437,7 @@ int sldns_wire2str_class_buf(uint16_t rrclass, char* str, size_t len);
|
||||
* @param str: the string to write to.
|
||||
* @param len: length of str.
|
||||
* @return the number of characters for this element, excluding zerobyte.
|
||||
* Is larger than str_len if output was truncated.
|
||||
* Is larger or equal than str_len if output was truncated.
|
||||
*/
|
||||
int sldns_wire2str_rcode_buf(int rcode, char* str, size_t len);
|
||||
|
||||
@ -448,7 +448,7 @@ int sldns_wire2str_rcode_buf(int rcode, char* str, size_t len);
|
||||
* @param str: the string to write to.
|
||||
* @param len: length of string.
|
||||
* @return the number of characters for this element, excluding zerobyte.
|
||||
* Is larger than str_len if output was truncated.
|
||||
* Is larger or equal than str_len if output was truncated.
|
||||
*/
|
||||
int sldns_wire2str_dname_buf(uint8_t* dname, size_t dname_len, char* str,
|
||||
size_t len);
|
||||
|
@ -37,7 +37,8 @@
|
||||
* \file
|
||||
*
|
||||
* This file checks to see that the current 5011 keys work to prime the
|
||||
* current root anchor. If not a certificate is used to update the anchor.
|
||||
* current root anchor. If not a certificate is used to update the anchor,
|
||||
* with RFC7958 https xml fetch.
|
||||
*
|
||||
* This is a concept solution for distribution of the DNSSEC root
|
||||
* trust anchor. It is a small tool, called "unbound-anchor", that
|
||||
@ -47,7 +48,7 @@
|
||||
* Management-Abstract:
|
||||
* * first run: fill root.key file with hardcoded DS record.
|
||||
* * mostly: use RFC5011 tracking, quick . DNSKEY UDP query.
|
||||
* * failover: use builtin certificate, do https and update.
|
||||
* * failover: use RFC7958 builtin certificate, do https and update.
|
||||
* Special considerations:
|
||||
* * 30-days RFC5011 timer saves a lot of https traffic.
|
||||
* * DNSKEY probe must be NOERROR, saves a lot of https traffic.
|
||||
@ -77,7 +78,7 @@
|
||||
* the file contains a list of normal DNSKEY/DS records, and uses that to
|
||||
* bootstrap 5011 (the KSK is made VALID).
|
||||
*
|
||||
* The certificate update is done by fetching root-anchors.xml and
|
||||
* The certificate RFC7958 update is done by fetching root-anchors.xml and
|
||||
* root-anchors.p7s via SSL. The HTTPS certificate can be logged but is
|
||||
* not validated (https for channel security; the security comes from the
|
||||
* certificate). The 'data.iana.org' domain name A and AAAA are resolved
|
||||
@ -171,7 +172,7 @@ struct ip_list {
|
||||
|
||||
/** Give unbound-anchor usage, and exit (1). */
|
||||
static void
|
||||
usage()
|
||||
usage(void)
|
||||
{
|
||||
printf("Usage: unbound-anchor [opts]\n");
|
||||
printf(" Setup or update root anchor. "
|
||||
@ -1836,7 +1837,7 @@ write_unsigned_root(const char* root_anchor_file)
|
||||
#ifdef HAVE_FSYNC
|
||||
fsync(fileno(out));
|
||||
#else
|
||||
FlushFileBuffers((HANDLE)_fileno(out));
|
||||
FlushFileBuffers((HANDLE)_get_osfhandle(_fileno(out)));
|
||||
#endif
|
||||
fclose(out);
|
||||
}
|
||||
@ -1868,7 +1869,7 @@ write_root_anchor(const char* root_anchor_file, BIO* ds)
|
||||
#ifdef HAVE_FSYNC
|
||||
fsync(fileno(out));
|
||||
#else
|
||||
FlushFileBuffers((HANDLE)_fileno(out));
|
||||
FlushFileBuffers((HANDLE)_get_osfhandle(_fileno(out)));
|
||||
#endif
|
||||
fclose(out);
|
||||
}
|
||||
@ -2310,10 +2311,22 @@ int main(int argc, char* argv[])
|
||||
if(argc != 0)
|
||||
usage();
|
||||
|
||||
#ifdef HAVE_ERR_LOAD_CRYPTO_STRINGS
|
||||
ERR_load_crypto_strings();
|
||||
#endif
|
||||
ERR_load_SSL_strings();
|
||||
#if OPENSSL_VERSION_NUMBER < 0x10100000 || !defined(HAVE_OPENSSL_INIT_CRYPTO)
|
||||
OpenSSL_add_all_algorithms();
|
||||
#else
|
||||
OPENSSL_init_crypto(OPENSSL_INIT_ADD_ALL_CIPHERS
|
||||
| OPENSSL_INIT_ADD_ALL_DIGESTS
|
||||
| OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL);
|
||||
#endif
|
||||
#if OPENSSL_VERSION_NUMBER < 0x10100000 || !defined(HAVE_OPENSSL_INIT_SSL)
|
||||
(void)SSL_library_init();
|
||||
#else
|
||||
(void)OPENSSL_init_ssl(0, NULL);
|
||||
#endif
|
||||
|
||||
if(dolist) do_list_builtin();
|
||||
|
||||
|
@ -72,7 +72,7 @@
|
||||
|
||||
/** Give checkconf usage, and exit (1). */
|
||||
static void
|
||||
usage()
|
||||
usage(void)
|
||||
{
|
||||
printf("Usage: unbound-checkconf [file]\n");
|
||||
printf(" Checks unbound configuration file for errors.\n");
|
||||
@ -161,6 +161,7 @@ warn_hosts(const char* typ, struct config_stub* list)
|
||||
static void
|
||||
interfacechecks(struct config_file* cfg)
|
||||
{
|
||||
int d;
|
||||
struct sockaddr_storage a;
|
||||
socklen_t alen;
|
||||
int i, j;
|
||||
@ -177,8 +178,8 @@ interfacechecks(struct config_file* cfg)
|
||||
}
|
||||
}
|
||||
for(i=0; i<cfg->num_out_ifs; i++) {
|
||||
if(!ipstrtoaddr(cfg->out_ifs[i], UNBOUND_DNS_PORT,
|
||||
&a, &alen)) {
|
||||
if(!ipstrtoaddr(cfg->out_ifs[i], UNBOUND_DNS_PORT, &a, &alen) &&
|
||||
!netblockstrtoaddr(cfg->out_ifs[i], UNBOUND_DNS_PORT, &a, &alen, &d)) {
|
||||
fatal_exit("cannot parse outgoing-interface "
|
||||
"specified as '%s'", cfg->out_ifs[i]);
|
||||
}
|
||||
@ -330,6 +331,8 @@ morechecks(struct config_file* cfg, const char* fname)
|
||||
fatal_exit("num_threads value weird");
|
||||
if(!cfg->do_ip4 && !cfg->do_ip6)
|
||||
fatal_exit("ip4 and ip6 are both disabled, pointless");
|
||||
if(!cfg->do_ip6 && cfg->prefer_ip6)
|
||||
fatal_exit("cannot prefer and disable ip6, pointless");
|
||||
if(!cfg->do_udp && !cfg->do_tcp)
|
||||
fatal_exit("udp and tcp are both disabled, pointless");
|
||||
if(cfg->edns_buffer_size > cfg->msg_buffer_size)
|
||||
@ -436,7 +439,9 @@ morechecks(struct config_file* cfg, const char* fname)
|
||||
if(cfg->username && cfg->username[0]) {
|
||||
if(getpwnam(cfg->username) == NULL)
|
||||
fatal_exit("user '%s' does not exist.", cfg->username);
|
||||
# ifdef HAVE_ENDPWENT
|
||||
endpwent();
|
||||
# endif
|
||||
}
|
||||
#endif
|
||||
if(cfg->remote_control_enable && cfg->remote_control_use_cert) {
|
||||
@ -481,14 +486,22 @@ check_hints(struct config_file* cfg)
|
||||
static void
|
||||
checkconf(const char* cfgfile, const char* opt, int final)
|
||||
{
|
||||
char oldwd[PATH_MAX];
|
||||
struct config_file* cfg = config_create();
|
||||
if(!cfg)
|
||||
fatal_exit("out of memory");
|
||||
oldwd[0] = 0;
|
||||
if(!getcwd(oldwd, sizeof(oldwd))) {
|
||||
log_err("cannot getcwd: %s", strerror(errno));
|
||||
oldwd[0] = 0;
|
||||
}
|
||||
if(!config_read(cfg, cfgfile, NULL)) {
|
||||
/* config_read prints messages to stderr */
|
||||
config_delete(cfg);
|
||||
exit(1);
|
||||
}
|
||||
if(oldwd[0] && chdir(oldwd) == -1)
|
||||
log_err("cannot chdir(%s): %s", oldwd, strerror(errno));
|
||||
if(opt) {
|
||||
print_option(cfg, opt, final);
|
||||
config_delete(cfg);
|
||||
|
@ -65,7 +65,7 @@
|
||||
|
||||
/** Give unbound-control usage, and exit (1). */
|
||||
static void
|
||||
usage()
|
||||
usage(void)
|
||||
{
|
||||
printf("Usage: unbound-control [options] command\n");
|
||||
printf(" Remote control utility for unbound server.\n");
|
||||
@ -212,7 +212,7 @@ contact_server(const char* svr, struct config_file* cfg, int statuscmd)
|
||||
struct sockaddr_un* usock = (struct sockaddr_un *) &addr;
|
||||
usock->sun_family = AF_LOCAL;
|
||||
#ifdef HAVE_STRUCT_SOCKADDR_UN_SUN_LEN
|
||||
usock->sun_len = (socklen_t)sizeof(usock);
|
||||
usock->sun_len = (unsigned)sizeof(usock);
|
||||
#endif
|
||||
(void)strlcpy(usock->sun_path, svr, sizeof(usock->sun_path));
|
||||
addrlen = (socklen_t)sizeof(struct sockaddr_un);
|
||||
@ -418,10 +418,22 @@ int main(int argc, char* argv[])
|
||||
cfgfile = CONFIGFILE;
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_ERR_LOAD_CRYPTO_STRINGS
|
||||
ERR_load_crypto_strings();
|
||||
#endif
|
||||
ERR_load_SSL_strings();
|
||||
#if OPENSSL_VERSION_NUMBER < 0x10100000 || !defined(HAVE_OPENSSL_INIT_CRYPTO)
|
||||
OpenSSL_add_all_algorithms();
|
||||
#else
|
||||
OPENSSL_init_crypto(OPENSSL_INIT_ADD_ALL_CIPHERS
|
||||
| OPENSSL_INIT_ADD_ALL_DIGESTS
|
||||
| OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL);
|
||||
#endif
|
||||
#if OPENSSL_VERSION_NUMBER < 0x10100000 || !defined(HAVE_OPENSSL_INIT_SSL)
|
||||
(void)SSL_library_init();
|
||||
#else
|
||||
(void)OPENSSL_init_ssl(0, NULL);
|
||||
#endif
|
||||
|
||||
if(!RAND_status()) {
|
||||
/* try to seed it */
|
||||
|
@ -72,7 +72,7 @@ static int verb = 0;
|
||||
|
||||
/** Give unbound-host usage, and exit (1). */
|
||||
static void
|
||||
usage()
|
||||
usage(void)
|
||||
{
|
||||
printf("Usage: unbound-host [-vdhr46] [-c class] [-t type] hostname\n");
|
||||
printf(" [-y key] [-f keyfile] [-F namedkeyfile]\n");
|
||||
@ -91,7 +91,7 @@ usage()
|
||||
printf(" -F keyfile read named.conf-style trust anchors.\n");
|
||||
printf(" -C config use the specified unbound.conf (none read by default)\n");
|
||||
printf(" -r read forwarder information from /etc/resolv.conf\n");
|
||||
printf(" breaks validation if the fwder does not do DNSSEC.\n");
|
||||
printf(" breaks validation if the forwarder does not do DNSSEC.\n");
|
||||
printf(" -v be more verbose, shows nodata and security.\n");
|
||||
printf(" -d debug, traces the action, -d -d shows more.\n");
|
||||
printf(" -4 use ipv4 network, avoid ipv6.\n");
|
||||
|
@ -1130,6 +1130,7 @@ void outnet_serviced_query_stop(struct serviced_query* sq, void* cb_arg)
|
||||
while(p) {
|
||||
if(p == pend) {
|
||||
log_assert(p->cb_arg == cb_arg);
|
||||
(void)cb_arg;
|
||||
log_info("serviced pending delete");
|
||||
if(prev)
|
||||
prev->next = p->next;
|
||||
|
@ -105,7 +105,7 @@ static int verb = 0;
|
||||
|
||||
/** print program usage help */
|
||||
static void
|
||||
usage()
|
||||
usage(void)
|
||||
{
|
||||
printf("lock_verify <trace files>\n");
|
||||
}
|
||||
|
@ -66,7 +66,7 @@ struct codeline {
|
||||
|
||||
/** print usage and exit */
|
||||
static void
|
||||
usage()
|
||||
usage(void)
|
||||
{
|
||||
printf("usage: memstats <logfile>\n");
|
||||
printf("statistics are printed on stdout.\n");
|
||||
|
@ -70,7 +70,7 @@ static int verb = 0;
|
||||
|
||||
/** Give petal usage, and exit (1). */
|
||||
static void
|
||||
usage()
|
||||
usage(void)
|
||||
{
|
||||
printf("Usage: petal [opts]\n");
|
||||
printf(" https daemon serves files from ./'host'/filename\n");
|
||||
@ -429,6 +429,7 @@ static void
|
||||
provide_file_chunked(SSL* ssl, char* fname)
|
||||
{
|
||||
char buf[16384];
|
||||
char* tmpbuf = NULL;
|
||||
char* at = buf;
|
||||
size_t avail = sizeof(buf);
|
||||
size_t r;
|
||||
@ -471,9 +472,13 @@ provide_file_chunked(SSL* ssl, char* fname)
|
||||
}
|
||||
|
||||
do {
|
||||
char tmpbuf[sizeof(buf)];
|
||||
size_t red;
|
||||
free(tmpbuf);
|
||||
tmpbuf = malloc(avail-16);
|
||||
if(!tmpbuf)
|
||||
break;
|
||||
/* read chunk; space-16 for xxxxCRLF..CRLF0CRLFCRLF (3 spare)*/
|
||||
size_t red = in?fread(tmpbuf, 1, avail-16, in):0;
|
||||
red = in?fread(tmpbuf, 1, avail-16, in):0;
|
||||
/* prepare chunk */
|
||||
snprintf(at, avail, "%x\r\n", (unsigned)red);
|
||||
r = strlen(at);
|
||||
@ -514,6 +519,7 @@ provide_file_chunked(SSL* ssl, char* fname)
|
||||
avail = sizeof(buf);
|
||||
} while(in && !feof(in) && !ferror(in));
|
||||
|
||||
free(tmpbuf);
|
||||
if(in) fclose(in);
|
||||
}
|
||||
|
||||
@ -634,14 +640,30 @@ int main(int argc, char* argv[])
|
||||
#ifdef SIGPIPE
|
||||
(void)signal(SIGPIPE, SIG_IGN);
|
||||
#endif
|
||||
#ifdef HAVE_ERR_LOAD_CRYPTO_STRINGS
|
||||
ERR_load_crypto_strings();
|
||||
#endif
|
||||
ERR_load_SSL_strings();
|
||||
#if OPENSSL_VERSION_NUMBER < 0x10100000 || !defined(HAVE_OPENSSL_INIT_CRYPTO)
|
||||
OpenSSL_add_all_algorithms();
|
||||
#else
|
||||
OPENSSL_init_crypto(OPENSSL_INIT_ADD_ALL_CIPHERS
|
||||
| OPENSSL_INIT_ADD_ALL_DIGESTS
|
||||
| OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL);
|
||||
#endif
|
||||
#if OPENSSL_VERSION_NUMBER < 0x10100000 || !defined(HAVE_OPENSSL_INIT_SSL)
|
||||
(void)SSL_library_init();
|
||||
#else
|
||||
(void)OPENSSL_init_ssl(0, NULL);
|
||||
#endif
|
||||
|
||||
do_service(addr, port, key, cert);
|
||||
|
||||
#ifdef HAVE_CRYPTO_CLEANUP_ALL_EX_DATA
|
||||
CRYPTO_cleanup_all_ex_data();
|
||||
#endif
|
||||
#ifdef HAVE_ERR_FREE_STRINGS
|
||||
ERR_free_strings();
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
@ -63,7 +63,7 @@ struct keysets {
|
||||
|
||||
/** print usage and exit */
|
||||
static void
|
||||
usage()
|
||||
usage(void)
|
||||
{
|
||||
printf("usage: signit expi ince keytag owner keyfile\n");
|
||||
printf("present rrset data on stdin.\n");
|
||||
|
@ -406,8 +406,18 @@ int main(int argc, char** argv)
|
||||
}
|
||||
if(usessl) {
|
||||
ERR_load_SSL_strings();
|
||||
#if OPENSSL_VERSION_NUMBER < 0x10100000 || !defined(HAVE_OPENSSL_INIT_CRYPTO)
|
||||
OpenSSL_add_all_algorithms();
|
||||
SSL_library_init();
|
||||
#else
|
||||
OPENSSL_init_crypto(OPENSSL_INIT_ADD_ALL_CIPHERS
|
||||
| OPENSSL_INIT_ADD_ALL_DIGESTS
|
||||
| OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL);
|
||||
#endif
|
||||
#if OPENSSL_VERSION_NUMBER < 0x10100000 || !defined(HAVE_OPENSSL_INIT_SSL)
|
||||
(void)SSL_library_init();
|
||||
#else
|
||||
(void)OPENSSL_init_ssl(0, NULL);
|
||||
#endif
|
||||
}
|
||||
send_em(svr, udp, usessl, noanswer, argc, argv);
|
||||
checklock_stop();
|
||||
|
@ -67,7 +67,7 @@ static struct config_strlist* cfgfiles = NULL;
|
||||
|
||||
/** give commandline usage for testbound. */
|
||||
static void
|
||||
testbound_usage()
|
||||
testbound_usage(void)
|
||||
{
|
||||
printf("usage: testbound [options]\n");
|
||||
printf("\ttest the unbound daemon.\n");
|
||||
|
@ -239,7 +239,7 @@ static void adjustline(char* line, struct entry* e,
|
||||
}
|
||||
|
||||
/** create new entry */
|
||||
static struct entry* new_entry()
|
||||
static struct entry* new_entry(void)
|
||||
{
|
||||
struct entry* e = (struct entry*)malloc(sizeof(struct entry));
|
||||
if(!e) error("out of memory");
|
||||
|
@ -568,6 +568,9 @@ void unit_show_feature(const char* feature)
|
||||
printf("test %s functions\n", feature);
|
||||
}
|
||||
|
||||
#ifdef USE_ECDSA_EVP_WORKAROUND
|
||||
void ecdsa_evp_workaround_init(void);
|
||||
#endif
|
||||
/**
|
||||
* Main unit test program. Setup, teardown and report errors.
|
||||
* @param argc: arg count.
|
||||
@ -585,10 +588,15 @@ main(int argc, char* argv[])
|
||||
}
|
||||
printf("Start of %s unit test.\n", PACKAGE_STRING);
|
||||
#ifdef HAVE_SSL
|
||||
# ifdef HAVE_ERR_LOAD_CRYPTO_STRINGS
|
||||
ERR_load_crypto_strings();
|
||||
# endif
|
||||
# ifdef USE_GOST
|
||||
(void)sldns_key_EVP_load_gost_id();
|
||||
# endif
|
||||
# ifdef USE_ECDSA_EVP_WORKAROUND
|
||||
ecdsa_evp_workaround_init();
|
||||
# endif
|
||||
#elif defined(HAVE_NSS)
|
||||
if(NSS_NoDB_Init(".") != SECSuccess)
|
||||
fatal_exit("could not init NSS");
|
||||
@ -617,13 +625,21 @@ main(int argc, char* argv[])
|
||||
sldns_key_EVP_unload_gost();
|
||||
# endif
|
||||
# ifdef HAVE_OPENSSL_CONFIG
|
||||
# ifdef HAVE_EVP_CLEANUP
|
||||
EVP_cleanup();
|
||||
# endif
|
||||
ENGINE_cleanup();
|
||||
CONF_modules_free();
|
||||
# endif
|
||||
# ifdef HAVE_CRYPTO_CLEANUP_ALL_EX_DATA
|
||||
CRYPTO_cleanup_all_ex_data();
|
||||
# endif
|
||||
# ifdef HAVE_ERR_FREE_STRINGS
|
||||
ERR_free_strings();
|
||||
# endif
|
||||
# ifdef HAVE_RAND_CLEANUP
|
||||
RAND_cleanup();
|
||||
# endif
|
||||
#elif defined(HAVE_NSS)
|
||||
if(NSS_Shutdown() != SECSuccess)
|
||||
fatal_exit("could not shutdown NSS");
|
||||
|
52
testdata/iter_resolve_minimised.rpl
vendored
52
testdata/iter_resolve_minimised.rpl
vendored
@ -30,7 +30,7 @@ MATCH opcode qtype qname
|
||||
ADJUST copy_id
|
||||
REPLY QR NOERROR
|
||||
SECTION QUESTION
|
||||
com. IN NS
|
||||
com. IN A
|
||||
SECTION AUTHORITY
|
||||
com. IN NS a.gtld-servers.net.
|
||||
SECTION ADDITIONAL
|
||||
@ -46,8 +46,8 @@ MATCH opcode qtype qname
|
||||
ADJUST copy_id
|
||||
REPLY QR NOERROR
|
||||
SECTION QUESTION
|
||||
com. IN NS
|
||||
SECTION ANSWER
|
||||
com. IN A
|
||||
SECTION AUTHORITY
|
||||
com. IN NS a.gtld-servers.net.
|
||||
SECTION ADDITIONAL
|
||||
a.gtld-servers.net. IN A 192.5.6.30
|
||||
@ -58,7 +58,7 @@ MATCH opcode qtype qname
|
||||
ADJUST copy_id
|
||||
REPLY QR NOERROR
|
||||
SECTION QUESTION
|
||||
example.com. IN NS
|
||||
example.com. IN A
|
||||
SECTION AUTHORITY
|
||||
example.com. IN NS ns.example.com.
|
||||
SECTION ADDITIONAL
|
||||
@ -74,20 +74,8 @@ MATCH opcode qtype qname
|
||||
ADJUST copy_id
|
||||
REPLY QR NOERROR
|
||||
SECTION QUESTION
|
||||
example.com. IN NS
|
||||
SECTION ANSWER
|
||||
example.com. IN NS ns.example.com.
|
||||
SECTION ADDITIONAL
|
||||
ns.example.com. IN A 1.2.3.4
|
||||
ENTRY_END
|
||||
|
||||
ENTRY_BEGIN
|
||||
MATCH opcode qtype qname
|
||||
ADJUST copy_id
|
||||
REPLY QR NOERROR
|
||||
SECTION QUESTION
|
||||
www.example.com. IN NS
|
||||
SECTION ANSWER
|
||||
example.com. IN A
|
||||
SECTION AUTHORITY
|
||||
example.com. IN NS ns.example.com.
|
||||
SECTION ADDITIONAL
|
||||
ns.example.com. IN A 1.2.3.4
|
||||
@ -99,8 +87,20 @@ ADJUST copy_id
|
||||
REPLY QR NOERROR
|
||||
SECTION QUESTION
|
||||
www.example.com. IN A
|
||||
SECTION AUTHORITY
|
||||
example.com. IN NS ns.example.com.
|
||||
SECTION ADDITIONAL
|
||||
ns.example.com. IN A 1.2.3.4
|
||||
ENTRY_END
|
||||
|
||||
ENTRY_BEGIN
|
||||
MATCH opcode qtype qname
|
||||
ADJUST copy_id
|
||||
REPLY QR NOERROR
|
||||
SECTION QUESTION
|
||||
www.example.com. IN AAAA
|
||||
SECTION ANSWER
|
||||
www.example.com. IN A 10.20.30.40
|
||||
www.example.com. IN AAAA ::123
|
||||
SECTION AUTHORITY
|
||||
example.com. IN NS ns.example.com.
|
||||
SECTION ADDITIONAL
|
||||
@ -112,35 +112,35 @@ STEP 10 QUERY
|
||||
ENTRY_BEGIN
|
||||
REPLY RD
|
||||
SECTION QUESTION
|
||||
www.example.com. IN A
|
||||
www.example.com. IN AAAA
|
||||
ENTRY_END
|
||||
|
||||
STEP 20 CHECK_OUT_QUERY
|
||||
ENTRY_BEGIN
|
||||
MATCH qname qtype opcode
|
||||
SECTION QUESTION
|
||||
com. IN NS
|
||||
com. IN A
|
||||
ENTRY_END
|
||||
|
||||
STEP 30 CHECK_OUT_QUERY
|
||||
ENTRY_BEGIN
|
||||
MATCH qname qtype opcode
|
||||
SECTION QUESTION
|
||||
example.com. IN NS
|
||||
example.com. IN A
|
||||
ENTRY_END
|
||||
|
||||
STEP 40 CHECK_OUT_QUERY
|
||||
ENTRY_BEGIN
|
||||
MATCH qname qtype opcode
|
||||
SECTION QUESTION
|
||||
www.example.com. IN NS
|
||||
www.example.com. IN A
|
||||
ENTRY_END
|
||||
|
||||
STEP 50 CHECK_OUT_QUERY
|
||||
ENTRY_BEGIN
|
||||
MATCH qname qtype opcode
|
||||
SECTION QUESTION
|
||||
www.example.com. IN A
|
||||
www.example.com. IN AAAA
|
||||
ENTRY_END
|
||||
|
||||
STEP 60 CHECK_ANSWER
|
||||
@ -148,9 +148,9 @@ ENTRY_BEGIN
|
||||
MATCH all
|
||||
REPLY QR RD RA NOERROR
|
||||
SECTION QUESTION
|
||||
www.example.com. IN A
|
||||
www.example.com. IN AAAA
|
||||
SECTION ANSWER
|
||||
www.example.com. IN A 10.20.30.40
|
||||
www.example.com. IN AAAA ::123
|
||||
SECTION AUTHORITY
|
||||
example.com. IN NS ns.example.com.
|
||||
SECTION ADDITIONAL
|
||||
|
14
testdata/iter_resolve_minimised_nx.rpl
vendored
14
testdata/iter_resolve_minimised_nx.rpl
vendored
@ -30,7 +30,7 @@ MATCH opcode qtype qname
|
||||
ADJUST copy_id
|
||||
REPLY QR NOERROR
|
||||
SECTION QUESTION
|
||||
com. IN NS
|
||||
com. IN A
|
||||
SECTION AUTHORITY
|
||||
com. IN NS a.gtld-servers.net.
|
||||
SECTION ADDITIONAL
|
||||
@ -46,8 +46,8 @@ MATCH opcode qtype qname
|
||||
ADJUST copy_id
|
||||
REPLY QR NOERROR
|
||||
SECTION QUESTION
|
||||
com. IN NS
|
||||
SECTION ANSWER
|
||||
com. IN A
|
||||
SECTION AUTHORITY
|
||||
com. IN NS a.gtld-servers.net.
|
||||
SECTION ADDITIONAL
|
||||
a.gtld-servers.net. IN A 192.5.6.30
|
||||
@ -58,7 +58,7 @@ MATCH opcode qtype qname
|
||||
ADJUST copy_id
|
||||
REPLY QR NOERROR
|
||||
SECTION QUESTION
|
||||
example.com. IN NS
|
||||
example.com. IN A
|
||||
SECTION AUTHORITY
|
||||
example.com. IN NS ns.example.com.
|
||||
SECTION ADDITIONAL
|
||||
@ -74,8 +74,8 @@ MATCH opcode qtype qname
|
||||
ADJUST copy_id
|
||||
REPLY QR NOERROR
|
||||
SECTION QUESTION
|
||||
example.com. IN NS
|
||||
SECTION ANSWER
|
||||
example.com. IN A
|
||||
SECTION AUTHORITY
|
||||
example.com. IN NS ns.example.com.
|
||||
SECTION ADDITIONAL
|
||||
ns.example.com. IN A 1.2.3.4
|
||||
@ -86,7 +86,7 @@ MATCH opcode qtype qname
|
||||
ADJUST copy_id
|
||||
REPLY QR NXDOMAIN
|
||||
SECTION QUESTION
|
||||
ent.example.com. IN NS
|
||||
ent.example.com. IN A
|
||||
SECTION AUTHORITY
|
||||
example.com. SOA ns.example.com. h.example.com. 2007090504 1800 1800 2419200 7200
|
||||
ENTRY_END
|
||||
|
22
testdata/iter_resolve_minimised_refused.rpl
vendored
22
testdata/iter_resolve_minimised_refused.rpl
vendored
@ -30,7 +30,7 @@ MATCH opcode qtype qname
|
||||
ADJUST copy_id
|
||||
REPLY QR NOERROR
|
||||
SECTION QUESTION
|
||||
com. IN NS
|
||||
com. IN A
|
||||
SECTION AUTHORITY
|
||||
com. IN NS a.gtld-servers.net.
|
||||
SECTION ADDITIONAL
|
||||
@ -46,8 +46,8 @@ MATCH opcode qtype qname
|
||||
ADJUST copy_id
|
||||
REPLY QR NOERROR
|
||||
SECTION QUESTION
|
||||
com. IN NS
|
||||
SECTION ANSWER
|
||||
com. IN A
|
||||
SECTION AUTHORITY
|
||||
com. IN NS a.gtld-servers.net.
|
||||
SECTION ADDITIONAL
|
||||
a.gtld-servers.net. IN A 192.5.6.30
|
||||
@ -58,7 +58,7 @@ MATCH opcode qtype qname
|
||||
ADJUST copy_id
|
||||
REPLY QR NOERROR
|
||||
SECTION QUESTION
|
||||
example.com. IN NS
|
||||
example.com. IN A
|
||||
SECTION AUTHORITY
|
||||
example.com. IN NS ns.example.com.
|
||||
SECTION ADDITIONAL
|
||||
@ -74,7 +74,7 @@ MATCH opcode qtype qname
|
||||
ADJUST copy_id
|
||||
REPLY QR REFUSED
|
||||
SECTION QUESTION
|
||||
refused.example.com. IN NS
|
||||
refused.example.com. IN A
|
||||
ENTRY_END
|
||||
|
||||
ENTRY_BEGIN
|
||||
@ -82,7 +82,7 @@ MATCH opcode qtype qname
|
||||
ADJUST copy_id
|
||||
REPLY QR REFUSED
|
||||
SECTION QUESTION
|
||||
www.refused.example.com. IN NS
|
||||
www.refused.example.com. IN A
|
||||
ENTRY_END
|
||||
|
||||
ENTRY_BEGIN
|
||||
@ -90,9 +90,9 @@ MATCH opcode qtype qname
|
||||
ADJUST copy_id
|
||||
REPLY QR NOERROR
|
||||
SECTION QUESTION
|
||||
www.refused.example.com. IN A
|
||||
www.refused.example.com. IN AAAA
|
||||
SECTION ANSWER
|
||||
www.refused.example.com. IN A 10.20.30.40
|
||||
www.refused.example.com. IN AAAA ::1
|
||||
SECTION AUTHORITY
|
||||
example.com. IN NS ns.example.com.
|
||||
SECTION ADDITIONAL
|
||||
@ -104,7 +104,7 @@ STEP 10 QUERY
|
||||
ENTRY_BEGIN
|
||||
REPLY RD
|
||||
SECTION QUESTION
|
||||
www.refused.example.com. IN A
|
||||
www.refused.example.com. IN AAAA
|
||||
ENTRY_END
|
||||
|
||||
STEP 20 CHECK_ANSWER
|
||||
@ -112,9 +112,9 @@ ENTRY_BEGIN
|
||||
MATCH all
|
||||
REPLY QR RD RA NOERROR
|
||||
SECTION QUESTION
|
||||
www.refused.example.com. IN A
|
||||
www.refused.example.com. IN AAAA
|
||||
SECTION ANSWER
|
||||
www.refused.example.com. IN A 10.20.30.40
|
||||
www.refused.example.com. IN AAAA ::1
|
||||
SECTION AUTHORITY
|
||||
example.com. IN NS ns.example.com.
|
||||
SECTION ADDITIONAL
|
||||
|
152
testdata/iter_resolve_minimised_timeout.rpl
vendored
Normal file
152
testdata/iter_resolve_minimised_timeout.rpl
vendored
Normal file
@ -0,0 +1,152 @@
|
||||
; config options
|
||||
server:
|
||||
target-fetch-policy: "0 0 0 0 0"
|
||||
qname-minimisation: yes
|
||||
|
||||
stub-zone:
|
||||
name: "."
|
||||
stub-addr: 193.0.14.129 # K.ROOT-SERVERS.NET.
|
||||
CONFIG_END
|
||||
|
||||
SCENARIO_BEGIN Test iterative qname minimised resolve of www.example.com. Simulate broken nameserver that drops QTYPE=A queries.
|
||||
|
||||
; K.ROOT-SERVERS.NET.
|
||||
RANGE_BEGIN 0 100
|
||||
ADDRESS 193.0.14.129
|
||||
ENTRY_BEGIN
|
||||
MATCH opcode qtype qname
|
||||
ADJUST copy_id
|
||||
REPLY QR NOERROR
|
||||
SECTION QUESTION
|
||||
. IN NS
|
||||
SECTION ANSWER
|
||||
. IN NS K.ROOT-SERVERS.NET.
|
||||
SECTION ADDITIONAL
|
||||
K.ROOT-SERVERS.NET. IN A 193.0.14.129
|
||||
ENTRY_END
|
||||
|
||||
ENTRY_BEGIN
|
||||
MATCH opcode qtype qname
|
||||
ADJUST copy_id
|
||||
REPLY QR NOERROR
|
||||
SECTION QUESTION
|
||||
com. IN A
|
||||
SECTION AUTHORITY
|
||||
com. IN NS a.gtld-servers.net.
|
||||
SECTION ADDITIONAL
|
||||
a.gtld-servers.net. IN A 192.5.6.30
|
||||
ENTRY_END
|
||||
RANGE_END
|
||||
|
||||
; a.gtld-servers.net.
|
||||
RANGE_BEGIN 0 100
|
||||
ADDRESS 192.5.6.30
|
||||
ENTRY_BEGIN
|
||||
MATCH opcode qtype qname
|
||||
ADJUST copy_id
|
||||
REPLY QR NOERROR
|
||||
SECTION QUESTION
|
||||
com. IN A
|
||||
SECTION AUTHORITY
|
||||
com. IN NS a.gtld-servers.net.
|
||||
SECTION ADDITIONAL
|
||||
a.gtld-servers.net. IN A 192.5.6.30
|
||||
ENTRY_END
|
||||
|
||||
ENTRY_BEGIN
|
||||
MATCH opcode qtype qname
|
||||
ADJUST copy_id
|
||||
REPLY QR NOERROR
|
||||
SECTION QUESTION
|
||||
example.com. IN A
|
||||
SECTION AUTHORITY
|
||||
example.com. IN NS ns.example.com.
|
||||
SECTION ADDITIONAL
|
||||
ns.example.com. IN A 1.2.3.4
|
||||
ENTRY_END
|
||||
RANGE_END
|
||||
|
||||
; ns.example.com.
|
||||
RANGE_BEGIN 0 100
|
||||
ADDRESS 1.2.3.4
|
||||
ENTRY_BEGIN
|
||||
MATCH opcode qtype qname
|
||||
ADJUST copy_id
|
||||
REPLY QR NOERROR
|
||||
SECTION QUESTION
|
||||
example.com. IN A
|
||||
SECTION AUTHORITY
|
||||
example.com. IN NS ns.example.com.
|
||||
SECTION ADDITIONAL
|
||||
ns.example.com. IN A 1.2.3.4
|
||||
ENTRY_END
|
||||
|
||||
ENTRY_BEGIN
|
||||
MATCH opcode qtype qname
|
||||
ADJUST copy_id
|
||||
REPLY QR NOERROR
|
||||
SECTION QUESTION
|
||||
www.example.com. IN AAAA
|
||||
SECTION ANSWER
|
||||
www.example.com. IN AAAA ::123
|
||||
SECTION AUTHORITY
|
||||
example.com. IN NS ns.example.com.
|
||||
SECTION ADDITIONAL
|
||||
ns.example.com. IN A 1.2.3.4
|
||||
ENTRY_END
|
||||
RANGE_END
|
||||
|
||||
STEP 10 QUERY
|
||||
ENTRY_BEGIN
|
||||
REPLY RD
|
||||
SECTION QUESTION
|
||||
www.example.com. IN AAAA
|
||||
ENTRY_END
|
||||
|
||||
STEP 20 CHECK_OUT_QUERY
|
||||
ENTRY_BEGIN
|
||||
MATCH qname qtype opcode
|
||||
SECTION QUESTION
|
||||
com. IN A
|
||||
ENTRY_END
|
||||
|
||||
STEP 30 CHECK_OUT_QUERY
|
||||
ENTRY_BEGIN
|
||||
MATCH qname qtype opcode
|
||||
SECTION QUESTION
|
||||
example.com. IN A
|
||||
ENTRY_END
|
||||
|
||||
STEP 40 CHECK_OUT_QUERY
|
||||
ENTRY_BEGIN
|
||||
MATCH qname qtype opcode
|
||||
SECTION QUESTION
|
||||
www.example.com. IN A
|
||||
ENTRY_END
|
||||
|
||||
STEP 41 TIMEOUT
|
||||
STEP 42 TIMEOUT
|
||||
STEP 43 TIMEOUT
|
||||
|
||||
STEP 50 CHECK_OUT_QUERY
|
||||
ENTRY_BEGIN
|
||||
MATCH qname qtype opcode
|
||||
SECTION QUESTION
|
||||
www.example.com. IN AAAA
|
||||
ENTRY_END
|
||||
|
||||
STEP 60 CHECK_ANSWER
|
||||
ENTRY_BEGIN
|
||||
MATCH all
|
||||
REPLY QR RD RA NOERROR
|
||||
SECTION QUESTION
|
||||
www.example.com. IN AAAA
|
||||
SECTION ANSWER
|
||||
www.example.com. IN AAAA ::123
|
||||
SECTION AUTHORITY
|
||||
example.com. IN NS ns.example.com.
|
||||
SECTION ADDITIONAL
|
||||
ns.example.com. IN A 1.2.3.4
|
||||
ENTRY_END
|
||||
|
||||
SCENARIO_END
|
93
testdata/local_acl_override.rpl
vendored
Normal file
93
testdata/local_acl_override.rpl
vendored
Normal file
@ -0,0 +1,93 @@
|
||||
; config options
|
||||
server:
|
||||
local-zone: "1.example." transparent
|
||||
local-zone: "2.example." transparent
|
||||
access-control: 10.10.10.0/24 allow
|
||||
|
||||
local-zone-override: "1.example." 10.10.10.20/32 refuse
|
||||
local-zone-override: "2.example." 10.10.10.30/32 refuse
|
||||
local-zone-override: "2.example." 10.10.10.40/32 always_nxdomain
|
||||
|
||||
forward-zone:
|
||||
name: "example."
|
||||
forward-addr: 1.2.3.4
|
||||
|
||||
CONFIG_END
|
||||
SCENARIO_BEGIN Test local data queries
|
||||
|
||||
RANGE_BEGIN 0 100
|
||||
ENTRY_BEGIN
|
||||
MATCH opcode qtype qname
|
||||
ADJUST copy_id
|
||||
REPLY QR NOERROR
|
||||
SECTION QUESTION
|
||||
1.example. IN TXT
|
||||
SECTION ANSWER
|
||||
1.example. IN TXT "data 1"
|
||||
ENTRY_END
|
||||
ENTRY_BEGIN
|
||||
MATCH opcode qtype qname
|
||||
ADJUST copy_id
|
||||
REPLY QR NOERROR
|
||||
SECTION QUESTION
|
||||
2.example. IN TXT
|
||||
SECTION ANSWER
|
||||
2.example. IN TXT "data 2"
|
||||
ENTRY_END
|
||||
RANGE_END
|
||||
|
||||
STEP 1 QUERY ADDRESS 10.10.10.10
|
||||
ENTRY_BEGIN
|
||||
REPLY RD
|
||||
SECTION QUESTION
|
||||
1.example. IN TXT
|
||||
ENTRY_END
|
||||
STEP 2 CHECK_ANSWER
|
||||
ENTRY_BEGIN
|
||||
MATCH all
|
||||
REPLY QR RD RA
|
||||
SECTION QUESTION
|
||||
1.example. IN TXT
|
||||
SECTION ANSWER
|
||||
1.example. IN TXT "data 1"
|
||||
ENTRY_END
|
||||
|
||||
STEP 3 QUERY ADDRESS 10.10.10.20
|
||||
ENTRY_BEGIN
|
||||
SECTION QUESTION
|
||||
1.example. IN TXT
|
||||
ENTRY_END
|
||||
STEP 4 CHECK_ANSWER
|
||||
ENTRY_BEGIN
|
||||
MATCH all
|
||||
REPLY QR RA AA REFUSED
|
||||
SECTION QUESTION
|
||||
1.example. IN TXT
|
||||
ENTRY_END
|
||||
|
||||
STEP 5 QUERY ADDRESS 10.10.10.30
|
||||
ENTRY_BEGIN
|
||||
SECTION QUESTION
|
||||
2.example. IN TXT
|
||||
ENTRY_END
|
||||
STEP 6 CHECK_ANSWER
|
||||
ENTRY_BEGIN
|
||||
MATCH all
|
||||
REPLY QR RA AA REFUSED
|
||||
SECTION QUESTION
|
||||
2.example. IN TXT
|
||||
ENTRY_END
|
||||
|
||||
STEP 7 QUERY ADDRESS 10.10.10.40
|
||||
ENTRY_BEGIN
|
||||
SECTION QUESTION
|
||||
2.example. IN TXT
|
||||
ENTRY_END
|
||||
STEP 8 CHECK_ANSWER
|
||||
ENTRY_BEGIN
|
||||
MATCH all
|
||||
REPLY QR RA AA NXDOMAIN
|
||||
SECTION QUESTION
|
||||
2.example. IN TXT
|
||||
ENTRY_END
|
||||
SCENARIO_END
|
169
testdata/local_acl_taglist.rpl
vendored
Normal file
169
testdata/local_acl_taglist.rpl
vendored
Normal file
@ -0,0 +1,169 @@
|
||||
; config options
|
||||
server:
|
||||
define-tag: "tag1 tag2 tag3"
|
||||
define-tag: "tag4"
|
||||
local-zone: "example." redirect
|
||||
local-data: 'example. IN TXT "data 0"'
|
||||
local-zone: "d.example." static
|
||||
local-data: 'd.example. IN TXT "data 1"'
|
||||
local-zone: "c.d.example." redirect
|
||||
local-data: 'c.d.example. IN TXT "data 2"'
|
||||
local-zone: "b.c.d.example." redirect
|
||||
local-data: 'b.c.d.example. IN TXT "data 3"'
|
||||
local-zone: "foo." redirect
|
||||
local-data: 'foo. IN TXT "data plain 4"'
|
||||
|
||||
; no tags for local-zones example. and c.d.example.
|
||||
local-zone-tag: "d.example." "tag1 tag2"
|
||||
local-zone-tag: "b.c.d.example." "tag3"
|
||||
local-zone-tag: "foo." "tag4"
|
||||
|
||||
access-control: 10.10.10.0/24 allow
|
||||
access-control-tag: 10.10.10.20/32 "tag1"
|
||||
access-control-tag: 10.10.10.30/32 "tag2 tag3"
|
||||
access-control-tag: 10.10.10.40/32 "tag3"
|
||||
|
||||
access-control-tag: 10.10.10.50/32 "tag4"
|
||||
access-control-tag-data: 10.10.10.50/32 "tag4" 'TXT "data tag4"'
|
||||
access-control-tag: 10.10.10.60/32 "tag4"
|
||||
|
||||
|
||||
CONFIG_END
|
||||
SCENARIO_BEGIN Test local data queries
|
||||
|
||||
STEP 1 QUERY ADDRESS 10.10.10.10
|
||||
ENTRY_BEGIN
|
||||
SECTION QUESTION
|
||||
d.example. IN TXT
|
||||
ENTRY_END
|
||||
STEP 2 CHECK_ANSWER
|
||||
ENTRY_BEGIN
|
||||
MATCH all
|
||||
REPLY QR RA AA
|
||||
SECTION QUESTION
|
||||
d.example. IN TXT
|
||||
SECTION ANSWER
|
||||
d.example. IN TXT "data 0"
|
||||
ENTRY_END
|
||||
|
||||
STEP 3 QUERY ADDRESS 10.10.10.20
|
||||
ENTRY_BEGIN
|
||||
SECTION QUESTION
|
||||
d.example. IN TXT
|
||||
ENTRY_END
|
||||
STEP 4 CHECK_ANSWER
|
||||
ENTRY_BEGIN
|
||||
MATCH all
|
||||
REPLY QR RA AA
|
||||
SECTION QUESTION
|
||||
d.example. IN TXT
|
||||
SECTION ANSWER
|
||||
d.example. IN TXT "data 1"
|
||||
ENTRY_END
|
||||
|
||||
STEP 5 QUERY ADDRESS 10.10.10.30
|
||||
ENTRY_BEGIN
|
||||
SECTION QUESTION
|
||||
d.example. IN TXT
|
||||
ENTRY_END
|
||||
STEP 6 CHECK_ANSWER
|
||||
ENTRY_BEGIN
|
||||
MATCH all
|
||||
REPLY QR RA AA
|
||||
SECTION QUESTION
|
||||
d.example. IN TXT
|
||||
SECTION ANSWER
|
||||
d.example. IN TXT "data 1"
|
||||
ENTRY_END
|
||||
|
||||
STEP 7 QUERY ADDRESS 10.10.10.40
|
||||
ENTRY_BEGIN
|
||||
SECTION QUESTION
|
||||
d.example. IN TXT
|
||||
ENTRY_END
|
||||
STEP 8 CHECK_ANSWER
|
||||
ENTRY_BEGIN
|
||||
MATCH all
|
||||
REPLY QR RA AA
|
||||
SECTION QUESTION
|
||||
d.example. IN TXT
|
||||
SECTION ANSWER
|
||||
d.example. IN TXT "data 0"
|
||||
ENTRY_END
|
||||
|
||||
STEP 9 QUERY ADDRESS 10.10.10.20
|
||||
ENTRY_BEGIN
|
||||
SECTION QUESTION
|
||||
c.d.example. IN TXT
|
||||
ENTRY_END
|
||||
STEP 10 CHECK_ANSWER
|
||||
ENTRY_BEGIN
|
||||
MATCH all
|
||||
REPLY QR RA AA
|
||||
SECTION QUESTION
|
||||
c.d.example. IN TXT
|
||||
SECTION ANSWER
|
||||
c.d.example. IN TXT "data 2"
|
||||
ENTRY_END
|
||||
|
||||
STEP 11 QUERY ADDRESS 10.10.10.20
|
||||
ENTRY_BEGIN
|
||||
SECTION QUESTION
|
||||
a.b.c.d.example. IN TXT
|
||||
ENTRY_END
|
||||
STEP 12 CHECK_ANSWER
|
||||
ENTRY_BEGIN
|
||||
MATCH all
|
||||
REPLY QR RA AA
|
||||
SECTION QUESTION
|
||||
a.b.c.d.example. IN TXT
|
||||
SECTION ANSWER
|
||||
a.b.c.d.example. IN TXT "data 2"
|
||||
ENTRY_END
|
||||
|
||||
STEP 13 QUERY ADDRESS 10.10.10.30
|
||||
ENTRY_BEGIN
|
||||
SECTION QUESTION
|
||||
a.b.c.d.example. IN TXT
|
||||
ENTRY_END
|
||||
STEP 14 CHECK_ANSWER
|
||||
ENTRY_BEGIN
|
||||
MATCH all
|
||||
REPLY QR RA AA
|
||||
SECTION QUESTION
|
||||
a.b.c.d.example. IN TXT
|
||||
SECTION ANSWER
|
||||
a.b.c.d.example. IN TXT "data 3"
|
||||
ENTRY_END
|
||||
|
||||
STEP 15 QUERY ADDRESS 10.10.10.50
|
||||
ENTRY_BEGIN
|
||||
SECTION QUESTION
|
||||
www.foo. IN TXT
|
||||
ENTRY_END
|
||||
STEP 16 CHECK_ANSWER
|
||||
ENTRY_BEGIN
|
||||
MATCH all
|
||||
REPLY QR RA AA
|
||||
SECTION QUESTION
|
||||
www.foo. IN TXT
|
||||
SECTION ANSWER
|
||||
www.foo. IN TXT "data tag4"
|
||||
ENTRY_END
|
||||
|
||||
STEP 17 QUERY ADDRESS 10.10.10.60
|
||||
ENTRY_BEGIN
|
||||
SECTION QUESTION
|
||||
www.foo. IN TXT
|
||||
ENTRY_END
|
||||
STEP 18 CHECK_ANSWER
|
||||
ENTRY_BEGIN
|
||||
MATCH all
|
||||
REPLY QR RA AA
|
||||
SECTION QUESTION
|
||||
www.foo. IN TXT
|
||||
SECTION ANSWER
|
||||
www.foo. IN TXT "data plain 4"
|
||||
ENTRY_END
|
||||
|
||||
SCENARIO_END
|
125
testdata/local_acl_taglist_action.rpl
vendored
Normal file
125
testdata/local_acl_taglist_action.rpl
vendored
Normal file
@ -0,0 +1,125 @@
|
||||
; config options
|
||||
server:
|
||||
define-tag: "tag1 tag2 tag3"
|
||||
local-zone: "example." static
|
||||
local-data: 'example. IN TXT "data 0"'
|
||||
|
||||
local-zone-tag: "example." "tag1 tag2 tag3"
|
||||
|
||||
access-control: 10.10.10.0/24 allow
|
||||
access-control-tag: 10.10.10.10/32 "tag1"
|
||||
access-control-tag: 10.10.10.20/32 "tag2 tag3"
|
||||
access-control-tag: 10.10.10.30/32 "tag3"
|
||||
access-control-tag: 10.10.10.40/32 "tag3"
|
||||
access-control-tag: 10.10.10.50/32 "tag3"
|
||||
|
||||
access-control-tag-action: 10.10.10.10/32 tag1 always_refuse
|
||||
access-control-tag-action: 10.10.10.20/32 tag2 always_nxdomain
|
||||
access-control-tag-action: 10.10.10.30/32 tag3 always_refuse
|
||||
access-control-tag-action: 10.10.10.50/32 tag3 always_transparent
|
||||
|
||||
forward-zone:
|
||||
name: "example."
|
||||
forward-addr: 1.2.3.4
|
||||
|
||||
CONFIG_END
|
||||
SCENARIO_BEGIN Test local data queries
|
||||
|
||||
RANGE_BEGIN 0 100
|
||||
ENTRY_BEGIN
|
||||
MATCH opcode qtype qname
|
||||
ADJUST copy_id
|
||||
REPLY QR NOERROR
|
||||
SECTION QUESTION
|
||||
example. IN TXT
|
||||
SECTION ANSWER
|
||||
example. IN TXT "data 1"
|
||||
ENTRY_END
|
||||
RANGE_END
|
||||
|
||||
STEP 1 QUERY ADDRESS 10.10.10.10
|
||||
ENTRY_BEGIN
|
||||
SECTION QUESTION
|
||||
example. IN TXT
|
||||
ENTRY_END
|
||||
STEP 2 CHECK_ANSWER
|
||||
ENTRY_BEGIN
|
||||
MATCH all
|
||||
REPLY QR RA AA REFUSED
|
||||
SECTION QUESTION
|
||||
example. IN TXT
|
||||
ENTRY_END
|
||||
|
||||
STEP 3 QUERY ADDRESS 10.10.10.20
|
||||
ENTRY_BEGIN
|
||||
SECTION QUESTION
|
||||
example. IN TXT
|
||||
ENTRY_END
|
||||
STEP 4 CHECK_ANSWER
|
||||
ENTRY_BEGIN
|
||||
MATCH all
|
||||
REPLY QR RA AA NXDOMAIN
|
||||
SECTION QUESTION
|
||||
example. IN TXT
|
||||
ENTRY_END
|
||||
|
||||
STEP 5 QUERY ADDRESS 10.10.10.30
|
||||
ENTRY_BEGIN
|
||||
SECTION QUESTION
|
||||
example. IN TXT
|
||||
ENTRY_END
|
||||
STEP 6 CHECK_ANSWER
|
||||
ENTRY_BEGIN
|
||||
MATCH all
|
||||
REPLY QR RA AA REFUSED
|
||||
SECTION QUESTION
|
||||
example. IN TXT
|
||||
ENTRY_END
|
||||
|
||||
STEP 7 QUERY ADDRESS 10.10.10.40
|
||||
ENTRY_BEGIN
|
||||
SECTION QUESTION
|
||||
example. IN TXT
|
||||
ENTRY_END
|
||||
STEP 8 CHECK_ANSWER
|
||||
ENTRY_BEGIN
|
||||
MATCH all
|
||||
REPLY QR RA AA
|
||||
SECTION QUESTION
|
||||
example. IN TXT
|
||||
SECTION ANSWER
|
||||
example. IN TXT "data 0"
|
||||
ENTRY_END
|
||||
|
||||
STEP 9 QUERY ADDRESS 10.10.10.50
|
||||
ENTRY_BEGIN
|
||||
REPLY RD
|
||||
SECTION QUESTION
|
||||
example. IN TXT
|
||||
ENTRY_END
|
||||
STEP 10 CHECK_ANSWER
|
||||
ENTRY_BEGIN
|
||||
MATCH all
|
||||
REPLY QR RD RA
|
||||
SECTION QUESTION
|
||||
example. IN TXT
|
||||
SECTION ANSWER
|
||||
example. IN TXT "data 1"
|
||||
ENTRY_END
|
||||
|
||||
STEP 11 QUERY ADDRESS 10.10.10.60
|
||||
ENTRY_BEGIN
|
||||
REPLY RD
|
||||
SECTION QUESTION
|
||||
example. IN TXT
|
||||
ENTRY_END
|
||||
STEP 12 CHECK_ANSWER
|
||||
ENTRY_BEGIN
|
||||
MATCH all
|
||||
REPLY QR RD RA
|
||||
SECTION QUESTION
|
||||
example. IN TXT
|
||||
SECTION ANSWER
|
||||
example. IN TXT "data 1"
|
||||
ENTRY_END
|
||||
SCENARIO_END
|
@ -64,7 +64,7 @@ alloc_setup_special(alloc_special_t* t)
|
||||
* @param alloc: the structure to fill up.
|
||||
*/
|
||||
static void
|
||||
prealloc(struct alloc_cache* alloc)
|
||||
prealloc_setup(struct alloc_cache* alloc)
|
||||
{
|
||||
alloc_special_t* p;
|
||||
int i;
|
||||
@ -216,7 +216,7 @@ alloc_special_obtain(struct alloc_cache* alloc)
|
||||
}
|
||||
}
|
||||
/* allocate new */
|
||||
prealloc(alloc);
|
||||
prealloc_setup(alloc);
|
||||
if(!(p = (alloc_special_t*)malloc(sizeof(alloc_special_t)))) {
|
||||
log_err("alloc_special_obtain: out of memory");
|
||||
return NULL;
|
||||
|
@ -212,6 +212,7 @@ config_create(void)
|
||||
cfg->local_zones = NULL;
|
||||
cfg->local_zones_nodefault = NULL;
|
||||
cfg->local_data = NULL;
|
||||
cfg->local_zone_overrides = NULL;
|
||||
cfg->unblock_lan_zones = 0;
|
||||
cfg->insecure_lan_zones = 0;
|
||||
cfg->python_script = NULL;
|
||||
@ -640,6 +641,14 @@ config_collate_cat(struct config_strlist* list)
|
||||
func(buf, arg); \
|
||||
} \
|
||||
}
|
||||
/** compare and print list option */
|
||||
#define O_LS3(opt, name, lst) if(strcmp(opt, name)==0) { \
|
||||
struct config_str3list* p = cfg->lst; \
|
||||
for(p = cfg->lst; p; p = p->next) { \
|
||||
snprintf(buf, len, "%s %s %s", p->str, p->str2, p->str3); \
|
||||
func(buf, arg); \
|
||||
} \
|
||||
}
|
||||
/** compare and print taglist option */
|
||||
#define O_LTG(opt, name, lst) if(strcmp(opt, name)==0) { \
|
||||
char* tmpstr = NULL; \
|
||||
@ -784,6 +793,10 @@ config_get_option(struct config_file* cfg, const char* opt,
|
||||
else O_YNO(opt, "qname-minimisation", qname_minimisation)
|
||||
else O_IFC(opt, "define-tag", num_tags, tagname)
|
||||
else O_LTG(opt, "local-zone-tag", local_zone_tags)
|
||||
else O_LTG(opt, "access-control-tag", acl_tags)
|
||||
else O_LS3(opt, "local-zone-override", local_zone_overrides)
|
||||
else O_LS3(opt, "access-control-tag-action", acl_tag_actions)
|
||||
else O_LS3(opt, "access-control-tag-data", acl_tag_datas)
|
||||
/* not here:
|
||||
* outgoing-permit, outgoing-avoid - have list of ports
|
||||
* local-zone - zones and nodefault variables
|
||||
@ -935,6 +948,20 @@ config_deldblstrlist(struct config_str2list* p)
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
config_deltrplstrlist(struct config_str3list* p)
|
||||
{
|
||||
struct config_str3list *np;
|
||||
while(p) {
|
||||
np = p->next;
|
||||
free(p->str);
|
||||
free(p->str2);
|
||||
free(p->str3);
|
||||
free(p);
|
||||
p = np;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
config_delstub(struct config_stub* p)
|
||||
{
|
||||
@ -969,8 +996,7 @@ config_del_strarray(char** array, int num)
|
||||
free(array);
|
||||
}
|
||||
|
||||
/** delete stringbytelist */
|
||||
static void
|
||||
void
|
||||
config_del_strbytelist(struct config_strbytelist* p)
|
||||
{
|
||||
struct config_strbytelist* np;
|
||||
@ -1020,8 +1046,12 @@ config_delete(struct config_file* cfg)
|
||||
config_deldblstrlist(cfg->local_zones);
|
||||
config_delstrlist(cfg->local_zones_nodefault);
|
||||
config_delstrlist(cfg->local_data);
|
||||
config_deltrplstrlist(cfg->local_zone_overrides);
|
||||
config_del_strarray(cfg->tagname, cfg->num_tags);
|
||||
config_del_strbytelist(cfg->local_zone_tags);
|
||||
config_del_strbytelist(cfg->acl_tags);
|
||||
config_deltrplstrlist(cfg->acl_tag_actions);
|
||||
config_deltrplstrlist(cfg->acl_tag_datas);
|
||||
config_delstrlist(cfg->control_ifs);
|
||||
free(cfg->server_key_file);
|
||||
free(cfg->server_cert_file);
|
||||
@ -1179,6 +1209,23 @@ int cfg_strlist_append(struct config_strlist_head* list, char* item)
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
cfg_region_strlist_insert(struct regional* region,
|
||||
struct config_strlist** head, char* item)
|
||||
{
|
||||
struct config_strlist *s;
|
||||
if(!item || !head)
|
||||
return 0;
|
||||
s = (struct config_strlist*)regional_alloc_zero(region,
|
||||
sizeof(struct config_strlist));
|
||||
if(!s)
|
||||
return 0;
|
||||
s->str = item;
|
||||
s->next = *head;
|
||||
*head = s;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
cfg_strlist_insert(struct config_strlist** head, char* item)
|
||||
{
|
||||
@ -1210,6 +1257,24 @@ cfg_str2list_insert(struct config_str2list** head, char* item, char* i2)
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
cfg_str3list_insert(struct config_str3list** head, char* item, char* i2,
|
||||
char* i3)
|
||||
{
|
||||
struct config_str3list *s;
|
||||
if(!item || !i2 || !i3 || !head)
|
||||
return 0;
|
||||
s = (struct config_str3list*)calloc(1, sizeof(struct config_str3list));
|
||||
if(!s)
|
||||
return 0;
|
||||
s->str = item;
|
||||
s->str2 = i2;
|
||||
s->str3 = i3;
|
||||
s->next = *head;
|
||||
*head = s;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
cfg_strbytelist_insert(struct config_strbytelist** head, char* item,
|
||||
uint8_t* i2, size_t i2len)
|
||||
@ -1373,6 +1438,7 @@ cfg_set_bit(uint8_t* bitlist, size_t len, int id)
|
||||
{
|
||||
int pos = id/8;
|
||||
log_assert((size_t)pos < len);
|
||||
(void)len;
|
||||
bitlist[pos] |= 1<<(id%8);
|
||||
}
|
||||
|
||||
|
@ -44,10 +44,12 @@
|
||||
struct config_stub;
|
||||
struct config_strlist;
|
||||
struct config_str2list;
|
||||
struct config_str3list;
|
||||
struct config_strbytelist;
|
||||
struct module_qstate;
|
||||
struct sock_list;
|
||||
struct ub_packed_rrset_key;
|
||||
struct regional;
|
||||
|
||||
/**
|
||||
* The configuration options.
|
||||
@ -73,6 +75,8 @@ struct config_file {
|
||||
int do_ip4;
|
||||
/** do ip6 query support. */
|
||||
int do_ip6;
|
||||
/** prefer ip6 upstream queries. */
|
||||
int prefer_ip6;
|
||||
/** do udp query support. */
|
||||
int do_udp;
|
||||
/** do tcp query support. */
|
||||
@ -292,12 +296,20 @@ struct config_file {
|
||||
struct config_strlist* local_zones_nodefault;
|
||||
/** local data RRs configured */
|
||||
struct config_strlist* local_data;
|
||||
/** local zone override types per netblock */
|
||||
struct config_str3list* local_zone_overrides;
|
||||
/** unblock lan zones (reverse lookups for AS112 zones) */
|
||||
int unblock_lan_zones;
|
||||
/** insecure lan zones (don't validate AS112 zones) */
|
||||
int insecure_lan_zones;
|
||||
/** list of zonename, tagbitlist */
|
||||
struct config_strbytelist* local_zone_tags;
|
||||
/** list of aclname, tagbitlist */
|
||||
struct config_strbytelist* acl_tags;
|
||||
/** list of aclname, tagname, localzonetype */
|
||||
struct config_str3list* acl_tag_actions;
|
||||
/** list of aclname, tagname, redirectdata */
|
||||
struct config_str3list* acl_tag_datas;
|
||||
/** tag list, array with tagname[i] is malloced string */
|
||||
char** tagname;
|
||||
/** number of items in the taglist */
|
||||
@ -433,6 +445,21 @@ struct config_str2list {
|
||||
char* str2;
|
||||
};
|
||||
|
||||
/**
|
||||
* List of three strings for config options
|
||||
*/
|
||||
struct config_str3list {
|
||||
/** next item in list */
|
||||
struct config_str3list* next;
|
||||
/** first string */
|
||||
char* str;
|
||||
/** second string */
|
||||
char* str2;
|
||||
/** third string */
|
||||
char* str3;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* List of string, bytestring for config options
|
||||
*/
|
||||
@ -575,6 +602,10 @@ int cfg_strlist_append(struct config_strlist_head* list, char* item);
|
||||
*/
|
||||
int cfg_strlist_insert(struct config_strlist** head, char* item);
|
||||
|
||||
/** insert with region for allocation. */
|
||||
int cfg_region_strlist_insert(struct regional* region,
|
||||
struct config_strlist** head, char* item);
|
||||
|
||||
/**
|
||||
* Insert string into str2list.
|
||||
* @param head: pointer to str2list head variable.
|
||||
@ -584,9 +615,20 @@ int cfg_strlist_insert(struct config_strlist** head, char* item);
|
||||
*/
|
||||
int cfg_str2list_insert(struct config_str2list** head, char* item, char* i2);
|
||||
|
||||
/**
|
||||
* Insert string into str3list.
|
||||
* @param head: pointer to str3list head variable.
|
||||
* @param item: new item. malloced by caller. If NULL the insertion fails.
|
||||
* @param i2: 2nd string, malloced by caller. If NULL the insertion fails.
|
||||
* @param i3: 3rd string, malloced by caller. If NULL the insertion fails.
|
||||
* @return: true on success.
|
||||
*/
|
||||
int cfg_str3list_insert(struct config_str3list** head, char* item, char* i2,
|
||||
char* i3);
|
||||
|
||||
/**
|
||||
* Insert string into strbytelist.
|
||||
* @param head: pointer to str2list head variable.
|
||||
* @param head: pointer to strbytelist head variable.
|
||||
* @param item: new item. malloced by caller. If NULL the insertion fails.
|
||||
* @param i2: 2nd string, malloced by caller. If NULL the insertion fails.
|
||||
* @param i2len: length of the i2 bytestring.
|
||||
@ -618,6 +660,15 @@ void config_delstrlist(struct config_strlist* list);
|
||||
*/
|
||||
void config_deldblstrlist(struct config_str2list* list);
|
||||
|
||||
/**
|
||||
* Delete items in config triple string list.
|
||||
* @param list: list.
|
||||
*/
|
||||
void config_deltrplstrlist(struct config_str3list* list);
|
||||
|
||||
/** delete stringbytelist */
|
||||
void config_del_strbytelist(struct config_strbytelist* list);
|
||||
|
||||
/**
|
||||
* Delete a stub item
|
||||
* @param p: stub item
|
||||
|
3652
util/configlexer.c
3652
util/configlexer.c
File diff suppressed because it is too large
Load Diff
@ -7,6 +7,10 @@
|
||||
* See LICENSE for the license.
|
||||
*
|
||||
*/
|
||||
|
||||
/* because flex keeps having sign-unsigned compare problems that are unfixed*/
|
||||
#pragma GCC diagnostic ignored "-Wsign-compare"
|
||||
|
||||
#include <ctype.h>
|
||||
#include <string.h>
|
||||
#include <strings.h>
|
||||
@ -216,6 +220,7 @@ outgoing-num-tcp{COLON} { YDVAR(1, VAR_OUTGOING_NUM_TCP) }
|
||||
incoming-num-tcp{COLON} { YDVAR(1, VAR_INCOMING_NUM_TCP) }
|
||||
do-ip4{COLON} { YDVAR(1, VAR_DO_IP4) }
|
||||
do-ip6{COLON} { YDVAR(1, VAR_DO_IP6) }
|
||||
prefer-ip6{COLON} { YDVAR(1, VAR_PREFER_IP6) }
|
||||
do-udp{COLON} { YDVAR(1, VAR_DO_UDP) }
|
||||
do-tcp{COLON} { YDVAR(1, VAR_DO_TCP) }
|
||||
tcp-upstream{COLON} { YDVAR(1, VAR_TCP_UPSTREAM) }
|
||||
@ -345,6 +350,10 @@ dns64-prefix{COLON} { YDVAR(1, VAR_DNS64_PREFIX) }
|
||||
dns64-synthall{COLON} { YDVAR(1, VAR_DNS64_SYNTHALL) }
|
||||
define-tag{COLON} { YDVAR(1, VAR_DEFINE_TAG) }
|
||||
local-zone-tag{COLON} { YDVAR(2, VAR_LOCAL_ZONE_TAG) }
|
||||
access-control-tag{COLON} { YDVAR(2, VAR_ACCESS_CONTROL_TAG) }
|
||||
access-control-tag-action{COLON} { YDVAR(3, VAR_ACCESS_CONTROL_TAG_ACTION) }
|
||||
access-control-tag-data{COLON} { YDVAR(3, VAR_ACCESS_CONTROL_TAG_DATA) }
|
||||
local-zone-override{COLON} { YDVAR(3, VAR_LOCAL_ZONE_OVERRIDE) }
|
||||
dnstap{COLON} { YDVAR(0, VAR_DNSTAP) }
|
||||
dnstap-enable{COLON} { YDVAR(1, VAR_DNSTAP_ENABLE) }
|
||||
dnstap-socket-path{COLON} { YDVAR(1, VAR_DNSTAP_SOCKET_PATH) }
|
||||
|
2160
util/configparser.c
2160
util/configparser.c
File diff suppressed because it is too large
Load Diff
@ -61,157 +61,162 @@ extern int yydebug;
|
||||
VAR_INTERFACE = 271,
|
||||
VAR_DO_IP4 = 272,
|
||||
VAR_DO_IP6 = 273,
|
||||
VAR_DO_UDP = 274,
|
||||
VAR_DO_TCP = 275,
|
||||
VAR_TCP_MSS = 276,
|
||||
VAR_OUTGOING_TCP_MSS = 277,
|
||||
VAR_CHROOT = 278,
|
||||
VAR_USERNAME = 279,
|
||||
VAR_DIRECTORY = 280,
|
||||
VAR_LOGFILE = 281,
|
||||
VAR_PIDFILE = 282,
|
||||
VAR_MSG_CACHE_SIZE = 283,
|
||||
VAR_MSG_CACHE_SLABS = 284,
|
||||
VAR_NUM_QUERIES_PER_THREAD = 285,
|
||||
VAR_RRSET_CACHE_SIZE = 286,
|
||||
VAR_RRSET_CACHE_SLABS = 287,
|
||||
VAR_OUTGOING_NUM_TCP = 288,
|
||||
VAR_INFRA_HOST_TTL = 289,
|
||||
VAR_INFRA_LAME_TTL = 290,
|
||||
VAR_INFRA_CACHE_SLABS = 291,
|
||||
VAR_INFRA_CACHE_NUMHOSTS = 292,
|
||||
VAR_INFRA_CACHE_LAME_SIZE = 293,
|
||||
VAR_NAME = 294,
|
||||
VAR_STUB_ZONE = 295,
|
||||
VAR_STUB_HOST = 296,
|
||||
VAR_STUB_ADDR = 297,
|
||||
VAR_TARGET_FETCH_POLICY = 298,
|
||||
VAR_HARDEN_SHORT_BUFSIZE = 299,
|
||||
VAR_HARDEN_LARGE_QUERIES = 300,
|
||||
VAR_FORWARD_ZONE = 301,
|
||||
VAR_FORWARD_HOST = 302,
|
||||
VAR_FORWARD_ADDR = 303,
|
||||
VAR_DO_NOT_QUERY_ADDRESS = 304,
|
||||
VAR_HIDE_IDENTITY = 305,
|
||||
VAR_HIDE_VERSION = 306,
|
||||
VAR_IDENTITY = 307,
|
||||
VAR_VERSION = 308,
|
||||
VAR_HARDEN_GLUE = 309,
|
||||
VAR_MODULE_CONF = 310,
|
||||
VAR_TRUST_ANCHOR_FILE = 311,
|
||||
VAR_TRUST_ANCHOR = 312,
|
||||
VAR_VAL_OVERRIDE_DATE = 313,
|
||||
VAR_BOGUS_TTL = 314,
|
||||
VAR_VAL_CLEAN_ADDITIONAL = 315,
|
||||
VAR_VAL_PERMISSIVE_MODE = 316,
|
||||
VAR_INCOMING_NUM_TCP = 317,
|
||||
VAR_MSG_BUFFER_SIZE = 318,
|
||||
VAR_KEY_CACHE_SIZE = 319,
|
||||
VAR_KEY_CACHE_SLABS = 320,
|
||||
VAR_TRUSTED_KEYS_FILE = 321,
|
||||
VAR_VAL_NSEC3_KEYSIZE_ITERATIONS = 322,
|
||||
VAR_USE_SYSLOG = 323,
|
||||
VAR_OUTGOING_INTERFACE = 324,
|
||||
VAR_ROOT_HINTS = 325,
|
||||
VAR_DO_NOT_QUERY_LOCALHOST = 326,
|
||||
VAR_CACHE_MAX_TTL = 327,
|
||||
VAR_HARDEN_DNSSEC_STRIPPED = 328,
|
||||
VAR_ACCESS_CONTROL = 329,
|
||||
VAR_LOCAL_ZONE = 330,
|
||||
VAR_LOCAL_DATA = 331,
|
||||
VAR_INTERFACE_AUTOMATIC = 332,
|
||||
VAR_STATISTICS_INTERVAL = 333,
|
||||
VAR_DO_DAEMONIZE = 334,
|
||||
VAR_USE_CAPS_FOR_ID = 335,
|
||||
VAR_STATISTICS_CUMULATIVE = 336,
|
||||
VAR_OUTGOING_PORT_PERMIT = 337,
|
||||
VAR_OUTGOING_PORT_AVOID = 338,
|
||||
VAR_DLV_ANCHOR_FILE = 339,
|
||||
VAR_DLV_ANCHOR = 340,
|
||||
VAR_NEG_CACHE_SIZE = 341,
|
||||
VAR_HARDEN_REFERRAL_PATH = 342,
|
||||
VAR_PRIVATE_ADDRESS = 343,
|
||||
VAR_PRIVATE_DOMAIN = 344,
|
||||
VAR_REMOTE_CONTROL = 345,
|
||||
VAR_CONTROL_ENABLE = 346,
|
||||
VAR_CONTROL_INTERFACE = 347,
|
||||
VAR_CONTROL_PORT = 348,
|
||||
VAR_SERVER_KEY_FILE = 349,
|
||||
VAR_SERVER_CERT_FILE = 350,
|
||||
VAR_CONTROL_KEY_FILE = 351,
|
||||
VAR_CONTROL_CERT_FILE = 352,
|
||||
VAR_CONTROL_USE_CERT = 353,
|
||||
VAR_EXTENDED_STATISTICS = 354,
|
||||
VAR_LOCAL_DATA_PTR = 355,
|
||||
VAR_JOSTLE_TIMEOUT = 356,
|
||||
VAR_STUB_PRIME = 357,
|
||||
VAR_UNWANTED_REPLY_THRESHOLD = 358,
|
||||
VAR_LOG_TIME_ASCII = 359,
|
||||
VAR_DOMAIN_INSECURE = 360,
|
||||
VAR_PYTHON = 361,
|
||||
VAR_PYTHON_SCRIPT = 362,
|
||||
VAR_VAL_SIG_SKEW_MIN = 363,
|
||||
VAR_VAL_SIG_SKEW_MAX = 364,
|
||||
VAR_CACHE_MIN_TTL = 365,
|
||||
VAR_VAL_LOG_LEVEL = 366,
|
||||
VAR_AUTO_TRUST_ANCHOR_FILE = 367,
|
||||
VAR_KEEP_MISSING = 368,
|
||||
VAR_ADD_HOLDDOWN = 369,
|
||||
VAR_DEL_HOLDDOWN = 370,
|
||||
VAR_SO_RCVBUF = 371,
|
||||
VAR_EDNS_BUFFER_SIZE = 372,
|
||||
VAR_PREFETCH = 373,
|
||||
VAR_PREFETCH_KEY = 374,
|
||||
VAR_SO_SNDBUF = 375,
|
||||
VAR_SO_REUSEPORT = 376,
|
||||
VAR_HARDEN_BELOW_NXDOMAIN = 377,
|
||||
VAR_IGNORE_CD_FLAG = 378,
|
||||
VAR_LOG_QUERIES = 379,
|
||||
VAR_TCP_UPSTREAM = 380,
|
||||
VAR_SSL_UPSTREAM = 381,
|
||||
VAR_SSL_SERVICE_KEY = 382,
|
||||
VAR_SSL_SERVICE_PEM = 383,
|
||||
VAR_SSL_PORT = 384,
|
||||
VAR_FORWARD_FIRST = 385,
|
||||
VAR_STUB_FIRST = 386,
|
||||
VAR_MINIMAL_RESPONSES = 387,
|
||||
VAR_RRSET_ROUNDROBIN = 388,
|
||||
VAR_MAX_UDP_SIZE = 389,
|
||||
VAR_DELAY_CLOSE = 390,
|
||||
VAR_UNBLOCK_LAN_ZONES = 391,
|
||||
VAR_INSECURE_LAN_ZONES = 392,
|
||||
VAR_INFRA_CACHE_MIN_RTT = 393,
|
||||
VAR_DNS64_PREFIX = 394,
|
||||
VAR_DNS64_SYNTHALL = 395,
|
||||
VAR_DNSTAP = 396,
|
||||
VAR_DNSTAP_ENABLE = 397,
|
||||
VAR_DNSTAP_SOCKET_PATH = 398,
|
||||
VAR_DNSTAP_SEND_IDENTITY = 399,
|
||||
VAR_DNSTAP_SEND_VERSION = 400,
|
||||
VAR_DNSTAP_IDENTITY = 401,
|
||||
VAR_DNSTAP_VERSION = 402,
|
||||
VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES = 403,
|
||||
VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES = 404,
|
||||
VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES = 405,
|
||||
VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES = 406,
|
||||
VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES = 407,
|
||||
VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES = 408,
|
||||
VAR_HARDEN_ALGO_DOWNGRADE = 409,
|
||||
VAR_IP_TRANSPARENT = 410,
|
||||
VAR_DISABLE_DNSSEC_LAME_CHECK = 411,
|
||||
VAR_RATELIMIT = 412,
|
||||
VAR_RATELIMIT_SLABS = 413,
|
||||
VAR_RATELIMIT_SIZE = 414,
|
||||
VAR_RATELIMIT_FOR_DOMAIN = 415,
|
||||
VAR_RATELIMIT_BELOW_DOMAIN = 416,
|
||||
VAR_RATELIMIT_FACTOR = 417,
|
||||
VAR_CAPS_WHITELIST = 418,
|
||||
VAR_CACHE_MAX_NEGATIVE_TTL = 419,
|
||||
VAR_PERMIT_SMALL_HOLDDOWN = 420,
|
||||
VAR_QNAME_MINIMISATION = 421,
|
||||
VAR_IP_FREEBIND = 422,
|
||||
VAR_DEFINE_TAG = 423,
|
||||
VAR_LOCAL_ZONE_TAG = 424
|
||||
VAR_PREFER_IP6 = 274,
|
||||
VAR_DO_UDP = 275,
|
||||
VAR_DO_TCP = 276,
|
||||
VAR_TCP_MSS = 277,
|
||||
VAR_OUTGOING_TCP_MSS = 278,
|
||||
VAR_CHROOT = 279,
|
||||
VAR_USERNAME = 280,
|
||||
VAR_DIRECTORY = 281,
|
||||
VAR_LOGFILE = 282,
|
||||
VAR_PIDFILE = 283,
|
||||
VAR_MSG_CACHE_SIZE = 284,
|
||||
VAR_MSG_CACHE_SLABS = 285,
|
||||
VAR_NUM_QUERIES_PER_THREAD = 286,
|
||||
VAR_RRSET_CACHE_SIZE = 287,
|
||||
VAR_RRSET_CACHE_SLABS = 288,
|
||||
VAR_OUTGOING_NUM_TCP = 289,
|
||||
VAR_INFRA_HOST_TTL = 290,
|
||||
VAR_INFRA_LAME_TTL = 291,
|
||||
VAR_INFRA_CACHE_SLABS = 292,
|
||||
VAR_INFRA_CACHE_NUMHOSTS = 293,
|
||||
VAR_INFRA_CACHE_LAME_SIZE = 294,
|
||||
VAR_NAME = 295,
|
||||
VAR_STUB_ZONE = 296,
|
||||
VAR_STUB_HOST = 297,
|
||||
VAR_STUB_ADDR = 298,
|
||||
VAR_TARGET_FETCH_POLICY = 299,
|
||||
VAR_HARDEN_SHORT_BUFSIZE = 300,
|
||||
VAR_HARDEN_LARGE_QUERIES = 301,
|
||||
VAR_FORWARD_ZONE = 302,
|
||||
VAR_FORWARD_HOST = 303,
|
||||
VAR_FORWARD_ADDR = 304,
|
||||
VAR_DO_NOT_QUERY_ADDRESS = 305,
|
||||
VAR_HIDE_IDENTITY = 306,
|
||||
VAR_HIDE_VERSION = 307,
|
||||
VAR_IDENTITY = 308,
|
||||
VAR_VERSION = 309,
|
||||
VAR_HARDEN_GLUE = 310,
|
||||
VAR_MODULE_CONF = 311,
|
||||
VAR_TRUST_ANCHOR_FILE = 312,
|
||||
VAR_TRUST_ANCHOR = 313,
|
||||
VAR_VAL_OVERRIDE_DATE = 314,
|
||||
VAR_BOGUS_TTL = 315,
|
||||
VAR_VAL_CLEAN_ADDITIONAL = 316,
|
||||
VAR_VAL_PERMISSIVE_MODE = 317,
|
||||
VAR_INCOMING_NUM_TCP = 318,
|
||||
VAR_MSG_BUFFER_SIZE = 319,
|
||||
VAR_KEY_CACHE_SIZE = 320,
|
||||
VAR_KEY_CACHE_SLABS = 321,
|
||||
VAR_TRUSTED_KEYS_FILE = 322,
|
||||
VAR_VAL_NSEC3_KEYSIZE_ITERATIONS = 323,
|
||||
VAR_USE_SYSLOG = 324,
|
||||
VAR_OUTGOING_INTERFACE = 325,
|
||||
VAR_ROOT_HINTS = 326,
|
||||
VAR_DO_NOT_QUERY_LOCALHOST = 327,
|
||||
VAR_CACHE_MAX_TTL = 328,
|
||||
VAR_HARDEN_DNSSEC_STRIPPED = 329,
|
||||
VAR_ACCESS_CONTROL = 330,
|
||||
VAR_LOCAL_ZONE = 331,
|
||||
VAR_LOCAL_DATA = 332,
|
||||
VAR_INTERFACE_AUTOMATIC = 333,
|
||||
VAR_STATISTICS_INTERVAL = 334,
|
||||
VAR_DO_DAEMONIZE = 335,
|
||||
VAR_USE_CAPS_FOR_ID = 336,
|
||||
VAR_STATISTICS_CUMULATIVE = 337,
|
||||
VAR_OUTGOING_PORT_PERMIT = 338,
|
||||
VAR_OUTGOING_PORT_AVOID = 339,
|
||||
VAR_DLV_ANCHOR_FILE = 340,
|
||||
VAR_DLV_ANCHOR = 341,
|
||||
VAR_NEG_CACHE_SIZE = 342,
|
||||
VAR_HARDEN_REFERRAL_PATH = 343,
|
||||
VAR_PRIVATE_ADDRESS = 344,
|
||||
VAR_PRIVATE_DOMAIN = 345,
|
||||
VAR_REMOTE_CONTROL = 346,
|
||||
VAR_CONTROL_ENABLE = 347,
|
||||
VAR_CONTROL_INTERFACE = 348,
|
||||
VAR_CONTROL_PORT = 349,
|
||||
VAR_SERVER_KEY_FILE = 350,
|
||||
VAR_SERVER_CERT_FILE = 351,
|
||||
VAR_CONTROL_KEY_FILE = 352,
|
||||
VAR_CONTROL_CERT_FILE = 353,
|
||||
VAR_CONTROL_USE_CERT = 354,
|
||||
VAR_EXTENDED_STATISTICS = 355,
|
||||
VAR_LOCAL_DATA_PTR = 356,
|
||||
VAR_JOSTLE_TIMEOUT = 357,
|
||||
VAR_STUB_PRIME = 358,
|
||||
VAR_UNWANTED_REPLY_THRESHOLD = 359,
|
||||
VAR_LOG_TIME_ASCII = 360,
|
||||
VAR_DOMAIN_INSECURE = 361,
|
||||
VAR_PYTHON = 362,
|
||||
VAR_PYTHON_SCRIPT = 363,
|
||||
VAR_VAL_SIG_SKEW_MIN = 364,
|
||||
VAR_VAL_SIG_SKEW_MAX = 365,
|
||||
VAR_CACHE_MIN_TTL = 366,
|
||||
VAR_VAL_LOG_LEVEL = 367,
|
||||
VAR_AUTO_TRUST_ANCHOR_FILE = 368,
|
||||
VAR_KEEP_MISSING = 369,
|
||||
VAR_ADD_HOLDDOWN = 370,
|
||||
VAR_DEL_HOLDDOWN = 371,
|
||||
VAR_SO_RCVBUF = 372,
|
||||
VAR_EDNS_BUFFER_SIZE = 373,
|
||||
VAR_PREFETCH = 374,
|
||||
VAR_PREFETCH_KEY = 375,
|
||||
VAR_SO_SNDBUF = 376,
|
||||
VAR_SO_REUSEPORT = 377,
|
||||
VAR_HARDEN_BELOW_NXDOMAIN = 378,
|
||||
VAR_IGNORE_CD_FLAG = 379,
|
||||
VAR_LOG_QUERIES = 380,
|
||||
VAR_TCP_UPSTREAM = 381,
|
||||
VAR_SSL_UPSTREAM = 382,
|
||||
VAR_SSL_SERVICE_KEY = 383,
|
||||
VAR_SSL_SERVICE_PEM = 384,
|
||||
VAR_SSL_PORT = 385,
|
||||
VAR_FORWARD_FIRST = 386,
|
||||
VAR_STUB_FIRST = 387,
|
||||
VAR_MINIMAL_RESPONSES = 388,
|
||||
VAR_RRSET_ROUNDROBIN = 389,
|
||||
VAR_MAX_UDP_SIZE = 390,
|
||||
VAR_DELAY_CLOSE = 391,
|
||||
VAR_UNBLOCK_LAN_ZONES = 392,
|
||||
VAR_INSECURE_LAN_ZONES = 393,
|
||||
VAR_INFRA_CACHE_MIN_RTT = 394,
|
||||
VAR_DNS64_PREFIX = 395,
|
||||
VAR_DNS64_SYNTHALL = 396,
|
||||
VAR_DNSTAP = 397,
|
||||
VAR_DNSTAP_ENABLE = 398,
|
||||
VAR_DNSTAP_SOCKET_PATH = 399,
|
||||
VAR_DNSTAP_SEND_IDENTITY = 400,
|
||||
VAR_DNSTAP_SEND_VERSION = 401,
|
||||
VAR_DNSTAP_IDENTITY = 402,
|
||||
VAR_DNSTAP_VERSION = 403,
|
||||
VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES = 404,
|
||||
VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES = 405,
|
||||
VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES = 406,
|
||||
VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES = 407,
|
||||
VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES = 408,
|
||||
VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES = 409,
|
||||
VAR_HARDEN_ALGO_DOWNGRADE = 410,
|
||||
VAR_IP_TRANSPARENT = 411,
|
||||
VAR_DISABLE_DNSSEC_LAME_CHECK = 412,
|
||||
VAR_RATELIMIT = 413,
|
||||
VAR_RATELIMIT_SLABS = 414,
|
||||
VAR_RATELIMIT_SIZE = 415,
|
||||
VAR_RATELIMIT_FOR_DOMAIN = 416,
|
||||
VAR_RATELIMIT_BELOW_DOMAIN = 417,
|
||||
VAR_RATELIMIT_FACTOR = 418,
|
||||
VAR_CAPS_WHITELIST = 419,
|
||||
VAR_CACHE_MAX_NEGATIVE_TTL = 420,
|
||||
VAR_PERMIT_SMALL_HOLDDOWN = 421,
|
||||
VAR_QNAME_MINIMISATION = 422,
|
||||
VAR_IP_FREEBIND = 423,
|
||||
VAR_DEFINE_TAG = 424,
|
||||
VAR_LOCAL_ZONE_TAG = 425,
|
||||
VAR_ACCESS_CONTROL_TAG = 426,
|
||||
VAR_LOCAL_ZONE_OVERRIDE = 427,
|
||||
VAR_ACCESS_CONTROL_TAG_ACTION = 428,
|
||||
VAR_ACCESS_CONTROL_TAG_DATA = 429
|
||||
};
|
||||
#endif
|
||||
/* Tokens. */
|
||||
@ -231,157 +236,162 @@ extern int yydebug;
|
||||
#define VAR_INTERFACE 271
|
||||
#define VAR_DO_IP4 272
|
||||
#define VAR_DO_IP6 273
|
||||
#define VAR_DO_UDP 274
|
||||
#define VAR_DO_TCP 275
|
||||
#define VAR_TCP_MSS 276
|
||||
#define VAR_OUTGOING_TCP_MSS 277
|
||||
#define VAR_CHROOT 278
|
||||
#define VAR_USERNAME 279
|
||||
#define VAR_DIRECTORY 280
|
||||
#define VAR_LOGFILE 281
|
||||
#define VAR_PIDFILE 282
|
||||
#define VAR_MSG_CACHE_SIZE 283
|
||||
#define VAR_MSG_CACHE_SLABS 284
|
||||
#define VAR_NUM_QUERIES_PER_THREAD 285
|
||||
#define VAR_RRSET_CACHE_SIZE 286
|
||||
#define VAR_RRSET_CACHE_SLABS 287
|
||||
#define VAR_OUTGOING_NUM_TCP 288
|
||||
#define VAR_INFRA_HOST_TTL 289
|
||||
#define VAR_INFRA_LAME_TTL 290
|
||||
#define VAR_INFRA_CACHE_SLABS 291
|
||||
#define VAR_INFRA_CACHE_NUMHOSTS 292
|
||||
#define VAR_INFRA_CACHE_LAME_SIZE 293
|
||||
#define VAR_NAME 294
|
||||
#define VAR_STUB_ZONE 295
|
||||
#define VAR_STUB_HOST 296
|
||||
#define VAR_STUB_ADDR 297
|
||||
#define VAR_TARGET_FETCH_POLICY 298
|
||||
#define VAR_HARDEN_SHORT_BUFSIZE 299
|
||||
#define VAR_HARDEN_LARGE_QUERIES 300
|
||||
#define VAR_FORWARD_ZONE 301
|
||||
#define VAR_FORWARD_HOST 302
|
||||
#define VAR_FORWARD_ADDR 303
|
||||
#define VAR_DO_NOT_QUERY_ADDRESS 304
|
||||
#define VAR_HIDE_IDENTITY 305
|
||||
#define VAR_HIDE_VERSION 306
|
||||
#define VAR_IDENTITY 307
|
||||
#define VAR_VERSION 308
|
||||
#define VAR_HARDEN_GLUE 309
|
||||
#define VAR_MODULE_CONF 310
|
||||
#define VAR_TRUST_ANCHOR_FILE 311
|
||||
#define VAR_TRUST_ANCHOR 312
|
||||
#define VAR_VAL_OVERRIDE_DATE 313
|
||||
#define VAR_BOGUS_TTL 314
|
||||
#define VAR_VAL_CLEAN_ADDITIONAL 315
|
||||
#define VAR_VAL_PERMISSIVE_MODE 316
|
||||
#define VAR_INCOMING_NUM_TCP 317
|
||||
#define VAR_MSG_BUFFER_SIZE 318
|
||||
#define VAR_KEY_CACHE_SIZE 319
|
||||
#define VAR_KEY_CACHE_SLABS 320
|
||||
#define VAR_TRUSTED_KEYS_FILE 321
|
||||
#define VAR_VAL_NSEC3_KEYSIZE_ITERATIONS 322
|
||||
#define VAR_USE_SYSLOG 323
|
||||
#define VAR_OUTGOING_INTERFACE 324
|
||||
#define VAR_ROOT_HINTS 325
|
||||
#define VAR_DO_NOT_QUERY_LOCALHOST 326
|
||||
#define VAR_CACHE_MAX_TTL 327
|
||||
#define VAR_HARDEN_DNSSEC_STRIPPED 328
|
||||
#define VAR_ACCESS_CONTROL 329
|
||||
#define VAR_LOCAL_ZONE 330
|
||||
#define VAR_LOCAL_DATA 331
|
||||
#define VAR_INTERFACE_AUTOMATIC 332
|
||||
#define VAR_STATISTICS_INTERVAL 333
|
||||
#define VAR_DO_DAEMONIZE 334
|
||||
#define VAR_USE_CAPS_FOR_ID 335
|
||||
#define VAR_STATISTICS_CUMULATIVE 336
|
||||
#define VAR_OUTGOING_PORT_PERMIT 337
|
||||
#define VAR_OUTGOING_PORT_AVOID 338
|
||||
#define VAR_DLV_ANCHOR_FILE 339
|
||||
#define VAR_DLV_ANCHOR 340
|
||||
#define VAR_NEG_CACHE_SIZE 341
|
||||
#define VAR_HARDEN_REFERRAL_PATH 342
|
||||
#define VAR_PRIVATE_ADDRESS 343
|
||||
#define VAR_PRIVATE_DOMAIN 344
|
||||
#define VAR_REMOTE_CONTROL 345
|
||||
#define VAR_CONTROL_ENABLE 346
|
||||
#define VAR_CONTROL_INTERFACE 347
|
||||
#define VAR_CONTROL_PORT 348
|
||||
#define VAR_SERVER_KEY_FILE 349
|
||||
#define VAR_SERVER_CERT_FILE 350
|
||||
#define VAR_CONTROL_KEY_FILE 351
|
||||
#define VAR_CONTROL_CERT_FILE 352
|
||||
#define VAR_CONTROL_USE_CERT 353
|
||||
#define VAR_EXTENDED_STATISTICS 354
|
||||
#define VAR_LOCAL_DATA_PTR 355
|
||||
#define VAR_JOSTLE_TIMEOUT 356
|
||||
#define VAR_STUB_PRIME 357
|
||||
#define VAR_UNWANTED_REPLY_THRESHOLD 358
|
||||
#define VAR_LOG_TIME_ASCII 359
|
||||
#define VAR_DOMAIN_INSECURE 360
|
||||
#define VAR_PYTHON 361
|
||||
#define VAR_PYTHON_SCRIPT 362
|
||||
#define VAR_VAL_SIG_SKEW_MIN 363
|
||||
#define VAR_VAL_SIG_SKEW_MAX 364
|
||||
#define VAR_CACHE_MIN_TTL 365
|
||||
#define VAR_VAL_LOG_LEVEL 366
|
||||
#define VAR_AUTO_TRUST_ANCHOR_FILE 367
|
||||
#define VAR_KEEP_MISSING 368
|
||||
#define VAR_ADD_HOLDDOWN 369
|
||||
#define VAR_DEL_HOLDDOWN 370
|
||||
#define VAR_SO_RCVBUF 371
|
||||
#define VAR_EDNS_BUFFER_SIZE 372
|
||||
#define VAR_PREFETCH 373
|
||||
#define VAR_PREFETCH_KEY 374
|
||||
#define VAR_SO_SNDBUF 375
|
||||
#define VAR_SO_REUSEPORT 376
|
||||
#define VAR_HARDEN_BELOW_NXDOMAIN 377
|
||||
#define VAR_IGNORE_CD_FLAG 378
|
||||
#define VAR_LOG_QUERIES 379
|
||||
#define VAR_TCP_UPSTREAM 380
|
||||
#define VAR_SSL_UPSTREAM 381
|
||||
#define VAR_SSL_SERVICE_KEY 382
|
||||
#define VAR_SSL_SERVICE_PEM 383
|
||||
#define VAR_SSL_PORT 384
|
||||
#define VAR_FORWARD_FIRST 385
|
||||
#define VAR_STUB_FIRST 386
|
||||
#define VAR_MINIMAL_RESPONSES 387
|
||||
#define VAR_RRSET_ROUNDROBIN 388
|
||||
#define VAR_MAX_UDP_SIZE 389
|
||||
#define VAR_DELAY_CLOSE 390
|
||||
#define VAR_UNBLOCK_LAN_ZONES 391
|
||||
#define VAR_INSECURE_LAN_ZONES 392
|
||||
#define VAR_INFRA_CACHE_MIN_RTT 393
|
||||
#define VAR_DNS64_PREFIX 394
|
||||
#define VAR_DNS64_SYNTHALL 395
|
||||
#define VAR_DNSTAP 396
|
||||
#define VAR_DNSTAP_ENABLE 397
|
||||
#define VAR_DNSTAP_SOCKET_PATH 398
|
||||
#define VAR_DNSTAP_SEND_IDENTITY 399
|
||||
#define VAR_DNSTAP_SEND_VERSION 400
|
||||
#define VAR_DNSTAP_IDENTITY 401
|
||||
#define VAR_DNSTAP_VERSION 402
|
||||
#define VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES 403
|
||||
#define VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES 404
|
||||
#define VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES 405
|
||||
#define VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES 406
|
||||
#define VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES 407
|
||||
#define VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES 408
|
||||
#define VAR_HARDEN_ALGO_DOWNGRADE 409
|
||||
#define VAR_IP_TRANSPARENT 410
|
||||
#define VAR_DISABLE_DNSSEC_LAME_CHECK 411
|
||||
#define VAR_RATELIMIT 412
|
||||
#define VAR_RATELIMIT_SLABS 413
|
||||
#define VAR_RATELIMIT_SIZE 414
|
||||
#define VAR_RATELIMIT_FOR_DOMAIN 415
|
||||
#define VAR_RATELIMIT_BELOW_DOMAIN 416
|
||||
#define VAR_RATELIMIT_FACTOR 417
|
||||
#define VAR_CAPS_WHITELIST 418
|
||||
#define VAR_CACHE_MAX_NEGATIVE_TTL 419
|
||||
#define VAR_PERMIT_SMALL_HOLDDOWN 420
|
||||
#define VAR_QNAME_MINIMISATION 421
|
||||
#define VAR_IP_FREEBIND 422
|
||||
#define VAR_DEFINE_TAG 423
|
||||
#define VAR_LOCAL_ZONE_TAG 424
|
||||
#define VAR_PREFER_IP6 274
|
||||
#define VAR_DO_UDP 275
|
||||
#define VAR_DO_TCP 276
|
||||
#define VAR_TCP_MSS 277
|
||||
#define VAR_OUTGOING_TCP_MSS 278
|
||||
#define VAR_CHROOT 279
|
||||
#define VAR_USERNAME 280
|
||||
#define VAR_DIRECTORY 281
|
||||
#define VAR_LOGFILE 282
|
||||
#define VAR_PIDFILE 283
|
||||
#define VAR_MSG_CACHE_SIZE 284
|
||||
#define VAR_MSG_CACHE_SLABS 285
|
||||
#define VAR_NUM_QUERIES_PER_THREAD 286
|
||||
#define VAR_RRSET_CACHE_SIZE 287
|
||||
#define VAR_RRSET_CACHE_SLABS 288
|
||||
#define VAR_OUTGOING_NUM_TCP 289
|
||||
#define VAR_INFRA_HOST_TTL 290
|
||||
#define VAR_INFRA_LAME_TTL 291
|
||||
#define VAR_INFRA_CACHE_SLABS 292
|
||||
#define VAR_INFRA_CACHE_NUMHOSTS 293
|
||||
#define VAR_INFRA_CACHE_LAME_SIZE 294
|
||||
#define VAR_NAME 295
|
||||
#define VAR_STUB_ZONE 296
|
||||
#define VAR_STUB_HOST 297
|
||||
#define VAR_STUB_ADDR 298
|
||||
#define VAR_TARGET_FETCH_POLICY 299
|
||||
#define VAR_HARDEN_SHORT_BUFSIZE 300
|
||||
#define VAR_HARDEN_LARGE_QUERIES 301
|
||||
#define VAR_FORWARD_ZONE 302
|
||||
#define VAR_FORWARD_HOST 303
|
||||
#define VAR_FORWARD_ADDR 304
|
||||
#define VAR_DO_NOT_QUERY_ADDRESS 305
|
||||
#define VAR_HIDE_IDENTITY 306
|
||||
#define VAR_HIDE_VERSION 307
|
||||
#define VAR_IDENTITY 308
|
||||
#define VAR_VERSION 309
|
||||
#define VAR_HARDEN_GLUE 310
|
||||
#define VAR_MODULE_CONF 311
|
||||
#define VAR_TRUST_ANCHOR_FILE 312
|
||||
#define VAR_TRUST_ANCHOR 313
|
||||
#define VAR_VAL_OVERRIDE_DATE 314
|
||||
#define VAR_BOGUS_TTL 315
|
||||
#define VAR_VAL_CLEAN_ADDITIONAL 316
|
||||
#define VAR_VAL_PERMISSIVE_MODE 317
|
||||
#define VAR_INCOMING_NUM_TCP 318
|
||||
#define VAR_MSG_BUFFER_SIZE 319
|
||||
#define VAR_KEY_CACHE_SIZE 320
|
||||
#define VAR_KEY_CACHE_SLABS 321
|
||||
#define VAR_TRUSTED_KEYS_FILE 322
|
||||
#define VAR_VAL_NSEC3_KEYSIZE_ITERATIONS 323
|
||||
#define VAR_USE_SYSLOG 324
|
||||
#define VAR_OUTGOING_INTERFACE 325
|
||||
#define VAR_ROOT_HINTS 326
|
||||
#define VAR_DO_NOT_QUERY_LOCALHOST 327
|
||||
#define VAR_CACHE_MAX_TTL 328
|
||||
#define VAR_HARDEN_DNSSEC_STRIPPED 329
|
||||
#define VAR_ACCESS_CONTROL 330
|
||||
#define VAR_LOCAL_ZONE 331
|
||||
#define VAR_LOCAL_DATA 332
|
||||
#define VAR_INTERFACE_AUTOMATIC 333
|
||||
#define VAR_STATISTICS_INTERVAL 334
|
||||
#define VAR_DO_DAEMONIZE 335
|
||||
#define VAR_USE_CAPS_FOR_ID 336
|
||||
#define VAR_STATISTICS_CUMULATIVE 337
|
||||
#define VAR_OUTGOING_PORT_PERMIT 338
|
||||
#define VAR_OUTGOING_PORT_AVOID 339
|
||||
#define VAR_DLV_ANCHOR_FILE 340
|
||||
#define VAR_DLV_ANCHOR 341
|
||||
#define VAR_NEG_CACHE_SIZE 342
|
||||
#define VAR_HARDEN_REFERRAL_PATH 343
|
||||
#define VAR_PRIVATE_ADDRESS 344
|
||||
#define VAR_PRIVATE_DOMAIN 345
|
||||
#define VAR_REMOTE_CONTROL 346
|
||||
#define VAR_CONTROL_ENABLE 347
|
||||
#define VAR_CONTROL_INTERFACE 348
|
||||
#define VAR_CONTROL_PORT 349
|
||||
#define VAR_SERVER_KEY_FILE 350
|
||||
#define VAR_SERVER_CERT_FILE 351
|
||||
#define VAR_CONTROL_KEY_FILE 352
|
||||
#define VAR_CONTROL_CERT_FILE 353
|
||||
#define VAR_CONTROL_USE_CERT 354
|
||||
#define VAR_EXTENDED_STATISTICS 355
|
||||
#define VAR_LOCAL_DATA_PTR 356
|
||||
#define VAR_JOSTLE_TIMEOUT 357
|
||||
#define VAR_STUB_PRIME 358
|
||||
#define VAR_UNWANTED_REPLY_THRESHOLD 359
|
||||
#define VAR_LOG_TIME_ASCII 360
|
||||
#define VAR_DOMAIN_INSECURE 361
|
||||
#define VAR_PYTHON 362
|
||||
#define VAR_PYTHON_SCRIPT 363
|
||||
#define VAR_VAL_SIG_SKEW_MIN 364
|
||||
#define VAR_VAL_SIG_SKEW_MAX 365
|
||||
#define VAR_CACHE_MIN_TTL 366
|
||||
#define VAR_VAL_LOG_LEVEL 367
|
||||
#define VAR_AUTO_TRUST_ANCHOR_FILE 368
|
||||
#define VAR_KEEP_MISSING 369
|
||||
#define VAR_ADD_HOLDDOWN 370
|
||||
#define VAR_DEL_HOLDDOWN 371
|
||||
#define VAR_SO_RCVBUF 372
|
||||
#define VAR_EDNS_BUFFER_SIZE 373
|
||||
#define VAR_PREFETCH 374
|
||||
#define VAR_PREFETCH_KEY 375
|
||||
#define VAR_SO_SNDBUF 376
|
||||
#define VAR_SO_REUSEPORT 377
|
||||
#define VAR_HARDEN_BELOW_NXDOMAIN 378
|
||||
#define VAR_IGNORE_CD_FLAG 379
|
||||
#define VAR_LOG_QUERIES 380
|
||||
#define VAR_TCP_UPSTREAM 381
|
||||
#define VAR_SSL_UPSTREAM 382
|
||||
#define VAR_SSL_SERVICE_KEY 383
|
||||
#define VAR_SSL_SERVICE_PEM 384
|
||||
#define VAR_SSL_PORT 385
|
||||
#define VAR_FORWARD_FIRST 386
|
||||
#define VAR_STUB_FIRST 387
|
||||
#define VAR_MINIMAL_RESPONSES 388
|
||||
#define VAR_RRSET_ROUNDROBIN 389
|
||||
#define VAR_MAX_UDP_SIZE 390
|
||||
#define VAR_DELAY_CLOSE 391
|
||||
#define VAR_UNBLOCK_LAN_ZONES 392
|
||||
#define VAR_INSECURE_LAN_ZONES 393
|
||||
#define VAR_INFRA_CACHE_MIN_RTT 394
|
||||
#define VAR_DNS64_PREFIX 395
|
||||
#define VAR_DNS64_SYNTHALL 396
|
||||
#define VAR_DNSTAP 397
|
||||
#define VAR_DNSTAP_ENABLE 398
|
||||
#define VAR_DNSTAP_SOCKET_PATH 399
|
||||
#define VAR_DNSTAP_SEND_IDENTITY 400
|
||||
#define VAR_DNSTAP_SEND_VERSION 401
|
||||
#define VAR_DNSTAP_IDENTITY 402
|
||||
#define VAR_DNSTAP_VERSION 403
|
||||
#define VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES 404
|
||||
#define VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES 405
|
||||
#define VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES 406
|
||||
#define VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES 407
|
||||
#define VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES 408
|
||||
#define VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES 409
|
||||
#define VAR_HARDEN_ALGO_DOWNGRADE 410
|
||||
#define VAR_IP_TRANSPARENT 411
|
||||
#define VAR_DISABLE_DNSSEC_LAME_CHECK 412
|
||||
#define VAR_RATELIMIT 413
|
||||
#define VAR_RATELIMIT_SLABS 414
|
||||
#define VAR_RATELIMIT_SIZE 415
|
||||
#define VAR_RATELIMIT_FOR_DOMAIN 416
|
||||
#define VAR_RATELIMIT_BELOW_DOMAIN 417
|
||||
#define VAR_RATELIMIT_FACTOR 418
|
||||
#define VAR_CAPS_WHITELIST 419
|
||||
#define VAR_CACHE_MAX_NEGATIVE_TTL 420
|
||||
#define VAR_PERMIT_SMALL_HOLDDOWN 421
|
||||
#define VAR_QNAME_MINIMISATION 422
|
||||
#define VAR_IP_FREEBIND 423
|
||||
#define VAR_DEFINE_TAG 424
|
||||
#define VAR_LOCAL_ZONE_TAG 425
|
||||
#define VAR_ACCESS_CONTROL_TAG 426
|
||||
#define VAR_LOCAL_ZONE_OVERRIDE 427
|
||||
#define VAR_ACCESS_CONTROL_TAG_ACTION 428
|
||||
#define VAR_ACCESS_CONTROL_TAG_DATA 429
|
||||
|
||||
/* Value type. */
|
||||
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
|
||||
@ -392,7 +402,7 @@ union YYSTYPE
|
||||
|
||||
char* str;
|
||||
|
||||
#line 396 "util/configparser.h" /* yacc.c:1909 */
|
||||
#line 406 "util/configparser.h" /* yacc.c:1909 */
|
||||
};
|
||||
|
||||
typedef union YYSTYPE YYSTYPE;
|
||||
|
@ -69,7 +69,7 @@ extern struct config_parser_state* cfg_parser;
|
||||
%token <str> STRING_ARG
|
||||
%token VAR_SERVER VAR_VERBOSITY VAR_NUM_THREADS VAR_PORT
|
||||
%token VAR_OUTGOING_RANGE VAR_INTERFACE
|
||||
%token VAR_DO_IP4 VAR_DO_IP6 VAR_DO_UDP VAR_DO_TCP
|
||||
%token VAR_DO_IP4 VAR_DO_IP6 VAR_PREFER_IP6 VAR_DO_UDP VAR_DO_TCP
|
||||
%token VAR_TCP_MSS VAR_OUTGOING_TCP_MSS
|
||||
%token VAR_CHROOT VAR_USERNAME VAR_DIRECTORY VAR_LOGFILE VAR_PIDFILE
|
||||
%token VAR_MSG_CACHE_SIZE VAR_MSG_CACHE_SLABS VAR_NUM_QUERIES_PER_THREAD
|
||||
@ -126,6 +126,8 @@ extern struct config_parser_state* cfg_parser;
|
||||
%token VAR_RATELIMIT_FOR_DOMAIN VAR_RATELIMIT_BELOW_DOMAIN VAR_RATELIMIT_FACTOR
|
||||
%token VAR_CAPS_WHITELIST VAR_CACHE_MAX_NEGATIVE_TTL VAR_PERMIT_SMALL_HOLDDOWN
|
||||
%token VAR_QNAME_MINIMISATION VAR_IP_FREEBIND VAR_DEFINE_TAG VAR_LOCAL_ZONE_TAG
|
||||
%token VAR_ACCESS_CONTROL_TAG VAR_LOCAL_ZONE_OVERRIDE
|
||||
%token VAR_ACCESS_CONTROL_TAG_ACTION VAR_ACCESS_CONTROL_TAG_DATA
|
||||
|
||||
%%
|
||||
toplevelvars: /* empty */ | toplevelvars toplevelvar ;
|
||||
@ -144,7 +146,8 @@ contents_server: contents_server content_server
|
||||
| ;
|
||||
content_server: server_num_threads | server_verbosity | server_port |
|
||||
server_outgoing_range | server_do_ip4 |
|
||||
server_do_ip6 | server_do_udp | server_do_tcp |
|
||||
server_do_ip6 | server_prefer_ip6 |
|
||||
server_do_udp | server_do_tcp |
|
||||
server_tcp_mss | server_outgoing_tcp_mss |
|
||||
server_interface | server_chroot | server_username |
|
||||
server_directory | server_logfile | server_pidfile |
|
||||
@ -194,7 +197,9 @@ content_server: server_num_threads | server_verbosity | server_port |
|
||||
server_caps_whitelist | server_cache_max_negative_ttl |
|
||||
server_permit_small_holddown | server_qname_minimisation |
|
||||
server_ip_freebind | server_define_tag | server_local_zone_tag |
|
||||
server_disable_dnssec_lame_check
|
||||
server_disable_dnssec_lame_check | server_access_control_tag |
|
||||
server_local_zone_override | server_access_control_tag_action |
|
||||
server_access_control_tag_data
|
||||
;
|
||||
stubstart: VAR_STUB_ZONE
|
||||
{
|
||||
@ -402,6 +407,15 @@ server_do_tcp: VAR_DO_TCP STRING_ARG
|
||||
free($2);
|
||||
}
|
||||
;
|
||||
server_prefer_ip6: VAR_PREFER_IP6 STRING_ARG
|
||||
{
|
||||
OUTYY(("P(server_prefer_ip6:%s)\n", $2));
|
||||
if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
|
||||
yyerror("expected yes or no.");
|
||||
else cfg_parser->cfg->prefer_ip6 = (strcmp($2, "yes")==0);
|
||||
free($2);
|
||||
}
|
||||
;
|
||||
server_tcp_mss: VAR_TCP_MSS STRING_ARG
|
||||
{
|
||||
OUTYY(("P(server_tcp_mss:%s)\n", $2));
|
||||
@ -521,6 +535,23 @@ server_directory: VAR_DIRECTORY STRING_ARG
|
||||
OUTYY(("P(server_directory:%s)\n", $2));
|
||||
free(cfg_parser->cfg->directory);
|
||||
cfg_parser->cfg->directory = $2;
|
||||
/* change there right away for includes relative to this */
|
||||
if($2[0]) {
|
||||
char* d;
|
||||
#ifdef UB_ON_WINDOWS
|
||||
w_config_adjust_directory(cfg_parser->cfg);
|
||||
#endif
|
||||
d = cfg_parser->cfg->directory;
|
||||
/* adjust directory if we have already chroot,
|
||||
* like, we reread after sighup */
|
||||
if(cfg_parser->chroot && cfg_parser->chroot[0] &&
|
||||
strncmp(d, cfg_parser->chroot, strlen(
|
||||
cfg_parser->chroot)) == 0)
|
||||
d += strlen(cfg_parser->chroot);
|
||||
if(chdir(d))
|
||||
log_err("cannot chdir to directory: %s (%s)",
|
||||
d, strerror(errno));
|
||||
}
|
||||
}
|
||||
;
|
||||
server_logfile: VAR_LOGFILE STRING_ARG
|
||||
@ -1216,12 +1247,16 @@ server_local_zone: VAR_LOCAL_ZONE STRING_ARG STRING_ARG
|
||||
if(strcmp($3, "static")!=0 && strcmp($3, "deny")!=0 &&
|
||||
strcmp($3, "refuse")!=0 && strcmp($3, "redirect")!=0 &&
|
||||
strcmp($3, "transparent")!=0 && strcmp($3, "nodefault")!=0
|
||||
&& strcmp($3, "typetransparent")!=0 &&
|
||||
strcmp($3, "inform")!=0 && strcmp($3, "inform_deny")!=0)
|
||||
&& strcmp($3, "typetransparent")!=0
|
||||
&& strcmp($3, "always_transparent")!=0
|
||||
&& strcmp($3, "always_refuse")!=0
|
||||
&& strcmp($3, "always_nxdomain")!=0
|
||||
&& strcmp($3, "inform")!=0 && strcmp($3, "inform_deny")!=0)
|
||||
yyerror("local-zone type: expected static, deny, "
|
||||
"refuse, redirect, transparent, "
|
||||
"typetransparent, inform, inform_deny "
|
||||
"or nodefault");
|
||||
"typetransparent, inform, inform_deny, "
|
||||
"always_transparent, always_refuse, "
|
||||
"always_nxdomain or nodefault");
|
||||
else if(strcmp($3, "nodefault")==0) {
|
||||
if(!cfg_strlist_insert(&cfg_parser->cfg->
|
||||
local_zones_nodefault, $2))
|
||||
@ -1332,6 +1367,61 @@ server_local_zone_tag: VAR_LOCAL_ZONE_TAG STRING_ARG STRING_ARG
|
||||
}
|
||||
}
|
||||
;
|
||||
server_access_control_tag: VAR_ACCESS_CONTROL_TAG STRING_ARG STRING_ARG
|
||||
{
|
||||
size_t len = 0;
|
||||
uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, $3,
|
||||
&len);
|
||||
free($3);
|
||||
OUTYY(("P(server_access_control_tag:%s)\n", $2));
|
||||
if(!bitlist)
|
||||
yyerror("could not parse tags, (define-tag them first)");
|
||||
if(bitlist) {
|
||||
if(!cfg_strbytelist_insert(
|
||||
&cfg_parser->cfg->acl_tags,
|
||||
$2, bitlist, len)) {
|
||||
yyerror("out of memory");
|
||||
free($2);
|
||||
}
|
||||
}
|
||||
}
|
||||
;
|
||||
server_access_control_tag_action: VAR_ACCESS_CONTROL_TAG_ACTION STRING_ARG STRING_ARG STRING_ARG
|
||||
{
|
||||
OUTYY(("P(server_access_control_tag_action:%s %s %s)\n", $2, $3, $4));
|
||||
if(!cfg_str3list_insert(&cfg_parser->cfg->acl_tag_actions,
|
||||
$2, $3, $4)) {
|
||||
yyerror("out of memory");
|
||||
free($2);
|
||||
free($3);
|
||||
free($4);
|
||||
}
|
||||
}
|
||||
;
|
||||
server_access_control_tag_data: VAR_ACCESS_CONTROL_TAG_DATA STRING_ARG STRING_ARG STRING_ARG
|
||||
{
|
||||
OUTYY(("P(server_access_control_tag_data:%s %s %s)\n", $2, $3, $4));
|
||||
if(!cfg_str3list_insert(&cfg_parser->cfg->acl_tag_datas,
|
||||
$2, $3, $4)) {
|
||||
yyerror("out of memory");
|
||||
free($2);
|
||||
free($3);
|
||||
free($4);
|
||||
}
|
||||
}
|
||||
;
|
||||
server_local_zone_override: VAR_LOCAL_ZONE_OVERRIDE STRING_ARG STRING_ARG STRING_ARG
|
||||
{
|
||||
OUTYY(("P(server_local_zone_override:%s %s %s)\n", $2, $3, $4));
|
||||
if(!cfg_str3list_insert(&cfg_parser->cfg->local_zone_overrides,
|
||||
$2, $3, $4)) {
|
||||
yyerror("out of memory");
|
||||
free($2);
|
||||
free($3);
|
||||
free($4);
|
||||
}
|
||||
}
|
||||
;
|
||||
server_ratelimit: VAR_RATELIMIT STRING_ARG
|
||||
{
|
||||
OUTYY(("P(server_ratelimit:%s)\n", $2));
|
||||
|
@ -1186,6 +1186,7 @@
|
||||
1525,
|
||||
1526,
|
||||
1527,
|
||||
1528,
|
||||
1529,
|
||||
1530,
|
||||
1531,
|
||||
@ -4526,7 +4527,6 @@
|
||||
6786,
|
||||
6787,
|
||||
6788,
|
||||
6789,
|
||||
6790,
|
||||
6791,
|
||||
6801,
|
||||
@ -5425,6 +5425,7 @@
|
||||
44900,
|
||||
45000,
|
||||
45054,
|
||||
45514,
|
||||
45678,
|
||||
45825,
|
||||
45966,
|
||||
|
@ -783,7 +783,7 @@ void* outgoing_ssl_fd(void* sslctx, int fd)
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined(HAVE_SSL) && defined(OPENSSL_THREADS) && !defined(THREADS_DISABLED) && defined(CRYPTO_LOCK)
|
||||
#if defined(HAVE_SSL) && defined(OPENSSL_THREADS) && !defined(THREADS_DISABLED) && defined(CRYPTO_LOCK) && OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||
/** global lock list for openssl locks */
|
||||
static lock_basic_t *ub_openssl_locks = NULL;
|
||||
|
||||
@ -808,7 +808,7 @@ ub_crypto_lock_cb(int mode, int type, const char *ATTR_UNUSED(file),
|
||||
|
||||
int ub_openssl_lock_init(void)
|
||||
{
|
||||
#if defined(HAVE_SSL) && defined(OPENSSL_THREADS) && !defined(THREADS_DISABLED) && defined(CRYPTO_LOCK)
|
||||
#if defined(HAVE_SSL) && defined(OPENSSL_THREADS) && !defined(THREADS_DISABLED) && defined(CRYPTO_LOCK) && OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||
int i;
|
||||
ub_openssl_locks = (lock_basic_t*)reallocarray(
|
||||
NULL, (size_t)CRYPTO_num_locks(), sizeof(lock_basic_t));
|
||||
@ -825,7 +825,7 @@ int ub_openssl_lock_init(void)
|
||||
|
||||
void ub_openssl_lock_delete(void)
|
||||
{
|
||||
#if defined(HAVE_SSL) && defined(OPENSSL_THREADS) && !defined(THREADS_DISABLED) && defined(CRYPTO_LOCK)
|
||||
#if defined(HAVE_SSL) && defined(OPENSSL_THREADS) && !defined(THREADS_DISABLED) && defined(CRYPTO_LOCK) && OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||
int i;
|
||||
if(!ub_openssl_locks)
|
||||
return;
|
||||
|
110
util/netevent.c
110
util/netevent.c
@ -80,8 +80,10 @@
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/** The TCP reading or writing query timeout in seconds */
|
||||
#define TCP_QUERY_TIMEOUT 120
|
||||
/** The TCP reading or writing query timeout in milliseconds */
|
||||
#define TCP_QUERY_TIMEOUT 120000
|
||||
/** The TCP timeout in msec for fast queries, above half are used */
|
||||
#define TCP_QUERY_TIMEOUT_FAST 200
|
||||
|
||||
#ifndef NONBLOCKING_IS_BROKEN
|
||||
/** number of UDP reads to perform per read indication from select */
|
||||
@ -710,14 +712,20 @@ comm_point_udp_callback(int fd, short event, void* arg)
|
||||
|
||||
/** Use a new tcp handler for new query fd, set to read query */
|
||||
static void
|
||||
setup_tcp_handler(struct comm_point* c, int fd)
|
||||
setup_tcp_handler(struct comm_point* c, int fd, int cur, int max)
|
||||
{
|
||||
log_assert(c->type == comm_tcp);
|
||||
log_assert(c->fd == -1);
|
||||
sldns_buffer_clear(c->buffer);
|
||||
c->tcp_is_reading = 1;
|
||||
c->tcp_byte_count = 0;
|
||||
comm_point_start_listening(c, fd, TCP_QUERY_TIMEOUT);
|
||||
c->tcp_timeout_msec = TCP_QUERY_TIMEOUT;
|
||||
/* if more than half the tcp handlers are in use, use a shorter
|
||||
* timeout for this TCP connection, we need to make space for
|
||||
* other connections to be able to get attention */
|
||||
if(cur > max/2)
|
||||
c->tcp_timeout_msec = TCP_QUERY_TIMEOUT_FAST;
|
||||
comm_point_start_listening(c, fd, c->tcp_timeout_msec);
|
||||
}
|
||||
|
||||
void comm_base_handle_slow_accept(int ATTR_UNUSED(fd),
|
||||
@ -769,7 +777,7 @@ int comm_point_perform_accept(struct comm_point* c,
|
||||
(*b->stop_accept)(b->cb_arg);
|
||||
/* set timeout, no mallocs */
|
||||
tv.tv_sec = NETEVENT_SLOW_ACCEPT_TIME/1000;
|
||||
tv.tv_usec = NETEVENT_SLOW_ACCEPT_TIME%1000;
|
||||
tv.tv_usec = (NETEVENT_SLOW_ACCEPT_TIME%1000)*1000;
|
||||
b->eb->slow_accept = ub_event_new(b->eb->base,
|
||||
-1, UB_EV_TIMEOUT,
|
||||
comm_base_handle_slow_accept, b);
|
||||
@ -862,6 +870,7 @@ comm_point_tcp_accept_callback(int fd, short event, void* arg)
|
||||
/* accept incoming connection. */
|
||||
c_hdl = c->tcp_free;
|
||||
log_assert(fd != -1);
|
||||
(void)fd;
|
||||
new_fd = comm_point_perform_accept(c, &c_hdl->repinfo.addr,
|
||||
&c_hdl->repinfo.addrlen);
|
||||
if(new_fd == -1)
|
||||
@ -886,7 +895,7 @@ comm_point_tcp_accept_callback(int fd, short event, void* arg)
|
||||
/* stop accepting incoming queries for now. */
|
||||
comm_point_stop_listening(c);
|
||||
}
|
||||
setup_tcp_handler(c_hdl, new_fd);
|
||||
setup_tcp_handler(c_hdl, new_fd, c->cur_tcp_count, c->max_tcp_count);
|
||||
}
|
||||
|
||||
/** Make tcp handler free for next assignment */
|
||||
@ -940,7 +949,7 @@ tcp_callback_reader(struct comm_point* c)
|
||||
comm_point_stop_listening(c);
|
||||
fptr_ok(fptr_whitelist_comm_point(c->callback));
|
||||
if( (*c->callback)(c, c->cb_arg, NETEVENT_NOERROR, &c->repinfo) ) {
|
||||
comm_point_start_listening(c, -1, TCP_QUERY_TIMEOUT);
|
||||
comm_point_start_listening(c, -1, c->tcp_timeout_msec);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1348,6 +1357,59 @@ comm_point_tcp_handle_write(int fd, struct comm_point* c)
|
||||
if(c->ssl)
|
||||
return ssl_handle_it(c);
|
||||
|
||||
#ifdef USE_MSG_FASTOPEN
|
||||
/* Only try this on first use of a connection that uses tfo,
|
||||
otherwise fall through to normal write */
|
||||
/* Also, TFO support on WINDOWS not implemented at the moment */
|
||||
if(c->tcp_do_fastopen == 1) {
|
||||
/* this form of sendmsg() does both a connect() and send() so need to
|
||||
look for various flavours of error*/
|
||||
uint16_t len = htons(sldns_buffer_limit(c->buffer));
|
||||
struct msghdr msg;
|
||||
struct iovec iov[2];
|
||||
c->tcp_do_fastopen = 0;
|
||||
memset(&msg, 0, sizeof(msg));
|
||||
iov[0].iov_base = (uint8_t*)&len + c->tcp_byte_count;
|
||||
iov[0].iov_len = sizeof(uint16_t) - c->tcp_byte_count;
|
||||
iov[1].iov_base = sldns_buffer_begin(c->buffer);
|
||||
iov[1].iov_len = sldns_buffer_limit(c->buffer);
|
||||
log_assert(iov[0].iov_len > 0);
|
||||
log_assert(iov[1].iov_len > 0);
|
||||
msg.msg_name = &c->repinfo.addr;
|
||||
msg.msg_namelen = c->repinfo.addrlen;
|
||||
msg.msg_iov = iov;
|
||||
msg.msg_iovlen = 2;
|
||||
r = sendmsg(fd, &msg, MSG_FASTOPEN);
|
||||
if (r == -1) {
|
||||
#if defined(EINPROGRESS) && defined(EWOULDBLOCK)
|
||||
/* Handshake is underway, maybe because no TFO cookie available.
|
||||
Come back to write the messsage*/
|
||||
if(errno == EINPROGRESS || errno == EWOULDBLOCK)
|
||||
return 1;
|
||||
#endif
|
||||
if(errno == EINTR || errno == EAGAIN)
|
||||
return 1;
|
||||
/* Not handling EISCONN here as shouldn't ever hit that case.*/
|
||||
if(errno != 0 && verbosity < 2)
|
||||
return 0; /* silence lots of chatter in the logs */
|
||||
else if(errno != 0)
|
||||
log_err_addr("tcp sendmsg", strerror(errno),
|
||||
&c->repinfo.addr, c->repinfo.addrlen);
|
||||
return 0;
|
||||
} else {
|
||||
c->tcp_byte_count += r;
|
||||
if(c->tcp_byte_count < sizeof(uint16_t))
|
||||
return 1;
|
||||
sldns_buffer_set_position(c->buffer, c->tcp_byte_count -
|
||||
sizeof(uint16_t));
|
||||
if(sldns_buffer_remaining(c->buffer) == 0) {
|
||||
tcp_callback_writer(c);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* USE_MSG_FASTOPEN */
|
||||
|
||||
if(c->tcp_byte_count < sizeof(uint16_t)) {
|
||||
uint16_t len = htons(sldns_buffer_limit(c->buffer));
|
||||
#ifdef HAVE_WRITEV
|
||||
@ -1540,6 +1602,9 @@ comm_point_create_udp(struct comm_base *base, int fd, sldns_buffer* buffer,
|
||||
c->do_not_close = 0;
|
||||
c->tcp_do_toggle_rw = 0;
|
||||
c->tcp_check_nb_connect = 0;
|
||||
#ifdef USE_MSG_FASTOPEN
|
||||
c->tcp_do_fastopen = 0;
|
||||
#endif
|
||||
c->inuse = 0;
|
||||
c->callback = callback;
|
||||
c->cb_arg = callback_arg;
|
||||
@ -1593,6 +1658,9 @@ comm_point_create_udp_ancil(struct comm_base *base, int fd,
|
||||
c->inuse = 0;
|
||||
c->tcp_do_toggle_rw = 0;
|
||||
c->tcp_check_nb_connect = 0;
|
||||
#ifdef USE_MSG_FASTOPEN
|
||||
c->tcp_do_fastopen = 0;
|
||||
#endif
|
||||
c->callback = callback;
|
||||
c->cb_arg = callback_arg;
|
||||
evbits = UB_EV_READ | UB_EV_PERSIST;
|
||||
@ -1655,6 +1723,9 @@ comm_point_create_tcp_handler(struct comm_base *base,
|
||||
c->do_not_close = 0;
|
||||
c->tcp_do_toggle_rw = 1;
|
||||
c->tcp_check_nb_connect = 0;
|
||||
#ifdef USE_MSG_FASTOPEN
|
||||
c->tcp_do_fastopen = 0;
|
||||
#endif
|
||||
c->repinfo.c = c;
|
||||
c->callback = callback;
|
||||
c->cb_arg = callback_arg;
|
||||
@ -1715,6 +1786,9 @@ comm_point_create_tcp(struct comm_base *base, int fd, int num, size_t bufsize,
|
||||
c->do_not_close = 0;
|
||||
c->tcp_do_toggle_rw = 0;
|
||||
c->tcp_check_nb_connect = 0;
|
||||
#ifdef USE_MSG_FASTOPEN
|
||||
c->tcp_do_fastopen = 0;
|
||||
#endif
|
||||
c->callback = NULL;
|
||||
c->cb_arg = NULL;
|
||||
evbits = UB_EV_READ | UB_EV_PERSIST;
|
||||
@ -1780,6 +1854,9 @@ comm_point_create_tcp_out(struct comm_base *base, size_t bufsize,
|
||||
c->do_not_close = 0;
|
||||
c->tcp_do_toggle_rw = 1;
|
||||
c->tcp_check_nb_connect = 1;
|
||||
#ifdef USE_MSG_FASTOPEN
|
||||
c->tcp_do_fastopen = 1;
|
||||
#endif
|
||||
c->repinfo.c = c;
|
||||
c->callback = callback;
|
||||
c->cb_arg = callback_arg;
|
||||
@ -1834,6 +1911,9 @@ comm_point_create_local(struct comm_base *base, int fd, size_t bufsize,
|
||||
c->do_not_close = 1;
|
||||
c->tcp_do_toggle_rw = 0;
|
||||
c->tcp_check_nb_connect = 0;
|
||||
#ifdef USE_MSG_FASTOPEN
|
||||
c->tcp_do_fastopen = 0;
|
||||
#endif
|
||||
c->callback = callback;
|
||||
c->cb_arg = callback_arg;
|
||||
/* ub_event stuff */
|
||||
@ -1887,6 +1967,9 @@ comm_point_create_raw(struct comm_base* base, int fd, int writing,
|
||||
c->do_not_close = 1;
|
||||
c->tcp_do_toggle_rw = 0;
|
||||
c->tcp_check_nb_connect = 0;
|
||||
#ifdef USE_MSG_FASTOPEN
|
||||
c->tcp_do_fastopen = 0;
|
||||
#endif
|
||||
c->callback = callback;
|
||||
c->cb_arg = callback_arg;
|
||||
/* ub_event stuff */
|
||||
@ -1983,7 +2066,8 @@ comm_point_send_reply(struct comm_reply *repinfo)
|
||||
dt_msg_send_client_response(repinfo->c->tcp_parent->dtenv,
|
||||
&repinfo->addr, repinfo->c->type, repinfo->c->buffer);
|
||||
#endif
|
||||
comm_point_start_listening(repinfo->c, -1, TCP_QUERY_TIMEOUT);
|
||||
comm_point_start_listening(repinfo->c, -1,
|
||||
repinfo->c->tcp_timeout_msec);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2009,7 +2093,7 @@ comm_point_stop_listening(struct comm_point* c)
|
||||
}
|
||||
|
||||
void
|
||||
comm_point_start_listening(struct comm_point* c, int newfd, int sec)
|
||||
comm_point_start_listening(struct comm_point* c, int newfd, int msec)
|
||||
{
|
||||
verbose(VERB_ALGO, "comm point start listening %d",
|
||||
c->fd==-1?newfd:c->fd);
|
||||
@ -2017,7 +2101,7 @@ comm_point_start_listening(struct comm_point* c, int newfd, int sec)
|
||||
/* no use to start listening no free slots. */
|
||||
return;
|
||||
}
|
||||
if(sec != -1 && sec != 0) {
|
||||
if(msec != -1 && msec != 0) {
|
||||
if(!c->timeout) {
|
||||
c->timeout = (struct timeval*)malloc(sizeof(
|
||||
struct timeval));
|
||||
@ -2028,8 +2112,8 @@ comm_point_start_listening(struct comm_point* c, int newfd, int sec)
|
||||
}
|
||||
ub_event_add_bits(c->ev->ev, UB_EV_TIMEOUT);
|
||||
#ifndef S_SPLINT_S /* splint fails on struct timeval. */
|
||||
c->timeout->tv_sec = sec;
|
||||
c->timeout->tv_usec = 0;
|
||||
c->timeout->tv_sec = msec/1000;
|
||||
c->timeout->tv_usec = (msec%1000)*1000;
|
||||
#endif /* S_SPLINT_S */
|
||||
}
|
||||
if(c->type == comm_tcp) {
|
||||
@ -2049,7 +2133,7 @@ comm_point_start_listening(struct comm_point* c, int newfd, int sec)
|
||||
c->fd = newfd;
|
||||
ub_event_set_fd(c->ev->ev, c->fd);
|
||||
}
|
||||
if(ub_event_add(c->ev->ev, sec==0?NULL:c->timeout) != 0) {
|
||||
if(ub_event_add(c->ev->ev, msec==0?NULL:c->timeout) != 0) {
|
||||
log_err("event_add failed. in cpsl.");
|
||||
}
|
||||
}
|
||||
|
@ -225,9 +225,17 @@ struct comm_point {
|
||||
So that when that is done the callback is called. */
|
||||
int tcp_do_toggle_rw;
|
||||
|
||||
/** timeout in msec for TCP wait times for this connection */
|
||||
int tcp_timeout_msec;
|
||||
|
||||
/** if set, checks for pending error from nonblocking connect() call.*/
|
||||
int tcp_check_nb_connect;
|
||||
|
||||
#ifdef USE_MSG_FASTOPEN
|
||||
/** used to track if the sendto() call should be done when using TFO. */
|
||||
int tcp_do_fastopen;
|
||||
#endif
|
||||
|
||||
/** number of queries outstanding on this socket, used by
|
||||
* outside network for udp ports */
|
||||
int inuse;
|
||||
@ -496,9 +504,10 @@ void comm_point_stop_listening(struct comm_point* c);
|
||||
* Start listening again for input on the comm point.
|
||||
* @param c: commpoint to enable again.
|
||||
* @param newfd: new fd, or -1 to leave fd be.
|
||||
* @param sec: timeout in seconds, or -1 for no (change to the) timeout.
|
||||
* @param msec: timeout in milliseconds, or -1 for no (change to the) timeout.
|
||||
* So seconds*1000.
|
||||
*/
|
||||
void comm_point_start_listening(struct comm_point* c, int newfd, int sec);
|
||||
void comm_point_start_listening(struct comm_point* c, int newfd, int msec);
|
||||
|
||||
/**
|
||||
* Stop listening and start listening again for reading or writing.
|
||||
|
@ -231,6 +231,19 @@ struct addr_tree_node* addr_tree_lookup(rbtree_t* tree,
|
||||
return result;
|
||||
}
|
||||
|
||||
struct addr_tree_node* addr_tree_find(rbtree_t* tree,
|
||||
struct sockaddr_storage* addr, socklen_t addrlen, int net)
|
||||
{
|
||||
rbnode_t* res = NULL;
|
||||
struct addr_tree_node key;
|
||||
key.node.key = &key;
|
||||
memcpy(&key.addr, addr, addrlen);
|
||||
key.addrlen = addrlen;
|
||||
key.net = net;
|
||||
res = rbtree_search(tree, &key);
|
||||
return (struct addr_tree_node*)res;
|
||||
}
|
||||
|
||||
int
|
||||
name_tree_next_root(rbtree_t* tree, uint16_t* dclass)
|
||||
{
|
||||
|
@ -183,6 +183,17 @@ void addr_tree_init_parents(rbtree_t* tree);
|
||||
struct addr_tree_node* addr_tree_lookup(rbtree_t* tree,
|
||||
struct sockaddr_storage* addr, socklen_t addrlen);
|
||||
|
||||
/**
|
||||
* Find element in addr tree. (search a netblock, not a match for an address)
|
||||
* @param tree: addr tree
|
||||
* @param addr: netblock to lookup.
|
||||
* @param addrlen: length of addr
|
||||
* @param net: size of subnet
|
||||
* @return addr tree element, or NULL if not found.
|
||||
*/
|
||||
struct addr_tree_node* addr_tree_find(rbtree_t* tree,
|
||||
struct sockaddr_storage* addr, socklen_t addrlen, int net);
|
||||
|
||||
/** compare name tree nodes */
|
||||
int name_tree_compare(const void* k1, const void* k2);
|
||||
|
||||
|
@ -820,7 +820,7 @@ uint32_t hashbig( const void *key, size_t length, uint32_t initval)
|
||||
#ifdef SELF_TEST
|
||||
|
||||
/* used for timings */
|
||||
void driver1()
|
||||
void driver1(void)
|
||||
{
|
||||
uint8_t buf[256];
|
||||
uint32_t i;
|
||||
@ -842,7 +842,7 @@ void driver1()
|
||||
#define HASHLEN 1
|
||||
#define MAXPAIR 60
|
||||
#define MAXLEN 70
|
||||
void driver2()
|
||||
void driver2(void)
|
||||
{
|
||||
uint8_t qa[MAXLEN+1], qb[MAXLEN+2], *a = &qa[0], *b = &qb[1];
|
||||
uint32_t c[HASHSTATE], d[HASHSTATE], i=0, j=0, k, l, m=0, z;
|
||||
@ -912,7 +912,7 @@ void driver2()
|
||||
}
|
||||
|
||||
/* Check for reading beyond the end of the buffer and alignment problems */
|
||||
void driver3()
|
||||
void driver3(void)
|
||||
{
|
||||
uint8_t buf[MAXLEN+20], *b;
|
||||
uint32_t len;
|
||||
@ -1003,7 +1003,7 @@ void driver3()
|
||||
}
|
||||
|
||||
/* check for problems with nulls */
|
||||
void driver4()
|
||||
void driver4(void)
|
||||
{
|
||||
uint8_t buf[1];
|
||||
uint32_t h,i,state[HASHSTATE];
|
||||
@ -1020,7 +1020,7 @@ void driver3()
|
||||
}
|
||||
|
||||
|
||||
int main()
|
||||
int main(void)
|
||||
{
|
||||
driver1(); /* test that the key is hashed: used for timings */
|
||||
driver2(); /* test that whole key is hashed thoroughly */
|
||||
|
@ -132,16 +132,12 @@ static void (*NATIVE_BITS_CB(void (*cb)(int, short, void*)))(int, short, void*)
|
||||
#define EVFLAG_AUTO 0
|
||||
#endif
|
||||
|
||||
#define AS_EVENT_BASE(x) \
|
||||
(((union {struct ub_event_base* a; struct event_base* b;})x).b)
|
||||
#define AS_UB_EVENT_BASE(x) \
|
||||
(((union {struct event_base* a; struct ub_event_base* b;})x).b)
|
||||
#define AS_EVENT(x) \
|
||||
(((union {struct ub_event* a; struct event* b;})x).b)
|
||||
#define AS_UB_EVENT(x) \
|
||||
(((union {struct event* a; struct ub_event* b;})x).b)
|
||||
#define AS_EVENT_BASE(x) ((struct event_base*)x)
|
||||
#define AS_UB_EVENT_BASE(x) ((struct ub_event_base*)x)
|
||||
#define AS_EVENT(x) ((struct event*)x)
|
||||
#define AS_UB_EVENT(x) ((struct ub_event*)x)
|
||||
|
||||
const char* ub_event_get_version()
|
||||
const char* ub_event_get_version(void)
|
||||
{
|
||||
return event_get_version();
|
||||
}
|
||||
|
@ -63,7 +63,7 @@ struct event_base;
|
||||
* daemon compile, and will be "pluggable-event<PACKAGE_VERSION>" for
|
||||
* libunbound.
|
||||
*/
|
||||
const char* ub_event_get_version();
|
||||
const char* ub_event_get_version(void);
|
||||
/** Return the name, system and method for the pluggable event base */
|
||||
void ub_get_event_sys(struct ub_event_base*, const char** n, const char** s,
|
||||
const char** m);
|
||||
|
@ -144,12 +144,10 @@ struct my_event {
|
||||
struct event ev;
|
||||
};
|
||||
|
||||
#define AS_MY_EVENT_BASE(x) \
|
||||
(((union {struct ub_event_base* a; struct my_event_base* b;})x).b)
|
||||
#define AS_MY_EVENT(x) \
|
||||
(((union {struct ub_event* a; struct my_event* b;})x).b)
|
||||
#define AS_MY_EVENT_BASE(x) ((struct my_event_base*)x)
|
||||
#define AS_MY_EVENT(x) ((struct my_event*)x)
|
||||
|
||||
const char* ub_event_get_version()
|
||||
const char* ub_event_get_version(void)
|
||||
{
|
||||
return "pluggable-event"PACKAGE_VERSION;
|
||||
}
|
||||
@ -597,7 +595,7 @@ ub_event_add(struct ub_event* ev, struct timeval* tv)
|
||||
int
|
||||
ub_event_del(struct ub_event* ev)
|
||||
{
|
||||
if (ev->magic == UB_EVENT_MAGIC) {
|
||||
if (ev && ev->magic == UB_EVENT_MAGIC) {
|
||||
fptr_ok(ev->vmt != &default_event_vmt ||
|
||||
ev->vmt->del == my_event_del);
|
||||
return (*ev->vmt->del)(ev);
|
||||
@ -620,7 +618,7 @@ ub_timer_add(struct ub_event* ev, struct ub_event_base* base,
|
||||
int
|
||||
ub_timer_del(struct ub_event* ev)
|
||||
{
|
||||
if (ev->magic == UB_EVENT_MAGIC) {
|
||||
if (ev && ev->magic == UB_EVENT_MAGIC) {
|
||||
fptr_ok(ev->vmt != &default_event_vmt ||
|
||||
ev->vmt->del_timer == my_timer_del);
|
||||
return (*ev->vmt->del_timer)(ev);
|
||||
@ -642,7 +640,7 @@ ub_signal_add(struct ub_event* ev, struct timeval* tv)
|
||||
int
|
||||
ub_signal_del(struct ub_event* ev)
|
||||
{
|
||||
if (ev->magic == UB_EVENT_MAGIC) {
|
||||
if (ev && ev->magic == UB_EVENT_MAGIC) {
|
||||
fptr_ok(ev->vmt != &default_event_vmt ||
|
||||
ev->vmt->del_signal == my_signal_del);
|
||||
return (*ev->vmt->del_signal)(ev);
|
||||
@ -653,7 +651,7 @@ ub_signal_del(struct ub_event* ev)
|
||||
void
|
||||
ub_winsock_unregister_wsaevent(struct ub_event* ev)
|
||||
{
|
||||
if (ev->magic == UB_EVENT_MAGIC) {
|
||||
if (ev && ev->magic == UB_EVENT_MAGIC) {
|
||||
fptr_ok(ev->vmt != &default_event_vmt ||
|
||||
ev->vmt->winsock_unregister_wsaevent ==
|
||||
my_winsock_unregister_wsaevent);
|
||||
|
@ -262,8 +262,9 @@ static int handle_select(struct event_base* base, struct timeval* wait)
|
||||
break; /* sanity check */
|
||||
}
|
||||
log_assert(numwait <= WSA_MAXIMUM_WAIT_EVENTS);
|
||||
verbose(VERB_CLIENT, "winsock_event bmax=%d numwait=%d wait=%x "
|
||||
"timeout=%d", base->max, numwait, (int)wait, (int)timeout);
|
||||
verbose(VERB_CLIENT, "winsock_event bmax=%d numwait=%d wait=%s "
|
||||
"timeout=%d", base->max, numwait, (wait?"<wait>":"<null>"),
|
||||
(int)timeout);
|
||||
|
||||
/* do the wait */
|
||||
if(numwait == 0) {
|
||||
|
@ -430,6 +430,8 @@ find_add_tp(struct val_anchors* anchors, uint8_t* rr, size_t rr_len,
|
||||
}
|
||||
tp = autr_tp_create(anchors, rr, dname_len, sldns_wirerr_get_class(rr,
|
||||
rr_len, dname_len));
|
||||
if(!tp)
|
||||
return NULL;
|
||||
lock_basic_lock(&tp->lock);
|
||||
return tp;
|
||||
}
|
||||
@ -1201,7 +1203,7 @@ void autr_write_file(struct module_env* env, struct trust_anchor* tp)
|
||||
if(fsync(fileno(out)) != 0)
|
||||
log_err("could not fsync(%s): %s", fname, strerror(errno));
|
||||
#else
|
||||
FlushFileBuffers((HANDLE)_fileno(out));
|
||||
FlushFileBuffers((HANDLE)_get_osfhandle(_fileno(out)));
|
||||
#endif
|
||||
if(fclose(out) != 0) {
|
||||
fatal_exit("could not complete write: %s: %s",
|
||||
|
@ -350,6 +350,23 @@ i * the '44' is the total remaining length.
|
||||
}
|
||||
#endif /* USE_ECDSA */
|
||||
|
||||
#ifdef USE_ECDSA_EVP_WORKAROUND
|
||||
static EVP_MD ecdsa_evp_256_md;
|
||||
static EVP_MD ecdsa_evp_384_md;
|
||||
void ecdsa_evp_workaround_init(void)
|
||||
{
|
||||
/* openssl before 1.0.0 fixes RSA with the SHA256
|
||||
* hash in EVP. We create one for ecdsa_sha256 */
|
||||
ecdsa_evp_256_md = *EVP_sha256();
|
||||
ecdsa_evp_256_md.required_pkey_type[0] = EVP_PKEY_EC;
|
||||
ecdsa_evp_256_md.verify = (void*)ECDSA_verify;
|
||||
|
||||
ecdsa_evp_384_md = *EVP_sha384();
|
||||
ecdsa_evp_384_md.required_pkey_type[0] = EVP_PKEY_EC;
|
||||
ecdsa_evp_384_md.verify = (void*)ECDSA_verify;
|
||||
}
|
||||
#endif /* USE_ECDSA_EVP_WORKAROUND */
|
||||
|
||||
/**
|
||||
* Setup key and digest for verification. Adjust sig if necessary.
|
||||
*
|
||||
@ -478,20 +495,7 @@ setup_key_digest(int algo, EVP_PKEY** evp_key, const EVP_MD** digest_type,
|
||||
return 0;
|
||||
}
|
||||
#ifdef USE_ECDSA_EVP_WORKAROUND
|
||||
/* openssl before 1.0.0 fixes RSA with the SHA256
|
||||
* hash in EVP. We create one for ecdsa_sha256 */
|
||||
{
|
||||
static int md_ecdsa_256_done = 0;
|
||||
static EVP_MD md;
|
||||
if(!md_ecdsa_256_done) {
|
||||
EVP_MD m = *EVP_sha256();
|
||||
md_ecdsa_256_done = 1;
|
||||
m.required_pkey_type[0] = (*evp_key)->type;
|
||||
m.verify = (void*)ECDSA_verify;
|
||||
md = m;
|
||||
}
|
||||
*digest_type = &md;
|
||||
}
|
||||
*digest_type = &ecdsa_evp_256_md;
|
||||
#else
|
||||
*digest_type = EVP_sha256();
|
||||
#endif
|
||||
@ -505,20 +509,7 @@ setup_key_digest(int algo, EVP_PKEY** evp_key, const EVP_MD** digest_type,
|
||||
return 0;
|
||||
}
|
||||
#ifdef USE_ECDSA_EVP_WORKAROUND
|
||||
/* openssl before 1.0.0 fixes RSA with the SHA384
|
||||
* hash in EVP. We create one for ecdsa_sha384 */
|
||||
{
|
||||
static int md_ecdsa_384_done = 0;
|
||||
static EVP_MD md;
|
||||
if(!md_ecdsa_384_done) {
|
||||
EVP_MD m = *EVP_sha384();
|
||||
md_ecdsa_384_done = 1;
|
||||
m.required_pkey_type[0] = (*evp_key)->type;
|
||||
m.verify = (void*)ECDSA_verify;
|
||||
md = m;
|
||||
}
|
||||
*digest_type = &md;
|
||||
}
|
||||
*digest_type = &ecdsa_evp_384_md;
|
||||
#else
|
||||
*digest_type = EVP_sha384();
|
||||
#endif
|
||||
@ -601,7 +592,7 @@ verify_canonrrset(sldns_buffer* buf, int algo, unsigned char* sigblock,
|
||||
log_err("EVP_MD_CTX_new: malloc failure");
|
||||
EVP_PKEY_free(evp_key);
|
||||
if(dofree) free(sigblock);
|
||||
else if(docrypto_free) CRYPTO_free(sigblock);
|
||||
else if(docrypto_free) OPENSSL_free(sigblock);
|
||||
return sec_status_unchecked;
|
||||
}
|
||||
if(EVP_VerifyInit(ctx, digest_type) == 0) {
|
||||
@ -609,7 +600,7 @@ verify_canonrrset(sldns_buffer* buf, int algo, unsigned char* sigblock,
|
||||
EVP_MD_CTX_destroy(ctx);
|
||||
EVP_PKEY_free(evp_key);
|
||||
if(dofree) free(sigblock);
|
||||
else if(docrypto_free) CRYPTO_free(sigblock);
|
||||
else if(docrypto_free) OPENSSL_free(sigblock);
|
||||
return sec_status_unchecked;
|
||||
}
|
||||
if(EVP_VerifyUpdate(ctx, (unsigned char*)sldns_buffer_begin(buf),
|
||||
@ -618,7 +609,7 @@ verify_canonrrset(sldns_buffer* buf, int algo, unsigned char* sigblock,
|
||||
EVP_MD_CTX_destroy(ctx);
|
||||
EVP_PKEY_free(evp_key);
|
||||
if(dofree) free(sigblock);
|
||||
else if(docrypto_free) CRYPTO_free(sigblock);
|
||||
else if(docrypto_free) OPENSSL_free(sigblock);
|
||||
return sec_status_unchecked;
|
||||
}
|
||||
|
||||
@ -632,7 +623,7 @@ verify_canonrrset(sldns_buffer* buf, int algo, unsigned char* sigblock,
|
||||
EVP_PKEY_free(evp_key);
|
||||
|
||||
if(dofree) free(sigblock);
|
||||
else if(docrypto_free) CRYPTO_free(sigblock);
|
||||
else if(docrypto_free) OPENSSL_free(sigblock);
|
||||
|
||||
if(res == 1) {
|
||||
return sec_status_secure;
|
||||
@ -1207,6 +1198,9 @@ verify_canonrrset(sldns_buffer* buf, int algo, unsigned char* sigblock,
|
||||
#include "macros.h"
|
||||
#include "rsa.h"
|
||||
#include "dsa.h"
|
||||
#ifdef HAVE_NETTLE_DSA_COMPAT_H
|
||||
#include "dsa-compat.h"
|
||||
#endif
|
||||
#include "asn1.h"
|
||||
#ifdef USE_ECDSA
|
||||
#include "ecdsa.h"
|
||||
@ -1367,6 +1361,7 @@ dnskey_algo_id_is_supported(int id)
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef USE_DSA
|
||||
static char *
|
||||
_verify_nettle_dsa(sldns_buffer* buf, unsigned char* sigblock,
|
||||
unsigned int sigblock_len, unsigned char* key, unsigned int keylen)
|
||||
@ -1454,6 +1449,7 @@ _verify_nettle_dsa(sldns_buffer* buf, unsigned char* sigblock,
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
#endif /* USE_DSA */
|
||||
|
||||
static char *
|
||||
_verify_nettle_rsa(sldns_buffer* buf, unsigned int digest_size, char* sigblock,
|
||||
|
@ -1283,15 +1283,23 @@ adjust_ttl(struct val_env* ve, uint32_t unow,
|
||||
/* so now:
|
||||
* d->ttl: rrset ttl read from message or cache. May be reduced
|
||||
* origttl: original TTL from signature, authoritative TTL max.
|
||||
* MIN_TTL: minimum TTL from config.
|
||||
* expittl: TTL until the signature expires.
|
||||
*
|
||||
* Use the smallest of these.
|
||||
* Use the smallest of these, but don't let origttl set the TTL
|
||||
* below the minimum.
|
||||
*/
|
||||
if(d->ttl > (time_t)origttl) {
|
||||
verbose(VERB_QUERY, "rrset TTL larger than original TTL,"
|
||||
" adjusting TTL downwards");
|
||||
if(MIN_TTL > (time_t)origttl && d->ttl > MIN_TTL) {
|
||||
verbose(VERB_QUERY, "rrset TTL larger than original and minimum"
|
||||
" TTL, adjusting TTL downwards to mimimum ttl");
|
||||
d->ttl = MIN_TTL;
|
||||
}
|
||||
else if(MIN_TTL <= origttl && d->ttl > (time_t)origttl) {
|
||||
verbose(VERB_QUERY, "rrset TTL larger than original TTL, "
|
||||
"adjusting TTL downwards to original ttl");
|
||||
d->ttl = origttl;
|
||||
}
|
||||
|
||||
if(expittl > 0 && d->ttl > (time_t)expittl) {
|
||||
verbose(VERB_ALGO, "rrset TTL larger than sig expiration ttl,"
|
||||
" adjusting TTL downwards");
|
||||
|
@ -156,6 +156,9 @@ val_apply_cfg(struct module_env* env, struct val_env* val_env,
|
||||
return 1;
|
||||
}
|
||||
|
||||
#ifdef USE_ECDSA_EVP_WORKAROUND
|
||||
void ecdsa_evp_workaround_init(void);
|
||||
#endif
|
||||
int
|
||||
val_init(struct module_env* env, int id)
|
||||
{
|
||||
@ -171,6 +174,9 @@ val_init(struct module_env* env, int id)
|
||||
lock_basic_init(&val_env->bogus_lock);
|
||||
lock_protect(&val_env->bogus_lock, &val_env->num_rrset_bogus,
|
||||
sizeof(val_env->num_rrset_bogus));
|
||||
#ifdef USE_ECDSA_EVP_WORKAROUND
|
||||
ecdsa_evp_workaround_init();
|
||||
#endif
|
||||
if(!val_apply_cfg(env, val_env, env->cfg)) {
|
||||
log_err("validator: could not apply configuration settings.");
|
||||
return 0;
|
||||
|
@ -92,10 +92,18 @@ section "-hidden.postinstall"
|
||||
File "..\anchor-update.exe"
|
||||
File "unbound-control-setup.cmd"
|
||||
File "unbound-website.url"
|
||||
File "service.conf"
|
||||
File "..\doc\example.conf"
|
||||
File "..\doc\Changelog"
|
||||
|
||||
# Does service.conf already exist?
|
||||
IfFileExists "$INSTDIR\service.conf" 0 service_conf_not_found
|
||||
# if so, leave it be and place the shipped file under another name
|
||||
File /oname=service.conf.shipped "service.conf"
|
||||
goto end_service_conf_not_found
|
||||
# or, it is not there, place it and fill it.
|
||||
service_conf_not_found:
|
||||
File "service.conf"
|
||||
|
||||
# Store Root Key choice
|
||||
SectionGetFlags ${SectionRootKey} $R0
|
||||
IntOp $R0 $R0 & ${SF_SELECTED}
|
||||
@ -111,6 +119,7 @@ section "-hidden.postinstall"
|
||||
${Else}
|
||||
WriteRegStr HKLM "Software\Unbound" "RootAnchor" ""
|
||||
${EndIf}
|
||||
end_service_conf_not_found:
|
||||
|
||||
# store installation folder
|
||||
WriteRegStr HKLM "Software\Unbound" "InstallLocation" "$INSTDIR"
|
||||
@ -179,7 +188,9 @@ section "un.Unbound"
|
||||
Delete "$INSTDIR\anchor-update.exe"
|
||||
Delete "$INSTDIR\unbound-control-setup.cmd"
|
||||
Delete "$INSTDIR\unbound-website.url"
|
||||
Delete "$INSTDIR\service.conf"
|
||||
# keep the service.conf with potential local modifications
|
||||
#Delete "$INSTDIR\service.conf"
|
||||
Delete "$INSTDIR\service.conf.shipped"
|
||||
Delete "$INSTDIR\example.conf"
|
||||
Delete "$INSTDIR\Changelog"
|
||||
Delete "$INSTDIR\root.key"
|
||||
|
@ -231,8 +231,8 @@ wsvc_install(FILE* out, const char* rename)
|
||||
NULL, /* no load ordering group */
|
||||
NULL, /* no tag identifier */
|
||||
NULL, /* no deps */
|
||||
(LPCTSTR)"NT AUTHORITY\\NetworkService", /* network service account with restricted rights */
|
||||
"" /* no password (must be an empty string) */
|
||||
NULL, /* on LocalSystem */
|
||||
NULL /* no password */
|
||||
);
|
||||
if(!sv) {
|
||||
CloseServiceHandle(scm);
|
||||
|
@ -565,7 +565,7 @@ win_do_cron(void* ATTR_UNUSED(arg))
|
||||
|
||||
/** Set the timer for cron for the next wake up */
|
||||
static void
|
||||
set_cron_timer()
|
||||
set_cron_timer(void)
|
||||
{
|
||||
struct timeval tv;
|
||||
int crontime;
|
||||
|
Loading…
x
Reference in New Issue
Block a user