diff --git a/.bind.metadata b/.bind.metadata new file mode 100644 index 0000000..c07b294 --- /dev/null +++ b/.bind.metadata @@ -0,0 +1,2 @@ +550367762a653ac5ed0eb04b316d06517650a925 SOURCES/bind-9.11.13.tar.gz +a164fcad1d64d6b5fab5034928cb7260f1fa8fdd SOURCES/random.data diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8008e19 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +SOURCES/bind-9.11.13.tar.gz +SOURCES/random.data diff --git a/SOURCES/README.sdb_pgsql b/SOURCES/README.sdb_pgsql new file mode 100644 index 0000000..c10c294 --- /dev/null +++ b/SOURCES/README.sdb_pgsql @@ -0,0 +1,79 @@ + PGSQL BIND SDB driver + +The postgresql BIND SDB driver is of experimental status and should not be +used for production systems. + +Usage: + +o Use the named_sdb process ( put ENABLE_SDB=yes in /etc/sysconfig/named ) + +o Edit your named.conf to contain a database zone, eg. : + +zone "pgdb.net." IN { + type master; + database "pgsql bind pgdb localhost pguser pgpasswd"; + # ^- DB name ^-Table ^-host ^-user ^-password +}; + +o Create the database zone table + The table must contain the columns "name", "rdtype", and "rdata", and + is expected to contain a properly constructed zone. The program "zonetodb" + creates such a table. + + zonetodb usage: + + zonetodb origin file dbname dbtable + + where + origin : zone origin, eg "pgdb.net." + file : master zone database file, eg. pgdb.net.db + dbname : name of postgresql database + dbtable: name of table in database + + Eg. to import this zone in the file 'pgdb.net.db' into the 'bind' database + 'pgdb' table: + +--- +#pgdb.net.db: +$TTL 1H +@ SOA localhost. root.localhost. ( 1 + 3H + 1H + 1W + 1H ) + NS localhost. +host1 A 192.168.2.1 +host2 A 192.168.2.2 +host3 A 192.168.2.3 +host4 A 192.168.2.4 +host5 A 192.168.2.5 +host6 A 192.168.2.6 +host7 A 192.168.2.7 +--- + +Issue this command as the pgsql user authorized to update the bind database: + +# zonetodb pgdb.net. pgdb.net.db bind pgdb + +will create / update the pgdb table in the 'bind' db: + +$ psql -dbind -c 'select * from pgdb;' + name | ttl | rdtype | rdata +----------------+------+--------+----------------------------------------------------- + pgdb.net | 3600 | SOA | localhost. root.localhost. 1 10800 3600 604800 3600 + pgdb.net | 3600 | NS | localhost. + host1.pgdb.net | 3600 | A | 192.168.2.1 + host2.pgdb.net | 3600 | A | 192.168.2.2 + host3.pgdb.net | 3600 | A | 192.168.2.3 + host4.pgdb.net | 3600 | A | 192.168.2.4 + host5.pgdb.net | 3600 | A | 192.168.2.5 + host6.pgdb.net | 3600 | A | 192.168.2.6 + host7.pgdb.net | 3600 | A | 192.168.2.7 +(9 rows) + +I've tested exactly the above configuration with bind-sdb-9.3.1+ and it works OK. + +NOTE: If you use pgsqldb SDB, ensure the postgresql service is started before the named + service . + +USE AT YOUR OWN RISK! diff --git a/SOURCES/bind-9.10-dist-native-pkcs11.patch b/SOURCES/bind-9.10-dist-native-pkcs11.patch new file mode 100644 index 0000000..e553d5f --- /dev/null +++ b/SOURCES/bind-9.10-dist-native-pkcs11.patch @@ -0,0 +1,612 @@ +diff --git a/bin/Makefile.in b/bin/Makefile.in +index f0c504a..ce7a2da 100644 +--- a/bin/Makefile.in ++++ b/bin/Makefile.in +@@ -11,8 +11,8 @@ srcdir = @srcdir@ + VPATH = @srcdir@ + top_srcdir = @top_srcdir@ + +-SUBDIRS = named rndc dig delv dnssec tools nsupdate check confgen \ +- @NZD_TOOLS@ @PYTHON_TOOLS@ @PKCS11_TOOLS@ tests ++SUBDIRS = named named-pkcs11 rndc dig delv dnssec dnssec-pkcs11 tools nsupdate \ ++ check confgen @NZD_TOOLS@ @PYTHON_TOOLS@ @PKCS11_TOOLS@ tests + TARGETS = + + @BIND9_MAKE_RULES@ +diff --git a/bin/dnssec-pkcs11/Makefile.in b/bin/dnssec-pkcs11/Makefile.in +index 4b8ca13..32f4470 100644 +--- a/bin/dnssec-pkcs11/Makefile.in ++++ b/bin/dnssec-pkcs11/Makefile.in +@@ -15,18 +15,18 @@ VERSION=@BIND9_VERSION@ + + @BIND9_MAKE_INCLUDES@ + +-CINCLUDES = ${DNS_INCLUDES} ${ISC_INCLUDES} @DST_OPENSSL_INC@ ++CINCLUDES = ${DNS_PKCS11_INCLUDES} ${ISC_PKCS11_INCLUDES} + +-CDEFINES = -DVERSION=\"${VERSION}\" @USE_PKCS11@ @PKCS11_ENGINE@ \ +- @CRYPTO@ -DPK11_LIB_LOCATION=\"@PKCS11_PROVIDER@\" ++CDEFINES = -DVERSION=\"${VERSION}\" @PKCS11_ENGINE@ \ ++ @CRYPTO_PK11@ -DPK11_LIB_LOCATION=\"@PKCS11_PROVIDER@\" + CWARNINGS = + +-DNSLIBS = ../../lib/dns/libdns.@A@ ${MAXMINDDB_LIBS} @DNS_CRYPTO_LIBS@ +-ISCLIBS = ../../lib/isc/libisc.@A@ +-ISCNOSYMLIBS = ../../lib/isc/libisc-nosymtbl.@A@ ++DNSLIBS = ../../lib/dns-pkcs11/libdns-pkcs11.@A@ ${MAXMINDDB_LIBS} @DNS_CRYPTO_LIBS@ ++ISCLIBS = ../../lib/isc-pkcs11/libisc-pkcs11.@A@ ++ISCNOSYMLIBS = ../../lib/isc-pkcs11/libisc-pkcs11-nosymtbl.@A@ + +-DNSDEPLIBS = ../../lib/dns/libdns.@A@ +-ISCDEPLIBS = ../../lib/isc/libisc.@A@ ++DNSDEPLIBS = ../../lib/dns-pkcs11/libdns-pkcs11.@A@ ++ISCDEPLIBS = ../../lib/isc-pkcs11/libisc-pkcs11.@A@ + + DEPLIBS = ${DNSDEPLIBS} ${ISCDEPLIBS} + +@@ -35,10 +35,10 @@ LIBS = ${DNSLIBS} ${ISCLIBS} @LIBS@ + NOSYMLIBS = ${DNSLIBS} ${ISCNOSYMLIBS} @LIBS@ + + # Alphabetically +-TARGETS = dnssec-keygen@EXEEXT@ dnssec-signzone@EXEEXT@ \ +- dnssec-keyfromlabel@EXEEXT@ dnssec-dsfromkey@EXEEXT@ \ +- dnssec-revoke@EXEEXT@ dnssec-settime@EXEEXT@ \ +- dnssec-verify@EXEEXT@ dnssec-importkey@EXEEXT@ ++TARGETS = dnssec-keygen-pkcs11@EXEEXT@ dnssec-signzone-pkcs11@EXEEXT@ \ ++ dnssec-keyfromlabel-pkcs11@EXEEXT@ dnssec-dsfromkey-pkcs11@EXEEXT@ \ ++ dnssec-revoke-pkcs11@EXEEXT@ dnssec-settime-pkcs11@EXEEXT@ \ ++ dnssec-verify-pkcs11@EXEEXT@ dnssec-importkey-pkcs11@EXEEXT@ + + OBJS = dnssectool.@O@ + +@@ -59,15 +59,15 @@ MANOBJS = ${MANPAGES} ${HTMLPAGES} + + @BIND9_MAKE_RULES@ + +-dnssec-dsfromkey@EXEEXT@: dnssec-dsfromkey.@O@ ${OBJS} ${DEPLIBS} ++dnssec-dsfromkey-pkcs11@EXEEXT@: dnssec-dsfromkey.@O@ ${OBJS} ${DEPLIBS} + export BASEOBJS="dnssec-dsfromkey.@O@ ${OBJS}"; \ + ${FINALBUILDCMD} + +-dnssec-keyfromlabel@EXEEXT@: dnssec-keyfromlabel.@O@ ${OBJS} ${DEPLIBS} ++dnssec-keyfromlabel-pkcs11@EXEEXT@: dnssec-keyfromlabel.@O@ ${OBJS} ${DEPLIBS} + export BASEOBJS="dnssec-keyfromlabel.@O@ ${OBJS}"; \ + ${FINALBUILDCMD} + +-dnssec-keygen@EXEEXT@: dnssec-keygen.@O@ ${OBJS} ${DEPLIBS} ++dnssec-keygen-pkcs11@EXEEXT@: dnssec-keygen.@O@ ${OBJS} ${DEPLIBS} + export BASEOBJS="dnssec-keygen.@O@ ${OBJS}"; \ + ${FINALBUILDCMD} + +@@ -75,7 +75,7 @@ dnssec-signzone.@O@: dnssec-signzone.c + ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} -DVERSION=\"${VERSION}\" \ + -c ${srcdir}/dnssec-signzone.c + +-dnssec-signzone@EXEEXT@: dnssec-signzone.@O@ ${OBJS} ${DEPLIBS} ++dnssec-signzone-pkcs11@EXEEXT@: dnssec-signzone.@O@ ${OBJS} ${DEPLIBS} + export BASEOBJS="dnssec-signzone.@O@ ${OBJS}"; \ + ${FINALBUILDCMD} + +@@ -83,19 +83,19 @@ dnssec-verify.@O@: dnssec-verify.c + ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} -DVERSION=\"${VERSION}\" \ + -c ${srcdir}/dnssec-verify.c + +-dnssec-verify@EXEEXT@: dnssec-verify.@O@ ${OBJS} ${DEPLIBS} ++dnssec-verify-pkcs11@EXEEXT@: dnssec-verify.@O@ ${OBJS} ${DEPLIBS} + export BASEOBJS="dnssec-verify.@O@ ${OBJS}"; \ + ${FINALBUILDCMD} + +-dnssec-revoke@EXEEXT@: dnssec-revoke.@O@ ${OBJS} ${DEPLIBS} ++dnssec-revoke-pkcs11@EXEEXT@: dnssec-revoke.@O@ ${OBJS} ${DEPLIBS} + ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \ + dnssec-revoke.@O@ ${OBJS} ${LIBS} + +-dnssec-settime@EXEEXT@: dnssec-settime.@O@ ${OBJS} ${DEPLIBS} ++dnssec-settime-pkcs11@EXEEXT@: dnssec-settime.@O@ ${OBJS} ${DEPLIBS} + ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \ + dnssec-settime.@O@ ${OBJS} ${LIBS} + +-dnssec-importkey@EXEEXT@: dnssec-importkey.@O@ ${OBJS} ${DEPLIBS} ++dnssec-importkey-pkcs11@EXEEXT@: dnssec-importkey.@O@ ${OBJS} ${DEPLIBS} + ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \ + dnssec-importkey.@O@ ${OBJS} ${LIBS} + +@@ -106,16 +106,14 @@ docclean manclean maintainer-clean:: + + installdirs: + $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${sbindir} +- $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${mandir}/man8 + + install-man8: ${MANPAGES} + ${INSTALL_DATA} $^ ${DESTDIR}${mandir}/man8 + +-install:: ${TARGETS} installdirs install-man8 ++install:: ${TARGETS} installdirs + for t in ${TARGETS}; do ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} $$t ${DESTDIR}${sbindir} || exit 1; done + + uninstall:: +- for m in ${MANPAGES}; do rm -f ${DESTDIR}${mandir}/man8/$$m || exit 1; done + for t in ${TARGETS}; do ${LIBTOOL_MODE_UNINSTALL} rm -f ${DESTDIR}${sbindir}/$$t || exit 1; done + + clean distclean:: +diff --git a/bin/dnssec/Makefile.in b/bin/dnssec/Makefile.in +index 4b8ca13..4175996 100644 +--- a/bin/dnssec/Makefile.in ++++ b/bin/dnssec/Makefile.in +@@ -17,7 +17,7 @@ VERSION=@BIND9_VERSION@ + + CINCLUDES = ${DNS_INCLUDES} ${ISC_INCLUDES} @DST_OPENSSL_INC@ + +-CDEFINES = -DVERSION=\"${VERSION}\" @USE_PKCS11@ @PKCS11_ENGINE@ \ ++CDEFINES = -DVERSION=\"${VERSION}\" \ + @CRYPTO@ -DPK11_LIB_LOCATION=\"@PKCS11_PROVIDER@\" + CWARNINGS = + +diff --git a/bin/named-pkcs11/Makefile.in b/bin/named-pkcs11/Makefile.in +index 3166368..a403941 100644 +--- a/bin/named-pkcs11/Makefile.in ++++ b/bin/named-pkcs11/Makefile.in +@@ -43,27 +43,27 @@ DLZDRIVER_INCLUDES = @DLZ_DRIVER_INCLUDES@ + DLZDRIVER_LIBS = @DLZ_DRIVER_LIBS@ + + CINCLUDES = -I${srcdir}/include -I${srcdir}/unix/include -I. \ +- ${LWRES_INCLUDES} ${DNS_INCLUDES} ${BIND9_INCLUDES} \ +- ${ISCCFG_INCLUDES} ${ISCCC_INCLUDES} ${ISC_INCLUDES} \ ++ ${LWRES_INCLUDES} ${DNS_PKCS11_INCLUDES} ${BIND9_INCLUDES} \ ++ ${ISCCFG_INCLUDES} ${ISCCC_INCLUDES} ${ISC_PKCS11_INCLUDES} \ + ${DLZDRIVER_INCLUDES} ${DBDRIVER_INCLUDES} ${MAXMINDDB_CFLAGS} \ + @DST_OPENSSL_INC@ + +-CDEFINES = @CONTRIB_DLZ@ @USE_PKCS11@ @PKCS11_ENGINE@ @CRYPTO@ ++CDEFINES = @USE_PKCS11@ @PKCS11_ENGINE@ @CRYPTO_PK11@ @USE_GSSAPI@ + + CWARNINGS = + +-DNSLIBS = ../../lib/dns/libdns.@A@ ${MAXMINDDB_LIBS} @DNS_CRYPTO_LIBS@ ++DNSLIBS = ../../lib/dns-pkcs11/libdns-pkcs11.@A@ ${MAXMINDDB_LIBS} @DNS_CRYPTO_LIBS@ + ISCCFGLIBS = ../../lib/isccfg/libisccfg.@A@ + ISCCCLIBS = ../../lib/isccc/libisccc.@A@ +-ISCLIBS = ../../lib/isc/libisc.@A@ +-ISCNOSYMLIBS = ../../lib/isc/libisc-nosymtbl.@A@ ++ISCLIBS = ../../lib/isc-pkcs11/libisc-pkcs11.@A@ ++ISCNOSYMLIBS = ../../lib/isc-pkcs11/libisc-pkcs11-nosymtbl.@A@ + LWRESLIBS = ../../lib/lwres/liblwres.@A@ + BIND9LIBS = ../../lib/bind9/libbind9.@A@ + +-DNSDEPLIBS = ../../lib/dns/libdns.@A@ ++DNSDEPLIBS = ../../lib/dns-pkcs11/libdns-pkcs11.@A@ + ISCCFGDEPLIBS = ../../lib/isccfg/libisccfg.@A@ + ISCCCDEPLIBS = ../../lib/isccc/libisccc.@A@ +-ISCDEPLIBS = ../../lib/isc/libisc.@A@ ++ISCDEPLIBS = ../../lib/isc-pkcs11/libisc-pkcs11.@A@ + LWRESDEPLIBS = ../../lib/lwres/liblwres.@A@ + BIND9DEPLIBS = ../../lib/bind9/libbind9.@A@ + +@@ -72,15 +72,15 @@ DEPLIBS = ${LWRESDEPLIBS} ${DNSDEPLIBS} ${BIND9DEPLIBS} \ + + LIBS = ${LWRESLIBS} ${DNSLIBS} ${BIND9LIBS} \ + ${ISCCFGLIBS} ${ISCCCLIBS} ${ISCLIBS} \ +- ${DLZDRIVER_LIBS} ${DBDRIVER_LIBS} @LIBS@ ++ @LIBS@ + + NOSYMLIBS = ${LWRESLIBS} ${DNSLIBS} ${BIND9LIBS} \ + ${ISCCFGLIBS} ${ISCCCLIBS} ${ISCNOSYMLIBS} \ +- ${DLZDRIVER_LIBS} ${DBDRIVER_LIBS} @LIBS@ ++ @LIBS@ + + SUBDIRS = unix + +-TARGETS = named@EXEEXT@ lwresd@EXEEXT@ ++TARGETS = named-pkcs11@EXEEXT@ + + GEOIPLINKOBJS = geoip.@O@ + GEOIP2LINKOBJS = geoip.@O@ +@@ -94,8 +94,7 @@ OBJS = builtin.@O@ client.@O@ config.@O@ control.@O@ \ + tkeyconf.@O@ tsigconf.@O@ update.@O@ xfrout.@O@ \ + zoneconf.@O@ \ + lwaddr.@O@ lwresd.@O@ lwdclient.@O@ lwderror.@O@ lwdgabn.@O@ \ +- lwdgnba.@O@ lwdgrbn.@O@ lwdnoop.@O@ lwsearch.@O@ \ +- ${DLZDRIVER_OBJS} ${DBDRIVER_OBJS} ++ lwdgnba.@O@ lwdgrbn.@O@ lwdnoop.@O@ lwsearch.@O@ + + UOBJS = unix/os.@O@ unix/dlz_dlopen_driver.@O@ + +@@ -113,8 +112,7 @@ SRCS = builtin.c client.c config.c control.c \ + tkeyconf.c tsigconf.c update.c xfrout.c \ + zoneconf.c \ + lwaddr.c lwresd.c lwdclient.c lwderror.c lwdgabn.c \ +- lwdgnba.c lwdgrbn.c lwdnoop.c lwsearch.c \ +- ${DLZDRIVER_SRCS} ${DBDRIVER_SRCS} ++ lwdgnba.c lwdgrbn.c lwdnoop.c lwsearch.c + + MANPAGES = named.8 lwresd.8 named.conf.5 + +@@ -154,14 +152,14 @@ server.@O@: server.c + -DPRODUCT=\"${PRODUCT}\" \ + -DVERSION=\"${VERSION}\" -c ${srcdir}/server.c + +-named@EXEEXT@: ${OBJS} ${DEPLIBS} ++named-pkcs11@EXEEXT@: ${OBJS} ${DEPLIBS} + export MAKE_SYMTABLE="yes"; \ + export BASEOBJS="${OBJS} ${UOBJS}"; \ + ${FINALBUILDCMD} + +-lwresd@EXEEXT@: named@EXEEXT@ ++lwresd@EXEEXT@: named-pkcs11@EXEEXT@ + rm -f lwresd@EXEEXT@ +- @LN@ named@EXEEXT@ lwresd@EXEEXT@ ++ @LN@ named-pkcs11@EXEEXT@ lwresd@EXEEXT@ + + doc man:: ${MANOBJS} + +@@ -192,16 +190,11 @@ install-man8: named.8 lwresd.8 + + install-man: install-man5 install-man8 + +-install:: named@EXEEXT@ lwresd@EXEEXT@ installdirs install-man +- ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} named@EXEEXT@ ${DESTDIR}${sbindir} +- (cd ${DESTDIR}${sbindir}; rm -f lwresd@EXEEXT@; @LN@ named@EXEEXT@ lwresd@EXEEXT@) ++install:: named-pkcs11@EXEEXT@ installdirs ++ ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} named-pkcs11@EXEEXT@ ${DESTDIR}${sbindir} + + uninstall:: +- rm -f ${DESTDIR}${mandir}/man5/named.conf.5 +- rm -f ${DESTDIR}${mandir}/man8/lwresd.8 +- rm -f ${DESTDIR}${mandir}/man8/named.8 +- rm -f ${DESTDIR}${sbindir}/lwresd@EXEEXT@ +- ${LIBTOOL_MODE_UNINSTALL} rm -f ${DESTDIR}${sbindir}/named@EXEEXT@ ++ ${LIBTOOL_MODE_UNINSTALL} rm -f ${DESTDIR}${sbindir}/named-pkcs11@EXEEXT@ + + @DLZ_DRIVER_RULES@ + +diff --git a/bin/named/Makefile.in b/bin/named/Makefile.in +index 3166368..890574f 100644 +--- a/bin/named/Makefile.in ++++ b/bin/named/Makefile.in +@@ -48,7 +48,7 @@ CINCLUDES = -I${srcdir}/include -I${srcdir}/unix/include -I. \ + ${DLZDRIVER_INCLUDES} ${DBDRIVER_INCLUDES} ${MAXMINDDB_CFLAGS} \ + @DST_OPENSSL_INC@ + +-CDEFINES = @CONTRIB_DLZ@ @USE_PKCS11@ @PKCS11_ENGINE@ @CRYPTO@ ++CDEFINES = @CONTRIB_DLZ@ @USE_GSSAPI@ @CRYPTO@ + + CWARNINGS = + +diff --git a/bin/pkcs11/Makefile.in b/bin/pkcs11/Makefile.in +index a058c91..d4b689a 100644 +--- a/bin/pkcs11/Makefile.in ++++ b/bin/pkcs11/Makefile.in +@@ -15,13 +15,13 @@ top_srcdir = @top_srcdir@ + + @BIND9_MAKE_INCLUDES@ + +-CINCLUDES = ${ISC_INCLUDES} ++CINCLUDES = ${ISC_PKCS11_INCLUDES} + + CDEFINES = + +-ISCLIBS = ../../lib/isc/libisc.@A@ @ISC_OPENSSL_LIBS@ ++ISCLIBS = ../../lib/isc-pkcs11/libisc-pkcs11.@A@ @ISC_OPENSSL_LIBS@ + +-ISCDEPLIBS = ../../lib/isc/libisc.@A@ ++ISCDEPLIBS = ../../lib/isc-pkcs11/libisc-pkcs11.@A@ + + DEPLIBS = ${ISCDEPLIBS} + +diff --git a/configure.ac b/configure.ac +index 9b7d778..59ba20b 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -1139,12 +1139,14 @@ AC_SUBST(USE_GSSAPI) + AC_SUBST(DST_GSSAPI_INC) + AC_SUBST(DNS_GSSAPI_LIBS) + DNS_CRYPTO_LIBS="$DNS_GSSAPI_LIBS $DNS_CRYPTO_LIBS" ++DNS_CRYPTO_PK11_LIBS="$DNS_GSSAPI_LIBS $DNS_CRYPTO_PK11_LIBS" + + # + # Applications linking with libdns also need to link with these libraries. + # + + AC_SUBST(DNS_CRYPTO_LIBS) ++AC_SUBST(DNS_CRYPTO_PK11_LIBS) + + # + # was --with-randomdev specified? +@@ -1494,11 +1496,11 @@ AC_ARG_ENABLE(openssl-hash, + AC_MSG_CHECKING(for OpenSSL library) + OPENSSL_WARNING= + openssldirs="/usr /usr/local /usr/local/ssl /opt/local /usr/pkg /usr/sfw" +-if test "yes" = "$want_native_pkcs11" +-then +- use_openssl="native_pkcs11" +- AC_MSG_RESULT(use of native PKCS11 instead) +-fi ++# if test "yes" = "$want_native_pkcs11" ++# then ++# use_openssl="native_pkcs11" ++# AC_MSG_RESULT(use of native PKCS11 instead) ++# fi + + if test "auto" = "$use_openssl" + then +@@ -1511,6 +1513,7 @@ then + fi + done + fi ++CRYPTO_PK11="" + OPENSSL_ECDSA="" + OPENSSL_GOST="" + OPENSSL_ED25519="" +@@ -1532,11 +1535,10 @@ case "$with_gost" in + ;; + esac + +-case "$use_openssl" in +- native_pkcs11) +- AC_MSG_RESULT(disabled because of native PKCS11) ++if test "$want_native_pkcs11" = "yes" ++then + DST_OPENSSL_INC="" +- CRYPTO="-DPKCS11CRYPTO" ++ CRYPTO_PK11="-DPKCS11CRYPTO" + CRYPTOLIB="pkcs11" + OPENSSLECDSALINKOBJS="" + OPENSSLECDSALINKSRCS="" +@@ -1546,7 +1548,9 @@ case "$use_openssl" in + OPENSSLGOSTLINKSRCS="" + OPENSSLLINKOBJS="" + OPENSSLLINKSRCS="" +- ;; ++fi ++ ++case "$use_openssl" in + no) + AC_MSG_RESULT(no) + DST_OPENSSL_INC="" +@@ -1578,7 +1582,7 @@ case "$use_openssl" in + If you do not want OpenSSL, use --without-openssl]) + ;; + *) +- if test "yes" = "$want_native_pkcs11" ++ if false # test "yes" = "$want_native_pkcs11" + then + AC_MSG_RESULT() + AC_MSG_ERROR([OpenSSL and native PKCS11 cannot be used together.]) +@@ -2006,6 +2010,7 @@ AC_SUBST(OPENSSL_ED25519) + AC_SUBST(OPENSSL_GOST) + + DNS_CRYPTO_LIBS="$DNS_CRYPTO_LIBS $DST_OPENSSL_LIBS" ++DNS_CRYPTO_PK11_LIBS="$DNS_CRYPTO_LIBS" + + ISC_PLATFORM_WANTAES="#undef ISC_PLATFORM_WANTAES" + if test "yes" = "$with_aes" +@@ -2291,6 +2296,7 @@ esac + AC_SUBST(PKCS11LINKOBJS) + AC_SUBST(PKCS11LINKSRCS) + AC_SUBST(CRYPTO) ++AC_SUBST(CRYPTO_PK11) + AC_SUBST(PKCS11_ECDSA) + AC_SUBST(PKCS11_GOST) + AC_SUBST(PKCS11_ED25519) +@@ -5405,8 +5411,11 @@ AC_CONFIG_FILES([ + bin/delv/Makefile + bin/dig/Makefile + bin/dnssec/Makefile ++ bin/dnssec-pkcs11/Makefile + bin/named/Makefile + bin/named/unix/Makefile ++ bin/named-pkcs11/Makefile ++ bin/named-pkcs11/unix/Makefile + bin/nsupdate/Makefile + bin/pkcs11/Makefile + bin/python/Makefile +@@ -5479,6 +5488,10 @@ AC_CONFIG_FILES([ + lib/dns/include/dns/Makefile + lib/dns/include/dst/Makefile + lib/dns/tests/Makefile ++ lib/dns-pkcs11/Makefile ++ lib/dns-pkcs11/include/Makefile ++ lib/dns-pkcs11/include/dns/Makefile ++ lib/dns-pkcs11/include/dst/Makefile + lib/irs/Makefile + lib/irs/include/Makefile + lib/irs/include/irs/Makefile +@@ -5503,6 +5516,24 @@ AC_CONFIG_FILES([ + lib/isc/unix/include/Makefile + lib/isc/unix/include/isc/Makefile + lib/isc/unix/include/pkcs11/Makefile ++ lib/isc-pkcs11/$arch/Makefile ++ lib/isc-pkcs11/$arch/include/Makefile ++ lib/isc-pkcs11/$arch/include/isc/Makefile ++ lib/isc-pkcs11/$thread_dir/Makefile ++ lib/isc-pkcs11/$thread_dir/include/Makefile ++ lib/isc-pkcs11/$thread_dir/include/isc/Makefile ++ lib/isc-pkcs11/Makefile ++ lib/isc-pkcs11/include/Makefile ++ lib/isc-pkcs11/include/isc/Makefile ++ lib/isc-pkcs11/include/isc/platform.h ++ lib/isc-pkcs11/include/pk11/Makefile ++ lib/isc-pkcs11/include/pkcs11/Makefile ++ lib/isc-pkcs11/tests/Makefile ++ lib/isc-pkcs11/nls/Makefile ++ lib/isc-pkcs11/unix/Makefile ++ lib/isc-pkcs11/unix/include/Makefile ++ lib/isc-pkcs11/unix/include/isc/Makefile ++ lib/isc-pkcs11/unix/include/pkcs11/Makefile + lib/isccc/Makefile + lib/isccc/include/Makefile + lib/isccc/include/isccc/Makefile +diff --git a/lib/Makefile.in b/lib/Makefile.in +index 81270a0..bcb5312 100644 +--- a/lib/Makefile.in ++++ b/lib/Makefile.in +@@ -15,7 +15,7 @@ top_srcdir = @top_srcdir@ + # Attempt to disable parallel processing. + .NOTPARALLEL: + .NO_PARALLEL: +-SUBDIRS = isc isccc dns isccfg bind9 lwres irs samples ++SUBDIRS = isc isc-pkcs11 isccc dns dns-pkcs11 isccfg bind9 lwres irs samples + TARGETS = + + @BIND9_MAKE_RULES@ +diff --git a/lib/dns-pkcs11/Makefile.in b/lib/dns-pkcs11/Makefile.in +index 7f09bd6..c388d9e 100644 +--- a/lib/dns-pkcs11/Makefile.in ++++ b/lib/dns-pkcs11/Makefile.in +@@ -26,17 +26,16 @@ VERSION=@BIND9_VERSION@ + + USE_ISC_SPNEGO = @USE_ISC_SPNEGO@ + +-CINCLUDES = -I. -I${top_srcdir}/lib/dns -Iinclude ${DNS_INCLUDES} \ +- ${ISC_INCLUDES} ${MAXMINDDB_CFLAGS} \ +- @DST_OPENSSL_INC@ @DST_GSSAPI_INC@ ++CINCLUDES = -I. -I${top_srcdir}/lib/dns-pkcs11 -Iinclude ${DNS_PKCS11_INCLUDES} \ ++ ${ISC_PKCS11_INCLUDES} ${MAXMINDDB_CFLAGS} @DST_OPENSSL_INC@ @DST_GSSAPI_INC@ + +-CDEFINES = -DUSE_MD5 @CRYPTO@ @USE_GSSAPI@ ${USE_ISC_SPNEGO} ++CDEFINES = -DUSE_MD5 @CRYPTO_PK11@ @USE_GSSAPI@ ${USE_ISC_SPNEGO} + + CWARNINGS = + +-ISCLIBS = ../../lib/isc/libisc.@A@ ++ISCLIBS = ../../lib/isc-pkcs11/libisc-pkcs11.@A@ + +-ISCDEPLIBS = ../../lib/isc/libisc.@A@ ++ISCDEPLIBS = ../../lib/isc-pkcs11/libisc-pkcs11.@A@ + + LIBS = ${MAXMINDDB_LIBS} @LIBS@ + +@@ -150,15 +149,15 @@ version.@O@: version.c + -DLIBAGE=${LIBAGE} \ + -c ${srcdir}/version.c + +-libdns.@SA@: ${OBJS} ++libdns-pkcs11.@SA@: ${OBJS} + ${AR} ${ARFLAGS} $@ ${OBJS} + ${RANLIB} $@ + +-libdns.la: ${OBJS} ++libdns-pkcs11.la: ${OBJS} + ${LIBTOOL_MODE_LINK} \ +- ${CC} ${ALL_CFLAGS} ${LDFLAGS} -o libdns.la -rpath ${libdir} \ ++ ${CC} ${ALL_CFLAGS} ${LDFLAGS} -o libdns-pkcs11.la -rpath ${libdir} \ + -version-info ${LIBINTERFACE}:${LIBREVISION}:${LIBAGE} \ +- ${OBJS} ${ISCLIBS} @DNS_CRYPTO_LIBS@ ${LIBS} ++ ${OBJS} ${ISCLIBS} @DNS_CRYPTO_PK11_LIBS@ ${LIBS} + + include: gen + ${MAKE} include/dns/enumtype.h +@@ -189,22 +188,22 @@ gen: gen.c + ${BUILD_CPPFLAGS} ${BUILD_LDFLAGS} -o $@ ${srcdir}/gen.c \ + ${BUILD_LIBS} ${LFS_LIBS} + +-timestamp: include libdns.@A@ ++timestamp: include libdns-pkcs11.@A@ + touch timestamp + +-testdirs: libdns.@A@ ++testdirs: libdns-pkcs11.@A@ + + installdirs: + $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${libdir} + + install:: timestamp installdirs +- ${LIBTOOL_MODE_INSTALL} ${INSTALL_LIBRARY} libdns.@A@ ${DESTDIR}${libdir} ++ ${LIBTOOL_MODE_INSTALL} ${INSTALL_LIBRARY} libdns-pkcs11.@A@ ${DESTDIR}${libdir} + + uninstall:: +- ${LIBTOOL_MODE_UNINSTALL} rm -f ${DESTDIR}${libdir}/libdns.@A@ ++ ${LIBTOOL_MODE_UNINSTALL} rm -f ${DESTDIR}${libdir}/libdns-pkcs11.@A@ + + clean distclean:: +- rm -f libdns.@A@ timestamp ++ rm -f libdns-pkcs11.@A@ timestamp + rm -f gen code.h include/dns/enumtype.h include/dns/enumclass.h + rm -f include/dns/rdatastruct.h + rm -f dnstap.pb-c.c dnstap.pb-c.h +diff --git a/lib/isc-pkcs11/Makefile.in b/lib/isc-pkcs11/Makefile.in +index 8ad54bb..a3ecdfb 100644 +--- a/lib/isc-pkcs11/Makefile.in ++++ b/lib/isc-pkcs11/Makefile.in +@@ -23,8 +23,8 @@ CINCLUDES = -I${srcdir}/unix/include \ + -I${srcdir}/@ISC_THREAD_DIR@/include \ + -I${srcdir}/@ISC_ARCH_DIR@/include \ + -I./include \ +- -I${srcdir}/include ${DNS_INCLUDES} @ISC_OPENSSL_INC@ +-CDEFINES = @CRYPTO@ -DPK11_LIB_LOCATION=\"${PROVIDER}\" ++ -I${srcdir}/include ${DNS_PKCS11_INCLUDES} ++CDEFINES = @CRYPTO_PK11@ -DPK11_LIB_LOCATION=\"${PROVIDER}\" + CWARNINGS = + + # Alphabetically +@@ -103,40 +103,40 @@ version.@O@: version.c + -DLIBAGE=${LIBAGE} \ + -c ${srcdir}/version.c + +-libisc.@SA@: ${OBJS} ${SYMTBLOBJS} ++libisc-pkcs11.@SA@: ${OBJS} ${SYMTBLOBJS} + ${AR} ${ARFLAGS} $@ ${OBJS} ${SYMTBLOBJS} + ${RANLIB} $@ + +-libisc-nosymtbl.@SA@: ${OBJS} ++libisc-pkcs11-nosymtbl.@SA@: ${OBJS} + ${AR} ${ARFLAGS} $@ ${OBJS} + ${RANLIB} $@ + +-libisc.la: ${OBJS} ${SYMTBLOBJS} ++libisc-pkcs11.la: ${OBJS} ${SYMTBLOBJS} + ${LIBTOOL_MODE_LINK} \ +- ${CC} ${ALL_CFLAGS} ${LDFLAGS} -o libisc.la -rpath ${libdir} \ ++ ${CC} ${ALL_CFLAGS} ${LDFLAGS} -o libisc-pkcs11.la -rpath ${libdir} \ + -version-info ${LIBINTERFACE}:${LIBREVISION}:${LIBAGE} \ + ${OBJS} ${SYMTBLOBJS} ${LIBS} + +-libisc-nosymtbl.la: ${OBJS} ++libisc-pkcs11-nosymtbl.la: ${OBJS} + ${LIBTOOL_MODE_LINK} \ +- ${CC} ${ALL_CFLAGS} ${LDFLAGS} -o libisc-nosymtbl.la -rpath ${libdir} \ ++ ${CC} ${ALL_CFLAGS} ${LDFLAGS} -o libisc-pkcs11-nosymtbl.la -rpath ${libdir} \ + -version-info ${LIBINTERFACE}:${LIBREVISION}:${LIBAGE} \ + ${OBJS} ${LIBS} + +-timestamp: libisc.@A@ libisc-nosymtbl.@A@ ++timestamp: libisc-pkcs11.@A@ libisc-pkcs11-nosymtbl.@A@ + touch timestamp + +-testdirs: libisc.@A@ libisc-nosymtbl.@A@ ++testdirs: libisc-pkcs11.@A@ libisc-pkcs11-nosymtbl.@A@ + + installdirs: + $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${libdir} + + install:: timestamp installdirs +- ${LIBTOOL_MODE_INSTALL} ${INSTALL_LIBRARY} libisc.@A@ ${DESTDIR}${libdir} ++ ${LIBTOOL_MODE_INSTALL} ${INSTALL_LIBRARY} libisc-pkcs11.@A@ ${DESTDIR}${libdir} + + uninstall:: +- ${LIBTOOL_MODE_UNINSTALL} rm -f ${DESTDIR}${libdir}/libisc.@A@ ++ ${LIBTOOL_MODE_UNINSTALL} rm -f ${DESTDIR}${libdir}/libisc-pkcs11.@A@ + + clean distclean:: +- rm -f libisc.@A@ libisc-nosymtbl.@A@ libisc.la \ +- libisc-nosymtbl.la timestamp ++ rm -f libisc-pkcs11.@A@ libisc-pkcs11-nosymtbl.@A@ libisc-pkcs11.la \ ++ libisc-pkcs11-nosymtbl.la timestamp +diff --git a/make/includes.in b/make/includes.in +index fa86ad1..3cfbe9f 100644 +--- a/make/includes.in ++++ b/make/includes.in +@@ -43,3 +43,13 @@ BIND9_INCLUDES = @BIND9_BIND9_BUILDINCLUDE@ \ + + TEST_INCLUDES = \ + -I${top_srcdir}/lib/tests/include ++ ++ISC_PKCS11_INCLUDES = @BIND9_ISC_BUILDINCLUDE@ \ ++ -I${top_srcdir}/lib/isc-pkcs11 \ ++ -I${top_srcdir}/lib/isc-pkcs11/include \ ++ -I${top_srcdir}/lib/isc-pkcs11/unix/include \ ++ -I${top_srcdir}/lib/isc-pkcs11/@ISC_THREAD_DIR@/include \ ++ -I${top_srcdir}/lib/isc-pkcs11/@ISC_ARCH_DIR@/include ++ ++DNS_PKCS11_INCLUDES = @BIND9_DNS_BUILDINCLUDE@ \ ++ -I${top_srcdir}/lib/dns-pkcs11/include diff --git a/SOURCES/bind-9.10-sdb.patch b/SOURCES/bind-9.10-sdb.patch new file mode 100644 index 0000000..5524daa --- /dev/null +++ b/SOURCES/bind-9.10-sdb.patch @@ -0,0 +1,310 @@ +diff --git a/bin/Makefile.in b/bin/Makefile.in +index ce7a2da..4e6a824 100644 +--- a/bin/Makefile.in ++++ b/bin/Makefile.in +@@ -11,8 +11,8 @@ srcdir = @srcdir@ + VPATH = @srcdir@ + top_srcdir = @top_srcdir@ + +-SUBDIRS = named named-pkcs11 rndc dig delv dnssec dnssec-pkcs11 tools nsupdate \ +- check confgen @NZD_TOOLS@ @PYTHON_TOOLS@ @PKCS11_TOOLS@ tests ++SUBDIRS = named named-sdb named-pkcs11 rndc dig delv dnssec dnssec-pkcs11 tools nsupdate \ ++ check confgen @NZD_TOOLS@ @PYTHON_TOOLS@ @PKCS11_TOOLS@ sdb_tools tests + TARGETS = + + @BIND9_MAKE_RULES@ +diff --git a/bin/named-sdb/Makefile.in b/bin/named-sdb/Makefile.in +index 03a72d5..4c1cb6d 100644 +--- a/bin/named-sdb/Makefile.in ++++ b/bin/named-sdb/Makefile.in +@@ -30,10 +30,10 @@ VERSION=@BIND9_VERSION@ + # + # Add database drivers here. + # +-DBDRIVER_OBJS = +-DBDRIVER_SRCS = ++DBDRIVER_OBJS = ldapdb.@O@ pgsqldb.@O@ sqlitedb.@O@ dirdb.@O@ ++DBDRIVER_SRCS = ldapdb.c pgsqldb.c sqlitedb.c dirdb.c + DBDRIVER_INCLUDES = +-DBDRIVER_LIBS = ++DBDRIVER_LIBS = -lldap -llber -lsqlite3 -lpq + + DLZ_DRIVER_DIR = ${top_srcdir}/contrib/dlz/drivers + +@@ -80,7 +80,7 @@ NOSYMLIBS = ${LWRESLIBS} ${DNSLIBS} ${BIND9LIBS} \ + + SUBDIRS = unix + +-TARGETS = named@EXEEXT@ lwresd@EXEEXT@ ++TARGETS = named-sdb@EXEEXT@ + + GEOIPLINKOBJS = geoip.@O@ + GEOIP2LINKOBJS = geoip.@O@ +@@ -154,7 +154,7 @@ server.@O@: server.c + -DPRODUCT=\"${PRODUCT}\" \ + -DVERSION=\"${VERSION}\" -c ${srcdir}/server.c + +-named@EXEEXT@: ${OBJS} ${DEPLIBS} ++named-sdb@EXEEXT@: ${OBJS} ${DEPLIBS} + export MAKE_SYMTABLE="yes"; \ + export BASEOBJS="${OBJS} ${UOBJS}"; \ + ${FINALBUILDCMD} +@@ -181,8 +181,6 @@ statschannel.@O@: bind9.xsl.h + + installdirs: + $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${sbindir} +- $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${mandir}/man5 +- $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${mandir}/man8 + + install-man5: named.conf.5 + ${INSTALL_DATA} $^ ${DESTDIR}${mandir}/man5 +@@ -192,16 +190,11 @@ install-man8: named.8 lwresd.8 + + install-man: install-man5 install-man8 + +-install:: named@EXEEXT@ lwresd@EXEEXT@ installdirs install-man +- ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} named@EXEEXT@ ${DESTDIR}${sbindir} +- (cd ${DESTDIR}${sbindir}; rm -f lwresd@EXEEXT@; @LN@ named@EXEEXT@ lwresd@EXEEXT@) ++install:: ${TARGETS} installdirs ++ ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} named-sdb@EXEEXT@ ${DESTDIR}${sbindir} + + uninstall:: +- rm -f ${DESTDIR}${mandir}/man5/named.conf.5 +- rm -f ${DESTDIR}${mandir}/man8/lwresd.8 +- rm -f ${DESTDIR}${mandir}/man8/named.8 +- rm -f ${DESTDIR}${sbindir}/lwresd@EXEEXT@ +- ${LIBTOOL_MODE_UNINSTALL} rm -f ${DESTDIR}${sbindir}/named@EXEEXT@ ++ ${LIBTOOL_MODE_UNINSTALL} rm -f ${DESTDIR}${sbindir}/named-sdb@EXEEXT@ + + @DLZ_DRIVER_RULES@ + +diff --git a/bin/named-sdb/main.c b/bin/named-sdb/main.c +index 108b8d6..a943421 100644 +--- a/bin/named-sdb/main.c ++++ b/bin/named-sdb/main.c +@@ -93,6 +93,10 @@ + * Include header files for database drivers here. + */ + /* #include "xxdb.h" */ ++#include "ldapdb.h" ++#include "pgsqldb.h" ++#include "sqlitedb.h" ++#include "dirdb.h" + + #ifdef CONTRIB_DLZ + /* +@@ -1069,6 +1073,11 @@ setup(void) { + ns_main_earlyfatal("isc_app_start() failed: %s", + isc_result_totext(result)); + ++ ldapdb_clear(); ++ pgsqldb_clear(); ++ dirdb_clear(); ++ sqlitedb_clear(); ++ + isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_MAIN, + ISC_LOG_NOTICE, "starting %s %s%s%s ", + ns_g_product, ns_g_version, +@@ -1269,6 +1278,75 @@ setup(void) { + isc_result_totext(result)); + #endif + ++ result = ldapdb_init(); ++ if (result != ISC_R_SUCCESS) ++ { ++ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_MAIN, ++ ISC_LOG_ERROR, ++ "SDB ldap module initialisation failed: %s.", ++ isc_result_totext(result) ++ ); ++ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_MAIN, ++ ISC_LOG_ERROR, ++ "SDB ldap zone database will be unavailable." ++ ); ++ }else ++ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_MAIN, ++ ISC_LOG_NOTICE, "SDB ldap zone database module loaded." ++ ); ++ ++ result = pgsqldb_init(); ++ if (result != ISC_R_SUCCESS) ++ { ++ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_MAIN, ++ ISC_LOG_ERROR, ++ "SDB pgsql module initialisation failed: %s.", ++ isc_result_totext(result) ++ ); ++ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_MAIN, ++ ISC_LOG_ERROR, ++ "SDB pgsql zone database will be unavailable." ++ ); ++ }else ++ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_MAIN, ++ ISC_LOG_NOTICE, "SDB postgreSQL DB zone database module loaded." ++ ); ++ ++ result = sqlitedb_init(); ++ if (result != ISC_R_SUCCESS) ++ { ++ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_MAIN, ++ ISC_LOG_ERROR, ++ "SDB sqlite3 module initialisation failed: %s.", ++ isc_result_totext(result) ++ ); ++ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_MAIN, ++ ISC_LOG_ERROR, ++ "SDB sqlite3 zone database will be unavailable." ++ ); ++ }else ++ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_MAIN, ++ ISC_LOG_NOTICE, "SDB sqlite3 DB zone database module loaded." ++ ); ++ ++ result = dirdb_init(); ++ if (result != ISC_R_SUCCESS) ++ { ++ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_MAIN, ++ ISC_LOG_ERROR, ++ "SDB directory DB module initialisation failed: %s.", ++ isc_result_totext(result) ++ ); ++ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_MAIN, ++ ISC_LOG_ERROR, ++ "SDB directory DB zone database will be unavailable." ++ ); ++ }else ++ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_MAIN, ++ ISC_LOG_NOTICE, "SDB directory DB zone database module loaded." ++ ); ++ ++ + ns_server_create(ns_g_mctx, &ns_g_server); + + #ifdef HAVE_LIBSECCOMP +@@ -1311,6 +1389,11 @@ cleanup(void) { + + dns_name_destroy(); + ++ ldapdb_clear(); ++ pgsqldb_clear(); ++ sqlitedb_clear(); ++ dirdb_clear(); ++ + isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_MAIN, + ISC_LOG_NOTICE, "exiting"); + ns_log_shutdown(); +diff --git a/bin/named/Makefile.in b/bin/named/Makefile.in +index 03a72d5..47cc046 100644 +--- a/bin/named/Makefile.in ++++ b/bin/named/Makefile.in +@@ -45,10 +45,10 @@ DLZDRIVER_LIBS = @DLZ_DRIVER_LIBS@ + CINCLUDES = -I${srcdir}/include -I${srcdir}/unix/include -I. \ + ${LWRES_INCLUDES} ${DNS_INCLUDES} ${BIND9_INCLUDES} \ + ${ISCCFG_INCLUDES} ${ISCCC_INCLUDES} ${ISC_INCLUDES} \ +- ${DLZDRIVER_INCLUDES} ${DBDRIVER_INCLUDES} ${MAXMINDDB_CFLAGS} \ ++ ${MAXMINDDB_CFLAGS} \ + @DST_OPENSSL_INC@ + +-CDEFINES = @CONTRIB_DLZ@ @USE_GSSAPI@ @CRYPTO@ ++CDEFINES = @USE_GSSAPI@ @CRYPTO@ + + CWARNINGS = + +@@ -72,11 +72,11 @@ DEPLIBS = ${LWRESDEPLIBS} ${DNSDEPLIBS} ${BIND9DEPLIBS} \ + + LIBS = ${LWRESLIBS} ${DNSLIBS} ${BIND9LIBS} \ + ${ISCCFGLIBS} ${ISCCCLIBS} ${ISCLIBS} \ +- ${DLZDRIVER_LIBS} ${DBDRIVER_LIBS} @LIBS@ ++ @LIBS@ + + NOSYMLIBS = ${LWRESLIBS} ${DNSLIBS} ${BIND9LIBS} \ + ${ISCCFGLIBS} ${ISCCCLIBS} ${ISCNOSYMLIBS} \ +- ${DLZDRIVER_LIBS} ${DBDRIVER_LIBS} @LIBS@ ++ @LIBS@ + + SUBDIRS = unix + +@@ -94,8 +94,7 @@ OBJS = builtin.@O@ client.@O@ config.@O@ control.@O@ \ + tkeyconf.@O@ tsigconf.@O@ update.@O@ xfrout.@O@ \ + zoneconf.@O@ \ + lwaddr.@O@ lwresd.@O@ lwdclient.@O@ lwderror.@O@ lwdgabn.@O@ \ +- lwdgnba.@O@ lwdgrbn.@O@ lwdnoop.@O@ lwsearch.@O@ \ +- ${DLZDRIVER_OBJS} ${DBDRIVER_OBJS} ++ lwdgnba.@O@ lwdgrbn.@O@ lwdnoop.@O@ lwsearch.@O@ + + UOBJS = unix/os.@O@ unix/dlz_dlopen_driver.@O@ + +@@ -113,8 +112,7 @@ SRCS = builtin.c client.c config.c control.c \ + tkeyconf.c tsigconf.c update.c xfrout.c \ + zoneconf.c \ + lwaddr.c lwresd.c lwdclient.c lwderror.c lwdgabn.c \ +- lwdgnba.c lwdgrbn.c lwdnoop.c lwsearch.c \ +- ${DLZDRIVER_SRCS} ${DBDRIVER_SRCS} ++ lwdgnba.c lwdgrbn.c lwdnoop.c lwsearch.c + + MANPAGES = named.8 lwresd.8 named.conf.5 + +@@ -203,7 +201,5 @@ uninstall:: + rm -f ${DESTDIR}${sbindir}/lwresd@EXEEXT@ + ${LIBTOOL_MODE_UNINSTALL} rm -f ${DESTDIR}${sbindir}/named@EXEEXT@ + +-@DLZ_DRIVER_RULES@ +- + named-symtbl.@O@: named-symtbl.c + ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} -c named-symtbl.c +diff --git a/bin/sdb_tools/Makefile.in b/bin/sdb_tools/Makefile.in +index c7e0868..95ab742 100644 +--- a/bin/sdb_tools/Makefile.in ++++ b/bin/sdb_tools/Makefile.in +@@ -32,11 +32,11 @@ DEPLIBS = ${LWRESDEPLIBS} ${DNSDEPLIBS} ${BIND9DEPLIBS} \ + LIBS = ${LWRESLIBS} ${DNSLIBS} ${BIND9LIBS} \ + ${ISCCFGLIBS} ${ISCCCLIBS} ${ISCLIBS} ${DBDRIVER_LIBS} @LIBS@ + +-TARGETS = zone2ldap@EXEEXT@ zonetodb@EXEEXT@ ++TARGETS = zone2ldap@EXEEXT@ zonetodb@EXEEXT@ zone2sqlite@EXEEXT@ + +-OBJS = zone2ldap.@O@ zonetodb.@O@ ++OBJS = zone2ldap.@O@ zonetodb.@O@ zone2sqlite.@O@ + +-SRCS = zone2ldap.c zonetodb.c ++SRCS = zone2ldap.c zonetodb.c zone2sqlite.c + + MANPAGES = zone2ldap.1 + +@@ -50,6 +50,9 @@ zone2ldap@EXEEXT@: zone2ldap.@O@ ${DEPLIBS} + zonetodb@EXEEXT@: zonetodb.@O@ ${DEPLIBS} + ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ zonetodb.@O@ -lpq ${LIBS} + ++zone2sqlite@EXEEXT@: zone2sqlite.@O@ ${DEPLIBS} ++ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${ALL_CFLAGS} ${LDFLAGS} -o $@ zone2sqlite.@O@ -lsqlite3 -lssl ${LIBS} ++ + clean distclean manclean maintainer-clean:: + rm -f ${TARGETS} ${OBJS} + +@@ -60,4 +63,5 @@ installdirs: + install:: ${TARGETS} installdirs + ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} zone2ldap@EXEEXT@ ${DESTDIR}${sbindir} + ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} zonetodb@EXEEXT@ ${DESTDIR}${sbindir} ++ ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} zone2sqlite@EXEEXT@ ${DESTDIR}${sbindir} + ${INSTALL_DATA} ${srcdir}/zone2ldap.1 ${DESTDIR}${mandir}/man1/zone2ldap.1 +diff --git a/configure.ac b/configure.ac +index eff9f05..d05ad1f 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -5429,6 +5429,8 @@ AC_CONFIG_FILES([ + bin/named/unix/Makefile + bin/named-pkcs11/Makefile + bin/named-pkcs11/unix/Makefile ++ bin/named-sdb/Makefile ++ bin/named-sdb/unix/Makefile + bin/nsupdate/Makefile + bin/pkcs11/Makefile + bin/python/Makefile +@@ -5453,6 +5455,7 @@ AC_CONFIG_FILES([ + bin/python/isc/tests/dnskey_test.py + bin/python/isc/tests/policy_test.py + bin/rndc/Makefile ++ bin/sdb_tools/Makefile + bin/tests/Makefile + bin/tests/headerdep_test.sh + bin/tests/optional/Makefile diff --git a/SOURCES/bind-9.10-use-of-strlcat.patch b/SOURCES/bind-9.10-use-of-strlcat.patch new file mode 100644 index 0000000..2a39916 --- /dev/null +++ b/SOURCES/bind-9.10-use-of-strlcat.patch @@ -0,0 +1,18 @@ +diff --git a/bin/sdb_tools/zone2ldap.c b/bin/sdb_tools/zone2ldap.c +index d56bc56..99c3314 100644 +--- a/bin/sdb_tools/zone2ldap.c ++++ b/bin/sdb_tools/zone2ldap.c +@@ -817,11 +817,11 @@ build_dn_from_dc_list (char **dc_list, unsigned int ttl, int flag, char *zone) + } + + +- strlcat (dn, tmp, sizeof (dn)); ++ strncat (dn, tmp, sizeof (dn) - strlen (dn)); + } + + sprintf (tmp, "dc=%s", dc_list[0]); +- strlcat (dn, tmp, sizeof (dn)); ++ strncat (dn, tmp, sizeof (dn) - strlen (dn)); + + fflush(NULL); + return dn; diff --git a/SOURCES/bind-9.11-dhcp-time-monotonic.patch b/SOURCES/bind-9.11-dhcp-time-monotonic.patch new file mode 100644 index 0000000..743c5cb --- /dev/null +++ b/SOURCES/bind-9.11-dhcp-time-monotonic.patch @@ -0,0 +1,171 @@ +diff --git a/lib/isc/include/isc/result.h b/lib/isc/include/isc/result.h +index 0389efa..149cde5 100644 +--- a/lib/isc/include/isc/result.h ++++ b/lib/isc/include/isc/result.h +@@ -89,7 +89,8 @@ + #define ISC_R_DISCFULL 67 /*%< disc full */ + #define ISC_R_DEFAULT 68 /*%< default */ + #define ISC_R_IPV4PREFIX 69 /*%< IPv4 prefix */ +-#define ISC_R_NRESULTS 70 ++#define ISC_R_TIMESHIFTED 70 /*%< system time changed */ ++#define ISC_R_NRESULTS 71 + + ISC_LANG_BEGINDECLS + +diff --git a/lib/isc/include/isc/util.h b/lib/isc/include/isc/util.h +index 973c348..cceeb5e 100644 +--- a/lib/isc/include/isc/util.h ++++ b/lib/isc/include/isc/util.h +@@ -289,6 +289,10 @@ extern void mock_assert(const int result, const char* const expression, + * Time + */ + #define TIME_NOW(tp) RUNTIME_CHECK(isc_time_now((tp)) == ISC_R_SUCCESS) ++#ifdef CLOCK_BOOTTIME ++#define TIME_MONOTONIC(tp) RUNTIME_CHECK(isc_time_boottime((tp)) == ISC_R_SUCCESS) ++#endif ++ + + /*% + * Alignment +diff --git a/lib/isc/result.c b/lib/isc/result.c +index a9db132..f33fc6b 100644 +--- a/lib/isc/result.c ++++ b/lib/isc/result.c +@@ -105,6 +105,7 @@ static const char *description[ISC_R_NRESULTS] = { + "disc full", /*%< 67 */ + "default", /*%< 68 */ + "IPv4 prefix", /*%< 69 */ ++ "time changed", /*%< 70 */ + }; + + static const char *identifier[ISC_R_NRESULTS] = { +@@ -178,6 +179,7 @@ static const char *identifier[ISC_R_NRESULTS] = { + "ISC_R_DISCFULL", + "ISC_R_DEFAULT", + "ISC_R_IPV4PREFIX", ++ "ISC_R_TIMESHIFTED", + }; + + #define ISC_RESULT_RESULTSET 2 +diff --git a/lib/isc/unix/app.c b/lib/isc/unix/app.c +index a6e9882..286fe95 100644 +--- a/lib/isc/unix/app.c ++++ b/lib/isc/unix/app.c +@@ -442,15 +442,47 @@ isc__app_ctxonrun(isc_appctx_t *ctx0, isc_mem_t *mctx, isc_task_t *task, + static isc_result_t + evloop(isc__appctx_t *ctx) { + isc_result_t result; ++ isc_time_t now; ++#ifdef CLOCK_BOOTTIME ++ isc_time_t monotonic; ++ isc_uint64_t diff = 0; ++#else ++ isc_time_t prev; ++ TIME_NOW(&prev); ++#endif + + while (!ctx->want_shutdown) { + int n; +- isc_time_t when, now; ++ isc_time_t when; + struct timeval tv, *tvp; + isc_socketwait_t *swait; + bool readytasks; + bool call_timer_dispatch = false; + ++ uint64_t us; ++ ++#ifdef CLOCK_BOOTTIME ++ // TBD macros for following three lines ++ TIME_NOW(&now); ++ TIME_MONOTONIC(&monotonic); ++ INSIST(now.seconds > monotonic.seconds) ++ us = isc_time_microdiff (&now, &monotonic); ++ if (us < diff){ ++ us = diff - us; ++ if (us > 1000000){ // ignoring shifts less than one second ++ return ISC_R_TIMESHIFTED; ++ }; ++ diff = isc_time_microdiff (&now, &monotonic); ++ } else { ++ diff = isc_time_microdiff (&now, &monotonic); ++ // not implemented ++ } ++#else ++ TIME_NOW(&now); ++ if (isc_time_compare (&now, &prev) < 0) ++ return ISC_R_TIMESHIFTED; ++ TIME_NOW(&prev); ++#endif + /* + * Check the reload (or suspend) case first for exiting the + * loop as fast as possible in case: +@@ -475,7 +507,6 @@ evloop(isc__appctx_t *ctx) { + if (result != ISC_R_SUCCESS) + tvp = NULL; + else { +- uint64_t us; + + TIME_NOW(&now); + us = isc_time_microdiff(&when, &now); +diff --git a/lib/isc/unix/include/isc/time.h b/lib/isc/unix/include/isc/time.h +index b864c29..5dd43c9 100644 +--- a/lib/isc/unix/include/isc/time.h ++++ b/lib/isc/unix/include/isc/time.h +@@ -132,6 +132,26 @@ isc_time_isepoch(const isc_time_t *t); + *\li 't' is a valid pointer. + */ + ++#ifdef CLOCK_BOOTTIME ++isc_result_t ++isc_time_boottime(isc_time_t *t); ++/*%< ++ * Set 't' to monotonic time from previous boot ++ * it's not affected by system time change. It also ++ * includes the time system was suspended ++ * ++ * Requires: ++ *\li 't' is a valid pointer. ++ * ++ * Returns: ++ * ++ *\li Success ++ *\li Unexpected error ++ * Getting the time from the system failed. ++ */ ++#endif /* CLOCK_BOOTTIME */ ++ ++ + isc_result_t + isc_time_now(isc_time_t *t); + /*%< +diff --git a/lib/isc/unix/time.c b/lib/isc/unix/time.c +index 8edc9df..fe0bb91 100644 +--- a/lib/isc/unix/time.c ++++ b/lib/isc/unix/time.c +@@ -498,3 +498,25 @@ isc_time_formatISO8601ms(const isc_time_t *t, char *buf, unsigned int len) { + t->nanoseconds / NS_PER_MS); + } + } ++ ++ ++#ifdef CLOCK_BOOTTIME ++isc_result_t ++isc_time_boottime(isc_time_t *t) { ++ struct timespec ts; ++ ++ char strbuf[ISC_STRERRORSIZE]; ++ ++ if (clock_gettime (CLOCK_BOOTTIME, &ts) != 0){ ++ isc__strerror(errno, strbuf, sizeof(strbuf)); ++ UNEXPECTED_ERROR(__FILE__, __LINE__, "%s", strbuf); ++ return (ISC_R_UNEXPECTED); ++ } ++ ++ t->seconds = ts.tv_sec; ++ t->nanoseconds = ts.tv_nsec; ++ ++ return (ISC_R_SUCCESS); ++ ++}; ++#endif diff --git a/SOURCES/bind-9.11-engine-pkcs11.patch b/SOURCES/bind-9.11-engine-pkcs11.patch new file mode 100644 index 0000000..4a6290d --- /dev/null +++ b/SOURCES/bind-9.11-engine-pkcs11.patch @@ -0,0 +1,27 @@ +From 37f89ccfc439f8d86c401d9ae10e94e53b924961 Mon Sep 17 00:00:00 2001 +From: Petr Mensik +Date: Tue, 27 Aug 2019 20:39:59 +0200 +Subject: [PATCH] Do not set engine for native PKCS11 + +It resets already set lib_path to pkcs11, which is invalid in native +pkcs11 crypto. Engine has to be path to PKCS#11 module. +--- + bin/named/include/named/globals.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/bin/named/include/named/globals.h b/bin/named/include/named/globals.h +index eda2214..2a611d5 100644 +--- a/bin/named/include/named/globals.h ++++ b/bin/named/include/named/globals.h +@@ -160,7 +160,7 @@ EXTERN const char * ns_g_defaultdnstap INIT(NULL); + + EXTERN const char * ns_g_username INIT(NULL); + +-#if defined(USE_PKCS11) ++#if defined(USE_PKCS11) && !defined(PKCS11CRYPTO) + EXTERN const char * ns_g_engine INIT(PKCS11_ENGINE); + #else + EXTERN const char * ns_g_engine INIT(NULL); +-- +2.20.1 + diff --git a/SOURCES/bind-9.11-export-isc-config.patch b/SOURCES/bind-9.11-export-isc-config.patch new file mode 100644 index 0000000..fd5622c --- /dev/null +++ b/SOURCES/bind-9.11-export-isc-config.patch @@ -0,0 +1,35 @@ +diff --git a/export-libs/Makefile b/export-libs/Makefile +index df15ea8..13f416b 100644 +--- a/export-libs/Makefile ++++ b/export-libs/Makefile +@@ -404,20 +404,18 @@ installdirs: + $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${mandir}/man1 + + install:: isc-config.sh installdirs +- ${INSTALL_SCRIPT} isc-config.sh ${DESTDIR}${bindir} +- rm -f ${DESTDIR}${bindir}/bind9-config +- ln ${DESTDIR}${bindir}/isc-config.sh ${DESTDIR}${bindir}/bind9-config +- ${INSTALL_DATA} ${top_srcdir}/isc-config.sh.1 ${DESTDIR}${mandir}/man1 +- rm -f ${DESTDIR}${mandir}/man1/bind9-config.1 +- ln ${DESTDIR}${mandir}/man1/isc-config.sh.1 ${DESTDIR}${mandir}/man1/bind9-config.1 +- ${INSTALL_DATA} ${top_srcdir}/bind.keys ${DESTDIR}${sysconfdir} ++ ${INSTALL_SCRIPT} isc-config.sh ${DESTDIR}${bindir}/isc-export-config.sh ++ rm -f ${DESTDIR}${bindir}/bind9-export-config ++ ln ${DESTDIR}${bindir}/isc-export-config.sh ${DESTDIR}${bindir}/bind9-export-config ++ ${INSTALL_DATA} ${top_srcdir}/isc-config.sh.1 ${DESTDIR}${mandir}/man1/isc-export-config.sh.1 ++ rm -f ${DESTDIR}${mandir}/man1/bind9-export-config.1 ++ ln ${DESTDIR}${mandir}/man1/isc-export-config.sh.1 ${DESTDIR}${mandir}/man1/bind9-export-config.1 + + uninstall:: +- rm -f ${DESTDIR}${sysconfdir}/bind.keys +- rm -f ${DESTDIR}${mandir}/man1/bind9-config.1 +- rm -f ${DESTDIR}${mandir}/man1/isc-config.sh.1 +- rm -f ${DESTDIR}${bindir}/bind9-config +- rm -f ${DESTDIR}${bindir}/isc-config.sh ++ rm -f ${DESTDIR}${mandir}/man1/bind9-export-config.1 ++ rm -f ${DESTDIR}${mandir}/man1/isc-export-config.sh.1 ++ rm -f ${DESTDIR}${bindir}/bind9-export-config ++ rm -f ${DESTDIR}${bindir}/isc-export-config.sh + + tags: + rm -f TAGS diff --git a/SOURCES/bind-9.11-export-suffix.patch b/SOURCES/bind-9.11-export-suffix.patch new file mode 100644 index 0000000..8703747 --- /dev/null +++ b/SOURCES/bind-9.11-export-suffix.patch @@ -0,0 +1,39 @@ +diff --git a/configure.ac b/configure.ac +index c1bfd62..7c5ad51 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -5333,6 +5333,8 @@ AC_SUBST(BUILD_CPPFLAGS) + AC_SUBST(BUILD_LDFLAGS) + AC_SUBST(BUILD_LIBS) + ++AC_SUBST(LIBDIR_SUFFIX) ++ + # + # Commands to run at the end of config.status. + # Don't just put these into configure, it won't work right if somebody +diff --git a/isc-config.sh.in b/isc-config.sh.in +index b5e94ed..d2857e0 100644 +--- a/isc-config.sh.in ++++ b/isc-config.sh.in +@@ -13,16 +13,17 @@ prefix=@prefix@ + exec_prefix=@exec_prefix@ + exec_prefix_set= + includedir=@includedir@ ++libdir_suffix=@LIBDIR_SUFFIX@ + arch=$(uname -m) + + case $arch in + x86_64 | amd64 | sparc64 | s390x | ppc64) +- libdir=/usr/lib64 +- sec_libdir=/usr/lib ++ libdir=/usr/lib64${libdir_suffix} ++ sec_libdir=/usr/lib${libdir_suffix} + ;; + * ) +- libdir=/usr/lib +- sec_libdir=/usr/lib64 ++ libdir=/usr/lib${libdir_suffix} ++ sec_libdir=/usr/lib64${libdir_suffix} + ;; + esac + diff --git a/SOURCES/bind-9.11-fips-code-includes.patch b/SOURCES/bind-9.11-fips-code-includes.patch new file mode 100644 index 0000000..f71a021 --- /dev/null +++ b/SOURCES/bind-9.11-fips-code-includes.patch @@ -0,0 +1,39 @@ +From 68baeb7211ba2fcd4eff53d987e9b70ba38294cb Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Petr=20Men=C5=A1=C3=ADk?= +Date: Thu, 20 Dec 2018 11:52:12 +0100 +Subject: [PATCH] Fix implicit declaration warning + +isc_md5_available() function is not declared before its use. Include +header providing it in files that use it. +--- + bin/tests/system/tkey/keydelete.c | 1 + + lib/dns/tsig.c | 1 + + 2 files changed, 2 insertions(+) + +diff --git a/bin/tests/system/tkey/keydelete.c b/bin/tests/system/tkey/keydelete.c +index 36ee6c7..6051cd2 100644 +--- a/bin/tests/system/tkey/keydelete.c ++++ b/bin/tests/system/tkey/keydelete.c +@@ -21,6 +21,7 @@ + #include + #include + #include ++#include + #include + #include + #include +diff --git a/lib/dns/tsig.c b/lib/dns/tsig.c +index 70805bb..33870f3 100644 +--- a/lib/dns/tsig.c ++++ b/lib/dns/tsig.c +@@ -18,6 +18,7 @@ + + #include + #include ++#include + #include + #include + #include +-- +2.14.5 + diff --git a/SOURCES/bind-9.11-fips-code.patch b/SOURCES/bind-9.11-fips-code.patch new file mode 100644 index 0000000..cf00104 --- /dev/null +++ b/SOURCES/bind-9.11-fips-code.patch @@ -0,0 +1,1459 @@ +From eff6dcb62f3cea6df0a848c2220a49bc02cb4a0e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Petr=20Men=C5=A1=C3=ADk?= +Date: Thu, 2 Aug 2018 23:34:45 +0200 +Subject: [PATCH] FIPS code changes +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Squashed commit of the following: + +commit b49f70ce0575b6b52a71b90fe0376dbf16f92c6b +Author: Petr Menšík +Date: Mon Jan 22 14:12:37 2018 +0100 + + Update system tests to detect MD5 disabled at runtime + +commit 80ceffee4860c24baf70bc9a8653d92731eda2e4 +Author: Petr Menšík +Date: Thu Aug 2 14:53:54 2018 +0200 + + Avoid warning about undefined parameters + +commit e4ad4363e3d1acaac58456117579f02761f38fdc +Author: Petr Menšík +Date: Wed Jun 20 19:31:19 2018 +0200 + + Fix rndc-confgen default algorithm, report true algorithm in usage. + +commit 7e629a351010cb75e0589ec361f720085675998c +Author: Petr Menšík +Date: Fri Feb 23 21:21:30 2018 +0100 + + Cleanup only if initialization was successful + +commit 2101b948c77cbcbe07eb4a1e60f3e693b2245ec6 +Author: Petr Menšík +Date: Mon Feb 5 12:19:28 2018 +0100 + + Ensure dst backend is initialized first even before hmac algorithms. + +commit 7567c7edde7519115a9ae7e20818c835d3eb1ffe +Author: Petr Menšík +Date: Mon Feb 5 12:17:54 2018 +0100 + + Skip initialization of MD5 based algorithms if not available. + +commit 5782137df6b45a6d900d5a1c250c1257227e917a +Author: Petr Menšík +Date: Mon Feb 5 10:21:27 2018 +0100 + + Change secalgs skipping to be more safe + +commit f2d78729898182d2d19d5064de1bec9b66817159 +Author: Petr Menšík +Date: Wed Jan 31 18:26:11 2018 +0100 + + Skip MD5 algorithm also in case of NULL name + +commit 32a2ad4abc7aaca1c257730319ad3c27405d3407 +Author: Petr Menšík +Date: Wed Jan 31 11:38:12 2018 +0100 + + Make MD5 behave like unknown algorithm in TSIG. + +commit 13cd3f704dce568fdf24a567be5802b58ac6007b +Author: Petr Menšík +Date: Tue Nov 28 20:14:37 2017 +0100 + + Select token with most supported functions, instead of demanding it must support all functions + + Initialize PKCS#11 always until successfully initialized + +commit a71df74abdca4fe63bcdf542b81a109cf1f495b4 +Author: Petr Menšík +Date: Mon Jan 22 16:17:44 2018 +0100 + + Handle MD5 unavailability from DST + +commit dd82cb263efa2753d3ee772972726ea08bcc639b +Author: Petr Menšík +Date: Mon Jan 22 14:11:16 2018 +0100 + + Check runtime flag from library and applications, fail gracefully. + +commit c7b2f87f07ecae75b821a908e29f08a42371e32e +Author: Petr Menšík +Date: Mon Jan 22 08:39:08 2018 +0100 + + Modify libraries to use isc_md5_available() if PK11_MD5_DISABLE is not + defined. + TODO: pk11.c should accept slot without MD5 support. + +commit 0b8e470ec636b9e350b5ec3203eb2b4091415fde +Author: Petr Menšík +Date: Mon Jan 22 07:21:04 2018 +0100 + + Add runtime detection whether MD5 is useable. +--- + bin/confgen/keygen.c | 10 +++- + bin/confgen/rndc-confgen.c | 32 ++++--------- + bin/dig/dig.c | 7 +-- + bin/dig/dighost.c | 14 ++++-- + bin/dnssec/dnssec-keygen.c | 14 ++++++ + bin/named/config.c | 25 +++++++++- + bin/nsupdate/nsupdate.c | 24 ++++++---- + bin/rndc/rndc.c | 3 +- + bin/tests/optional/hash_test.c | 78 ++++++++++++++++--------------- + bin/tests/system/tkey/keycreate.c | 3 ++ + bin/tests/system/tkey/keydelete.c | 17 ++++--- + lib/bind9/check.c | 10 ++++ + lib/dns/dst_api.c | 23 ++++++--- + lib/dns/dst_internal.h | 3 +- + lib/dns/dst_parse.c | 18 +++++-- + lib/dns/hmac_link.c | 18 ++----- + lib/dns/opensslrsa_link.c | 6 +++ + lib/dns/pkcs11rsa_link.c | 33 +++++++++++-- + lib/dns/rcode.c | 21 ++++++++- + lib/dns/tests/rsa_test.c | 4 ++ + lib/dns/tests/tsig_test.c | 1 + + lib/dns/tkey.c | 9 ++++ + lib/dns/tsec.c | 8 +++- + lib/dns/tsig.c | 17 ++++--- + lib/isc/include/isc/md5.h | 3 ++ + lib/isc/md5.c | 59 +++++++++++++++++++++++ + lib/isc/pk11.c | 44 +++++++++++------ + lib/isc/tests/hash_test.c | 9 ++++ + lib/isccc/cc.c | 42 +++++++++++------ + 29 files changed, 400 insertions(+), 155 deletions(-) + +diff --git a/bin/confgen/keygen.c b/bin/confgen/keygen.c +index 8931ad5..5015abb 100644 +--- a/bin/confgen/keygen.c ++++ b/bin/confgen/keygen.c +@@ -22,6 +22,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -73,7 +74,7 @@ alg_fromtext(const char *name) { + p = &name[5]; + + #ifndef PK11_MD5_DISABLE +- if (strcasecmp(p, "md5") == 0) ++ if (strcasecmp(p, "md5") == 0 && isc_md5_available()) + return DST_ALG_HMACMD5; + #endif + if (strcasecmp(p, "sha1") == 0) +@@ -132,6 +133,13 @@ generate_key(isc_mem_t *mctx, const char *randomfile, dns_secalg_t alg, + switch (alg) { + #ifndef PK11_MD5_DISABLE + case DST_ALG_HMACMD5: ++ if (!isc_md5_available()) { ++ fatal("unsupported algorithm %d\n", alg); ++ } else if (keysize < 1 || keysize > 512) { ++ fatal("keysize %d out of range (must be 1-512)\n", ++ keysize); ++ } ++ break; + #endif + case DST_ALG_HMACSHA1: + case DST_ALG_HMACSHA224: +diff --git a/bin/confgen/rndc-confgen.c b/bin/confgen/rndc-confgen.c +index 5ca3d76..6b7790a 100644 +--- a/bin/confgen/rndc-confgen.c ++++ b/bin/confgen/rndc-confgen.c +@@ -36,6 +36,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -63,7 +64,7 @@ const char *progname; + + bool verbose = false; + +-const char *keyfile, *keydef; ++const char *keyfile, *keydef, *algdef; + + ISC_PLATFORM_NORETURN_PRE static void + usage(int status) ISC_PLATFORM_NORETURN_POST; +@@ -71,13 +72,12 @@ usage(int status) ISC_PLATFORM_NORETURN_POST; + static void + usage(int status) { + +-#ifndef PK11_MD5_DISABLE + fprintf(stderr, "\ + Usage:\n\ + %s [-a] [-b bits] [-c keyfile] [-k keyname] [-p port] [-r randomfile] \ + [-s addr] [-t chrootdir] [-u user]\n\ + -a: generate just the key clause and write it to keyfile (%s)\n\ +- -A alg: algorithm (default hmac-md5)\n\ ++ -A alg: algorithm (default %s)\n\ + -b bits: from 1 through 512, default 256; total length of the secret\n\ + -c keyfile: specify an alternate key file (requires -a)\n\ + -k keyname: the name as it will be used in named.conf and rndc.conf\n\ +@@ -86,24 +86,7 @@ Usage:\n\ + -s addr: the address to which rndc should connect\n\ + -t chrootdir: write a keyfile in chrootdir as well (requires -a)\n\ + -u user: set the keyfile owner to \"user\" (requires -a)\n", +- progname, keydef); +-#else +- fprintf(stderr, "\ +-Usage:\n\ +- %s [-a] [-b bits] [-c keyfile] [-k keyname] [-p port] [-r randomfile] \ +-[-s addr] [-t chrootdir] [-u user]\n\ +- -a: generate just the key clause and write it to keyfile (%s)\n\ +- -A alg: algorithm (default hmac-sha256)\n\ +- -b bits: from 1 through 512, default 256; total length of the secret\n\ +- -c keyfile: specify an alternate key file (requires -a)\n\ +- -k keyname: the name as it will be used in named.conf and rndc.conf\n\ +- -p port: the port named will listen on and rndc will connect to\n\ +- -r randomfile: source of random data (use \"keyboard\" for key timing)\n\ +- -s addr: the address to which rndc should connect\n\ +- -t chrootdir: write a keyfile in chrootdir as well (requires -a)\n\ +- -u user: set the keyfile owner to \"user\" (requires -a)\n", +- progname, keydef); +-#endif ++ progname, keydef, algdef); + + exit (status); + } +@@ -139,11 +122,12 @@ main(int argc, char **argv) { + progname = program; + + keyname = DEFAULT_KEYNAME; +-#ifndef PK11_MD5_DISABLE +- alg = DST_ALG_HMACMD5; +-#else + alg = DST_ALG_HMACSHA256; ++#ifndef PK11_MD5_DISABLE ++ if (isc_md5_available()) ++ alg = DST_ALG_HMACMD5; + #endif ++ algdef = alg_totext(alg); + serveraddr = DEFAULT_SERVER; + port = DEFAULT_PORT; + +diff --git a/bin/dig/dig.c b/bin/dig/dig.c +index 706299e..aaf22e7 100644 +--- a/bin/dig/dig.c ++++ b/bin/dig/dig.c +@@ -20,6 +20,7 @@ + #include + + #include ++#include + #include + #include + #include +@@ -1774,10 +1775,10 @@ dash_option(char *option, char *next, dig_lookup_t **lookup, + ptr = ptr2; + ptr2 = ptr3; + } else { +-#ifndef PK11_MD5_DISABLE +- hmacname = DNS_TSIG_HMACMD5_NAME; +-#else + hmacname = DNS_TSIG_HMACSHA256_NAME; ++#ifndef PK11_MD5_DISABLE ++ if (isc_md5_available()) ++ hmacname = DNS_TSIG_HMACMD5_NAME; + #endif + digestbits = 0; + } +diff --git a/bin/dig/dighost.c b/bin/dig/dighost.c +index 93e5b40..afd2700 100644 +--- a/bin/dig/dighost.c ++++ b/bin/dig/dighost.c +@@ -80,6 +80,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -1246,9 +1247,10 @@ parse_hmac(const char *hmac) { + digestbits = 0; + + #ifndef PK11_MD5_DISABLE +- if (strcasecmp(buf, "hmac-md5") == 0) { ++ if (strcasecmp(buf, "hmac-md5") == 0 && isc_md5_available()) { + hmacname = DNS_TSIG_HMACMD5_NAME; +- } else if (strncasecmp(buf, "hmac-md5-", 9) == 0) { ++ } else if (strncasecmp(buf, "hmac-md5-", 9) == 0 && ++ isc_md5_available()) { + hmacname = DNS_TSIG_HMACMD5_NAME; + digestbits = parse_bits(&buf[9], "digest-bits [0..128]", 128); + } else +@@ -1368,7 +1370,13 @@ setup_file_key(void) { + switch (dst_key_alg(dstkey)) { + #ifndef PK11_MD5_DISABLE + case DST_ALG_HMACMD5: +- hmacname = DNS_TSIG_HMACMD5_NAME; ++ if (isc_md5_available()) { ++ hmacname = DNS_TSIG_HMACMD5_NAME; ++ } else { ++ printf(";; Couldn't create key %s: bad algorithm\n", ++ keynametext); ++ goto failure; ++ } + break; + #endif + case DST_ALG_HMACSHA1: +diff --git a/bin/dnssec/dnssec-keygen.c b/bin/dnssec/dnssec-keygen.c +index 1476d0d..f5c9316 100644 +--- a/bin/dnssec/dnssec-keygen.c ++++ b/bin/dnssec/dnssec-keygen.c +@@ -36,6 +36,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -562,6 +563,19 @@ main(int argc, char **argv) { + "\"-a RSAMD5\"\n"); + INSIST(freeit == NULL); + return (1); ++ } else if (strcasecmp(algname, "HMAC-MD5") == 0) { ++ if (isc_md5_available()) { ++ alg = DST_ALG_HMACMD5; ++ } else { ++ fprintf(stderr, ++ "The use of HMAC-MD5 was disabled\n"); ++ return (1); ++ } ++ } else if (strcasecmp(algname, "RSAMD5") == 0 && ++ !isc_md5_available()) { ++ fprintf(stderr, "The use of RSAMD5 was disabled\n"); ++ INSIST(freeit == NULL); ++ return (1); + } else if (strcasecmp(algname, "HMAC-MD5") == 0) { + alg = DST_ALG_HMACMD5; + #else +diff --git a/bin/named/config.c b/bin/named/config.c +index 32c454a..dff826b 100644 +--- a/bin/named/config.c ++++ b/bin/named/config.c +@@ -18,6 +18,7 @@ + + #include + #include ++#include + #include + #include + #include +@@ -974,6 +975,21 @@ ns_config_getkeyalgorithm(const char *str, dns_name_t **name, + return (ns_config_getkeyalgorithm2(str, name, NULL, digestbits)); + } + ++static inline int ++algorithms_start() { ++#ifndef PK11_MD5_DISABLE ++ if (!isc_md5_available()) { ++ int i = 0; ++ while (algorithms[i].str != NULL && ++ algorithms[i].hmac == hmacmd5) { ++ i++; ++ } ++ return i; ++ } ++#endif ++ return 0; ++} ++ + isc_result_t + ns_config_getkeyalgorithm2(const char *str, dns_name_t **name, + unsigned int *typep, uint16_t *digestbits) +@@ -983,7 +999,7 @@ ns_config_getkeyalgorithm2(const char *str, dns_name_t **name, + uint16_t bits; + isc_result_t result; + +- for (i = 0; algorithms[i].str != NULL; i++) { ++ for (i = algorithms_start(); algorithms[i].str != NULL; i++) { + len = strlen(algorithms[i].str); + if (strncasecmp(algorithms[i].str, str, len) == 0 && + (str[len] == '\0' || +@@ -1006,7 +1022,12 @@ ns_config_getkeyalgorithm2(const char *str, dns_name_t **name, + if (name != NULL) { + switch (algorithms[i].hmac) { + #ifndef PK11_MD5_DISABLE +- case hmacmd5: *name = dns_tsig_hmacmd5_name; break; ++ case hmacmd5: ++ if (isc_md5_available()) { ++ *name = dns_tsig_hmacmd5_name; break; ++ } else { ++ return (ISC_R_NOTFOUND); ++ } + #endif + case hmacsha1: *name = dns_tsig_hmacsha1_name; break; + case hmacsha224: *name = dns_tsig_hmacsha224_name; break; +diff --git a/bin/nsupdate/nsupdate.c b/bin/nsupdate/nsupdate.c +index de60313..bbb3936 100644 +--- a/bin/nsupdate/nsupdate.c ++++ b/bin/nsupdate/nsupdate.c +@@ -31,6 +31,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -477,9 +478,10 @@ parse_hmac(dns_name_t **hmac, const char *hmacstr, size_t len, + strlcpy(buf, hmacstr, ISC_MIN(len + 1, sizeof(buf))); + + #ifndef PK11_MD5_DISABLE +- if (strcasecmp(buf, "hmac-md5") == 0) { ++ if (strcasecmp(buf, "hmac-md5") == 0 && isc_md5_available()) { + *hmac = DNS_TSIG_HMACMD5_NAME; +- } else if (strncasecmp(buf, "hmac-md5-", 9) == 0) { ++ } else if (strncasecmp(buf, "hmac-md5-", 9) == 0 && ++ isc_md5_available()) { + *hmac = DNS_TSIG_HMACMD5_NAME; + result = isc_parse_uint16(&digestbits, &buf[9], 10); + if (result != ISC_R_SUCCESS || digestbits > 128) { +@@ -592,10 +594,10 @@ setup_keystr(void) { + exit(1); + } + } else { +-#ifndef PK11_MD5_DISABLE +- hmacname = DNS_TSIG_HMACMD5_NAME; +-#else + hmacname = DNS_TSIG_HMACSHA256_NAME; ++#ifndef PK11_MD5_DISABLE ++ if (isc_md5_available()) ++ hmacname = DNS_TSIG_HMACMD5_NAME; + #endif + name = keystr; + n = s; +@@ -732,7 +734,8 @@ setup_keyfile(isc_mem_t *mctx, isc_log_t *lctx) { + switch (dst_key_alg(dstkey)) { + #ifndef PK11_MD5_DISABLE + case DST_ALG_HMACMD5: +- hmacname = DNS_TSIG_HMACMD5_NAME; ++ if (isc_md5_available()) ++ hmacname = DNS_TSIG_HMACMD5_NAME; + break; + #endif + case DST_ALG_HMACSHA1: +@@ -1637,12 +1640,13 @@ evaluate_key(char *cmdline) { + return (STATUS_SYNTAX); + } + namestr = n + 1; +- } else +-#ifndef PK11_MD5_DISABLE +- hmacname = DNS_TSIG_HMACMD5_NAME; +-#else ++ } else { + hmacname = DNS_TSIG_HMACSHA256_NAME; ++#ifndef PK11_MD5_DISABLE ++ if (isc_md5_available()) ++ hmacname = DNS_TSIG_HMACMD5_NAME; + #endif ++ } + + isc_buffer_init(&b, namestr, strlen(namestr)); + isc_buffer_add(&b, strlen(namestr)); +diff --git a/bin/rndc/rndc.c b/bin/rndc/rndc.c +index 9eb0ce0..8083654 100644 +--- a/bin/rndc/rndc.c ++++ b/bin/rndc/rndc.c +@@ -23,6 +23,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -636,7 +637,7 @@ parse_config(isc_mem_t *mctx, isc_log_t *log, const char *keyname, + algorithmstr = cfg_obj_asstring(algorithmobj); + + #ifndef PK11_MD5_DISABLE +- if (strcasecmp(algorithmstr, "hmac-md5") == 0) ++ if (strcasecmp(algorithmstr, "hmac-md5") == 0 && isc_md5_available()) + algorithm = ISCCC_ALG_HMACMD5; + else + #endif +diff --git a/bin/tests/optional/hash_test.c b/bin/tests/optional/hash_test.c +index bf2891a..b5f0a1c 100644 +--- a/bin/tests/optional/hash_test.c ++++ b/bin/tests/optional/hash_test.c +@@ -90,43 +90,47 @@ main(int argc, char **argv) { + print_digest(s, "sha224", digest, ISC_SHA224_DIGESTLENGTH/4); + + #ifndef PK11_MD5_DISABLE +- s = "abc"; +- isc_md5_init(&md5); +- memmove(buffer, s, strlen(s)); +- isc_md5_update(&md5, buffer, strlen(s)); +- isc_md5_final(&md5, digest); +- print_digest(s, "md5", digest, 4); +- +- /* +- * The 3 HMAC-MD5 examples from RFC2104 +- */ +- s = "Hi There"; +- memset(key, 0x0b, 16); +- isc_hmacmd5_init(&hmacmd5, key, 16); +- memmove(buffer, s, strlen(s)); +- isc_hmacmd5_update(&hmacmd5, buffer, strlen(s)); +- isc_hmacmd5_sign(&hmacmd5, digest); +- print_digest(s, "hmacmd5", digest, 4); +- +- s = "what do ya want for nothing?"; +- strlcpy((char *)key, "Jefe", sizeof(key)); +- isc_hmacmd5_init(&hmacmd5, key, 4); +- memmove(buffer, s, strlen(s)); +- isc_hmacmd5_update(&hmacmd5, buffer, strlen(s)); +- isc_hmacmd5_sign(&hmacmd5, digest); +- print_digest(s, "hmacmd5", digest, 4); +- +- s = "\335\335\335\335\335\335\335\335\335\335" +- "\335\335\335\335\335\335\335\335\335\335" +- "\335\335\335\335\335\335\335\335\335\335" +- "\335\335\335\335\335\335\335\335\335\335" +- "\335\335\335\335\335\335\335\335\335\335"; +- memset(key, 0xaa, 16); +- isc_hmacmd5_init(&hmacmd5, key, 16); +- memmove(buffer, s, strlen(s)); +- isc_hmacmd5_update(&hmacmd5, buffer, strlen(s)); +- isc_hmacmd5_sign(&hmacmd5, digest); +- print_digest(s, "hmacmd5", digest, 4); ++ if (isc_md5_available()) { ++ s = "abc"; ++ isc_md5_init(&md5); ++ memmove(buffer, s, strlen(s)); ++ isc_md5_update(&md5, buffer, strlen(s)); ++ isc_md5_final(&md5, digest); ++ print_digest(s, "md5", digest, 4); ++ ++ /* ++ * The 3 HMAC-MD5 examples from RFC2104 ++ */ ++ s = "Hi There"; ++ memset(key, 0x0b, 16); ++ isc_hmacmd5_init(&hmacmd5, key, 16); ++ memmove(buffer, s, strlen(s)); ++ isc_hmacmd5_update(&hmacmd5, buffer, strlen(s)); ++ isc_hmacmd5_sign(&hmacmd5, digest); ++ print_digest(s, "hmacmd5", digest, 4); ++ ++ s = "what do ya want for nothing?"; ++ strlcpy((char *)key, "Jefe", sizeof(key)); ++ isc_hmacmd5_init(&hmacmd5, key, 4); ++ memmove(buffer, s, strlen(s)); ++ isc_hmacmd5_update(&hmacmd5, buffer, strlen(s)); ++ isc_hmacmd5_sign(&hmacmd5, digest); ++ print_digest(s, "hmacmd5", digest, 4); ++ ++ s = "\335\335\335\335\335\335\335\335\335\335" ++ "\335\335\335\335\335\335\335\335\335\335" ++ "\335\335\335\335\335\335\335\335\335\335" ++ "\335\335\335\335\335\335\335\335\335\335" ++ "\335\335\335\335\335\335\335\335\335\335"; ++ memset(key, 0xaa, 16); ++ isc_hmacmd5_init(&hmacmd5, key, 16); ++ memmove(buffer, s, strlen(s)); ++ isc_hmacmd5_update(&hmacmd5, buffer, strlen(s)); ++ isc_hmacmd5_sign(&hmacmd5, digest); ++ print_digest(s, "hmacmd5", digest, 4); ++ } else { ++ fprintf(stderr, "Skipping disabled MD5 algorithm\n"); ++ } + #endif + + /* +diff --git a/bin/tests/system/tkey/keycreate.c b/bin/tests/system/tkey/keycreate.c +index 5a00f86..653c951 100644 +--- a/bin/tests/system/tkey/keycreate.c ++++ b/bin/tests/system/tkey/keycreate.c +@@ -20,6 +20,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -142,6 +143,8 @@ sendquery(isc_task_t *task, isc_event_t *event) { + static char keystr[] = "0123456789ab"; + + isc_event_free(&event); ++ if (!isc_md5_available()) ++ CHECK("MD5 was disabled", ISC_R_NOTIMPLEMENTED); + + result = ISC_R_FAILURE; + if (inet_pton(AF_INET, "10.53.0.1", &inaddr) != 1) +diff --git a/bin/tests/system/tkey/keydelete.c b/bin/tests/system/tkey/keydelete.c +index bde66a4..70a40c3 100644 +--- a/bin/tests/system/tkey/keydelete.c ++++ b/bin/tests/system/tkey/keydelete.c +@@ -225,12 +225,17 @@ main(int argc, char **argv) { + result = dst_key_fromnamedfile(keyname, NULL, type, mctx, &dstkey); + CHECK("dst_key_fromnamedfile", result); + #ifndef PK11_MD5_DISABLE +- result = dns_tsigkey_createfromkey(dst_key_name(dstkey), +- DNS_TSIG_HMACMD5_NAME, +- dstkey, true, NULL, 0, 0, +- mctx, ring, &tsigkey); +- dst_key_free(&dstkey); +- CHECK("dns_tsigkey_createfromkey", result); ++ if (isc_md5_available()) { ++ result = dns_tsigkey_createfromkey(dst_key_name(dstkey), ++ DNS_TSIG_HMACMD5_NAME, ++ dstkey, true, NULL, 0, 0, ++ mctx, ring, &tsigkey); ++ dst_key_free(&dstkey); ++ CHECK("dns_tsigkey_createfromkey", result); ++ } else { ++ dst_key_free(&dstkey); ++ CHECK("MD5 was disabled", ISC_R_NOTIMPLEMENTED); ++ } + #else + dst_key_free(&dstkey); + CHECK("MD5 was disabled", ISC_R_NOTIMPLEMENTED); +diff --git a/lib/bind9/check.c b/lib/bind9/check.c +index ec0ab6d..e0803d4 100644 +--- a/lib/bind9/check.c ++++ b/lib/bind9/check.c +@@ -23,6 +23,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -2618,6 +2619,15 @@ bind9_check_key(const cfg_obj_t *key, isc_log_t *logctx) { + } + + algorithm = cfg_obj_asstring(algobj); ++#ifndef PK11_MD5_DISABLE ++ /* Skip hmac-md5* algorithms */ ++ if (!isc_md5_available() && ++ strncasecmp(algorithm, "hmac-md5", 8) == 0) { ++ cfg_obj_log(algobj, logctx, ISC_LOG_ERROR, ++ "disabled algorithm '%s'", algorithm); ++ return (ISC_R_DISABLED); ++ } ++#endif + for (i = 0; algorithms[i].name != NULL; i++) { + len = strlen(algorithms[i].name); + if (strncasecmp(algorithms[i].name, algorithm, len) == 0 && +diff --git a/lib/dns/dst_api.c b/lib/dns/dst_api.c +index e3c47a9..320c0f8 100644 +--- a/lib/dns/dst_api.c ++++ b/lib/dns/dst_api.c +@@ -192,6 +192,12 @@ dst_lib_init2(isc_mem_t *mctx, isc_entropy_t *ectx, + dst_result_register(); + + memset(dst_t_func, 0, sizeof(dst_t_func)); ++ ++#ifdef OPENSSL ++ RETERR(dst__openssl_init(engine)); ++#elif PKCS11CRYPTO ++ RETERR(dst__pkcs11_init(mctx, engine)); ++#endif + #ifndef PK11_MD5_DISABLE + RETERR(dst__hmacmd5_init(&dst_t_func[DST_ALG_HMACMD5])); + #endif +@@ -201,7 +207,6 @@ dst_lib_init2(isc_mem_t *mctx, isc_entropy_t *ectx, + RETERR(dst__hmacsha384_init(&dst_t_func[DST_ALG_HMACSHA384])); + RETERR(dst__hmacsha512_init(&dst_t_func[DST_ALG_HMACSHA512])); + #ifdef OPENSSL +- RETERR(dst__openssl_init(engine)); + #ifndef PK11_MD5_DISABLE + RETERR(dst__opensslrsa_init(&dst_t_func[DST_ALG_RSAMD5], + DST_ALG_RSAMD5)); +@@ -235,14 +240,18 @@ dst_lib_init2(isc_mem_t *mctx, isc_entropy_t *ectx, + RETERR(dst__openssleddsa_init(&dst_t_func[DST_ALG_ED448])); + #endif + #elif PKCS11CRYPTO +- RETERR(dst__pkcs11_init(mctx, engine)); + #ifndef PK11_MD5_DISABLE +- RETERR(dst__pkcs11rsa_init(&dst_t_func[DST_ALG_RSAMD5])); ++ RETERR(dst__pkcs11rsa_init(&dst_t_func[DST_ALG_RSAMD5], ++ DST_ALG_RSAMD5)); + #endif +- RETERR(dst__pkcs11rsa_init(&dst_t_func[DST_ALG_RSASHA1])); +- RETERR(dst__pkcs11rsa_init(&dst_t_func[DST_ALG_NSEC3RSASHA1])); +- RETERR(dst__pkcs11rsa_init(&dst_t_func[DST_ALG_RSASHA256])); +- RETERR(dst__pkcs11rsa_init(&dst_t_func[DST_ALG_RSASHA512])); ++ RETERR(dst__pkcs11rsa_init(&dst_t_func[DST_ALG_RSASHA1], ++ DST_ALG_RSASHA1)); ++ RETERR(dst__pkcs11rsa_init(&dst_t_func[DST_ALG_NSEC3RSASHA1], ++ DST_ALG_NSEC3RSASHA1)); ++ RETERR(dst__pkcs11rsa_init(&dst_t_func[DST_ALG_RSASHA256], ++ DST_ALG_RSASHA256)); ++ RETERR(dst__pkcs11rsa_init(&dst_t_func[DST_ALG_RSASHA512], ++ DST_ALG_RSASHA512)); + #ifndef PK11_DSA_DISABLE + RETERR(dst__pkcs11dsa_init(&dst_t_func[DST_ALG_DSA])); + RETERR(dst__pkcs11dsa_init(&dst_t_func[DST_ALG_NSEC3DSA])); +diff --git a/lib/dns/dst_internal.h b/lib/dns/dst_internal.h +index 6ee796c..3e55d44 100644 +--- a/lib/dns/dst_internal.h ++++ b/lib/dns/dst_internal.h +@@ -250,7 +250,8 @@ isc_result_t dst__hmacsha384_init(struct dst_func **funcp); + isc_result_t dst__hmacsha512_init(struct dst_func **funcp); + isc_result_t dst__opensslrsa_init(struct dst_func **funcp, + unsigned char algorithm); +-isc_result_t dst__pkcs11rsa_init(struct dst_func **funcp); ++isc_result_t dst__pkcs11rsa_init(struct dst_func **funcp, ++ unsigned char algorithm); + #ifndef PK11_DSA_DISABLE + isc_result_t dst__openssldsa_init(struct dst_func **funcp); + isc_result_t dst__pkcs11dsa_init(struct dst_func **funcp); +diff --git a/lib/dns/dst_parse.c b/lib/dns/dst_parse.c +index f31c33d..87023a6 100644 +--- a/lib/dns/dst_parse.c ++++ b/lib/dns/dst_parse.c +@@ -33,6 +33,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -396,6 +397,10 @@ check_data(const dst_private_t *priv, const unsigned int alg, + switch (alg) { + #ifndef PK11_MD5_DISABLE + case DST_ALG_RSAMD5: ++ if (isc_md5_available()) ++ return (check_rsa(priv, external)); ++ else ++ return (DST_R_UNSUPPORTEDALG); + #endif + case DST_ALG_RSASHA1: + case DST_ALG_NSEC3RSASHA1: +@@ -421,7 +426,10 @@ check_data(const dst_private_t *priv, const unsigned int alg, + return (check_eddsa(priv, external)); + #ifndef PK11_MD5_DISABLE + case DST_ALG_HMACMD5: +- return (check_hmac_md5(priv, old)); ++ if (isc_md5_available()) ++ return (check_hmac_md5(priv, old)); ++ else ++ return (DST_R_UNSUPPORTEDALG); + #endif + case DST_ALG_HMACSHA1: + return (check_hmac_sha(priv, HMACSHA1_NTAGS, alg)); +@@ -640,11 +648,13 @@ dst__privstruct_parse(dst_key_t *key, unsigned int alg, isc_lex_t *lex, + } + + #ifdef PK11_MD5_DISABLE +- check = check_data(priv, alg == DST_ALG_RSA ? DST_ALG_RSASHA1 : alg, +- true, external); ++ if (alg == DST_ALG_RSA) ++ alg = DST_ALG_RSASHA1; + #else +- check = check_data(priv, alg, true, external); ++ if (!isc_md5_available() && alg == DST_ALG_RSA) ++ alg = DST_ALG_RSASHA1; + #endif ++ check = check_data(priv, alg, true, external); + if (check < 0) { + ret = DST_R_INVALIDPRIVATEKEY; + goto fail; +diff --git a/lib/dns/hmac_link.c b/lib/dns/hmac_link.c +index 3b6579b..4bdce2f 100644 +--- a/lib/dns/hmac_link.c ++++ b/lib/dns/hmac_link.c +@@ -340,20 +340,10 @@ static dst_func_t hmacmd5_functions = { + + isc_result_t + dst__hmacmd5_init(dst_func_t **funcp) { +-#ifdef HAVE_FIPS_MODE +- /* +- * Problems from OpenSSL are likely from FIPS mode +- */ +- int fips_mode = FIPS_mode(); +- +- if (fips_mode != 0) { +- UNEXPECTED_ERROR(__FILE__, __LINE__, +- "FIPS mode is %d: MD5 is only supported " +- "if the value is 0.\n" +- "Please disable either FIPS mode or MD5.", +- fips_mode); +- } +-#endif ++ ++ /* Intentionally skip initialization */ ++ if (!isc_md5_available()) ++ return (ISC_R_SUCCESS); + + #if PK11_FLAVOR != PK11_UTIMACO_FLAVOR + /* +diff --git a/lib/dns/opensslrsa_link.c b/lib/dns/opensslrsa_link.c +index ec35f50..c80fabe 100644 +--- a/lib/dns/opensslrsa_link.c ++++ b/lib/dns/opensslrsa_link.c +@@ -1812,6 +1812,12 @@ dst__opensslrsa_init(dst_func_t **funcp, unsigned char algorithm) { + + if (*funcp == NULL) { + switch (algorithm) { ++#ifndef PK11_MD5_DISABLE ++ case DST_ALG_RSAMD5: ++ if (isc_md5_available()) ++ *funcp = &opensslrsa_functions; ++ break; ++#endif + case DST_ALG_RSASHA256: + #if defined(HAVE_EVP_SHA256) || !USE_EVP + *funcp = &opensslrsa_functions; +diff --git a/lib/dns/pkcs11rsa_link.c b/lib/dns/pkcs11rsa_link.c +index 096c1a8..6c280bf 100644 +--- a/lib/dns/pkcs11rsa_link.c ++++ b/lib/dns/pkcs11rsa_link.c +@@ -96,10 +96,15 @@ pkcs11rsa_createctx_sign(dst_key_t *key, dst_context_t *dctx) { + #endif + + /* +- * Reject incorrect RSA key lengths. ++ * Reject incorrect RSA key lengths or disabled algorithms. + */ + switch (dctx->key->key_alg) { + case DST_ALG_RSAMD5: ++#ifndef PK11_MD5_DISABLE ++ if (!isc_md5_available()) ++ return (ISC_R_FAILURE); ++#endif ++ /* FALLTHROUGH */ + case DST_ALG_RSASHA1: + case DST_ALG_NSEC3RSASHA1: + /* From RFC 3110 */ +@@ -641,6 +646,9 @@ pkcs11rsa_createctx(dst_key_t *key, dst_context_t *dctx) { + switch (key->key_alg) { + #ifndef PK11_MD5_DISABLE + case DST_ALG_RSAMD5: ++ if (!isc_md5_available()) ++ return (ISC_R_FAILURE); ++ + mech.mechanism = CKM_MD5; + break; + #endif +@@ -799,6 +807,9 @@ pkcs11rsa_sign(dst_context_t *dctx, isc_buffer_t *sig) { + switch (key->key_alg) { + #ifndef PK11_MD5_DISABLE + case DST_ALG_RSAMD5: ++ if (!isc_md5_available()) ++ return (ISC_R_FAILURE); ++ + der = md5_der; + derlen = sizeof(md5_der); + hashlen = ISC_MD5_DIGESTLENGTH; +@@ -1024,6 +1035,9 @@ pkcs11rsa_verify(dst_context_t *dctx, const isc_region_t *sig) { + switch (key->key_alg) { + #ifndef PK11_MD5_DISABLE + case DST_ALG_RSAMD5: ++ if (!isc_md5_available()) ++ return (ISC_R_FAILURE); ++ + der = md5_der; + derlen = sizeof(md5_der); + hashlen = ISC_MD5_DIGESTLENGTH; +@@ -2231,11 +2245,22 @@ static dst_func_t pkcs11rsa_functions = { + }; + + isc_result_t +-dst__pkcs11rsa_init(dst_func_t **funcp) { ++dst__pkcs11rsa_init(dst_func_t **funcp, unsigned char algorithm) { + REQUIRE(funcp != NULL); + +- if (*funcp == NULL) +- *funcp = &pkcs11rsa_functions; ++ if (*funcp == NULL) { ++ switch (algorithm) { ++#ifndef PK11_MD5_DISABLE ++ case DST_ALG_RSAMD5: ++ if (isc_md5_available()) ++ *funcp = &pkcs11rsa_functions; ++ break; ++#endif ++ default: ++ *funcp = &pkcs11rsa_functions; ++ break; ++ } ++ } + return (ISC_R_SUCCESS); + } + +diff --git a/lib/dns/rcode.c b/lib/dns/rcode.c +index 9c42c50..f51d548 100644 +--- a/lib/dns/rcode.c ++++ b/lib/dns/rcode.c +@@ -16,6 +16,7 @@ + #include + + #include ++#include + #include + #include + #include +@@ -357,17 +358,33 @@ dns_cert_totext(dns_cert_t cert, isc_buffer_t *target) { + return (dns_mnemonic_totext(cert, target, certs)); + } + ++static inline struct tbl * ++secalgs_tbl_start() { ++ struct tbl *algs = secalgs; ++ ++#ifndef PK11_MD5_DISABLE ++ if (!isc_md5_available()) { ++ while (algs->name != NULL && ++ algs->value == DNS_KEYALG_RSAMD5) ++ ++algs; ++ } ++#endif ++ return algs; ++} ++ + isc_result_t + dns_secalg_fromtext(dns_secalg_t *secalgp, isc_textregion_t *source) { + unsigned int value; +- RETERR(dns_mnemonic_fromtext(&value, source, secalgs, 0xff)); ++ ++ RETERR(dns_mnemonic_fromtext(&value, source, ++ secalgs_tbl_start(), 0xff)); + *secalgp = value; + return (ISC_R_SUCCESS); + } + + isc_result_t + dns_secalg_totext(dns_secalg_t secalg, isc_buffer_t *target) { +- return (dns_mnemonic_totext(secalg, target, secalgs)); ++ return (dns_mnemonic_totext(secalg, target, secalgs_tbl_start())); + } + + void +diff --git a/lib/dns/tests/rsa_test.c b/lib/dns/tests/rsa_test.c +index f9ac6d0..241e17e 100644 +--- a/lib/dns/tests/rsa_test.c ++++ b/lib/dns/tests/rsa_test.c +@@ -27,6 +27,7 @@ + #define UNIT_TESTING + #include + ++#include + #include + #include + +@@ -248,6 +249,8 @@ isc_rsa_verify_test(void **state) { + /* RSAMD5 */ + + #ifndef PK11_MD5_DISABLE ++ if (isc_md5_available()) { ++ /* wrong indentation is kept for diff minimization */ + key->key_alg = DST_ALG_RSAMD5; + + ret = dst_context_create3(key, mctx, DNS_LOGCATEGORY_DNSSEC, +@@ -265,6 +268,7 @@ isc_rsa_verify_test(void **state) { + assert_int_equal(ret, ISC_R_SUCCESS); + + dst_context_destroy(&ctx); ++ } + #endif + + /* RSASHA256 */ +diff --git a/lib/dns/tests/tsig_test.c b/lib/dns/tests/tsig_test.c +index 11d011a..feb2068 100644 +--- a/lib/dns/tests/tsig_test.c ++++ b/lib/dns/tests/tsig_test.c +@@ -25,6 +25,7 @@ + #define UNIT_TESTING + #include + ++#include + #include + #include + #include +diff --git a/lib/dns/tkey.c b/lib/dns/tkey.c +index 89cfc79..d07364a 100644 +--- a/lib/dns/tkey.c ++++ b/lib/dns/tkey.c +@@ -245,6 +245,9 @@ compute_secret(isc_buffer_t *shared, isc_region_t *queryrandomness, + unsigned char digests[32]; + unsigned int i; + ++ if (!isc_md5_available()) ++ return (ISC_R_NOTIMPLEMENTED); ++ + isc_buffer_usedregion(shared, &r); + + /* +@@ -321,6 +324,12 @@ process_dhtkey(dns_message_t *msg, dns_name_t *signer, dns_name_t *name, + } + + #ifndef PK11_MD5_DISABLE ++ if (!isc_md5_available()) { ++ tkey_log("process_dhtkey: MD5 was disabled"); ++ tkeyout->error = dns_tsigerror_badalg; ++ return (ISC_R_SUCCESS); ++ } ++ + if (!dns_name_equal(&tkeyin->algorithm, DNS_TSIG_HMACMD5_NAME)) { + tkey_log("process_dhtkey: algorithms other than " + "hmac-md5 are not supported"); +diff --git a/lib/dns/tsec.c b/lib/dns/tsec.c +index 9d8ead4..0c82f65 100644 +--- a/lib/dns/tsec.c ++++ b/lib/dns/tsec.c +@@ -11,6 +11,7 @@ + + #include + ++#include + #include + #include + +@@ -63,7 +64,12 @@ dns_tsec_create(isc_mem_t *mctx, dns_tsectype_t type, dst_key_t *key, + switch (dst_key_alg(key)) { + #ifndef PK11_MD5_DISABLE + case DST_ALG_HMACMD5: +- algname = dns_tsig_hmacmd5_name; ++ if (isc_md5_available()) { ++ algname = dns_tsig_hmacmd5_name; ++ } else { ++ isc_mem_put(mctx, tsec, sizeof(*tsec)); ++ return (DNS_R_BADALG); ++ } + break; + #endif + case DST_ALG_HMACSHA1: +diff --git a/lib/dns/tsig.c b/lib/dns/tsig.c +index 58c1104..00ee1e1 100644 +--- a/lib/dns/tsig.c ++++ b/lib/dns/tsig.c +@@ -273,7 +273,8 @@ dns_tsigkey_createfromkey(dns_name_t *name, dns_name_t *algorithm, + (void)dns_name_downcase(&tkey->name, &tkey->name, NULL); + + #ifndef PK11_MD5_DISABLE +- if (dns_name_equal(algorithm, DNS_TSIG_HMACMD5_NAME)) { ++ if (dns_name_equal(algorithm, DNS_TSIG_HMACMD5_NAME) && ++ isc_md5_available()) { + tkey->algorithm = DNS_TSIG_HMACMD5_NAME; + if (dstkey != NULL && dst_key_alg(dstkey) != DST_ALG_HMACMD5) { + ret = DNS_R_BADALG; +@@ -499,7 +500,8 @@ destroyring(dns_tsig_keyring_t *ring) { + static unsigned int + dst_alg_fromname(dns_name_t *algorithm) { + #ifndef PK11_MD5_DISABLE +- if (dns_name_equal(algorithm, DNS_TSIG_HMACMD5_NAME)) { ++ if (dns_name_equal(algorithm, DNS_TSIG_HMACMD5_NAME) && ++ isc_md5_available()) { + return (DST_ALG_HMACMD5); + } else + #endif +@@ -683,7 +685,8 @@ dns_tsigkey_create(dns_name_t *name, dns_name_t *algorithm, + REQUIRE(secret != NULL); + + #ifndef PK11_MD5_DISABLE +- if (dns_name_equal(algorithm, DNS_TSIG_HMACMD5_NAME)) { ++ if (dns_name_equal(algorithm, DNS_TSIG_HMACMD5_NAME) && ++ isc_md5_available()) { + if (secret != NULL) { + isc_buffer_t b; + +@@ -1291,7 +1294,7 @@ dns_tsig_verify(isc_buffer_t *source, dns_message_t *msg, + return (ret); + if ( + #ifndef PK11_MD5_DISABLE +- alg == DST_ALG_HMACMD5 || ++ (alg == DST_ALG_HMACMD5 && isc_md5_available()) || + #endif + alg == DST_ALG_HMACSHA1 || + alg == DST_ALG_HMACSHA224 || alg == DST_ALG_HMACSHA256 || +@@ -1460,7 +1463,7 @@ dns_tsig_verify(isc_buffer_t *source, dns_message_t *msg, + + if ( + #ifndef PK11_MD5_DISABLE +- alg == DST_ALG_HMACMD5 || ++ (alg == DST_ALG_HMACMD5 && isc_md5_available()) || + #endif + alg == DST_ALG_HMACSHA1 || + alg == DST_ALG_HMACSHA224 || alg == DST_ALG_HMACSHA256 || +@@ -1601,7 +1604,7 @@ tsig_verify_tcp(isc_buffer_t *source, dns_message_t *msg) { + goto cleanup_querystruct; + if ( + #ifndef PK11_MD5_DISABLE +- alg == DST_ALG_HMACMD5 || ++ (alg == DST_ALG_HMACMD5 && isc_md5_available()) || + #endif + alg == DST_ALG_HMACSHA1 || + alg == DST_ALG_HMACSHA224 || +@@ -1780,7 +1783,7 @@ tsig_verify_tcp(isc_buffer_t *source, dns_message_t *msg) { + goto cleanup_context; + if ( + #ifndef PK11_MD5_DISABLE +- alg == DST_ALG_HMACMD5 || ++ (alg == DST_ALG_HMACMD5 && isc_md5_available()) || + #endif + alg == DST_ALG_HMACSHA1 || + alg == DST_ALG_HMACSHA224 || +diff --git a/lib/isc/include/isc/md5.h b/lib/isc/include/isc/md5.h +index 4d29398..e3f5cec 100644 +--- a/lib/isc/include/isc/md5.h ++++ b/lib/isc/include/isc/md5.h +@@ -91,6 +91,9 @@ isc_md5_final(isc_md5_t *ctx, unsigned char *digest); + bool + isc_md5_check(bool testing); + ++bool ++isc_md5_available(void); ++ + ISC_LANG_ENDDECLS + + #endif /* !PK11_MD5_DISABLE */ +diff --git a/lib/isc/md5.c b/lib/isc/md5.c +index 249f3da..628a414 100644 +--- a/lib/isc/md5.c ++++ b/lib/isc/md5.c +@@ -37,6 +37,7 @@ + + #include + #include ++#include + #include + #include + #include +@@ -54,6 +55,9 @@ + #define EVP_MD_CTX_free(ptr) EVP_MD_CTX_cleanup(ptr) + #endif + ++static isc_once_t available_once = ISC_ONCE_INIT; ++static bool available = false; ++ + void + isc_md5_init(isc_md5_t *ctx) { + ctx->ctx = EVP_MD_CTX_new(); +@@ -85,8 +89,33 @@ isc_md5_final(isc_md5_t *ctx, unsigned char *digest) { + ctx->ctx = NULL; + } + ++static void ++do_detect_available() { ++ isc_md5_t local; ++ isc_md5_t *ctx = &local; ++ unsigned char digest[ISC_MD5_DIGESTLENGTH]; ++ ++ ctx->ctx = EVP_MD_CTX_new(); ++ RUNTIME_CHECK(ctx->ctx != NULL); ++ available = (EVP_DigestInit(ctx->ctx, EVP_md5()) == 1); ++ if (available) ++ (void)EVP_DigestFinal(ctx->ctx, digest, NULL); ++ EVP_MD_CTX_free(ctx->ctx); ++ ctx->ctx = NULL; ++} ++ ++bool ++isc_md5_available() { ++ RUNTIME_CHECK(isc_once_do(&available_once, do_detect_available) ++ == ISC_R_SUCCESS); ++ return available; ++} ++ + #elif PKCS11CRYPTO + ++static isc_once_t available_once = ISC_ONCE_INIT; ++static bool available = false; ++ + void + isc_md5_init(isc_md5_t *ctx) { + CK_RV rv; +@@ -129,6 +158,31 @@ isc_md5_final(isc_md5_t *ctx, unsigned char *digest) { + pk11_return_session(ctx); + } + ++static void ++do_detect_available() { ++ isc_md5_t local; ++ isc_md5_t *ctx = &local; ++ CK_RV rv; ++ CK_MECHANISM mech = { CKM_MD5, NULL, 0 }; ++ ++ if (pk11_get_session(ctx, OP_DIGEST, true, false, ++ false, NULL, 0) == ISC_R_SUCCESS) ++ { ++ rv = pkcs_C_DigestInit(ctx->session, &mech); ++ isc_md5_invalidate(ctx); ++ available = (rv == CKR_OK); ++ } else { ++ available = false; ++ } ++} ++ ++bool ++isc_md5_available() { ++ RUNTIME_CHECK(isc_once_do(&available_once, do_detect_available) ++ == ISC_R_SUCCESS); ++ return available; ++} ++ + #else + + static void +@@ -338,6 +392,11 @@ isc_md5_final(isc_md5_t *ctx, unsigned char *digest) { + memmove(digest, ctx->buf, 16); + isc_safe_memwipe(ctx, sizeof(*ctx)); /* In case it's sensitive */ + } ++ ++bool ++isc_md5_available() { ++ return true; ++} + #endif + + /* +diff --git a/lib/isc/pk11.c b/lib/isc/pk11.c +index 0d5b009..7809e7b 100644 +--- a/lib/isc/pk11.c ++++ b/lib/isc/pk11.c +@@ -197,8 +197,6 @@ pk11_initialize(isc_mem_t *mctx, const char *engine) { + UNLOCK(&alloclock); + if (initialized) { + goto unlock; +- } else { +- initialized = true; + } + + ISC_LIST_INIT(tokens); +@@ -238,6 +236,7 @@ pk11_initialize(isc_mem_t *mctx, const char *engine) { + } + #endif + #endif /* PKCS11CRYPTO */ ++ initialized = true; + unlock: + UNLOCK(&sessionlock); + return (result); +@@ -589,6 +588,8 @@ scan_slots(void) { + pk11_token_t *token; + unsigned int i; + bool bad; ++ unsigned int best_rsa_algorithms = 0; ++ unsigned int best_digest_algorithms = 0; + + slotCount = 0; + PK11_FATALCHECK(pkcs_C_GetSlotList, (CK_FALSE, NULL_PTR, &slotCount)); +@@ -601,6 +602,8 @@ scan_slots(void) { + PK11_FATALCHECK(pkcs_C_GetSlotList, (CK_FALSE, slotList, &slotCount)); + + for (i = 0; i < slotCount; i++) { ++ unsigned int rsa_algorithms = 0; ++ unsigned int digest_algorithms = 0; + slot = slotList[i]; + PK11_TRACE2("slot#%u=0x%lx\n", i, slot); + +@@ -640,11 +643,12 @@ scan_slots(void) { + if ((rv != CKR_OK) || + ((mechInfo.flags & CKF_SIGN) == 0) || + ((mechInfo.flags & CKF_VERIFY) == 0)) { +-#if !defined(PK11_MD5_DISABLE) && !defined(PK11_RSA_PKCS_REPLACE) +- bad = true; +-#endif + PK11_TRACEM(CKM_MD5_RSA_PKCS); + } ++#if !defined(PK11_MD5_DISABLE) && !defined(PK11_RSA_PKCS_REPLACE) ++ else ++ ++rsa_algorithms; ++#endif + rv = pkcs_C_GetMechanismInfo(slot, CKM_SHA1_RSA_PKCS, + &mechInfo); + if ((rv != CKR_OK) || +@@ -687,8 +691,14 @@ scan_slots(void) { + if (bad) + goto try_dsa; + token->operations |= 1 << OP_RSA; +- if (best_rsa_token == NULL) ++ if (best_rsa_token == NULL) { + best_rsa_token = token; ++ best_rsa_algorithms = rsa_algorithms; ++ } else if (rsa_algorithms > best_rsa_algorithms) { ++ pk11_mem_put(best_rsa_token, sizeof(*best_rsa_token)); ++ best_rsa_token = token; ++ best_rsa_algorithms = rsa_algorithms; ++ } + + try_dsa: + bad = false; +@@ -756,11 +766,12 @@ scan_slots(void) { + bad = false; + rv = pkcs_C_GetMechanismInfo(slot, CKM_MD5, &mechInfo); + if ((rv != CKR_OK) || ((mechInfo.flags & CKF_DIGEST) == 0)) { +-#ifndef PK11_MD5_DISABLE +- bad = true; +-#endif + PK11_TRACEM(CKM_MD5); + } ++#ifndef PK11_MD5_DISABLE ++ else ++ ++digest_algorithms; ++#endif + rv = pkcs_C_GetMechanismInfo(slot, CKM_SHA_1, &mechInfo); + if ((rv != CKR_OK) || ((mechInfo.flags & CKF_DIGEST) == 0)) { + bad = true; +@@ -788,11 +799,12 @@ scan_slots(void) { + } + rv = pkcs_C_GetMechanismInfo(slot, CKM_MD5_HMAC, &mechInfo); + if ((rv != CKR_OK) || ((mechInfo.flags & CKF_SIGN) == 0)) { +-#if !defined(PK11_MD5_DISABLE) && !defined(PK11_MD5_HMAC_REPLACE) +- bad = true; +-#endif + PK11_TRACEM(CKM_MD5_HMAC); + } ++#if !defined(PK11_MD5_DISABLE) && !defined(PK11_MD5_HMAC_REPLACE) ++ else ++ ++digest_algorithms; ++#endif + rv = pkcs_C_GetMechanismInfo(slot, CKM_SHA_1_HMAC, &mechInfo); + if ((rv != CKR_OK) || ((mechInfo.flags & CKF_SIGN) == 0)) { + #ifndef PK11_SHA_1_HMAC_REPLACE +@@ -830,8 +842,14 @@ scan_slots(void) { + } + if (!bad) { + token->operations |= 1 << OP_DIGEST; +- if (digest_token == NULL) ++ if (digest_token == NULL) { + digest_token = token; ++ best_digest_algorithms = digest_algorithms; ++ } else if (digest_algorithms > best_digest_algorithms) { ++ pk11_mem_put(digest_token, sizeof(*digest_token)); ++ digest_token = token; ++ best_digest_algorithms = digest_algorithms; ++ } + } + + /* ECDSA requires digest */ +diff --git a/lib/isc/tests/hash_test.c b/lib/isc/tests/hash_test.c +index 31ced94..421131e 100644 +--- a/lib/isc/tests/hash_test.c ++++ b/lib/isc/tests/hash_test.c +@@ -775,6 +775,9 @@ isc_md5_test(void **state) { + + UNUSED(state); + ++ if (!isc_md5_available()) ++ return; ++ + /* + * These are the various test vectors. All of these are passed + * through the hash function and the results are compared to the +@@ -1630,6 +1633,9 @@ isc_hmacmd5_test(void **state) { + + UNUSED(state); + ++ if (!isc_md5_available()) ++ return; ++ + /* + * These are the various test vectors. All of these are passed + * through the hash function and the results are compared to the +@@ -1940,6 +1946,9 @@ static void + md5_check_test(void **state) { + UNUSED(state); + ++ if (!isc_md5_available()) ++ return; ++ + assert_true(isc_md5_check(false)); + assert_false(isc_md5_check(true)); + +diff --git a/lib/isccc/cc.c b/lib/isccc/cc.c +index c2740cb..c314d76 100644 +--- a/lib/isccc/cc.c ++++ b/lib/isccc/cc.c +@@ -272,11 +272,15 @@ sign(unsigned char *data, unsigned int length, unsigned char *hmac, + switch (algorithm) { + #ifndef PK11_MD5_DISABLE + case ISCCC_ALG_HMACMD5: +- isc_hmacmd5_init(&ctx.hmd5, secret->rstart, +- REGION_SIZE(*secret)); +- isc_hmacmd5_update(&ctx.hmd5, data, length); +- isc_hmacmd5_sign(&ctx.hmd5, digest); +- source.rend = digest + ISC_MD5_DIGESTLENGTH; ++ if (isc_md5_available()) { ++ isc_hmacmd5_init(&ctx.hmd5, secret->rstart, ++ REGION_SIZE(*secret)); ++ isc_hmacmd5_update(&ctx.hmd5, data, length); ++ isc_hmacmd5_sign(&ctx.hmd5, digest); ++ source.rend = digest + ISC_MD5_DIGESTLENGTH; ++ } else { ++ return (ISC_R_FAILURE); ++ } + break; + #endif + +@@ -350,14 +354,18 @@ isccc_cc_towire(isccc_sexpr_t *alist, isc_buffer_t **buffer, + { + unsigned int hmac_base, signed_base; + isc_result_t result; ++ const bool md5 = (algorithm == ISCCC_ALG_HMACMD5); + + #ifndef PK11_MD5_DISABLE ++ if (md5 && !isc_md5_available()) ++ return (ISC_R_NOTIMPLEMENTED); ++ + result = isc_buffer_reserve(buffer, +- 4 + ((algorithm == ISCCC_ALG_HMACMD5) ? ++ 4 + ((md5) ? + sizeof(auth_hmd5) : + sizeof(auth_hsha))); + #else +- if (algorithm == ISCCC_ALG_HMACMD5) ++ if (md5) + return (ISC_R_NOTIMPLEMENTED); + result = isc_buffer_reserve(buffer, 4 + sizeof(auth_hsha)); + #endif +@@ -376,7 +384,7 @@ isccc_cc_towire(isccc_sexpr_t *alist, isc_buffer_t **buffer, + * we know what it is. + */ + #ifndef PK11_MD5_DISABLE +- if (algorithm == ISCCC_ALG_HMACMD5) { ++ if (md5) { + hmac_base = (*buffer)->used + HMD5_OFFSET; + isc_buffer_putmem(*buffer, + auth_hmd5, sizeof(auth_hmd5)); +@@ -442,7 +450,7 @@ verify(isccc_sexpr_t *alist, unsigned char *data, unsigned int length, + if (!isccc_alist_alistp(_auth)) + return (ISC_R_FAILURE); + #ifndef PK11_MD5_DISABLE +- if (algorithm == ISCCC_ALG_HMACMD5) ++ if (algorithm == ISCCC_ALG_HMACMD5 && isc_md5_available()) + hmac = isccc_alist_lookup(_auth, "hmd5"); + else + #endif +@@ -457,12 +465,16 @@ verify(isccc_sexpr_t *alist, unsigned char *data, unsigned int length, + switch (algorithm) { + #ifndef PK11_MD5_DISABLE + case ISCCC_ALG_HMACMD5: +- isc_hmacmd5_init(&ctx.hmd5, secret->rstart, +- REGION_SIZE(*secret)); +- isc_hmacmd5_update(&ctx.hmd5, data, length); +- isc_hmacmd5_sign(&ctx.hmd5, digest); +- source.rend = digest + ISC_MD5_DIGESTLENGTH; +- break; ++ if (isc_md5_available()) { ++ isc_hmacmd5_init(&ctx.hmd5, secret->rstart, ++ REGION_SIZE(*secret)); ++ isc_hmacmd5_update(&ctx.hmd5, data, length); ++ isc_hmacmd5_sign(&ctx.hmd5, digest); ++ source.rend = digest + ISC_MD5_DIGESTLENGTH; ++ break; ++ } else { ++ return (ISC_R_FAILURE); ++ } + #endif + + case ISCCC_ALG_HMACSHA1: +-- +2.20.1 + diff --git a/SOURCES/bind-9.11-fips-disable.patch b/SOURCES/bind-9.11-fips-disable.patch new file mode 100644 index 0000000..afe9564 --- /dev/null +++ b/SOURCES/bind-9.11-fips-disable.patch @@ -0,0 +1,121 @@ +From 83b889c238282b210f874a3ad81bb56299767495 Mon Sep 17 00:00:00 2001 +From: Petr Mensik +Date: Mon, 5 Aug 2019 11:54:03 +0200 +Subject: [PATCH] Allow explicit disabling of autodisabled MD5 + +Default security policy might include explicitly disabled RSAMD5 +algorithm. Current FIPS code automatically disables in FIPS mode. But if +RSAMD5 is included in security policy, it fails to start, because that +algorithm is not recognized. Allow it disabled, but fail on any +other usage. +--- + bin/named/server.c | 4 ++-- + lib/bind9/check.c | 4 ++++ + lib/dns/rcode.c | 33 +++++++++++++++------------------ + 3 files changed, 21 insertions(+), 20 deletions(-) + +diff --git a/bin/named/server.c b/bin/named/server.c +index 5b57371..51702ab 100644 +--- a/bin/named/server.c ++++ b/bin/named/server.c +@@ -1547,12 +1547,12 @@ disable_algorithms(const cfg_obj_t *disabled, dns_resolver_t *resolver) { + r.length = strlen(r.base); + + result = dns_secalg_fromtext(&alg, &r); +- if (result != ISC_R_SUCCESS) { ++ if (result != ISC_R_SUCCESS && result != ISC_R_DISABLED) { + uint8_t ui; + result = isc_parse_uint8(&ui, r.base, 10); + alg = ui; + } +- if (result != ISC_R_SUCCESS) { ++ if (result != ISC_R_SUCCESS && result != ISC_R_DISABLED) { + cfg_obj_log(cfg_listelt_value(element), + ns_g_lctx, ISC_LOG_ERROR, + "invalid algorithm"); +diff --git a/lib/bind9/check.c b/lib/bind9/check.c +index e0803d4..8023784 100644 +--- a/lib/bind9/check.c ++++ b/lib/bind9/check.c +@@ -302,6 +302,10 @@ disabled_algorithms(const cfg_obj_t *disabled, isc_log_t *logctx) { + r.length = strlen(r.base); + + tresult = dns_secalg_fromtext(&alg, &r); ++ if (tresult == ISC_R_DISABLED) { ++ // Recognize disabled algorithms, disable it explicitly ++ tresult = ISC_R_SUCCESS; ++ } + if (tresult != ISC_R_SUCCESS) { + cfg_obj_log(cfg_listelt_value(element), logctx, + ISC_LOG_ERROR, "invalid algorithm '%s'", +diff --git a/lib/dns/rcode.c b/lib/dns/rcode.c +index f51d548..c49b8d1 100644 +--- a/lib/dns/rcode.c ++++ b/lib/dns/rcode.c +@@ -126,7 +126,6 @@ + #endif + + #define SECALGNAMES \ +- MD5_SECALGNAMES \ + DH_SECALGNAMES \ + DSA_SECALGNAMES \ + { DNS_KEYALG_ECC, "ECC", 0 }, \ +@@ -178,6 +177,7 @@ static struct tbl rcodes[] = { RCODENAMES ERCODENAMES }; + static struct tbl tsigrcodes[] = { RCODENAMES TSIGRCODENAMES }; + static struct tbl certs[] = { CERTNAMES }; + static struct tbl secalgs[] = { SECALGNAMES }; ++static struct tbl md5_secalgs[] = { MD5_SECALGNAMES }; + static struct tbl secprotos[] = { SECPROTONAMES }; + static struct tbl hashalgs[] = { HASHALGNAMES }; + static struct tbl dsdigests[] = { DSDIGESTNAMES }; +@@ -358,33 +358,30 @@ dns_cert_totext(dns_cert_t cert, isc_buffer_t *target) { + return (dns_mnemonic_totext(cert, target, certs)); + } + +-static inline struct tbl * +-secalgs_tbl_start() { +- struct tbl *algs = secalgs; +- +-#ifndef PK11_MD5_DISABLE +- if (!isc_md5_available()) { +- while (algs->name != NULL && +- algs->value == DNS_KEYALG_RSAMD5) +- ++algs; +- } +-#endif +- return algs; +-} +- + isc_result_t + dns_secalg_fromtext(dns_secalg_t *secalgp, isc_textregion_t *source) { + unsigned int value; ++ isc_result_t result; + +- RETERR(dns_mnemonic_fromtext(&value, source, +- secalgs_tbl_start(), 0xff)); ++ result = dns_mnemonic_fromtext(&value, source, ++ secalgs, 0xff); ++ if (result != ISC_R_SUCCESS) { ++ result = dns_mnemonic_fromtext(&value, source, ++ md5_secalgs, 0xff); ++ if (result != ISC_R_SUCCESS) { ++ return (result); ++ } else if (!isc_md5_available()) { ++ *secalgp = value; ++ return (ISC_R_DISABLED); ++ } ++ } + *secalgp = value; + return (ISC_R_SUCCESS); + } + + isc_result_t + dns_secalg_totext(dns_secalg_t secalg, isc_buffer_t *target) { +- return (dns_mnemonic_totext(secalg, target, secalgs_tbl_start())); ++ return (dns_mnemonic_totext(secalg, target, secalgs)); + } + + void +-- +2.20.1 + diff --git a/SOURCES/bind-9.11-fips-tests.patch b/SOURCES/bind-9.11-fips-tests.patch new file mode 100644 index 0000000..29dda07 --- /dev/null +++ b/SOURCES/bind-9.11-fips-tests.patch @@ -0,0 +1,1408 @@ +From c23daf334d5487fa53fef88c82312e439a2d8523 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Petr=20Men=C5=A1=C3=ADk?= +Date: Thu, 2 Aug 2018 23:46:45 +0200 +Subject: [PATCH] FIPS tests changes +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Squashed commit of the following: + +commit 09e5eb48698d4fef2fc1031870de86c553b6bfaa +Author: Petr Menšík +Date: Wed Mar 7 20:35:13 2018 +0100 + + Fix nsupdate test. Do not use md5 by default for rndc, skip gracefully md5 if not available. + +commit ab303db70082db76ecf36493d0b82ef3e8750cad +Author: Petr Menšík +Date: Wed Mar 7 18:11:10 2018 +0100 + + Changed root key to be RSASHA256 + + Change bad trusted key to be the same algorithm. + +commit 88ab07c0e14cc71247e1f9d11a1ea832b64c1ee8 +Author: Petr Menšík +Date: Wed Mar 7 16:56:17 2018 +0100 + + Change used key to not use hmac-md5 + + Fix upforwd test, do not use hmac-md5 + +commit aec891571626f053acfb4d0a247240cbc21a84e9 +Author: Petr Menšík +Date: Wed Mar 7 15:54:11 2018 +0100 + + Increase bitsize of DSA key to pass FIPS 140-2 mode. + +commit bca8e164fa0d9aff2f946b8b4eb0f1f7e0bf6696 +Author: Petr Menšík +Date: Wed Mar 7 15:41:08 2018 +0100 + + Fix tsig and rndc tests for disabled md5 + + Use hmac-sha256 instead of hmac-md5. + +commit 0d314c1ab6151aa13574a21ad22f28d3b7f42a67 +Author: Petr Menšík +Date: Wed Mar 7 13:21:00 2018 +0100 + + Add md5 availability detection to featuretest + +commit f389a918803e2853e4b55fed62765dc4a492e34f +Author: Petr Menšík +Date: Wed Mar 7 10:44:23 2018 +0100 + + Change tests to not use hmac-md5 algorithms if not required + + Use hmac-sha256 instead of default hmac-md5 for allow-query +--- + bin/tests/system/acl/ns2/named1.conf.in | 4 +- + bin/tests/system/acl/ns2/named2.conf.in | 4 +- + bin/tests/system/acl/ns2/named3.conf.in | 6 +- + bin/tests/system/acl/ns2/named4.conf.in | 4 +- + bin/tests/system/acl/ns2/named5.conf.in | 4 +- + bin/tests/system/acl/tests.sh | 32 ++++----- + .../system/allow-query/ns2/named10.conf.in | 2 +- + .../system/allow-query/ns2/named11.conf.in | 4 +- + .../system/allow-query/ns2/named12.conf.in | 2 +- + .../system/allow-query/ns2/named30.conf.in | 2 +- + .../system/allow-query/ns2/named31.conf.in | 4 +- + .../system/allow-query/ns2/named32.conf.in | 2 +- + .../system/allow-query/ns2/named40.conf.in | 4 +- + bin/tests/system/allow-query/tests.sh | 18 ++--- + bin/tests/system/catz/ns1/named.conf.in | 2 +- + bin/tests/system/catz/ns2/named.conf.in | 2 +- + bin/tests/system/checkconf/bad-tsig.conf | 2 +- + bin/tests/system/checkconf/good.conf | 2 +- + bin/tests/system/digdelv/ns2/example.db | 15 +++-- + bin/tests/system/digdelv/tests.sh | 20 +++--- + bin/tests/system/dlv/ns1/sign.sh | 4 +- + bin/tests/system/dlv/ns2/sign.sh | 4 +- + bin/tests/system/dlv/ns6/sign.sh | 66 +++++++++--------- + bin/tests/system/dnssec/ns2/sign.sh | 8 +-- + bin/tests/system/dnssec/ns5/trusted.conf.bad | 2 +- + bin/tests/system/dnssec/tests.sh | 4 +- + bin/tests/system/feature-test.c | 14 ++++ + bin/tests/system/filter-aaaa/ns1/sign.sh | 4 +- + bin/tests/system/filter-aaaa/ns4/sign.sh | 4 +- + bin/tests/system/notify/ns5/named.conf.in | 6 +- + bin/tests/system/notify/tests.sh | 6 +- + bin/tests/system/nsupdate/ns1/named.conf.in | 2 +- + bin/tests/system/nsupdate/ns2/named.conf.in | 2 +- + bin/tests/system/nsupdate/setup.sh | 7 +- + bin/tests/system/nsupdate/tests.sh | 11 ++- + bin/tests/system/rndc/setup.sh | 2 +- + bin/tests/system/rndc/tests.sh | 23 ++++--- + bin/tests/system/tsig/clean.sh | 1 + + bin/tests/system/tsig/ns1/named.conf.in | 10 +-- + bin/tests/system/tsig/setup.sh | 5 ++ + bin/tests/system/tsig/tests.sh | 67 ++++++++++++------- + bin/tests/system/tsiggss/setup.sh | 2 +- + bin/tests/system/upforwd/ns1/named.conf.in | 2 +- + bin/tests/system/upforwd/tests.sh | 2 +- + bin/tests/system/tsig/ns1/rndc5.conf.in | 10 +++ + 45 files changed, 232 insertions(+), 171 deletions(-) + create mode 100644 bin/tests/system/tsig/ns1/rndc5.conf.in + +diff --git a/bin/tests/system/acl/ns2/named1.conf.in b/bin/tests/system/acl/ns2/named1.conf.in +index 0ea6502..026db3f 100644 +--- a/bin/tests/system/acl/ns2/named1.conf.in ++++ b/bin/tests/system/acl/ns2/named1.conf.in +@@ -33,12 +33,12 @@ options { + }; + + key one { +- algorithm hmac-md5; ++ algorithm hmac-sha256; + secret "1234abcd8765"; + }; + + key two { +- algorithm hmac-md5; ++ algorithm hmac-sha256; + secret "1234abcd8765"; + }; + +diff --git a/bin/tests/system/acl/ns2/named2.conf.in b/bin/tests/system/acl/ns2/named2.conf.in +index b877880..d8f50be 100644 +--- a/bin/tests/system/acl/ns2/named2.conf.in ++++ b/bin/tests/system/acl/ns2/named2.conf.in +@@ -33,12 +33,12 @@ options { + }; + + key one { +- algorithm hmac-md5; ++ algorithm hmac-sha256; + secret "1234abcd8765"; + }; + + key two { +- algorithm hmac-md5; ++ algorithm hmac-sha256; + secret "1234abcd8765"; + }; + +diff --git a/bin/tests/system/acl/ns2/named3.conf.in b/bin/tests/system/acl/ns2/named3.conf.in +index 0a95062..aa54088 100644 +--- a/bin/tests/system/acl/ns2/named3.conf.in ++++ b/bin/tests/system/acl/ns2/named3.conf.in +@@ -33,17 +33,17 @@ options { + }; + + key one { +- algorithm hmac-md5; ++ algorithm hmac-sha256; + secret "1234abcd8765"; + }; + + key two { +- algorithm hmac-md5; ++ algorithm hmac-sha256; + secret "1234abcd8765"; + }; + + key three { +- algorithm hmac-md5; ++ algorithm hmac-sha256; + secret "1234abcd8765"; + }; + +diff --git a/bin/tests/system/acl/ns2/named4.conf.in b/bin/tests/system/acl/ns2/named4.conf.in +index 7cdcb6e..606a345 100644 +--- a/bin/tests/system/acl/ns2/named4.conf.in ++++ b/bin/tests/system/acl/ns2/named4.conf.in +@@ -33,12 +33,12 @@ options { + }; + + key one { +- algorithm hmac-md5; ++ algorithm hmac-sha256; + secret "1234abcd8765"; + }; + + key two { +- algorithm hmac-md5; ++ algorithm hmac-sha256; + secret "1234abcd8765"; + }; + +diff --git a/bin/tests/system/acl/ns2/named5.conf.in b/bin/tests/system/acl/ns2/named5.conf.in +index 4b4e050..0e679a8 100644 +--- a/bin/tests/system/acl/ns2/named5.conf.in ++++ b/bin/tests/system/acl/ns2/named5.conf.in +@@ -34,12 +34,12 @@ options { + }; + + key one { +- algorithm hmac-md5; ++ algorithm hmac-sha256; + secret "1234abcd8765"; + }; + + key two { +- algorithm hmac-md5; ++ algorithm hmac-sha256; + secret "1234abcd8765"; + }; + +diff --git a/bin/tests/system/acl/tests.sh b/bin/tests/system/acl/tests.sh +index 09f31f2..f88f0d4 100644 +--- a/bin/tests/system/acl/tests.sh ++++ b/bin/tests/system/acl/tests.sh +@@ -22,14 +22,14 @@ echo_i "testing basic ACL processing" + # key "one" should fail + t=`expr $t + 1` + $DIG $DIGOPTS tsigzone. \ +- @10.53.0.2 -b 10.53.0.1 axfr -y one:1234abcd8765 > dig.out.${t} ++ @10.53.0.2 -b 10.53.0.1 axfr -y hmac-sha256:one:1234abcd8765 > dig.out.${t} + grep "^;" dig.out.${t} > /dev/null 2>&1 || { echo_i "test $t failed" ; status=1; } + + + # any other key should be fine + t=`expr $t + 1` + $DIG $DIGOPTS tsigzone. \ +- @10.53.0.2 -b 10.53.0.1 axfr -y two:1234abcd8765 > dig.out.${t} ++ @10.53.0.2 -b 10.53.0.1 axfr -y hmac-sha256:two:1234abcd8765 > dig.out.${t} + grep "^;" dig.out.${t} > /dev/null 2>&1 && { echo_i "test $t failed" ; status=1; } + + copy_setports ns2/named2.conf.in ns2/named.conf +@@ -39,18 +39,18 @@ sleep 5 + # prefix 10/8 should fail + t=`expr $t + 1` + $DIG $DIGOPTS tsigzone. \ +- @10.53.0.2 -b 10.53.0.1 axfr -y one:1234abcd8765 > dig.out.${t} ++ @10.53.0.2 -b 10.53.0.1 axfr -y hmac-sha256:one:1234abcd8765 > dig.out.${t} + grep "^;" dig.out.${t} > /dev/null 2>&1 || { echo_i "test $t failed" ; status=1; } + + # any other address should work, as long as it sends key "one" + t=`expr $t + 1` + $DIG $DIGOPTS tsigzone. \ +- @10.53.0.2 -b 127.0.0.1 axfr -y two:1234abcd8765 > dig.out.${t} ++ @10.53.0.2 -b 127.0.0.1 axfr -y hmac-sha256:two:1234abcd8765 > dig.out.${t} + grep "^;" dig.out.${t} > /dev/null 2>&1 || { echo_i "test $t failed" ; status=1; } + + t=`expr $t + 1` + $DIG $DIGOPTS tsigzone. \ +- @10.53.0.2 -b 127.0.0.1 axfr -y one:1234abcd8765 > dig.out.${t} ++ @10.53.0.2 -b 127.0.0.1 axfr -y hmac-sha256:one:1234abcd8765 > dig.out.${t} + grep "^;" dig.out.${t} > /dev/null 2>&1 && { echo_i "test $t failed" ; status=1; } + + echo_i "testing nested ACL processing" +@@ -62,31 +62,31 @@ sleep 5 + # should succeed + t=`expr $t + 1` + $DIG $DIGOPTS tsigzone. \ +- @10.53.0.2 -b 10.53.0.2 axfr -y two:1234abcd8765 > dig.out.${t} ++ @10.53.0.2 -b 10.53.0.2 axfr -y hmac-sha256:two:1234abcd8765 > dig.out.${t} + grep "^;" dig.out.${t} > /dev/null 2>&1 && { echo_i "test $t failed" ; status=1; } + + # should succeed + t=`expr $t + 1` + $DIG $DIGOPTS tsigzone. \ +- @10.53.0.2 -b 10.53.0.2 axfr -y one:1234abcd8765 > dig.out.${t} ++ @10.53.0.2 -b 10.53.0.2 axfr -y hmac-sha256:one:1234abcd8765 > dig.out.${t} + grep "^;" dig.out.${t} > /dev/null 2>&1 && { echo_i "test $t failed" ; status=1; } + + # should succeed + t=`expr $t + 1` + $DIG $DIGOPTS tsigzone. \ +- @10.53.0.2 -b 10.53.0.1 axfr -y two:1234abcd8765 > dig.out.${t} ++ @10.53.0.2 -b 10.53.0.1 axfr -y hmac-sha256:two:1234abcd8765 > dig.out.${t} + grep "^;" dig.out.${t} > /dev/null 2>&1 && { echo_i "test $t failed" ; status=1; } + + # should succeed + t=`expr $t + 1` + $DIG $DIGOPTS tsigzone. \ +- @10.53.0.2 -b 10.53.0.1 axfr -y two:1234abcd8765 > dig.out.${t} ++ @10.53.0.2 -b 10.53.0.1 axfr -y hmac-sha256:two:1234abcd8765 > dig.out.${t} + grep "^;" dig.out.${t} > /dev/null 2>&1 && { echo_i "test $t failed" ; status=1; } + + # but only one or the other should fail + t=`expr $t + 1` + $DIG $DIGOPTS tsigzone. \ +- @10.53.0.2 -b 127.0.0.1 axfr -y one:1234abcd8765 > dig.out.${t} ++ @10.53.0.2 -b 127.0.0.1 axfr -y hmac-sha256:one:1234abcd8765 > dig.out.${t} + grep "^;" dig.out.${t} > /dev/null 2>&1 || { echo_i "test $t failed" ; status=1; } + + t=`expr $t + 1` +@@ -97,7 +97,7 @@ grep "^;" dig.out.${t} > /dev/null 2>&1 || { echo_i "test $tt failed" ; status=1 + # and other values? right out + t=`expr $t + 1` + $DIG $DIGOPTS tsigzone. \ +- @10.53.0.2 -b 127.0.0.1 axfr -y three:1234abcd8765 > dig.out.${t} ++ @10.53.0.2 -b 127.0.0.1 axfr -y hmac-sha256:three:1234abcd8765 > dig.out.${t} + grep "^;" dig.out.${t} > /dev/null 2>&1 || { echo_i "test $t failed" ; status=1; } + + # now we only allow 10.53.0.1 *and* key one, or 10.53.0.2 *and* key two +@@ -108,31 +108,31 @@ sleep 5 + # should succeed + t=`expr $t + 1` + $DIG $DIGOPTS tsigzone. \ +- @10.53.0.2 -b 10.53.0.2 axfr -y two:1234abcd8765 > dig.out.${t} ++ @10.53.0.2 -b 10.53.0.2 axfr -y hmac-sha256:two:1234abcd8765 > dig.out.${t} + grep "^;" dig.out.${t} > /dev/null 2>&1 && { echo_i "test $t failed" ; status=1; } + + # should succeed + t=`expr $t + 1` + $DIG $DIGOPTS tsigzone. \ +- @10.53.0.2 -b 10.53.0.1 axfr -y one:1234abcd8765 > dig.out.${t} ++ @10.53.0.2 -b 10.53.0.1 axfr -y hmac-sha256:one:1234abcd8765 > dig.out.${t} + grep "^;" dig.out.${t} > /dev/null 2>&1 && { echo_i "test $t failed" ; status=1; } + + # should fail + t=`expr $t + 1` + $DIG $DIGOPTS tsigzone. \ +- @10.53.0.2 -b 10.53.0.2 axfr -y one:1234abcd8765 > dig.out.${t} ++ @10.53.0.2 -b 10.53.0.2 axfr -y hmac-sha256:one:1234abcd8765 > dig.out.${t} + grep "^;" dig.out.${t} > /dev/null 2>&1 || { echo_i "test $t failed" ; status=1; } + + # should fail + t=`expr $t + 1` + $DIG $DIGOPTS tsigzone. \ +- @10.53.0.2 -b 10.53.0.1 axfr -y two:1234abcd8765 > dig.out.${t} ++ @10.53.0.2 -b 10.53.0.1 axfr -y hmac-sha256:two:1234abcd8765 > dig.out.${t} + grep "^;" dig.out.${t} > /dev/null 2>&1 || { echo_i "test $t failed" ; status=1; } + + # should fail + t=`expr $t + 1` + $DIG $DIGOPTS tsigzone. \ +- @10.53.0.2 -b 10.53.0.3 axfr -y one:1234abcd8765 > dig.out.${t} ++ @10.53.0.2 -b 10.53.0.3 axfr -y hmac-sha256:one:1234abcd8765 > dig.out.${t} + grep "^;" dig.out.${t} > /dev/null 2>&1 || { echo_i "test $t failed" ; status=1; } + + echo_i "testing allow-query-on ACL processing" +diff --git a/bin/tests/system/allow-query/ns2/named10.conf.in b/bin/tests/system/allow-query/ns2/named10.conf.in +index 1569913..e9c5c2d 100644 +--- a/bin/tests/system/allow-query/ns2/named10.conf.in ++++ b/bin/tests/system/allow-query/ns2/named10.conf.in +@@ -12,7 +12,7 @@ + controls { /* empty */ }; + + key one { +- algorithm hmac-md5; ++ algorithm hmac-sha256; + secret "1234abcd8765"; + }; + +diff --git a/bin/tests/system/allow-query/ns2/named11.conf.in b/bin/tests/system/allow-query/ns2/named11.conf.in +index 18ac91c..2b1c873 100644 +--- a/bin/tests/system/allow-query/ns2/named11.conf.in ++++ b/bin/tests/system/allow-query/ns2/named11.conf.in +@@ -12,12 +12,12 @@ + controls { /* empty */ }; + + key one { +- algorithm hmac-md5; ++ algorithm hmac-sha256; + secret "1234abcd8765"; + }; + + key two { +- algorithm hmac-md5; ++ algorithm hmac-sha256; + secret "1234efgh8765"; + }; + +diff --git a/bin/tests/system/allow-query/ns2/named12.conf.in b/bin/tests/system/allow-query/ns2/named12.conf.in +index b824844..dd48945 100644 +--- a/bin/tests/system/allow-query/ns2/named12.conf.in ++++ b/bin/tests/system/allow-query/ns2/named12.conf.in +@@ -12,7 +12,7 @@ + controls { /* empty */ }; + + key one { +- algorithm hmac-md5; ++ algorithm hmac-sha256; + secret "1234abcd8765"; + }; + +diff --git a/bin/tests/system/allow-query/ns2/named30.conf.in b/bin/tests/system/allow-query/ns2/named30.conf.in +index aeb1540..bfce58b 100644 +--- a/bin/tests/system/allow-query/ns2/named30.conf.in ++++ b/bin/tests/system/allow-query/ns2/named30.conf.in +@@ -12,7 +12,7 @@ + controls { /* empty */ }; + + key one { +- algorithm hmac-md5; ++ algorithm hmac-sha256; + secret "1234abcd8765"; + }; + +diff --git a/bin/tests/system/allow-query/ns2/named31.conf.in b/bin/tests/system/allow-query/ns2/named31.conf.in +index d4b7432..e0f5252 100644 +--- a/bin/tests/system/allow-query/ns2/named31.conf.in ++++ b/bin/tests/system/allow-query/ns2/named31.conf.in +@@ -12,12 +12,12 @@ + controls { /* empty */ }; + + key one { +- algorithm hmac-md5; ++ algorithm hmac-sha256; + secret "1234abcd8765"; + }; + + key two { +- algorithm hmac-md5; ++ algorithm hmac-sha256; + secret "1234efgh8765"; + }; + +diff --git a/bin/tests/system/allow-query/ns2/named32.conf.in b/bin/tests/system/allow-query/ns2/named32.conf.in +index c025938..87afb3f 100644 +--- a/bin/tests/system/allow-query/ns2/named32.conf.in ++++ b/bin/tests/system/allow-query/ns2/named32.conf.in +@@ -12,7 +12,7 @@ + controls { /* empty */ }; + + key one { +- algorithm hmac-md5; ++ algorithm hmac-sha256; + secret "1234abcd8765"; + }; + +diff --git a/bin/tests/system/allow-query/ns2/named40.conf.in b/bin/tests/system/allow-query/ns2/named40.conf.in +index d83b376..d726b94 100644 +--- a/bin/tests/system/allow-query/ns2/named40.conf.in ++++ b/bin/tests/system/allow-query/ns2/named40.conf.in +@@ -16,12 +16,12 @@ acl accept { 10.53.0.2; }; + acl badaccept { 10.53.0.1; }; + + key one { +- algorithm hmac-md5; ++ algorithm hmac-sha256; + secret "1234abcd8765"; + }; + + key two { +- algorithm hmac-md5; ++ algorithm hmac-sha256; + secret "1234efgh8765"; + }; + +diff --git a/bin/tests/system/allow-query/tests.sh b/bin/tests/system/allow-query/tests.sh +index fb6059d..f960156 100644 +--- a/bin/tests/system/allow-query/tests.sh ++++ b/bin/tests/system/allow-query/tests.sh +@@ -190,7 +190,7 @@ rndc_reload + + echo_i "test $n: key allowed - query allowed" + ret=0 +-$DIG $DIGOPTS @10.53.0.2 -b 10.53.0.2 -y one:1234abcd8765 a.normal.example a > dig.out.ns2.$n || ret=1 ++$DIG $DIGOPTS @10.53.0.2 -b 10.53.0.2 -y hmac-sha256:one:1234abcd8765 a.normal.example a > dig.out.ns2.$n || ret=1 + grep 'status: NOERROR' dig.out.ns2.$n > /dev/null || ret=1 + grep '^a.normal.example' dig.out.ns2.$n > /dev/null || ret=1 + if [ $ret != 0 ]; then echo_i "failed"; fi +@@ -203,7 +203,7 @@ rndc_reload + + echo_i "test $n: key not allowed - query refused" + ret=0 +-$DIG $DIGOPTS @10.53.0.2 -b 10.53.0.2 -y two:1234efgh8765 a.normal.example a > dig.out.ns2.$n || ret=1 ++$DIG $DIGOPTS @10.53.0.2 -b 10.53.0.2 -y hmac-sha256:two:1234efgh8765 a.normal.example a > dig.out.ns2.$n || ret=1 + grep 'status: REFUSED' dig.out.ns2.$n > /dev/null || ret=1 + grep '^a.normal.example' dig.out.ns2.$n > /dev/null && ret=1 + if [ $ret != 0 ]; then echo_i "failed"; fi +@@ -216,7 +216,7 @@ rndc_reload + + echo_i "test $n: key disallowed - query refused" + ret=0 +-$DIG $DIGOPTS @10.53.0.2 -b 10.53.0.2 -y one:1234abcd8765 a.normal.example a > dig.out.ns2.$n || ret=1 ++$DIG $DIGOPTS @10.53.0.2 -b 10.53.0.2 -y hmac-sha256:one:1234abcd8765 a.normal.example a > dig.out.ns2.$n || ret=1 + grep 'status: REFUSED' dig.out.ns2.$n > /dev/null || ret=1 + grep '^a.normal.example' dig.out.ns2.$n > /dev/null && ret=1 + if [ $ret != 0 ]; then echo_i "failed"; fi +@@ -349,7 +349,7 @@ rndc_reload + + echo_i "test $n: views key allowed - query allowed" + ret=0 +-$DIG $DIGOPTS @10.53.0.2 -b 10.53.0.2 -y one:1234abcd8765 a.normal.example a > dig.out.ns2.$n || ret=1 ++$DIG $DIGOPTS @10.53.0.2 -b 10.53.0.2 -y hmac-sha256:one:1234abcd8765 a.normal.example a > dig.out.ns2.$n || ret=1 + grep 'status: NOERROR' dig.out.ns2.$n > /dev/null || ret=1 + grep '^a.normal.example' dig.out.ns2.$n > /dev/null || ret=1 + if [ $ret != 0 ]; then echo_i "failed"; fi +@@ -362,7 +362,7 @@ rndc_reload + + echo_i "test $n: views key not allowed - query refused" + ret=0 +-$DIG $DIGOPTS @10.53.0.2 -b 10.53.0.2 -y two:1234efgh8765 a.normal.example a > dig.out.ns2.$n || ret=1 ++$DIG $DIGOPTS @10.53.0.2 -b 10.53.0.2 -y hmac-sha256:two:1234efgh8765 a.normal.example a > dig.out.ns2.$n || ret=1 + grep 'status: REFUSED' dig.out.ns2.$n > /dev/null || ret=1 + grep '^a.normal.example' dig.out.ns2.$n > /dev/null && ret=1 + if [ $ret != 0 ]; then echo_i "failed"; fi +@@ -375,7 +375,7 @@ rndc_reload + + echo_i "test $n: views key disallowed - query refused" + ret=0 +-$DIG $DIGOPTS @10.53.0.2 -b 10.53.0.2 -y one:1234abcd8765 a.normal.example a > dig.out.ns2.$n || ret=1 ++$DIG $DIGOPTS @10.53.0.2 -b 10.53.0.2 -y hmac-sha256:one:1234abcd8765 a.normal.example a > dig.out.ns2.$n || ret=1 + grep 'status: REFUSED' dig.out.ns2.$n > /dev/null || ret=1 + grep '^a.normal.example' dig.out.ns2.$n > /dev/null && ret=1 + if [ $ret != 0 ]; then echo_i "failed"; fi +@@ -508,7 +508,7 @@ status=`expr $status + $ret` + n=`expr $n + 1` + echo_i "test $n: zone key allowed - query allowed" + ret=0 +-$DIG $DIGOPTS @10.53.0.2 -b 10.53.0.2 -y one:1234abcd8765 a.keyallow.example a > dig.out.ns2.$n || ret=1 ++$DIG $DIGOPTS @10.53.0.2 -b 10.53.0.2 -y hmac-sha256:one:1234abcd8765 a.keyallow.example a > dig.out.ns2.$n || ret=1 + grep 'status: NOERROR' dig.out.ns2.$n > /dev/null || ret=1 + grep '^a.keyallow.example' dig.out.ns2.$n > /dev/null || ret=1 + if [ $ret != 0 ]; then echo_i "failed"; fi +@@ -518,7 +518,7 @@ status=`expr $status + $ret` + n=`expr $n + 1` + echo_i "test $n: zone key not allowed - query refused" + ret=0 +-$DIG $DIGOPTS @10.53.0.2 -b 10.53.0.2 -y two:1234efgh8765 a.keyallow.example a > dig.out.ns2.$n || ret=1 ++$DIG $DIGOPTS @10.53.0.2 -b 10.53.0.2 -y hmac-sha256:two:1234efgh8765 a.keyallow.example a > dig.out.ns2.$n || ret=1 + grep 'status: REFUSED' dig.out.ns2.$n > /dev/null || ret=1 + grep '^a.keyallow.example' dig.out.ns2.$n > /dev/null && ret=1 + if [ $ret != 0 ]; then echo_i "failed"; fi +@@ -528,7 +528,7 @@ status=`expr $status + $ret` + n=`expr $n + 1` + echo_i "test $n: zone key disallowed - query refused" + ret=0 +-$DIG $DIGOPTS @10.53.0.2 -b 10.53.0.2 -y one:1234abcd8765 a.keydisallow.example a > dig.out.ns2.$n || ret=1 ++$DIG $DIGOPTS @10.53.0.2 -b 10.53.0.2 -y hmac-sha256:one:1234abcd8765 a.keydisallow.example a > dig.out.ns2.$n || ret=1 + grep 'status: REFUSED' dig.out.ns2.$n > /dev/null || ret=1 + grep '^a.keydisallow.example' dig.out.ns2.$n > /dev/null && ret=1 + if [ $ret != 0 ]; then echo_i "failed"; fi +diff --git a/bin/tests/system/catz/ns1/named.conf.in b/bin/tests/system/catz/ns1/named.conf.in +index 74b7d37..c353766 100644 +--- a/bin/tests/system/catz/ns1/named.conf.in ++++ b/bin/tests/system/catz/ns1/named.conf.in +@@ -61,5 +61,5 @@ zone "catalog4.example" { + + key tsig_key. { + secret "LSAnCU+Z"; +- algorithm hmac-md5; ++ algorithm hmac-sha256; + }; +diff --git a/bin/tests/system/catz/ns2/named.conf.in b/bin/tests/system/catz/ns2/named.conf.in +index ee83efb..35ced08 100644 +--- a/bin/tests/system/catz/ns2/named.conf.in ++++ b/bin/tests/system/catz/ns2/named.conf.in +@@ -70,5 +70,5 @@ zone "catalog4.example" { + + key tsig_key. { + secret "LSAnCU+Z"; +- algorithm hmac-md5; ++ algorithm hmac-sha256; + }; +diff --git a/bin/tests/system/checkconf/bad-tsig.conf b/bin/tests/system/checkconf/bad-tsig.conf +index 21be03e..e57c308 100644 +--- a/bin/tests/system/checkconf/bad-tsig.conf ++++ b/bin/tests/system/checkconf/bad-tsig.conf +@@ -11,7 +11,7 @@ + + /* Bad secret */ + key "badtsig" { +- algorithm hmac-md5; ++ algorithm hmac-sha256; + secret "jEdD+BPKg=="; + }; + +diff --git a/bin/tests/system/checkconf/good.conf b/bin/tests/system/checkconf/good.conf +index 9ab35b3..486551a 100644 +--- a/bin/tests/system/checkconf/good.conf ++++ b/bin/tests/system/checkconf/good.conf +@@ -153,6 +153,6 @@ dyndb "name" "library.so" { + system; + }; + key "mykey" { +- algorithm "hmac-md5"; ++ algorithm "hmac-sha256"; + secret "qwertyuiopasdfgh"; + }; +diff --git a/bin/tests/system/digdelv/ns2/example.db b/bin/tests/system/digdelv/ns2/example.db +index f4e30f5..9f53e31 100644 +--- a/bin/tests/system/digdelv/ns2/example.db ++++ b/bin/tests/system/digdelv/ns2/example.db +@@ -38,12 +38,15 @@ foo SSHFP 2 1 123456789abcdef67890123456789abcdef67890 + ;; + ;; we are not testing DNSSEC behavior, so we don't care about the semantics + ;; of the following records. +-dnskey 300 DNSKEY 256 3 1 ( +- AQPTpWyReB/e9Ii6mVGnakS8hX2zkh/iUYAg +- +Ge4noWROpTWOIBvm76zeJPWs4Zfqa1IsswD +- Ix5Mqeg0zwclz59uecKsKyx5w9IhtZ8plc4R +- b9VIE5x7KNHAYTvTO5d4S8M= +- ) ++dnskey 300 DNSKEY 256 3 8 ( ++ AwEAAaWmCoDpj2K59zcpqnmnQM7IC/XbjS6jIP7uTBR4X7p1bdQJzAeo ++ EnMhnpnxPp0j+20eZm4847DB2U+HuHy79Mvqd3aozTmfBJvzjKs9qyba ++ zY/ZHn6BDYxNJiFfjSS/VJ1KuQPDbpCzhm2hbvT5s9nSOaG0WyRk+d+R ++ qEca11E7ZKkmmNiGlyzMAgfmTTBwgxWBAAhvd9nU1GqD6eQ6Z63hpTc/ ++ KDIHnFTo7pOcZ4z5urIKUMCMcFytedETlEoR5CIWGPdQq2eIEEMfn5ld ++ QqdEZRHVErD9og8aluJ2s767HZb8LzjCfYgBFoT9/n48T75oZLEKtSkG ++ /idCeeQlaLU= ++ ) + + ; TTL of 3 weeks + weeks 1814400 A 10.53.0.2 +diff --git a/bin/tests/system/digdelv/tests.sh b/bin/tests/system/digdelv/tests.sh +index ade45ce..d3aff24 100644 +--- a/bin/tests/system/digdelv/tests.sh ++++ b/bin/tests/system/digdelv/tests.sh +@@ -106,7 +106,7 @@ if [ -x "$DIG" ] ; then + echo_i "checking dig +rrcomments works for DNSKEY($n)" + ret=0 + $DIG $DIGOPTS +tcp @10.53.0.3 +rrcomments DNSKEY dnskey.example > dig.out.test$n || ret=1 +- grep "; ZSK; alg = RSAMD5 ; key id = 30795" < dig.out.test$n > /dev/null || ret=1 ++ grep "; ZSK; alg = RSASHA256 ; key id = 36895$" < dig.out.test$n > /dev/null || ret=1 + check_ttl_range dig.out.test$n "DNSKEY" 300 || ret=1 + if [ $ret != 0 ]; then echo_i "failed"; fi + status=`expr $status + $ret` +@@ -115,7 +115,7 @@ if [ -x "$DIG" ] ; then + echo_i "checking dig +short +rrcomments works for DNSKEY ($n)" + ret=0 + $DIG $DIGOPTS +tcp @10.53.0.3 +short +rrcomments DNSKEY dnskey.example > dig.out.test$n || ret=1 +- grep "; ZSK; alg = RSAMD5 ; key id = 30795" < dig.out.test$n > /dev/null || ret=1 ++ grep "; ZSK; alg = RSASHA256 ; key id = 36895$" < dig.out.test$n > /dev/null || ret=1 + if [ $ret != 0 ]; then echo_i "failed"; fi + status=`expr $status + $ret` + +@@ -123,7 +123,7 @@ if [ -x "$DIG" ] ; then + echo_i "checking dig +short +nosplit works($n)" + ret=0 + $DIG $DIGOPTS +tcp @10.53.0.3 +short +nosplit DNSKEY dnskey.example > dig.out.test$n || ret=1 +- grep "Z8plc4Rb9VIE5x7KNHAYTvTO5d4S8M=$" < dig.out.test$n > /dev/null || ret=1 ++ grep "T9/n48T75oZLEKtSkG/idCeeQlaLU=$" < dig.out.test$n > /dev/null || ret=1 + if [ $ret != 0 ]; then echo_i "failed"; fi + status=`expr $status + $ret` + +@@ -131,7 +131,7 @@ if [ -x "$DIG" ] ; then + echo_i "checking dig +short +rrcomments works($n)" + ret=0 + $DIG $DIGOPTS +tcp @10.53.0.3 +short +rrcomments DNSKEY dnskey.example > dig.out.test$n || ret=1 +- grep "S8M= ; ZSK; alg = RSAMD5 ; key id = 30795$" < dig.out.test$n > /dev/null || ret=1 ++ grep "aLU= ; ZSK; alg = RSASHA256 ; key id = 36895$" < dig.out.test$n > /dev/null || ret=1 + if [ $ret != 0 ]; then echo_i "failed"; fi + status=`expr $status + $ret` + +@@ -148,7 +148,7 @@ if [ -x "$DIG" ] ; then + echo_i "checking dig +short +rrcomments works($n)" + ret=0 + $DIG $DIGOPTS +tcp @10.53.0.3 +short +rrcomments DNSKEY dnskey.example > dig.out.test$n || ret=1 +- grep "S8M= ; ZSK; alg = RSAMD5 ; key id = 30795$" < dig.out.test$n > /dev/null || ret=1 ++ grep "aLU= ; ZSK; alg = RSASHA256 ; key id = 36895$" < dig.out.test$n > /dev/null || ret=1 + if [ $ret != 0 ]; then echo_i "failed"; fi + status=`expr $status + $ret` + +@@ -695,7 +695,7 @@ if [ -x ${DELV} ] ; then + echo_i "checking delv +rrcomments works for DNSKEY($n)" + ret=0 + $DELV $DELVOPTS +tcp @10.53.0.3 +rrcomments DNSKEY dnskey.example > delv.out.test$n || ret=1 +- grep "; ZSK; alg = RSAMD5 ; key id = 30795" < delv.out.test$n > /dev/null || ret=1 ++ grep "; ZSK; alg = RSASHA256 ; key id = 36895" < delv.out.test$n > /dev/null || ret=1 + check_ttl_range delv.out.test$n "DNSKEY" 300 || ret=1 + if [ $ret != 0 ]; then echo_i "failed"; fi + status=`expr $status + $ret` +@@ -704,7 +704,7 @@ if [ -x ${DELV} ] ; then + echo_i "checking delv +short +rrcomments works for DNSKEY ($n)" + ret=0 + $DELV $DELVOPTS +tcp @10.53.0.3 +short +rrcomments DNSKEY dnskey.example > delv.out.test$n || ret=1 +- grep "; ZSK; alg = RSAMD5 ; key id = 30795" < delv.out.test$n > /dev/null || ret=1 ++ grep "; ZSK; alg = RSASHA256 ; key id = 36895" < delv.out.test$n > /dev/null || ret=1 + if [ $ret != 0 ]; then echo_i "failed"; fi + status=`expr $status + $ret` + +@@ -712,7 +712,7 @@ if [ -x ${DELV} ] ; then + echo_i "checking delv +short +rrcomments works ($n)" + ret=0 + $DELV $DELVOPTS +tcp @10.53.0.3 +short +rrcomments DNSKEY dnskey.example > delv.out.test$n || ret=1 +- grep "S8M= ; ZSK; alg = RSAMD5 ; key id = 30795$" < delv.out.test$n > /dev/null || ret=1 ++ grep "aLU= ; ZSK; alg = RSASHA256 ; key id = 36895$" < delv.out.test$n > /dev/null || ret=1 + if [ $ret != 0 ]; then echo_i "failed"; fi + status=`expr $status + $ret` + +@@ -720,7 +720,7 @@ if [ -x ${DELV} ] ; then + echo_i "checking delv +short +nosplit works ($n)" + ret=0 + $DELV $DELVOPTS +tcp @10.53.0.3 +short +nosplit DNSKEY dnskey.example > delv.out.test$n || ret=1 +- grep "Z8plc4Rb9VIE5x7KNHAYTvTO5d4S8M=" < delv.out.test$n > /dev/null || ret=1 ++ grep "T9/n48T75oZLEKtSkG/idCeeQlaLU=" < delv.out.test$n > /dev/null || ret=1 + if test `wc -l < delv.out.test$n` != 1 ; then ret=1 ; fi + f=`awk '{print NF}' < delv.out.test$n` + test "${f:-0}" -eq 14 || ret=1 +@@ -731,7 +731,7 @@ if [ -x ${DELV} ] ; then + echo_i "checking delv +short +nosplit +norrcomments works ($n)" + ret=0 + $DELV $DELVOPTS +tcp @10.53.0.3 +short +nosplit +norrcomments DNSKEY dnskey.example > delv.out.test$n || ret=1 +- grep "Z8plc4Rb9VIE5x7KNHAYTvTO5d4S8M=$" < delv.out.test$n > /dev/null || ret=1 ++ grep "T9/n48T75oZLEKtSkG/idCeeQlaLU=$" < delv.out.test$n > /dev/null || ret=1 + if test `wc -l < delv.out.test$n` != 1 ; then ret=1 ; fi + f=`awk '{print NF}' < delv.out.test$n` + test "${f:-0}" -eq 4 || ret=1 +diff --git a/bin/tests/system/dlv/ns1/sign.sh b/bin/tests/system/dlv/ns1/sign.sh +index 606e7cc..a3a0d60 100755 +--- a/bin/tests/system/dlv/ns1/sign.sh ++++ b/bin/tests/system/dlv/ns1/sign.sh +@@ -23,8 +23,8 @@ infile=root.db.in + zonefile=root.db + outfile=root.signed + +-keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` +-keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` ++keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 1024 -n zone $zone 2> /dev/null` ++keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 1024 -n zone $zone 2> /dev/null` + + cat $infile $keyname1.key $keyname2.key >$zonefile + +diff --git a/bin/tests/system/dlv/ns2/sign.sh b/bin/tests/system/dlv/ns2/sign.sh +index 9825c57..202c978 100755 +--- a/bin/tests/system/dlv/ns2/sign.sh ++++ b/bin/tests/system/dlv/ns2/sign.sh +@@ -24,8 +24,8 @@ zonefile=druz.db + outfile=druz.pre + dlvzone=utld. + +-keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` +-keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` ++keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 1024 -n zone $zone 2> /dev/null` ++keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 1024 -n zone $zone 2> /dev/null` + + cat $infile $keyname1.key $keyname2.key >$zonefile + +diff --git a/bin/tests/system/dlv/ns6/sign.sh b/bin/tests/system/dlv/ns6/sign.sh +index 1e39862..4ed19ac 100755 +--- a/bin/tests/system/dlv/ns6/sign.sh ++++ b/bin/tests/system/dlv/ns6/sign.sh +@@ -16,13 +16,15 @@ SYSTESTDIR=dlv + + echo_i "dlv/ns6/sign.sh" + ++bits=1024 ++ + zone=grand.child1.utld. + infile=child.db.in + zonefile=grand.child1.utld.db + outfile=grand.child1.signed + +-keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` +-keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` ++keyname1=`$KEYGEN -r $RANDFILE -a DSA -b $bits -n zone $zone 2> /dev/null` ++keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b $bits -n zone $zone 2> /dev/null` + + cat $infile $keyname1.key $keyname2.key >$zonefile + +@@ -36,8 +38,8 @@ zonefile=grand.child3.utld.db + outfile=grand.child3.signed + dlvzone=dlv.utld. + +-keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` +-keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` ++keyname1=`$KEYGEN -r $RANDFILE -a DSA -b $bits -n zone $zone 2> /dev/null` ++keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b $bits -n zone $zone 2> /dev/null` + + cat $infile $keyname1.key $keyname2.key >$zonefile + +@@ -51,8 +53,8 @@ zonefile=grand.child4.utld.db + outfile=grand.child4.signed + dlvzone=dlv.utld. + +-keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` +-keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` ++keyname1=`$KEYGEN -r $RANDFILE -a DSA -b $bits -n zone $zone 2> /dev/null` ++keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b $bits -n zone $zone 2> /dev/null` + + cat $infile $keyname1.key $keyname2.key >$zonefile + +@@ -66,8 +68,8 @@ zonefile=grand.child5.utld.db + outfile=grand.child5.signed + dlvzone=dlv.utld. + +-keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` +-keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` ++keyname1=`$KEYGEN -r $RANDFILE -a DSA -b $bits -n zone $zone 2> /dev/null` ++keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b $bits -n zone $zone 2> /dev/null` + + cat $infile $keyname1.key $keyname2.key >$zonefile + +@@ -81,8 +83,8 @@ zonefile=grand.child7.utld.db + outfile=grand.child7.signed + dlvzone=dlv.utld. + +-keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` +-keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` ++keyname1=`$KEYGEN -r $RANDFILE -a DSA -b $bits -n zone $zone 2> /dev/null` ++keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b $bits -n zone $zone 2> /dev/null` + + cat $infile $keyname1.key $keyname2.key >$zonefile + +@@ -96,8 +98,8 @@ zonefile=grand.child8.utld.db + outfile=grand.child8.signed + dlvzone=dlv.utld. + +-keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` +-keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` ++keyname1=`$KEYGEN -r $RANDFILE -a DSA -b $bits -n zone $zone 2> /dev/null` ++keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b $bits -n zone $zone 2> /dev/null` + + cat $infile $keyname1.key $keyname2.key >$zonefile + +@@ -111,8 +113,8 @@ zonefile=grand.child9.utld.db + outfile=grand.child9.signed + dlvzone=dlv.utld. + +-keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` +-keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` ++keyname1=`$KEYGEN -r $RANDFILE -a DSA -b $bits -n zone $zone 2> /dev/null` ++keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b $bits -n zone $zone 2> /dev/null` + + cat $infile $keyname1.key $keyname2.key >$zonefile + +@@ -125,8 +127,8 @@ zonefile=grand.child10.utld.db + outfile=grand.child10.signed + dlvzone=dlv.utld. + +-keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` +-keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` ++keyname1=`$KEYGEN -r $RANDFILE -a DSA -b $bits -n zone $zone 2> /dev/null` ++keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b $bits -n zone $zone 2> /dev/null` + + cat $infile $keyname1.key $keyname2.key >$zonefile + +@@ -138,8 +140,8 @@ infile=child.db.in + zonefile=grand.child1.druz.db + outfile=grand.child1.druz.signed + +-keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` +-keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` ++keyname1=`$KEYGEN -r $RANDFILE -a DSA -b $bits -n zone $zone 2> /dev/null` ++keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b $bits -n zone $zone 2> /dev/null` + + cat $infile $keyname1.key $keyname2.key >$zonefile + +@@ -153,8 +155,8 @@ zonefile=grand.child3.druz.db + outfile=grand.child3.druz.signed + dlvzone=dlv.druz. + +-keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` +-keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` ++keyname1=`$KEYGEN -r $RANDFILE -a DSA -b $bits -n zone $zone 2> /dev/null` ++keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b $bits -n zone $zone 2> /dev/null` + + cat $infile $keyname1.key $keyname2.key >$zonefile + +@@ -168,8 +170,8 @@ zonefile=grand.child4.druz.db + outfile=grand.child4.druz.signed + dlvzone=dlv.druz. + +-keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` +-keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` ++keyname1=`$KEYGEN -r $RANDFILE -a DSA -b $bits -n zone $zone 2> /dev/null` ++keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b $bits -n zone $zone 2> /dev/null` + + cat $infile $keyname1.key $keyname2.key >$zonefile + +@@ -183,8 +185,8 @@ zonefile=grand.child5.druz.db + outfile=grand.child5.druz.signed + dlvzone=dlv.druz. + +-keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` +-keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` ++keyname1=`$KEYGEN -r $RANDFILE -a DSA -b $bits -n zone $zone 2> /dev/null` ++keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b $bits -n zone $zone 2> /dev/null` + + cat $infile $keyname1.key $keyname2.key >$zonefile + +@@ -198,8 +200,8 @@ zonefile=grand.child7.druz.db + outfile=grand.child7.druz.signed + dlvzone=dlv.druz. + +-keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` +-keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` ++keyname1=`$KEYGEN -r $RANDFILE -a DSA -b $bits -n zone $zone 2> /dev/null` ++keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b $bits -n zone $zone 2> /dev/null` + + cat $infile $keyname1.key $keyname2.key >$zonefile + +@@ -213,8 +215,8 @@ zonefile=grand.child8.druz.db + outfile=grand.child8.druz.signed + dlvzone=dlv.druz. + +-keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` +-keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` ++keyname1=`$KEYGEN -r $RANDFILE -a DSA -b $bits -n zone $zone 2> /dev/null` ++keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b $bits -n zone $zone 2> /dev/null` + + cat $infile $keyname1.key $keyname2.key >$zonefile + +@@ -228,8 +230,8 @@ zonefile=grand.child9.druz.db + outfile=grand.child9.druz.signed + dlvzone=dlv.druz. + +-keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` +-keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` ++keyname1=`$KEYGEN -r $RANDFILE -a DSA -b $bits -n zone $zone 2> /dev/null` ++keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b $bits -n zone $zone 2> /dev/null` + + cat $infile $keyname1.key $keyname2.key >$zonefile + +@@ -242,8 +244,8 @@ zonefile=grand.child10.druz.db + outfile=grand.child10.druz.signed + dlvzone=dlv.druz. + +-keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` +-keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` ++keyname1=`$KEYGEN -r $RANDFILE -a DSA -b $bits -n zone $zone 2> /dev/null` ++keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b $bits -n zone $zone 2> /dev/null` + + cat $infile $keyname1.key $keyname2.key >$zonefile + +diff --git a/bin/tests/system/dnssec/ns2/sign.sh b/bin/tests/system/dnssec/ns2/sign.sh +index 13fb924..1ffa279 100644 +--- a/bin/tests/system/dnssec/ns2/sign.sh ++++ b/bin/tests/system/dnssec/ns2/sign.sh +@@ -126,8 +126,8 @@ zone=in-addr.arpa. + infile=in-addr.arpa.db.in + zonefile=in-addr.arpa.db + +-keyname1=`$KEYGEN -q -r $RANDFILE -a DSA -b 768 -n zone $zone` +-keyname2=`$KEYGEN -q -r $RANDFILE -a DSA -b 768 -n zone $zone` ++keyname1=`$KEYGEN -q -r $RANDFILE -a DSA -b 1024 -n zone $zone` ++keyname2=`$KEYGEN -q -r $RANDFILE -a DSA -b 1024 -n zone $zone` + + cat $infile $keyname1.key $keyname2.key >$zonefile + $SIGNER -P -g -r $RANDFILE -o $zone -k $keyname1 $zonefile $keyname2 > /dev/null +@@ -138,7 +138,7 @@ privzone=private.secure.example + privinfile=private.secure.example.db.in + privzonefile=private.secure.example.db + +-privkeyname=`$KEYGEN -q -r $RANDFILE -a RSAMD5 -b 768 -n zone $privzone` ++privkeyname=`$KEYGEN -q -r $RANDFILE -a RSASHA256 -b 1024 -n zone $privzone` + + cat $privinfile $privkeyname.key >$privzonefile + +@@ -152,7 +152,7 @@ dlvinfile=dlv.db.in + dlvzonefile=dlv.db + dlvsetfile=dlvset-${privzone}${TP} + +-dlvkeyname=`$KEYGEN -q -r $RANDFILE -a RSAMD5 -b 768 -n zone $dlvzone` ++dlvkeyname=`$KEYGEN -q -r $RANDFILE -a RSASHA256 -b 1024 -n zone $dlvzone` + + cat $dlvinfile $dlvkeyname.key $dlvsetfile > $dlvzonefile + +diff --git a/bin/tests/system/dnssec/ns5/trusted.conf.bad b/bin/tests/system/dnssec/ns5/trusted.conf.bad +index ed30460..e6b1126 100644 +--- a/bin/tests/system/dnssec/ns5/trusted.conf.bad ++++ b/bin/tests/system/dnssec/ns5/trusted.conf.bad +@@ -10,5 +10,5 @@ + */ + + trusted-keys { +- "." 256 3 1 "AQO6Cl+slAf+iuieDim9L3kujFHQD7s/IOj03ClMOpKYcTXtK4mRpuULVfvWxDi9Ew/gj0xLnnX7z9OJHIxLI+DSrAHd8Dm0XfBEAtVtJSn70GaPZgnLMw1rk5ap2DsEoWk="; ++ "." 256 3 8 "AwEAAarwAdjV4gIhpBCjXVAScRFEx3co7k8smJdxrnqoGsl5NB7EZ9jRdgvCXbJn6v8y9jlNWVHvaC8ilhfhLh0A1vLWiWv4ijd/12xcnrY7xpG7Cu3YkxUxaXJ7Jdg/Iw1+9mGgXF1v4UbCIcw/3U3cxyk7OxYg+VSb5KBAQSR0upxV"; + }; +diff --git a/bin/tests/system/dnssec/tests.sh b/bin/tests/system/dnssec/tests.sh +index b31c1b4..a5e237b 100644 +--- a/bin/tests/system/dnssec/tests.sh ++++ b/bin/tests/system/dnssec/tests.sh +@@ -3235,8 +3235,8 @@ do + alg=`expr $alg + 1` + continue;; + 3) size="-b 512";; +- 5) size="-b 512";; +- 6) size="-b 512";; ++ 5) size="-b 1024";; ++ 6) size="-b 1024";; + 7) size="-b 512";; + 8) size="-b 512";; + 10) size="-b 1024";; +diff --git a/bin/tests/system/feature-test.c b/bin/tests/system/feature-test.c +index c1249ed..20a3139 100644 +--- a/bin/tests/system/feature-test.c ++++ b/bin/tests/system/feature-test.c +@@ -19,6 +19,7 @@ + #include + #include + #include ++#include + #include + + #ifdef WIN32 +@@ -47,6 +48,7 @@ usage() { + fprintf(stderr, " --have-geoip2\n"); + fprintf(stderr, " --have-libxml2\n"); + fprintf(stderr, " --ipv6only=no\n"); ++ fprintf(stderr, " --md5\n"); + fprintf(stderr, " --rpz-nsdname\n"); + fprintf(stderr, " --rpz-nsip\n"); + fprintf(stderr, " --with-idn\n"); +@@ -155,6 +157,18 @@ main(int argc, char **argv) { + #endif + } + ++ if (strcmp(argv[1], "--md5") == 0) { ++#ifdef PK11_MD5_DISABLE ++ return (1); ++#else ++ if (isc_md5_available()) { ++ return (0); ++ } else { ++ return (1); ++ } ++#endif ++ } ++ + if (strcmp(argv[1], "--rpz-nsip") == 0) { + #ifdef ENABLE_RPZ_NSIP + return (0); +diff --git a/bin/tests/system/filter-aaaa/ns1/sign.sh b/bin/tests/system/filter-aaaa/ns1/sign.sh +index f755581..4a7d890 100755 +--- a/bin/tests/system/filter-aaaa/ns1/sign.sh ++++ b/bin/tests/system/filter-aaaa/ns1/sign.sh +@@ -21,8 +21,8 @@ infile=signed.db.in + zonefile=signed.db.signed + outfile=signed.db.signed + +-keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` +-keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` ++keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 1024 -n zone $zone 2> /dev/null` ++keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 1024 -n zone $zone 2> /dev/null` + + cat $infile $keyname1.key $keyname2.key >$zonefile + +diff --git a/bin/tests/system/filter-aaaa/ns4/sign.sh b/bin/tests/system/filter-aaaa/ns4/sign.sh +index f755581..4a7d890 100755 +--- a/bin/tests/system/filter-aaaa/ns4/sign.sh ++++ b/bin/tests/system/filter-aaaa/ns4/sign.sh +@@ -21,8 +21,8 @@ infile=signed.db.in + zonefile=signed.db.signed + outfile=signed.db.signed + +-keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` +-keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 768 -n zone $zone 2> /dev/null` ++keyname1=`$KEYGEN -r $RANDFILE -a DSA -b 1024 -n zone $zone 2> /dev/null` ++keyname2=`$KEYGEN -f KSK -r $RANDFILE -a DSA -b 1024 -n zone $zone 2> /dev/null` + + cat $infile $keyname1.key $keyname2.key >$zonefile + +diff --git a/bin/tests/system/notify/ns5/named.conf.in b/bin/tests/system/notify/ns5/named.conf.in +index cfcfe8f..0a1614d 100644 +--- a/bin/tests/system/notify/ns5/named.conf.in ++++ b/bin/tests/system/notify/ns5/named.conf.in +@@ -10,17 +10,17 @@ + */ + + key "a" { +- algorithm "hmac-md5"; ++ algorithm "hmac-sha256"; + secret "aaaaaaaaaaaaaaaaaaaa"; + }; + + key "b" { +- algorithm "hmac-md5"; ++ algorithm "hmac-sha256"; + secret "bbbbbbbbbbbbbbbbbbbb"; + }; + + key "c" { +- algorithm "hmac-md5"; ++ algorithm "hmac-sha256"; + secret "cccccccccccccccccccc"; + }; + +diff --git a/bin/tests/system/notify/tests.sh b/bin/tests/system/notify/tests.sh +index 1f6e6d0..c08bd25 100644 +--- a/bin/tests/system/notify/tests.sh ++++ b/bin/tests/system/notify/tests.sh +@@ -212,16 +212,16 @@ ret=0 + $NSUPDATE << EOF + server 10.53.0.5 ${PORT} + zone x21 +-key a aaaaaaaaaaaaaaaaaaaa ++key hmac-sha256:a aaaaaaaaaaaaaaaaaaaa + update add added.x21 0 in txt "test string" + send + EOF + + for i in 1 2 3 4 5 6 7 8 9 + do +- $DIG $DIGOPTS added.x21. -y b:bbbbbbbbbbbbbbbbbbbb @10.53.0.5 \ ++ $DIG $DIGOPTS added.x21. -y hmac-sha256:b:bbbbbbbbbbbbbbbbbbbb @10.53.0.5 \ + txt > dig.out.b.ns5.test$n || ret=1 +- $DIG $DIGOPTS added.x21. -y c:cccccccccccccccccccc @10.53.0.5 \ ++ $DIG $DIGOPTS added.x21. -y hmac-sha256:c:cccccccccccccccccccc @10.53.0.5 \ + txt > dig.out.c.ns5.test$n || ret=1 + grep "test string" dig.out.b.ns5.test$n > /dev/null && + grep "test string" dig.out.c.ns5.test$n > /dev/null && +diff --git a/bin/tests/system/nsupdate/ns1/named.conf.in b/bin/tests/system/nsupdate/ns1/named.conf.in +index 1d999ad..26b6b7c 100644 +--- a/bin/tests/system/nsupdate/ns1/named.conf.in ++++ b/bin/tests/system/nsupdate/ns1/named.conf.in +@@ -32,7 +32,7 @@ controls { + }; + + key altkey { +- algorithm hmac-md5; ++ algorithm hmac-sha512; + secret "1234abcd8765"; + }; + +diff --git a/bin/tests/system/nsupdate/ns2/named.conf.in b/bin/tests/system/nsupdate/ns2/named.conf.in +index 4549184..cb7dccd 100644 +--- a/bin/tests/system/nsupdate/ns2/named.conf.in ++++ b/bin/tests/system/nsupdate/ns2/named.conf.in +@@ -33,7 +33,7 @@ controls { + }; + + key altkey { +- algorithm hmac-md5; ++ algorithm hmac-sha512; + secret "1234abcd8765"; + }; + +diff --git a/bin/tests/system/nsupdate/setup.sh b/bin/tests/system/nsupdate/setup.sh +index 21805c5..0d3d85c 100644 +--- a/bin/tests/system/nsupdate/setup.sh ++++ b/bin/tests/system/nsupdate/setup.sh +@@ -58,7 +58,12 @@ EOF + + $DDNSCONFGEN -q -r $RANDFILE -z example.nil > ns1/ddns.key + +-$DDNSCONFGEN -q -r $RANDFILE -a hmac-md5 -k md5-key -z keytests.nil > ns1/md5.key ++if $FEATURETEST --md5; then ++ $DDNSCONFGEN -q -r $RANDFILE -a hmac-md5 -k md5-key -z keytests.nil > ns1/md5.key ++else ++ echo -n > ns1/md5.key ++fi ++ + $DDNSCONFGEN -q -r $RANDFILE -a hmac-sha1 -k sha1-key -z keytests.nil > ns1/sha1.key + $DDNSCONFGEN -q -r $RANDFILE -a hmac-sha224 -k sha224-key -z keytests.nil > ns1/sha224.key + $DDNSCONFGEN -q -r $RANDFILE -a hmac-sha256 -k sha256-key -z keytests.nil > ns1/sha256.key +diff --git a/bin/tests/system/nsupdate/tests.sh b/bin/tests/system/nsupdate/tests.sh +index 4da4849..b3bc807 100755 +--- a/bin/tests/system/nsupdate/tests.sh ++++ b/bin/tests/system/nsupdate/tests.sh +@@ -708,7 +708,14 @@ fi + n=`expr $n + 1` + ret=0 + echo_i "check TSIG key algorithms ($n)" +-for alg in md5 sha1 sha224 sha256 sha384 sha512; do ++if $FEATURETEST --md5 ++then ++ ALGS="md5 sha1 sha224 sha256 sha384 sha512" ++else ++ ALGS="sha1 sha224 sha256 sha384 sha512" ++ echo_i "skipping disabled md5 algorithm" ++fi ++for alg in $ALGS; do + $NSUPDATE -k ns1/${alg}.key < /dev/null || ret=1 + server 10.53.0.1 ${PORT} + update add ${alg}.keytests.nil. 600 A 10.10.10.3 +@@ -716,7 +723,7 @@ send + END + done + sleep 2 +-for alg in md5 sha1 sha224 sha256 sha384 sha512; do ++for alg in $ALGS; do + $DIG $DIGOPTS +short @10.53.0.1 ${alg}.keytests.nil | grep 10.10.10.3 > /dev/null 2>&1 || ret=1 + done + if [ $ret -ne 0 ]; then +diff --git a/bin/tests/system/rndc/setup.sh b/bin/tests/system/rndc/setup.sh +index 343869e..c30efb0 100644 +--- a/bin/tests/system/rndc/setup.sh ++++ b/bin/tests/system/rndc/setup.sh +@@ -37,7 +37,7 @@ make_key () { + sed 's/allow { 10.53.0.4/allow { any/' >> ns4/named.conf + } + +-make_key 1 ${EXTRAPORT1} hmac-md5 ++$FEATURETEST --md5 && make_key 1 ${EXTRAPORT1} hmac-md5 + make_key 2 ${EXTRAPORT2} hmac-sha1 + make_key 3 ${EXTRAPORT3} hmac-sha224 + make_key 4 ${EXTRAPORT4} hmac-sha256 +diff --git a/bin/tests/system/rndc/tests.sh b/bin/tests/system/rndc/tests.sh +index 57e066d..186a723 100644 +--- a/bin/tests/system/rndc/tests.sh ++++ b/bin/tests/system/rndc/tests.sh +@@ -348,15 +348,20 @@ if [ $ret != 0 ]; then echo_i "failed"; fi + status=`expr $status + $ret` + + n=`expr $n + 1` +-echo_i "testing rndc with hmac-md5 ($n)" +-ret=0 +-$RNDC -s 10.53.0.4 -p ${EXTRAPORT1} -c ns4/key1.conf status > /dev/null 2>&1 || ret=1 +-for i in 2 3 4 5 6 +-do +- $RNDC -s 10.53.0.4 -p ${EXTRAPORT1} -c ns4/key${i}.conf status > /dev/null 2>&1 && ret=1 +-done +-if [ $ret != 0 ]; then echo_i "failed"; fi +-status=`expr $status + $ret` ++if $FEATURETEST --md5 ++then ++ echo_i "testing rndc with hmac-md5 ($n)" ++ ret=0 ++ $RNDC -s 10.53.0.4 -p ${EXTRAPORT1} -c ns4/key1.conf status > /dev/null 2>&1 || ret=1 ++ for i in 2 3 4 5 6 ++ do ++ $RNDC -s 10.53.0.4 -p ${EXTRAPORT1} -c ns4/key${i}.conf status > /dev/null 2>&1 && ret=1 ++ done ++ if [ $ret != 0 ]; then echo_i "failed"; fi ++ status=`expr $status + $ret` ++else ++ echo_i "skipping rndc with hmac-md5 ($n)" ++fi + + n=`expr $n + 1` + echo_i "testing rndc with hmac-sha1 ($n)" +diff --git a/bin/tests/system/tsig/clean.sh b/bin/tests/system/tsig/clean.sh +index 576ec70..cb7a852 100644 +--- a/bin/tests/system/tsig/clean.sh ++++ b/bin/tests/system/tsig/clean.sh +@@ -20,3 +20,4 @@ rm -f */named.run + rm -f ns*/named.lock + rm -f Kexample.net.+163+* + rm -f keygen.out? ++rm -f ns1/named.conf +diff --git a/bin/tests/system/tsig/ns1/named.conf.in b/bin/tests/system/tsig/ns1/named.conf.in +index fbf30c6..f61657d 100644 +--- a/bin/tests/system/tsig/ns1/named.conf.in ++++ b/bin/tests/system/tsig/ns1/named.conf.in +@@ -21,10 +21,7 @@ options { + notify no; + }; + +-key "md5" { +- secret "97rnFx24Tfna4mHPfgnerA=="; +- algorithm hmac-md5; +-}; ++# md5 key appended by setup.sh at the end + + key "sha1" { + secret "FrSt77yPTFx6hTs4i2tKLB9LmE0="; +@@ -51,10 +48,7 @@ key "sha512" { + algorithm hmac-sha512; + }; + +-key "md5-trunc" { +- secret "97rnFx24Tfna4mHPfgnerA=="; +- algorithm hmac-md5-80; +-}; ++# md5-trunc key appended by setup.sh at the end + + key "sha1-trunc" { + secret "FrSt77yPTFx6hTs4i2tKLB9LmE0="; +diff --git a/bin/tests/system/tsig/setup.sh b/bin/tests/system/tsig/setup.sh +index 4dd4a25..aa0f966 100644 +--- a/bin/tests/system/tsig/setup.sh ++++ b/bin/tests/system/tsig/setup.sh +@@ -17,3 +17,8 @@ $SHELL clean.sh + copy_setports ns1/named.conf.in ns1/named.conf + + test -r $RANDFILE || $GENRANDOM $RANDOMSIZE $RANDFILE ++ ++if $FEATURETEST --md5 ++then ++ cat ns1/rndc5.conf.in >> ns1/named.conf ++fi +diff --git a/bin/tests/system/tsig/tests.sh b/bin/tests/system/tsig/tests.sh +index f731fa6..cade35b 100644 +--- a/bin/tests/system/tsig/tests.sh ++++ b/bin/tests/system/tsig/tests.sh +@@ -26,20 +26,25 @@ sha512="jI/Pa4qRu96t76Pns5Z/Ndxbn3QCkwcxLOgt9vgvnJw5wqTRvNyk3FtD6yIMd1dWVlqZ+Y4f + + status=0 + +-echo_i "fetching using hmac-md5 (old form)" +-ret=0 +-$DIG $DIGOPTS example.nil. -y "md5:$md5" @10.53.0.1 soa > dig.out.md5.old || ret=1 +-grep -i "md5.*TSIG.*NOERROR" dig.out.md5.old > /dev/null || ret=1 +-if [ $ret -eq 1 ] ; then +- echo_i "failed"; status=1 +-fi +- +-echo_i "fetching using hmac-md5 (new form)" +-ret=0 +-$DIG $DIGOPTS example.nil. -y "hmac-md5:md5:$md5" @10.53.0.1 soa > dig.out.md5.new || ret=1 +-grep -i "md5.*TSIG.*NOERROR" dig.out.md5.new > /dev/null || ret=1 +-if [ $ret -eq 1 ] ; then +- echo_i "failed"; status=1 ++if $FEATURETEST --md5 ++then ++ echo_i "fetching using hmac-md5 (old form)" ++ ret=0 ++ $DIG $DIGOPTS example.nil. -y "md5:$md5" @10.53.0.1 soa > dig.out.md5.old || ret=1 ++ grep -i "md5.*TSIG.*NOERROR" dig.out.md5.old > /dev/null || ret=1 ++ if [ $ret -eq 1 ] ; then ++ echo_i "failed"; status=1 ++ fi ++ ++ echo_i "fetching using hmac-md5 (new form)" ++ ret=0 ++ $DIG $DIGOPTS example.nil. -y "hmac-md5:md5:$md5" @10.53.0.1 soa > dig.out.md5.new || ret=1 ++ grep -i "md5.*TSIG.*NOERROR" dig.out.md5.new > /dev/null || ret=1 ++ if [ $ret -eq 1 ] ; then ++ echo_i "failed"; status=1 ++ fi ++else ++ echo_i "skipping using hmac-md5" + fi + + echo_i "fetching using hmac-sha1" +@@ -87,12 +92,17 @@ fi + # Truncated TSIG + # + # +-echo_i "fetching using hmac-md5 (trunc)" +-ret=0 +-$DIG $DIGOPTS example.nil. -y "hmac-md5-80:md5-trunc:$md5" @10.53.0.1 soa > dig.out.md5.trunc || ret=1 +-grep -i "md5-trunc.*TSIG.*NOERROR" dig.out.md5.trunc > /dev/null || ret=1 +-if [ $ret -eq 1 ] ; then +- echo_i "failed"; status=1 ++if $FEATURETEST --md5 ++then ++ echo_i "fetching using hmac-md5 (trunc)" ++ ret=0 ++ $DIG $DIGOPTS example.nil. -y "hmac-md5-80:md5-trunc:$md5" @10.53.0.1 soa > dig.out.md5.trunc || ret=1 ++ grep -i "md5-trunc.*TSIG.*NOERROR" dig.out.md5.trunc > /dev/null || ret=1 ++ if [ $ret -eq 1 ] ; then ++ echo_i "failed"; status=1 ++ fi ++else ++ echo_i "skipping using hmac-md5 (trunc)" + fi + + echo_i "fetching using hmac-sha1 (trunc)" +@@ -141,12 +151,17 @@ fi + # Check for bad truncation. + # + # +-echo_i "fetching using hmac-md5-80 (BADTRUNC)" +-ret=0 +-$DIG $DIGOPTS example.nil. -y "hmac-md5-80:md5:$md5" @10.53.0.1 soa > dig.out.md5-80 || ret=1 +-grep -i "md5.*TSIG.*BADTRUNC" dig.out.md5-80 > /dev/null || ret=1 +-if [ $ret -eq 1 ] ; then +- echo_i "failed"; status=1 ++if $FEATURETEST --md5 ++then ++ echo_i "fetching using hmac-md5-80 (BADTRUNC)" ++ ret=0 ++ $DIG $DIGOPTS example.nil. -y "hmac-md5-80:md5:$md5" @10.53.0.1 soa > dig.out.md5-80 || ret=1 ++ grep -i "md5.*TSIG.*BADTRUNC" dig.out.md5-80 > /dev/null || ret=1 ++ if [ $ret -eq 1 ] ; then ++ echo_i "failed"; status=1 ++ fi ++else ++ echo_i "skipping using hmac-md5-80 (BADTRUNC)" + fi + + echo_i "fetching using hmac-sha1-80 (BADTRUNC)" +diff --git a/bin/tests/system/tsiggss/setup.sh b/bin/tests/system/tsiggss/setup.sh +index 0d21c7b..dbcb7b4 100644 +--- a/bin/tests/system/tsiggss/setup.sh ++++ b/bin/tests/system/tsiggss/setup.sh +@@ -18,5 +18,5 @@ test -r $RANDFILE || $GENRANDOM $RANDOMSIZE $RANDFILE + + copy_setports ns1/named.conf.in ns1/named.conf + +-key=`$KEYGEN -Cq -K ns1 -a DSA -b 512 -r $RANDFILE -n HOST -T KEY key.example.nil.` ++key=`$KEYGEN -Cq -K ns1 -a DSA -b 1024 -r $RANDFILE -n HOST -T KEY key.example.nil.` + cat ns1/example.nil.db.in ns1/${key}.key > ns1/example.nil.db +diff --git a/bin/tests/system/upforwd/ns1/named.conf.in b/bin/tests/system/upforwd/ns1/named.conf.in +index e0a30cd..6a77b1c 100644 +--- a/bin/tests/system/upforwd/ns1/named.conf.in ++++ b/bin/tests/system/upforwd/ns1/named.conf.in +@@ -10,7 +10,7 @@ + */ + + key "update.example." { +- algorithm "hmac-md5"; ++ algorithm "hmac-sha256"; + secret "c3Ryb25nIGVub3VnaCBmb3IgYSBtYW4gYnV0IG1hZGUgZm9yIGEgd29tYW4K"; + }; + +diff --git a/bin/tests/system/upforwd/tests.sh b/bin/tests/system/upforwd/tests.sh +index b0694bb..9adae82 100644 +--- a/bin/tests/system/upforwd/tests.sh ++++ b/bin/tests/system/upforwd/tests.sh +@@ -68,7 +68,7 @@ if [ $ret != 0 ] ; then echo_i "failed"; status=`expr $status + $ret`; fi + + echo_i "updating zone (signed) ($n)" + ret=0 +-$NSUPDATE -y update.example:c3Ryb25nIGVub3VnaCBmb3IgYSBtYW4gYnV0IG1hZGUgZm9yIGEgd29tYW4K -- - < +Date: Tue, 25 Sep 2018 18:08:46 +0200 +Subject: [PATCH] Disable IDN from environment as documented + +Manual page of host contained instructions to disable IDN processing +when it was built with libidn2. When refactoring IDN support however, +support for disabling IDN in host and nslookup was lost. Use also +environment variable and document it for nslookup, host and dig. + +Support variable CHARSET=ASCII to disable IDN, supported in downstream +RH patch since RHEL 5. +--- + bin/dig/dig.docbook | 4 +++- + bin/dig/dighost.c | 5 +++++ + bin/dig/host.docbook | 2 +- + bin/dig/nslookup.docbook | 15 +++++++++++++++ + 4 files changed, 24 insertions(+), 2 deletions(-) + +diff --git a/bin/dig/dig.docbook b/bin/dig/dig.docbook +index 5d19301..933af79 100644 +--- a/bin/dig/dig.docbook ++++ b/bin/dig/dig.docbook +@@ -1312,7 +1312,9 @@ dig +qr www.isc.org any -x 127.0.0.1 isc.org ns +noqr + reply from the server. + If you'd like to turn off the IDN support for some reason, use + parameters +noidnin and +- +noidnout. ++ +noidnout or define ++ the IDN_DISABLE environment variable. ++ + + + +diff --git a/bin/dig/dighost.c b/bin/dig/dighost.c +index 5eabc1f..73aaab8 100644 +--- a/bin/dig/dighost.c ++++ b/bin/dig/dighost.c +@@ -826,6 +826,11 @@ make_empty_lookup(void) { + looknew->badcookie = true; + #ifdef WITH_IDN_SUPPORT + looknew->idnin = isatty(1)?(getenv("IDN_DISABLE") == NULL):false; ++ if (looknew->idnin) { ++ const char *charset = getenv("CHARSET"); ++ if (charset && !strcmp(charset, "ASCII")) ++ looknew->idnin = false; ++ } + #else + looknew->idnin = false; + #endif +diff --git a/bin/dig/host.docbook b/bin/dig/host.docbook +index da0f8fb..9689b5a 100644 +--- a/bin/dig/host.docbook ++++ b/bin/dig/host.docbook +@@ -379,7 +379,7 @@ + host appropriately converts character encoding of + domain name before sending a request to DNS server or displaying a + reply from the server. +- If you'd like to turn off the IDN support for some reason, defines ++ If you'd like to turn off the IDN support for some reason, define + the IDN_DISABLE environment variable. + The IDN support is disabled if the variable is set when + host runs. +diff --git a/bin/dig/nslookup.docbook b/bin/dig/nslookup.docbook +index d46fc2d..6d7d181 100644 +--- a/bin/dig/nslookup.docbook ++++ b/bin/dig/nslookup.docbook +@@ -495,6 +495,21 @@ nslookup -query=hinfo -timeout=10 + + + ++ IDN SUPPORT ++ ++ ++ If nslookup has been built with IDN (internationalized ++ domain name) support, it can accept and display non-ASCII domain names. ++ nslookup appropriately converts character encoding of ++ domain name before sending a request to DNS server or displaying a ++ reply from the server. ++ If you'd like to turn off the IDN support for some reason, define ++ the IDN_DISABLE environment variable. ++ The IDN support is disabled if the variable is set when ++ nslookup runs. ++ ++ ++ + FILES + + /etc/resolv.conf +-- +2.20.1 + diff --git a/SOURCES/bind-9.11-json-c.patch b/SOURCES/bind-9.11-json-c.patch new file mode 100644 index 0000000..95e5597 --- /dev/null +++ b/SOURCES/bind-9.11-json-c.patch @@ -0,0 +1,50 @@ +From cb6d2019766a6c8c5516fd8859cedf0052f03293 Mon Sep 17 00:00:00 2001 +From: Petr Mensik +Date: Thu, 25 Jul 2019 11:37:57 +0200 +Subject: [PATCH] Skip support of jsoncpp + +Bind cannot be compiled when jsoncpp-devel is installed. Remove support +for jsoncpp, use only json-c-devel. Bind 9.15 has already support for +--with-json-c, do not yet introduce it. +--- + configure.ac | 17 ++--------------- + 1 file changed, 2 insertions(+), 15 deletions(-) + +diff --git a/configure.ac b/configure.ac +index 6d05337..5ce83b5 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -2594,15 +2594,7 @@ case "$use_libjson" in + auto|yes) + for d in /usr /usr/local /opt/local + do +- if test -f "${d}/include/json/json.h" +- then +- if test ${d} != /usr +- then +- libjson_cflags="-I ${d}/include" +- LIBS="$LIBS -L${d}/lib" +- fi +- have_libjson="yes" +- elif test -f "${d}/include/json-c/json.h" ++ if test -f "${d}/include/json-c/json.h" + then + if test ${d} != /usr + then +@@ -2615,12 +2607,7 @@ case "$use_libjson" in + done + ;; + *) +- if test -f "${use_libjson}/include/json/json.h" +- then +- libjson_cflags="-I${use_libjson}/include" +- LIBS="$LIBS -L${use_libjson}/lib" +- have_libjson="yes" +- elif test -f "${use_libjson}/include/json-c/json.h" ++ if test -f "${use_libjson}/include/json-c/json.h" + then + libjson_cflags="-I${use_libjson}/include" + LIBS="$LIBS -L${use_libjson}/lib" +-- +2.20.1 + diff --git a/SOURCES/bind-9.11-kyua-pkcs11.patch b/SOURCES/bind-9.11-kyua-pkcs11.patch new file mode 100644 index 0000000..ac15d22 --- /dev/null +++ b/SOURCES/bind-9.11-kyua-pkcs11.patch @@ -0,0 +1,192 @@ +From eb38d2278937ec3fe45d0af30cd080953bbb5b54 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Petr=20Men=C5=A1=C3=ADk?= +Date: Tue, 2 Jan 2018 18:13:07 +0100 +Subject: [PATCH] Fix pkcs11 variants atf tests + +Add dns-pkcs11 tests Makefile to configure + +Add pkcs11 Kyuafile, fix dh_test to pass in pkcs11 mode +--- + configure.ac | 1 + + lib/Kyuafile | 2 ++ + lib/dns-pkcs11/tests/Makefile.in | 10 +++++----- + lib/dns-pkcs11/tests/dh_test.c | 3 ++- + lib/isc-pkcs11/tests/Makefile.in | 6 +++--- + lib/isc-pkcs11/tests/hash_test.c | 32 +++++++++++++++++++++++++------- + 6 files changed, 38 insertions(+), 16 deletions(-) + +diff --git a/configure.ac b/configure.ac +index 0532feb..a83ddd5 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -5578,6 +5578,7 @@ AC_CONFIG_FILES([ + lib/dns-pkcs11/include/Makefile + lib/dns-pkcs11/include/dns/Makefile + lib/dns-pkcs11/include/dst/Makefile ++ lib/dns-pkcs11/tests/Makefile + lib/irs/Makefile + lib/irs/include/Makefile + lib/irs/include/irs/Makefile +diff --git a/lib/Kyuafile b/lib/Kyuafile +index 7c8bab0..eec9564 100644 +--- a/lib/Kyuafile ++++ b/lib/Kyuafile +@@ -2,8 +2,10 @@ syntax(2) + test_suite('bind9') + + include('dns/Kyuafile') ++include('dns-pkcs11/Kyuafile') + include('irs/Kyuafile') + include('isc/Kyuafile') ++include('isc-pkcs11/Kyuafile') + include('isccc/Kyuafile') + include('isccfg/Kyuafile') + include('lwres/Kyuafile') +diff --git a/lib/dns-pkcs11/tests/Makefile.in b/lib/dns-pkcs11/tests/Makefile.in +index 7671e1d..e237d5c 100644 +--- a/lib/dns-pkcs11/tests/Makefile.in ++++ b/lib/dns-pkcs11/tests/Makefile.in +@@ -17,12 +17,12 @@ VERSION=@BIND9_VERSION@ + + CINCLUDES = -I. -Iinclude ${DNS_INCLUDES} ${ISC_INCLUDES} \ + @DST_OPENSSL_INC@ +-CDEFINES = @CRYPTO@ -DTESTS="\"${top_builddir}/lib/dns/tests/\"" ++CDEFINES = @CRYPTO_PK11@ -DTESTS="\"${top_builddir}/lib/dns-pkcs11/tests/\"" + +-ISCLIBS = ../../isc/libisc.@A@ +-ISCDEPLIBS = ../../isc/libisc.@A@ +-DNSLIBS = ../libdns.@A@ ${MAXMINDDB_LIBS} @DNS_CRYPTO_LIBS@ +-DNSDEPLIBS = ../libdns.@A@ ++ISCLIBS = ../../isc-pkcs11/libisc-pkcs11.@A@ ++ISCDEPLIBS = ../../isc-pkcs11/libisc-pkcs11.@A@ ++DNSLIBS = ../libdns-pkcs11.@A@ ${MAXMINDDB_LIBS} @DNS_CRYPTO_LIBS@ ++DNSDEPLIBS = ../libdns-pkcs11.@A@ + + LIBS = @LIBS@ @CMOCKA_LIBS@ + CFLAGS = @CFLAGS@ @CMOCKA_CFLAGS@ +diff --git a/lib/dns-pkcs11/tests/dh_test.c b/lib/dns-pkcs11/tests/dh_test.c +index 4dbfd82..a383b8e 100644 +--- a/lib/dns-pkcs11/tests/dh_test.c ++++ b/lib/dns-pkcs11/tests/dh_test.c +@@ -86,7 +86,8 @@ dh_computesecret(void **state) { + result = dst_key_computesecret(key, key, &buf); + assert_int_equal(result, DST_R_NOTPRIVATEKEY); + result = key->func->computesecret(key, key, &buf); +- assert_int_equal(result, DST_R_COMPUTESECRETFAILURE); ++ /* PKCS11 variant gives different result, accept both */ ++ assert_true(result == DST_R_COMPUTESECRETFAILURE || result == DST_R_INVALIDPRIVATEKEY); + + dst_key_free(&key); + } +diff --git a/lib/isc-pkcs11/tests/Makefile.in b/lib/isc-pkcs11/tests/Makefile.in +index 2fdee0b..a263b35 100644 +--- a/lib/isc-pkcs11/tests/Makefile.in ++++ b/lib/isc-pkcs11/tests/Makefile.in +@@ -16,10 +16,10 @@ VERSION=@BIND9_VERSION@ + @BIND9_MAKE_INCLUDES@ + + CINCLUDES = -I. -Iinclude ${ISC_INCLUDES} @ISC_OPENSSL_INC@ +-CDEFINES = @CRYPTO@ -DTESTS="\"${top_builddir}/lib/isc/tests/\"" ++CDEFINES = @CRYPTO_PK11@ -DTESTS="\"${top_builddir}/lib/isc-pkcs11/tests/\"" + +-ISCLIBS = ../libisc.@A@ @ISC_OPENSSL_LIBS@ +-ISCDEPLIBS = ../libisc.@A@ ++ISCLIBS = ../libisc-pkcs11.@A@ @ISC_OPENSSL_LIBS@ ++ISCDEPLIBS = ../libisc-pkcs11.@A@ + + LIBS = @LIBS@ @CMOCKA_LIBS@ + CFLAGS = @CFLAGS@ @CMOCKA_CFLAGS@ +diff --git a/lib/isc-pkcs11/tests/hash_test.c b/lib/isc-pkcs11/tests/hash_test.c +index 9c4d299..d9deba2 100644 +--- a/lib/isc-pkcs11/tests/hash_test.c ++++ b/lib/isc-pkcs11/tests/hash_test.c +@@ -85,7 +85,7 @@ typedef struct hash_testcase { + + typedef struct hash_test_key { + const char *key; +- const int len; ++ const unsigned len; + } hash_test_key_t; + + /* non-hmac tests */ +@@ -956,8 +956,11 @@ isc_hmacsha1_test(void **state) { + hash_test_key_t *test_key = test_keys; + + while (testcase->input != NULL && testcase->result != NULL) { ++ int len = ISC_MAX(test_key->len, ISC_SHA1_DIGESTLENGTH); ++ ++ memset(buffer, 0, ISC_SHA1_DIGESTLENGTH); + memmove(buffer, test_key->key, test_key->len); +- isc_hmacsha1_init(&hmacsha1, buffer, test_key->len); ++ isc_hmacsha1_init(&hmacsha1, buffer, len); + isc_hmacsha1_update(&hmacsha1, + (const uint8_t *) testcase->input, + testcase->input_len); +@@ -1116,8 +1119,11 @@ isc_hmacsha224_test(void **state) { + hash_test_key_t *test_key = test_keys; + + while (testcase->input != NULL && testcase->result != NULL) { ++ int len = ISC_MAX(test_key->len, ISC_SHA224_DIGESTLENGTH); ++ ++ memset(buffer, 0, ISC_SHA224_DIGESTLENGTH); + memmove(buffer, test_key->key, test_key->len); +- isc_hmacsha224_init(&hmacsha224, buffer, test_key->len); ++ isc_hmacsha224_init(&hmacsha224, buffer, len); + isc_hmacsha224_update(&hmacsha224, + (const uint8_t *) testcase->input, + testcase->input_len); +@@ -1277,8 +1283,11 @@ isc_hmacsha256_test(void **state) { + hash_test_key_t *test_key = test_keys; + + while (testcase->input != NULL && testcase->result != NULL) { ++ int len = ISC_MAX(test_key->len, ISC_SHA256_DIGESTLENGTH); ++ ++ memset(buffer, 0, ISC_SHA256_DIGESTLENGTH); + memmove(buffer, test_key->key, test_key->len); +- isc_hmacsha256_init(&hmacsha256, buffer, test_key->len); ++ isc_hmacsha256_init(&hmacsha256, buffer, len); + isc_hmacsha256_update(&hmacsha256, + (const uint8_t *) testcase->input, + testcase->input_len); +@@ -1444,8 +1453,11 @@ isc_hmacsha384_test(void **state) { + hash_test_key_t *test_key = test_keys; + + while (testcase->input != NULL && testcase->result != NULL) { ++ int len = ISC_MAX(test_key->len, ISC_SHA384_DIGESTLENGTH); ++ ++ memset(buffer, 0, ISC_SHA384_DIGESTLENGTH); + memmove(buffer, test_key->key, test_key->len); +- isc_hmacsha384_init(&hmacsha384, buffer, test_key->len); ++ isc_hmacsha384_init(&hmacsha384, buffer, len); + isc_hmacsha384_update(&hmacsha384, + (const uint8_t *) testcase->input, + testcase->input_len); +@@ -1611,8 +1623,11 @@ isc_hmacsha512_test(void **state) { + hash_test_key_t *test_key = test_keys; + + while (testcase->input != NULL && testcase->result != NULL) { ++ int len = ISC_MAX(test_key->len, ISC_SHA512_DIGESTLENGTH); ++ ++ memset(buffer, 0, ISC_SHA512_DIGESTLENGTH); + memmove(buffer, test_key->key, test_key->len); +- isc_hmacsha512_init(&hmacsha512, buffer, test_key->len); ++ isc_hmacsha512_init(&hmacsha512, buffer, len); + isc_hmacsha512_update(&hmacsha512, + (const uint8_t *) testcase->input, + testcase->input_len); +@@ -1755,8 +1770,11 @@ isc_hmacmd5_test(void **state) { + hash_test_key_t *test_key = test_keys; + + while (testcase->input != NULL && testcase->result != NULL) { ++ int len = ISC_MAX(test_key->len, ISC_MD5_DIGESTLENGTH); ++ ++ memset(buffer, 0, ISC_MD5_DIGESTLENGTH); + memmove(buffer, test_key->key, test_key->len); +- isc_hmacmd5_init(&hmacmd5, buffer, test_key->len); ++ isc_hmacmd5_init(&hmacmd5, buffer, len); + isc_hmacmd5_update(&hmacmd5, + (const uint8_t *) testcase->input, + testcase->input_len); +-- +2.20.1 + diff --git a/SOURCES/bind-9.11-oot-manual.patch b/SOURCES/bind-9.11-oot-manual.patch new file mode 100644 index 0000000..84e9d25 --- /dev/null +++ b/SOURCES/bind-9.11-oot-manual.patch @@ -0,0 +1,256 @@ +From 8ca95f47231822df2b9c171a4da1e93ca5b748eb Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Petr=20Men=C5=A1=C3=ADk?= +Date: Wed, 25 Jul 2018 12:24:16 +0200 +Subject: [PATCH] Use make automatic variables to install updated manuals + +Make will choose modified manual from build directory or original from source +directory automagically. Take advantage of install tool feature. +Install all files in single command instead of iterating on each of them. +--- + bin/check/Makefile.in | 8 +++++--- + bin/confgen/Makefile.in | 9 +++++---- + bin/delv/Makefile.in | 6 ++++-- + bin/dig/Makefile.in | 8 ++++---- + bin/dnssec/Makefile.in | 6 ++++-- + bin/named/Makefile.in | 13 +++++++++---- + bin/pkcs11/Makefile.in | 9 ++++----- + bin/python/Makefile.in | 8 ++++---- + bin/tools/Makefile.in | 25 +++++++++++++++---------- + 9 files changed, 54 insertions(+), 38 deletions(-) + +diff --git a/bin/check/Makefile.in b/bin/check/Makefile.in +index c124e80..1174f8d 100644 +--- a/bin/check/Makefile.in ++++ b/bin/check/Makefile.in +@@ -83,12 +83,14 @@ installdirs: + $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${sbindir} + $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${mandir}/man8 + +-install:: named-checkconf@EXEEXT@ named-checkzone@EXEEXT@ installdirs ++install-man8: ${MANPAGES} ++ ${INSTALL_DATA} $^ ${DESTDIR}${mandir}/man8 ++ (cd ${DESTDIR}${mandir}/man8; rm -f named-compilezone.8; ${LINK_PROGRAM} named-checkzone.8 named-compilezone.8) ++ ++install:: named-checkconf@EXEEXT@ named-checkzone@EXEEXT@ installdirs install-man8 + ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} named-checkconf@EXEEXT@ ${DESTDIR}${sbindir} + ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} named-checkzone@EXEEXT@ ${DESTDIR}${sbindir} + (cd ${DESTDIR}${sbindir}; rm -f named-compilezone@EXEEXT@; ${LINK_PROGRAM} named-checkzone@EXEEXT@ named-compilezone@EXEEXT@) +- for m in ${MANPAGES}; do ${INSTALL_DATA} ${srcdir}/$$m ${DESTDIR}${mandir}/man8 || exit 1; done +- (cd ${DESTDIR}${mandir}/man8; rm -f named-compilezone.8; ${LINK_PROGRAM} named-checkzone.8 named-compilezone.8) + + uninstall:: + rm -f ${DESTDIR}${mandir}/man8/named-compilezone.8 +diff --git a/bin/confgen/Makefile.in b/bin/confgen/Makefile.in +index 87f13dd..7865c0c 100644 +--- a/bin/confgen/Makefile.in ++++ b/bin/confgen/Makefile.in +@@ -95,13 +95,14 @@ installdirs: + $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${sbindir} + $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${mandir}/man8 + +-install:: rndc-confgen@EXEEXT@ ddns-confgen@EXEEXT@ installdirs ++install-man8: rndc-confgen.8 ddns-confgen.8 ++ ${INSTALL_DATA} $^ ${DESTDIR}${mandir}/man8 ++ (cd ${DESTDIR}${mandir}/man8; rm -f tsig-keygen.8; ${LINK_PROGRAM} ddns-confgen.8 tsig-keygen.8) ++ ++install:: rndc-confgen@EXEEXT@ ddns-confgen@EXEEXT@ installdirs install-man8 + ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} rndc-confgen@EXEEXT@ ${DESTDIR}${sbindir} + ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} ddns-confgen@EXEEXT@ ${DESTDIR}${sbindir} +- ${INSTALL_DATA} ${srcdir}/rndc-confgen.8 ${DESTDIR}${mandir}/man8 +- ${INSTALL_DATA} ${srcdir}/ddns-confgen.8 ${DESTDIR}${mandir}/man8 + (cd ${DESTDIR}${sbindir}; rm -f tsig-keygen@EXEEXT@; ${LINK_PROGRAM} ddns-confgen@EXEEXT@ tsig-keygen@EXEEXT@) +- (cd ${DESTDIR}${mandir}/man8; rm -f tsig-keygen.8; ${LINK_PROGRAM} ddns-confgen.8 tsig-keygen.8) + + uninstall:: + rm -f ${DESTDIR}${mandir}/man8/tsig-keygen.8 +diff --git a/bin/delv/Makefile.in b/bin/delv/Makefile.in +index e2d2802..19361a8 100644 +--- a/bin/delv/Makefile.in ++++ b/bin/delv/Makefile.in +@@ -63,10 +63,12 @@ installdirs: + $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${bindir} + $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${mandir}/man1 + +-install:: delv@EXEEXT@ installdirs ++install-man1: delv.1 ++ ${INSTALL_DATA} $^ ${DESTDIR}${mandir}/man1 ++ ++install:: delv@EXEEXT@ installdirs install-man1 + ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} \ + delv@EXEEXT@ ${DESTDIR}${bindir} +- ${INSTALL_DATA} ${srcdir}/delv.1 ${DESTDIR}${mandir}/man1 + + uninstall:: + rm -f ${DESTDIR}${mandir}/man1/delv.1 +diff --git a/bin/dig/Makefile.in b/bin/dig/Makefile.in +index a9830a9..d7ac0b6 100644 +--- a/bin/dig/Makefile.in ++++ b/bin/dig/Makefile.in +@@ -91,16 +91,16 @@ installdirs: + $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${bindir} + $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${mandir}/man1 + +-install:: dig@EXEEXT@ host@EXEEXT@ nslookup@EXEEXT@ installdirs ++install-man1: ${MANPAGES} ++ ${INSTALL_DATA} $^ ${DESTDIR}${mandir}/man1 ++ ++install:: dig@EXEEXT@ host@EXEEXT@ nslookup@EXEEXT@ installdirs install-man1 + ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} \ + dig@EXEEXT@ ${DESTDIR}${bindir} + ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} \ + host@EXEEXT@ ${DESTDIR}${bindir} + ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} \ + nslookup@EXEEXT@ ${DESTDIR}${bindir} +- for m in ${MANPAGES}; do \ +- ${INSTALL_DATA} ${srcdir}/$$m ${DESTDIR}${mandir}/man1 || exit 1; \ +- done + + uninstall:: + for m in ${MANPAGES}; do \ +diff --git a/bin/dnssec/Makefile.in b/bin/dnssec/Makefile.in +index 2239ad1..ce0a177 100644 +--- a/bin/dnssec/Makefile.in ++++ b/bin/dnssec/Makefile.in +@@ -110,9 +110,11 @@ installdirs: + $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${sbindir} + $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${mandir}/man8 + +-install:: ${TARGETS} installdirs ++install-man8: ${MANPAGES} ++ ${INSTALL_DATA} $^ ${DESTDIR}${mandir}/man8 ++ ++install:: ${TARGETS} installdirs install-man8 + for t in ${TARGETS}; do ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} $$t ${DESTDIR}${sbindir} || exit 1; done +- for m in ${MANPAGES}; do ${INSTALL_DATA} ${srcdir}/$$m ${DESTDIR}${mandir}/man8 || exit 1; done + + uninstall:: + for m in ${MANPAGES}; do rm -f ${DESTDIR}${mandir}/man8/$$m || exit 1; done +diff --git a/bin/named/Makefile.in b/bin/named/Makefile.in +index e1f85a9..d92bc9a 100644 +--- a/bin/named/Makefile.in ++++ b/bin/named/Makefile.in +@@ -176,12 +176,17 @@ installdirs: + $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${mandir}/man5 + $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${mandir}/man8 + +-install:: named@EXEEXT@ lwresd@EXEEXT@ installdirs ++install-man5: named.conf.5 ++ ${INSTALL_DATA} $^ ${DESTDIR}${mandir}/man5 ++ ++install-man8: named.8 lwresd.8 ++ ${INSTALL_DATA} $^ ${DESTDIR}${mandir}/man8 ++ ++install-man: install-man5 install-man8 ++ ++install:: named@EXEEXT@ lwresd@EXEEXT@ installdirs install-man + ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} named@EXEEXT@ ${DESTDIR}${sbindir} + (cd ${DESTDIR}${sbindir}; rm -f lwresd@EXEEXT@; @LN@ named@EXEEXT@ lwresd@EXEEXT@) +- ${INSTALL_DATA} ${srcdir}/named.8 ${DESTDIR}${mandir}/man8 +- ${INSTALL_DATA} ${srcdir}/lwresd.8 ${DESTDIR}${mandir}/man8 +- ${INSTALL_DATA} ${srcdir}/named.conf.5 ${DESTDIR}${mandir}/man5 + + uninstall:: + rm -f ${DESTDIR}${mandir}/man5/named.conf.5 +diff --git a/bin/pkcs11/Makefile.in b/bin/pkcs11/Makefile.in +index ae90616..a058c91 100644 +--- a/bin/pkcs11/Makefile.in ++++ b/bin/pkcs11/Makefile.in +@@ -71,7 +71,10 @@ installdirs: + $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${sbindir} + $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${mandir}/man8 + +-install:: ${TARGETS} installdirs ++install-man8: ${MANPAGES} ++ ${INSTALL_DATA} $^ ${DESTDIR}${mandir}/man8 ++ ++install:: ${TARGETS} installdirs install-man8 + ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} pkcs11-list@EXEEXT@ \ + ${DESTDIR}${sbindir} + ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} pkcs11-destroy@EXEEXT@ \ +@@ -80,10 +83,6 @@ install:: ${TARGETS} installdirs + ${DESTDIR}${sbindir} + ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} pkcs11-tokens@EXEEXT@ \ + ${DESTDIR}${sbindir} +- ${INSTALL_DATA} ${srcdir}/pkcs11-list.8 ${DESTDIR}${mandir}/man8 +- ${INSTALL_DATA} ${srcdir}/pkcs11-destroy.8 ${DESTDIR}${mandir}/man8 +- ${INSTALL_DATA} ${srcdir}/pkcs11-keygen.8 ${DESTDIR}${mandir}/man8 +- ${INSTALL_DATA} ${srcdir}/pkcs11-tokens.8 ${DESTDIR}${mandir}/man8 + + uninstall:: + rm -f ${DESTDIR}${mandir}/man8/pkcs11-tokens.8 +diff --git a/bin/python/Makefile.in b/bin/python/Makefile.in +index aa678d4..064c404 100644 +--- a/bin/python/Makefile.in ++++ b/bin/python/Makefile.in +@@ -47,13 +47,13 @@ installdirs: + $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${sbindir} + $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${mandir}/man8 + +-install:: ${TARGETS} installdirs ++install-man8: ${MANPAGES} ++ ${INSTALL_DATA} $^ ${DESTDIR}${mandir}/man8 ++ ++install:: ${TARGETS} installdirs install-man8 + ${INSTALL_SCRIPT} dnssec-checkds ${DESTDIR}${sbindir} + ${INSTALL_SCRIPT} dnssec-coverage ${DESTDIR}${sbindir} + ${INSTALL_SCRIPT} dnssec-keymgr ${DESTDIR}${sbindir} +- ${INSTALL_DATA} ${srcdir}/dnssec-checkds.8 ${DESTDIR}${mandir}/man8 +- ${INSTALL_DATA} ${srcdir}/dnssec-coverage.8 ${DESTDIR}${mandir}/man8 +- ${INSTALL_DATA} ${srcdir}/dnssec-keymgr.8 ${DESTDIR}${mandir}/man8 + if test -n "${PYTHON}" ; then \ + if test -n "${DESTDIR}" ; then \ + ${PYTHON} ${srcdir}/setup.py install --root=${DESTDIR} --prefix=${prefix} @PYTHON_INSTALL_LIB@ ; \ +diff --git a/bin/tools/Makefile.in b/bin/tools/Makefile.in +index 7bf2af4..c395bc7 100644 +--- a/bin/tools/Makefile.in ++++ b/bin/tools/Makefile.in +@@ -119,17 +119,27 @@ installdirs: + $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${mandir}/man1 + $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${mandir}/man8 + +-nzd: ++nzd-man: named-nzd2nzf.8 ++ ${INSTALL_DATA} $^ ${DESTDIR}${mandir}/man8 ++ ++nzd: nzd-man + ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} named-nzd2nzf@EXEEXT@ \ + ${DESTDIR}${sbindir} +- ${INSTALL_DATA} ${srcdir}/named-nzd2nzf.8 ${DESTDIR}${mandir}/man8 + +-dnstap: ++dnstap-man: dnstap-read.1 ++ ${INSTALL_DATA} $^ ${DESTDIR}${mandir}/man1 ++ ++dnstap: dnstap-man + ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} dnstap-read@EXEEXT@ \ + ${DESTDIR}${bindir} +- ${INSTALL_DATA} ${srcdir}/dnstap-read.1 ${DESTDIR}${mandir}/man1 + +-install:: ${TARGETS} installdirs @DNSTAP@ @NZD_TOOLS@ ++install-man1: arpaname.1 named-rrchecker.1 mdig.1 ++ ${INSTALL_DATA} $^ ${DESTDIR}${mandir}/man1 ++ ++install-man8: named-journalprint.8 nsec3hash.8 ++ ${INSTALL_DATA} $^ ${DESTDIR}${mandir}/man8 ++ ++install:: ${TARGETS} installdirs @DNSTAP@ @NZD_TOOLS@ install-man1 install-man8 + ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} arpaname@EXEEXT@ \ + ${DESTDIR}${bindir} + ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} named-journalprint@EXEEXT@ \ +@@ -144,13 +154,8 @@ install:: ${TARGETS} installdirs @DNSTAP@ @NZD_TOOLS@ + ${DESTDIR}${sbindir} + ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} mdig@EXEEXT@ \ + ${DESTDIR}${bindir} +- ${INSTALL_DATA} ${srcdir}/arpaname.1 ${DESTDIR}${mandir}/man1 + ${INSTALL_DATA} ${srcdir}/isc-hmac-fixup.8 ${DESTDIR}${mandir}/man8 +- ${INSTALL_DATA} ${srcdir}/named-journalprint.8 ${DESTDIR}${mandir}/man8 +- ${INSTALL_DATA} ${srcdir}/named-rrchecker.1 ${DESTDIR}${mandir}/man1 +- ${INSTALL_DATA} ${srcdir}/nsec3hash.8 ${DESTDIR}${mandir}/man8 + ${INSTALL_DATA} ${srcdir}/genrandom.8 ${DESTDIR}${mandir}/man8 +- ${INSTALL_DATA} ${srcdir}/mdig.1 ${DESTDIR}${mandir}/man1 + + uninstall:: + rm -f ${DESTDIR}${mandir}/man1/mdig.1 +-- +2.14.4 + diff --git a/SOURCES/bind-9.11-pk11.patch b/SOURCES/bind-9.11-pk11.patch new file mode 100644 index 0000000..d802314 --- /dev/null +++ b/SOURCES/bind-9.11-pk11.patch @@ -0,0 +1,27 @@ +diff --git a/lib/dns/dst_internal.h b/lib/dns/dst_internal.h +index 640519a..fc40472 100644 +--- a/lib/dns/dst_internal.h ++++ b/lib/dns/dst_internal.h +@@ -59,6 +59,9 @@ + #include + #include + #endif ++#if PKCS11CRYPTO ++#include ++#endif + + ISC_LANG_BEGINDECLS + +diff --git a/lib/isc/include/pk11/internal.h b/lib/isc/include/pk11/internal.h +index aa8907a..603712a 100644 +--- a/lib/isc/include/pk11/internal.h ++++ b/lib/isc/include/pk11/internal.h +@@ -13,6 +13,8 @@ + #ifndef PK11_INTERNAL_H + #define PK11_INTERNAL_H 1 + ++#include ++ + /*! \file pk11/internal.h */ + + ISC_LANG_BEGINDECLS diff --git a/SOURCES/bind-9.11-rh1205168.patch b/SOURCES/bind-9.11-rh1205168.patch new file mode 100644 index 0000000..181cec9 --- /dev/null +++ b/SOURCES/bind-9.11-rh1205168.patch @@ -0,0 +1,120 @@ +From 90416594843a56550e40b11561807786219ce1c4 Mon Sep 17 00:00:00 2001 +From: Evan Hunt +Date: Mon, 11 Sep 2017 15:01:36 -0700 +Subject: [PATCH] remap getaddrinfo() to irs_getgetaddrinfo() + +The libirs version of getaddrinfo() cannot be called from within BIND9. + +fix prototypes +--- + lib/irs/include/irs/netdb.h.in | 94 ++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 94 insertions(+) + +diff --git a/lib/irs/include/irs/netdb.h.in b/lib/irs/include/irs/netdb.h.in +index 23dcd37..f36113d 100644 +--- a/lib/irs/include/irs/netdb.h.in ++++ b/lib/irs/include/irs/netdb.h.in +@@ -150,6 +150,100 @@ struct addrinfo { + #define NI_DGRAM 0x00000010 + + /* ++ * Define to map into irs_ namespace. ++ */ ++ ++#define IRS_NAMESPACE ++ ++#ifdef IRS_NAMESPACE ++ ++/* ++ * Use our versions not the ones from the C library. ++ */ ++ ++#ifdef getnameinfo ++#undef getnameinfo ++#endif ++#define getnameinfo irs_getnameinfo ++ ++#ifdef getaddrinfo ++#undef getaddrinfo ++#endif ++#define getaddrinfo irs_getaddrinfo ++ ++#ifdef freeaddrinfo ++#undef freeaddrinfo ++#endif ++#define freeaddrinfo irs_freeaddrinfo ++ ++#ifdef gai_strerror ++#undef gai_strerror ++#endif ++#define gai_strerror irs_gai_strerror ++ ++#endif ++ ++extern int getaddrinfo (const char *name, ++ const char *service, ++ const struct addrinfo *req, ++ struct addrinfo **pai); ++extern int getnameinfo (const struct sockaddr *sa, ++ socklen_t salen, char *host, ++ socklen_t hostlen, char *serv, ++ socklen_t servlen, int flags); ++extern void freeaddrinfo (struct addrinfo *ai); ++extern const char *gai_strerror (int ecode); ++ ++/* ++ * Define to map into irs_ namespace. ++ */ ++ ++#define IRS_NAMESPACE ++ ++#ifdef IRS_NAMESPACE ++ ++/* ++ * Use our versions not the ones from the C library. ++ */ ++ ++#ifdef getnameinfo ++#undef getnameinfo ++#endif ++#define getnameinfo irs_getnameinfo ++ ++#ifdef getaddrinfo ++#undef getaddrinfo ++#endif ++#define getaddrinfo irs_getaddrinfo ++ ++#ifdef freeaddrinfo ++#undef freeaddrinfo ++#endif ++#define freeaddrinfo irs_freeaddrinfo ++ ++#ifdef gai_strerror ++#undef gai_strerror ++#endif ++#define gai_strerror irs_gai_strerror ++ ++int ++getaddrinfo(const char *hostname, const char *servname, ++ const struct addrinfo *hints, struct addrinfo **res); ++ ++int ++getnameinfo(const struct sockaddr *sa, IRS_GETNAMEINFO_SOCKLEN_T salen, ++ char *host, IRS_GETNAMEINFO_BUFLEN_T hostlen, ++ char *serv, IRS_GETNAMEINFO_BUFLEN_T servlen, ++ IRS_GETNAMEINFO_FLAGS_T flags); ++ ++void freeaddrinfo (struct addrinfo *ai); ++ ++IRS_GAISTRERROR_RETURN_T ++gai_strerror(int ecode); ++ ++#endif ++ ++/* + * Tell Emacs to use C mode on this file. + * Local variables: + * mode: c +-- +2.9.5 + diff --git a/SOURCES/bind-9.11-rh1410433.patch b/SOURCES/bind-9.11-rh1410433.patch new file mode 100644 index 0000000..d307620 --- /dev/null +++ b/SOURCES/bind-9.11-rh1410433.patch @@ -0,0 +1,16 @@ +diff --git a/lib/dns/dyndb.c b/lib/dns/dyndb.c +index 15561ce..e4449b0 100644 +--- a/lib/dns/dyndb.c ++++ b/lib/dns/dyndb.c +@@ -133,8 +133,11 @@ load_library(isc_mem_t *mctx, const char *filename, const char *instname, + instname, filename); + + flags = RTLD_NOW|RTLD_LOCAL; ++#if 0 ++ /* Shared global namespace is required for dns-pkcs11 library */ + #if defined(RTLD_DEEPBIND) && !__SANITIZE_ADDRESS__ + flags |= RTLD_DEEPBIND; ++#endif + #endif + + handle = dlopen(filename, flags); diff --git a/SOURCES/bind-9.11-rh1624100.patch b/SOURCES/bind-9.11-rh1624100.patch new file mode 100644 index 0000000..5764ed7 --- /dev/null +++ b/SOURCES/bind-9.11-rh1624100.patch @@ -0,0 +1,288 @@ +From 76594cba9a1e910bb36160d96fc3872349341799 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ond=C5=99ej=20Sur=C3=BD?= +Date: Wed, 25 Apr 2018 14:04:31 +0200 +Subject: [PATCH] Replace isc_safe routines with their OpenSSL counter parts + +(cherry picked from commit 66ba2fdad583d962a1f4971c85d58381f0849e4d) + +Remove isc_safe_memcompare, it's not needed anywhere and can't be replaced with CRYPTO_memcmp() + +(cherry picked from commit b105ccee68ccc3c18e6ea530063b3c8e5a42571c) + +Fix the isc_safe_memwipe() usage with (NULL, >0) + +(cherry picked from commit 083461d3329ff6f2410745848a926090586a9846) +--- + bin/dnssec/dnssec-signzone.c | 2 +- + lib/dns/nsec3.c | 4 +- + lib/dns/spnego.c | 4 +- + lib/isc/Makefile.in | 8 +--- + lib/isc/include/isc/safe.h | 18 ++------ + lib/isc/safe.c | 83 ------------------------------------ + lib/isc/tests/safe_test.c | 18 -------- + 7 files changed, 11 insertions(+), 126 deletions(-) + delete mode 100644 lib/isc/safe.c + +diff --git a/bin/dnssec/dnssec-signzone.c b/bin/dnssec/dnssec-signzone.c +index 6ddaebe..d921870 100644 +--- a/bin/dnssec/dnssec-signzone.c ++++ b/bin/dnssec/dnssec-signzone.c +@@ -787,7 +787,7 @@ hashlist_add_dns_name(hashlist_t *l, /*const*/ dns_name_t *name, + + static int + hashlist_comp(const void *a, const void *b) { +- return (isc_safe_memcompare(a, b, hash_length + 1)); ++ return (memcmp(a, b, hash_length + 1)); + } + + static void +diff --git a/lib/dns/nsec3.c b/lib/dns/nsec3.c +index 6ae7ca8..01426d6 100644 +--- a/lib/dns/nsec3.c ++++ b/lib/dns/nsec3.c +@@ -1963,7 +1963,7 @@ dns_nsec3_noexistnodata(dns_rdatatype_t type, dns_name_t* name, + * Work out what this NSEC3 covers. + * Inside (<0) or outside (>=0). + */ +- scope = isc_safe_memcompare(owner, nsec3.next, nsec3.next_length); ++ scope = memcmp(owner, nsec3.next, nsec3.next_length); + + /* + * Prepare to compute all the hashes. +@@ -1987,7 +1987,7 @@ dns_nsec3_noexistnodata(dns_rdatatype_t type, dns_name_t* name, + return (ISC_R_IGNORE); + } + +- order = isc_safe_memcompare(hash, owner, length); ++ order = memcmp(hash, owner, length); + if (first && order == 0) { + /* + * The hashes are the same. +diff --git a/lib/dns/spnego.c b/lib/dns/spnego.c +index ad77f24..670982a 100644 +--- a/lib/dns/spnego.c ++++ b/lib/dns/spnego.c +@@ -371,7 +371,7 @@ gssapi_spnego_decapsulate(OM_uint32 *, + + /* mod_auth_kerb.c */ + +-static int ++static isc_boolean_t + cmp_gss_type(gss_buffer_t token, gss_OID gssoid) + { + unsigned char *p; +@@ -395,7 +395,7 @@ cmp_gss_type(gss_buffer_t token, gss_OID gssoid) + if (((OM_uint32) *p++) != gssoid->length) + return (GSS_S_DEFECTIVE_TOKEN); + +- return (isc_safe_memcompare(p, gssoid->elements, gssoid->length)); ++ return (!isc_safe_memequal(p, gssoid->elements, gssoid->length)); + } + + /* accept_sec_context.c */ +diff --git a/lib/isc/Makefile.in b/lib/isc/Makefile.in +index 0fd0837..8ad54bb 100644 +--- a/lib/isc/Makefile.in ++++ b/lib/isc/Makefile.in +@@ -60,7 +60,7 @@ OBJS = @ISC_EXTRA_OBJS@ @ISC_PK11_O@ @ISC_PK11_RESULT_O@ \ + parseint.@O@ portset.@O@ quota.@O@ radix.@O@ random.@O@ \ + ratelimiter.@O@ refcount.@O@ region.@O@ regex.@O@ result.@O@ \ + rwlock.@O@ \ +- safe.@O@ serial.@O@ siphash.@O@ sha1.@O@ sha2.@O@ sockaddr.@O@ stats.@O@ \ ++ serial.@O@ siphash.@O@ sha1.@O@ sha2.@O@ sockaddr.@O@ stats.@O@ \ + string.@O@ strtoul.@O@ symtab.@O@ task.@O@ taskpool.@O@ \ + tm.@O@ timer.@O@ version.@O@ \ + ${UNIXOBJS} ${NLSOBJS} ${THREADOBJS} +@@ -79,7 +79,7 @@ SRCS = @ISC_EXTRA_SRCS@ @ISC_PK11_C@ @ISC_PK11_RESULT_C@ \ + netaddr.c netscope.c pool.c ondestroy.c \ + parseint.c portset.c quota.c radix.c random.c ${CHACHASRCS} \ + ratelimiter.c refcount.c region.c regex.c result.c rwlock.c \ +- safe.c serial.c siphash.c sha1.c sha2.c sockaddr.c stats.c string.c \ ++ serial.c siphash.c sha1.c sha2.c sockaddr.c stats.c string.c \ + strtoul.c symtab.c task.c taskpool.c timer.c \ + tm.c version.c + +@@ -95,10 +95,6 @@ TESTDIRS = @UNITTESTS@ + + @BIND9_MAKE_RULES@ + +-safe.@O@: safe.c +- ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} @CCNOOPT@ \ +- -c ${srcdir}/safe.c +- + version.@O@: version.c + ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} \ + -DVERSION=\"${VERSION}\" \ +diff --git a/lib/isc/include/isc/safe.h b/lib/isc/include/isc/safe.h +index 66ed08b..88b8f47 100644 +--- a/lib/isc/include/isc/safe.h ++++ b/lib/isc/include/isc/safe.h +@@ -15,29 +15,19 @@ + + /*! \file isc/safe.h */ + +-#include +- +-#include +-#include ++#include ++#include + + ISC_LANG_BEGINDECLS + +-bool +-isc_safe_memequal(const void *s1, const void *s2, size_t n); ++#define isc_safe_memequal(s1, s2, n) !CRYPTO_memcmp(s1, s2, n) + /*%< + * Returns true iff. two blocks of memory are equal, otherwise + * false. + * + */ + +-int +-isc_safe_memcompare(const void *b1, const void *b2, size_t len); +-/*%< +- * Clone of libc memcmp() which is safe to differential timing attacks. +- */ +- +-void +-isc_safe_memwipe(void *ptr, size_t len); ++#define isc_safe_memwipe(ptr, len) OPENSSL_cleanse(ptr, len) + /*%< + * Clear the memory of length `len` pointed to by `ptr`. + * +diff --git a/lib/isc/safe.c b/lib/isc/safe.c +deleted file mode 100644 +index 7a464b6..0000000 +--- a/lib/isc/safe.c ++++ /dev/null +@@ -1,83 +0,0 @@ +-/* +- * Copyright (C) Internet Systems Consortium, Inc. ("ISC") +- * +- * This Source Code Form is subject to the terms of the Mozilla Public +- * License, v. 2.0. If a copy of the MPL was not distributed with this +- * file, You can obtain one at http://mozilla.org/MPL/2.0/. +- * +- * See the COPYRIGHT file distributed with this work for additional +- * information regarding copyright ownership. +- */ +- +-/*! \file */ +- +-#include +- +-#include +- +-#include +-#include +-#include +- +-#ifdef WIN32 +-#include +-#endif +- +-#ifdef _MSC_VER +-#pragma optimize("", off) +-#endif +- +-bool +-isc_safe_memequal(const void *s1, const void *s2, size_t n) { +- uint8_t acc = 0; +- +- if (n != 0U) { +- const uint8_t *p1 = s1, *p2 = s2; +- +- do { +- acc |= *p1++ ^ *p2++; +- } while (--n != 0U); +- } +- return (acc == 0); +-} +- +- +-int +-isc_safe_memcompare(const void *b1, const void *b2, size_t len) { +- const unsigned char *p1 = b1, *p2 = b2; +- size_t i; +- int res = 0, done = 0; +- +- for (i = 0; i < len; i++) { +- /* lt is -1 if p1[i] < p2[i]; else 0. */ +- int lt = (p1[i] - p2[i]) >> CHAR_BIT; +- +- /* gt is -1 if p1[i] > p2[i]; else 0. */ +- int gt = (p2[i] - p1[i]) >> CHAR_BIT; +- +- /* cmp is 1 if p1[i] > p2[i]; -1 if p1[i] < p2[i]; else 0. */ +- int cmp = lt - gt; +- +- /* set res = cmp if !done. */ +- res |= cmp & ~done; +- +- /* set done if p1[i] != p2[i]. */ +- done |= lt | gt; +- } +- +- return (res); +-} +- +-void +-isc_safe_memwipe(void *ptr, size_t len) { +- if (ISC_UNLIKELY(ptr == NULL || len == 0)) +- return; +- +-#ifdef WIN32 +- SecureZeroMemory(ptr, len); +-#elif HAVE_EXPLICIT_BZERO +- explicit_bzero(ptr, len); +-#else +- memset(ptr, 0, len); +-#endif +-} +diff --git a/lib/isc/tests/safe_test.c b/lib/isc/tests/safe_test.c +index 266ac75..60e9181 100644 +--- a/lib/isc/tests/safe_test.c ++++ b/lib/isc/tests/safe_test.c +@@ -45,22 +45,6 @@ isc_safe_memequal_test(void **state) { + "\x00\x00\x00\x00", 4)); + } + +-/* test isc_safe_memcompare() */ +-static void +-isc_safe_memcompare_test(void **state) { +- UNUSED(state); +- +- assert_int_equal(isc_safe_memcompare("test", "test", 4), 0); +- assert_true(isc_safe_memcompare("test", "tesc", 4) > 0); +- assert_true(isc_safe_memcompare("test", "tesy", 4) < 0); +- assert_int_equal(isc_safe_memcompare("\x00\x00\x00\x00", +- "\x00\x00\x00\x00", 4), 0); +- assert_true(isc_safe_memcompare("\x00\x00\x00\x00", +- "\x00\x00\x00\x01", 4) < 0); +- assert_true(isc_safe_memcompare("\x00\x00\x00\x02", +- "\x00\x00\x00\x00", 4) > 0); +-} +- + /* test isc_safe_memwipe() */ + static void + isc_safe_memwipe_test(void **state) { +@@ -69,7 +53,6 @@ isc_safe_memwipe_test(void **state) { + /* These should pass. */ + isc_safe_memwipe(NULL, 0); + isc_safe_memwipe((void *) -1, 0); +- isc_safe_memwipe(NULL, 42); + + /* + * isc_safe_memwipe(ptr, size) should function same as +@@ -108,7 +91,6 @@ main(void) { + const struct CMUnitTest tests[] = { + cmocka_unit_test(isc_safe_memequal_test), + cmocka_unit_test(isc_safe_memwipe_test), +- cmocka_unit_test(isc_safe_memcompare_test), + }; + + return (cmocka_run_group_tests(tests, NULL, NULL)); +-- +2.20.1 + diff --git a/SOURCES/bind-9.11-rh1668682.patch b/SOURCES/bind-9.11-rh1668682.patch new file mode 100644 index 0000000..3e268b6 --- /dev/null +++ b/SOURCES/bind-9.11-rh1668682.patch @@ -0,0 +1,37 @@ +From 16c1bd61384e993fef13d7be88fdd34551a2b3ce Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Petr=20Men=C5=A1=C3=ADk?= +Date: Wed, 23 Jan 2019 20:12:51 +0100 +Subject: [PATCH] Use custom random generator only for bind build + +Do not test random entropy on startup when used by DHCP. On most cases +random entropy is not even used by DHCP. In cases it is (LDAP SSL), fail +whenever it is not available. + +Resolves: rhbz#1668682 +--- + lib/dns/openssl_link.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/lib/dns/openssl_link.c b/lib/dns/openssl_link.c +index 91e87d0..2551b0a 100644 +--- a/lib/dns/openssl_link.c ++++ b/lib/dns/openssl_link.c +@@ -289,6 +289,7 @@ dst__openssl_init(const char *engine) { + #endif + #endif /* !defined(OPENSSL_NO_ENGINE) */ + ++#ifdef ISC_PLATFORM_USETHREADS + /* Protect ourselves against unseeded PRNG */ + if (RAND_status() != 1) { + FATAL_ERROR(__FILE__, __LINE__, +@@ -296,6 +297,7 @@ dst__openssl_init(const char *engine) { + "cannot be initialized (see the `PRNG not " + "seeded' message in the OpenSSL FAQ)"); + } ++#endif /* ISC_PLATFORM_USETHREADS */ + + return (ISC_R_SUCCESS); + +-- +2.20.1 + diff --git a/SOURCES/bind-9.11-rh1790879.patch b/SOURCES/bind-9.11-rh1790879.patch new file mode 100644 index 0000000..7f44fee --- /dev/null +++ b/SOURCES/bind-9.11-rh1790879.patch @@ -0,0 +1,65 @@ +From f9a37643528dc83b981156d0a1cf52e3d9a38322 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Micha=C5=82=20K=C4=99pie=C5=84?= +Date: Mon, 2 Dec 2019 15:15:06 +0100 +Subject: [PATCH] Fix GeoIP2 memory leak upon reconfiguration + +Loaded GeoIP2 databases are only released when named is shut down, but +not during server reconfiguration. This causes memory to be leaked +every time "rndc reconfig" or "rndc reload" is used, as long as any +GeoIP2 database is in use. Fix by releasing any loaded GeoIP2 databases +before reloading them. Do not call dns_geoip_shutdown() until server +shutdown as that function releases the memory context used for caching +GeoIP2 lookup results. + +(cherry picked from commit 670afbe84a87e202fa795079d9d6d1639bcf391d) +(cherry picked from commit 95a5589fa2ac3956fecfef780158a2745718c860) +--- + bin/named/geoip.c | 2 -- + bin/named/server.c | 6 ++++++ + 2 files changed, 6 insertions(+), 2 deletions(-) + +diff --git a/bin/named/geoip.c b/bin/named/geoip.c +index d560f8fbcf..0b11f6b803 100644 +--- a/bin/named/geoip.c ++++ b/bin/named/geoip.c +@@ -243,6 +243,4 @@ ns_geoip_shutdown(void) { + ns_g_geoip->domain = NULL; + } + #endif /* HAVE_GEOIP2 */ +- +- dns_geoip_shutdown(); + } +diff --git a/bin/named/server.c b/bin/named/server.c +index ebe7ad4702..4d7d2210ff 100644 +--- a/bin/named/server.c ++++ b/bin/named/server.c +@@ -72,6 +72,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -7684,6 +7685,10 @@ load_configuration(const char *filename, ns_server_t *server, + isc__socketmgr_setreserved(ns_g_socketmgr, reserved); + + #if defined(HAVE_GEOIP) || defined(HAVE_GEOIP2) ++ /* ++ * Release any previously opened GeoIP2 databases. ++ */ ++ ns_geoip_shutdown(); + /* + * Initialize GeoIP databases from the configured location. + * This should happen before configuring any ACLs, so that we +@@ -9030,6 +9035,7 @@ shutdown_server(isc_task_t *task, isc_event_t *event) { + #endif + #if defined(HAVE_GEOIP) || defined(HAVE_GEOIP2) + ns_geoip_shutdown(); ++ dns_geoip_shutdown(); + #endif /* HAVE_GEOIP || HAVE_GEOIP2 */ + + dns_db_detach(&server->in_roothints); +-- +2.21.1 + diff --git a/SOURCES/bind-9.11-rt31459.patch b/SOURCES/bind-9.11-rt31459.patch new file mode 100644 index 0000000..ea25abe --- /dev/null +++ b/SOURCES/bind-9.11-rt31459.patch @@ -0,0 +1,2122 @@ +From 7e61714a5d1509ec79af42391e41eb1afc53063a Mon Sep 17 00:00:00 2001 +From: Evan Hunt +Date: Tue, 12 Sep 2017 19:05:46 -0700 +Subject: [PATCH] rebased rt31459c + +[rt31459d] update the newer tools + +[rt31459d] setup entropy in dns_lib_init() + +[rt31459d] silence compiler warning + +DNS_OPENSSL_LIBS -> DST_OPENSSL_LIBS + +Include new unit test +--- + bin/confgen/keygen.c | 7 + + bin/dnssec/dnssec-dsfromkey.c | 8 +- + bin/dnssec/dnssec-importkey.c | 8 +- + bin/dnssec/dnssec-revoke.c | 8 +- + bin/dnssec/dnssec-settime.c | 8 +- + bin/dnssec/dnssec-signzone.c | 11 +- + bin/dnssec/dnssec-verify.c | 8 +- + bin/dnssec/dnssectool.c | 11 +- + bin/named/server.c | 6 + + bin/nsupdate/nsupdate.c | 14 +- + bin/tests/makejournal.c | 6 +- + bin/tests/system/pipelined/pipequeries.c | 20 +- + bin/tests/system/pipelined/tests.sh | 4 +- + bin/tests/system/rsabigexponent/bigkey.c | 4 + + bin/tests/system/tkey/keycreate.c | 26 ++- + bin/tests/system/tkey/keydelete.c | 26 ++- + bin/tests/system/tkey/tests.sh | 8 +- + bin/tools/mdig.c | 3 +- + configure | 250 +++++++++++++---------- + configure.ac | 77 ++++++- + lib/dns/dst_api.c | 21 +- + lib/dns/include/dst/dst.h | 8 + + lib/dns/lib.c | 15 +- + lib/dns/openssl_link.c | 72 ++++++- + lib/dns/pkcs11.c | 29 ++- + lib/dns/tests/Kyuafile | 1 + + lib/dns/tests/Makefile.in | 7 + + lib/dns/tests/dstrandom_test.c | 115 +++++++++++ + lib/dns/win32/libdns.def.in | 7 + + lib/isc/entropy.c | 24 +++ + lib/isc/include/isc/entropy.h | 12 ++ + lib/isc/include/isc/platform.h.in | 5 + + lib/isc/include/isc/types.h | 2 + + lib/isc/pk11.c | 12 +- + lib/isc/win32/include/isc/platform.h.in | 5 + + win32utils/Configure | 28 ++- + 36 files changed, 701 insertions(+), 175 deletions(-) + create mode 100644 lib/dns/tests/dstrandom_test.c + +diff --git a/bin/confgen/keygen.c b/bin/confgen/keygen.c +index 5015abb..295e16f 100644 +--- a/bin/confgen/keygen.c ++++ b/bin/confgen/keygen.c +@@ -165,6 +165,13 @@ generate_key(isc_mem_t *mctx, const char *randomfile, dns_secalg_t alg, + randomfile = NULL; + open_keyboard = ISC_ENTROPY_KEYBOARDYES; + } ++#ifdef ISC_PLATFORM_CRYPTORANDOM ++ if (randomfile != NULL && ++ strcmp(randomfile, ISC_PLATFORM_CRYPTORANDOM) == 0) { ++ randomfile = NULL; ++ isc_entropy_usehook(ectx, true); ++ } ++#endif + DO("start entropy source", isc_entropy_usebestsource(ectx, + &entropy_source, + randomfile, +diff --git a/bin/dnssec/dnssec-dsfromkey.c b/bin/dnssec/dnssec-dsfromkey.c +index 2c0c308..3e585af 100644 +--- a/bin/dnssec/dnssec-dsfromkey.c ++++ b/bin/dnssec/dnssec-dsfromkey.c +@@ -494,14 +494,14 @@ main(int argc, char **argv) { + + if (ectx == NULL) + setup_entropy(mctx, NULL, &ectx); +- result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE); +- if (result != ISC_R_SUCCESS) +- fatal("could not initialize hash"); + result = dst_lib_init(mctx, ectx, + ISC_ENTROPY_BLOCKING | ISC_ENTROPY_GOODONLY); + if (result != ISC_R_SUCCESS) + fatal("could not initialize dst: %s", + isc_result_totext(result)); ++ result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE); ++ if (result != ISC_R_SUCCESS) ++ fatal("could not initialize hash"); + isc_entropy_stopcallbacksources(ectx); + + setup_logging(mctx, &log); +@@ -571,8 +571,8 @@ main(int argc, char **argv) { + if (dns_rdataset_isassociated(&rdataset)) + dns_rdataset_disassociate(&rdataset); + cleanup_logging(&log); +- dst_lib_destroy(); + isc_hash_destroy(); ++ dst_lib_destroy(); + cleanup_entropy(&ectx); + dns_name_destroy(); + if (verbose > 10) +diff --git a/bin/dnssec/dnssec-importkey.c b/bin/dnssec/dnssec-importkey.c +index 0d1e7f8..79c4d74 100644 +--- a/bin/dnssec/dnssec-importkey.c ++++ b/bin/dnssec/dnssec-importkey.c +@@ -407,14 +407,14 @@ main(int argc, char **argv) { + + if (ectx == NULL) + setup_entropy(mctx, NULL, &ectx); +- result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE); +- if (result != ISC_R_SUCCESS) +- fatal("could not initialize hash"); + result = dst_lib_init(mctx, ectx, + ISC_ENTROPY_BLOCKING | ISC_ENTROPY_GOODONLY); + if (result != ISC_R_SUCCESS) + fatal("could not initialize dst: %s", + isc_result_totext(result)); ++ result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE); ++ if (result != ISC_R_SUCCESS) ++ fatal("could not initialize hash"); + isc_entropy_stopcallbacksources(ectx); + + setup_logging(mctx, &log); +@@ -458,8 +458,8 @@ main(int argc, char **argv) { + if (dns_rdataset_isassociated(&rdataset)) + dns_rdataset_disassociate(&rdataset); + cleanup_logging(&log); +- dst_lib_destroy(); + isc_hash_destroy(); ++ dst_lib_destroy(); + cleanup_entropy(&ectx); + dns_name_destroy(); + if (verbose > 10) +diff --git a/bin/dnssec/dnssec-revoke.c b/bin/dnssec/dnssec-revoke.c +index 7d82dbf..10f9359 100644 +--- a/bin/dnssec/dnssec-revoke.c ++++ b/bin/dnssec/dnssec-revoke.c +@@ -184,14 +184,14 @@ main(int argc, char **argv) { + + if (ectx == NULL) + setup_entropy(mctx, NULL, &ectx); +- result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE); +- if (result != ISC_R_SUCCESS) +- fatal("Could not initialize hash"); + result = dst_lib_init2(mctx, ectx, engine, + ISC_ENTROPY_BLOCKING | ISC_ENTROPY_GOODONLY); + if (result != ISC_R_SUCCESS) + fatal("Could not initialize dst: %s", + isc_result_totext(result)); ++ result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE); ++ if (result != ISC_R_SUCCESS) ++ fatal("Could not initialize hash"); + isc_entropy_stopcallbacksources(ectx); + + result = dst_key_fromnamedfile(filename, dir, +@@ -273,8 +273,8 @@ main(int argc, char **argv) { + + cleanup: + dst_key_free(&key); +- dst_lib_destroy(); + isc_hash_destroy(); ++ dst_lib_destroy(); + cleanup_entropy(&ectx); + if (verbose > 10) + isc_mem_stats(mctx, stdout); +diff --git a/bin/dnssec/dnssec-settime.c b/bin/dnssec/dnssec-settime.c +index f355903..6a2ca59 100644 +--- a/bin/dnssec/dnssec-settime.c ++++ b/bin/dnssec/dnssec-settime.c +@@ -382,14 +382,14 @@ main(int argc, char **argv) { + + if (ectx == NULL) + setup_entropy(mctx, NULL, &ectx); +- result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE); +- if (result != ISC_R_SUCCESS) +- fatal("Could not initialize hash"); + result = dst_lib_init2(mctx, ectx, engine, + ISC_ENTROPY_BLOCKING | ISC_ENTROPY_GOODONLY); + if (result != ISC_R_SUCCESS) + fatal("Could not initialize dst: %s", + isc_result_totext(result)); ++ result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE); ++ if (result != ISC_R_SUCCESS) ++ fatal("Could not initialize hash"); + isc_entropy_stopcallbacksources(ectx); + + if (predecessor != NULL) { +@@ -674,8 +674,8 @@ main(int argc, char **argv) { + if (prevkey != NULL) + dst_key_free(&prevkey); + dst_key_free(&key); +- dst_lib_destroy(); + isc_hash_destroy(); ++ dst_lib_destroy(); + cleanup_entropy(&ectx); + if (verbose > 10) + isc_mem_stats(mctx, stdout); +diff --git a/bin/dnssec/dnssec-signzone.c b/bin/dnssec/dnssec-signzone.c +index c6a0313..6ddaebe 100644 +--- a/bin/dnssec/dnssec-signzone.c ++++ b/bin/dnssec/dnssec-signzone.c +@@ -3460,14 +3460,15 @@ main(int argc, char *argv[]) { + if (!pseudorandom) + eflags |= ISC_ENTROPY_GOODONLY; + +- result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE); +- if (result != ISC_R_SUCCESS) +- fatal("could not create hash context"); +- + result = dst_lib_init2(mctx, ectx, engine, eflags); + if (result != ISC_R_SUCCESS) + fatal("could not initialize dst: %s", + isc_result_totext(result)); ++ ++ result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE); ++ if (result != ISC_R_SUCCESS) ++ fatal("could not create hash context"); ++ + isc_stdtime_get(&now); + + if (startstr != NULL) { +@@ -3879,8 +3880,8 @@ main(int argc, char *argv[]) { + dns_master_styledestroy(&dsstyle, mctx); + + cleanup_logging(&log); +- dst_lib_destroy(); + isc_hash_destroy(); ++ dst_lib_destroy(); + cleanup_entropy(&ectx); + dns_name_destroy(); + if (verbose > 10) +diff --git a/bin/dnssec/dnssec-verify.c b/bin/dnssec/dnssec-verify.c +index 4c293bf..3263cbc 100644 +--- a/bin/dnssec/dnssec-verify.c ++++ b/bin/dnssec/dnssec-verify.c +@@ -281,15 +281,15 @@ main(int argc, char *argv[]) { + if (ectx == NULL) + setup_entropy(mctx, NULL, &ectx); + +- result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE); +- if (result != ISC_R_SUCCESS) +- fatal("could not create hash context"); +- + result = dst_lib_init2(mctx, ectx, engine, ISC_ENTROPY_BLOCKING); + if (result != ISC_R_SUCCESS) + fatal("could not initialize dst: %s", + isc_result_totext(result)); + ++ result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE); ++ if (result != ISC_R_SUCCESS) ++ fatal("could not create hash context"); ++ + isc_stdtime_get(&now); + + rdclass = strtoclass(classname); +diff --git a/bin/dnssec/dnssectool.c b/bin/dnssec/dnssectool.c +index fbc7ece..31a99e7 100644 +--- a/bin/dnssec/dnssectool.c ++++ b/bin/dnssec/dnssectool.c +@@ -34,6 +34,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -235,7 +236,8 @@ setup_entropy(isc_mem_t *mctx, const char *randomfile, isc_entropy_t **ectx) { + if (*ectx == NULL) { + result = isc_entropy_create(mctx, ectx); + if (result != ISC_R_SUCCESS) +- fatal("could not create entropy object"); ++ fatal("could not create entropy object: %s", ++ isc_result_totext(result)); + ISC_LIST_INIT(sources); + } + +@@ -244,6 +246,13 @@ setup_entropy(isc_mem_t *mctx, const char *randomfile, isc_entropy_t **ectx) { + randomfile = NULL; + } + ++#ifdef ISC_PLATFORM_CRYPTORANDOM ++ if (randomfile != NULL && ++ strcmp(randomfile, ISC_PLATFORM_CRYPTORANDOM) == 0) { ++ randomfile = NULL; ++ isc_entropy_usehook(*ectx, true); ++ } ++#endif + result = isc_entropy_usebestsource(*ectx, &source, randomfile, + usekeyboard); + +diff --git a/bin/named/server.c b/bin/named/server.c +index 7d85d3b..c782073 100644 +--- a/bin/named/server.c ++++ b/bin/named/server.c +@@ -36,6 +36,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -8211,6 +8212,10 @@ load_configuration(const char *filename, ns_server_t *server, + "no source of entropy found"); + } else { + const char *randomdev = cfg_obj_asstring(obj); ++#ifdef ISC_PLATFORM_CRYPTORANDOM ++ if (strcmp(randomdev, ISC_PLATFORM_CRYPTORANDOM) == 0) ++ isc_entropy_usehook(ns_g_entropy, true); ++#else + int level = ISC_LOG_ERROR; + result = isc_entropy_createfilesource(ns_g_entropy, + randomdev); +@@ -8245,6 +8250,7 @@ load_configuration(const char *filename, ns_server_t *server, + } + isc_entropy_detach(&ns_g_fallbackentropy); + } ++#endif + #endif + } + +diff --git a/bin/nsupdate/nsupdate.c b/bin/nsupdate/nsupdate.c +index bbb3936..0286987 100644 +--- a/bin/nsupdate/nsupdate.c ++++ b/bin/nsupdate/nsupdate.c +@@ -272,7 +272,8 @@ setup_entropy(isc_mem_t *mctx, const char *randomfile, isc_entropy_t **ectx) { + if (*ectx == NULL) { + result = isc_entropy_create(mctx, ectx); + if (result != ISC_R_SUCCESS) +- fatal("could not create entropy object"); ++ fatal("could not create entropy object: %s", ++ isc_result_totext(result)); + ISC_LIST_INIT(sources); + } + +@@ -281,6 +282,13 @@ setup_entropy(isc_mem_t *mctx, const char *randomfile, isc_entropy_t **ectx) { + randomfile = NULL; + } + ++#ifdef ISC_PLATFORM_CRYPTORANDOM ++ if (randomfile != NULL && ++ strcmp(randomfile, ISC_PLATFORM_CRYPTORANDOM) == 0) { ++ randomfile = NULL; ++ isc_entropy_usehook(*ectx, true); ++ } ++#endif + result = isc_entropy_usebestsource(*ectx, &source, randomfile, + usekeyboard); + +@@ -979,11 +987,11 @@ setup_system(void) { + } + } + +- setup_entropy(gmctx, NULL, &entropy); ++ if (entropy == NULL) ++ setup_entropy(gmctx, NULL, &entropy); + + result = isc_hash_create(gmctx, entropy, DNS_NAME_MAXWIRE); + check_result(result, "isc_hash_create"); +- isc_hash_init(); + + result = dns_dispatchmgr_create(gmctx, entropy, &dispatchmgr); + check_result(result, "dns_dispatchmgr_create"); +diff --git a/bin/tests/makejournal.c b/bin/tests/makejournal.c +index 61a41b0..acc71a1 100644 +--- a/bin/tests/makejournal.c ++++ b/bin/tests/makejournal.c +@@ -102,12 +102,12 @@ main(int argc, char **argv) { + CHECK(isc_mem_create(0, 0, &mctx)); + CHECK(isc_entropy_create(mctx, &ectx)); + +- CHECK(isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE)); +- hash_active = true; +- + CHECK(dst_lib_init(mctx, ectx, ISC_ENTROPY_BLOCKING)); + dst_active = true; + ++ CHECK(isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE)); ++ hash_active = true; ++ + CHECK(isc_log_create(mctx, &lctx, &logconfig)); + isc_log_registercategories(lctx, categories); + isc_log_setcontext(lctx); +diff --git a/bin/tests/system/pipelined/pipequeries.c b/bin/tests/system/pipelined/pipequeries.c +index c6ab7f8..f0a6ff2 100644 +--- a/bin/tests/system/pipelined/pipequeries.c ++++ b/bin/tests/system/pipelined/pipequeries.c +@@ -204,6 +204,7 @@ sendqueries(isc_task_t *task, isc_event_t *event) { + + int + main(int argc, char *argv[]) { ++ char *randomfile = NULL; + isc_sockaddr_t bind_any; + struct in_addr inaddr; + isc_result_t result; +@@ -222,7 +223,7 @@ main(int argc, char *argv[]) { + int c; + + isc_commandline_errprint = false; +- while ((c = isc_commandline_parse(argc, argv, "p:")) != -1) { ++ while ((c = isc_commandline_parse(argc, argv, "p:r:")) != -1) { + switch (c) { + case 'p': + result = isc_parse_uint16(&port, +@@ -233,6 +234,9 @@ main(int argc, char *argv[]) { + exit(1); + } + break; ++ case 'r': ++ randomfile = isc_commandline_argument; ++ break; + case '?': + fprintf(stderr, "%s: invalid argument '%c'", + argv[0], c); +@@ -275,10 +279,18 @@ main(int argc, char *argv[]) { + + ectx = NULL; + RUNCHECK(isc_entropy_create(mctx, &ectx)); +- RUNCHECK(isc_entropy_createfilesource(ectx, "../random.data")); +- RUNCHECK(isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE)); ++#ifdef ISC_PLATFORM_CRYPTORANDOM ++ if (randomfile != NULL && ++ strcmp(randomfile, ISC_PLATFORM_CRYPTORANDOM) == 0) { ++ randomfile = NULL; ++ isc_entropy_usehook(ectx, true); ++ } ++#endif ++ if (randomfile != NULL) ++ RUNCHECK(isc_entropy_createfilesource(ectx, randomfile)); + + RUNCHECK(dst_lib_init(mctx, ectx, ISC_ENTROPY_GOODONLY)); ++ RUNCHECK(isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE)); + + taskmgr = NULL; + RUNCHECK(isc_taskmgr_create(mctx, 1, 0, &taskmgr)); +@@ -331,8 +343,8 @@ main(int argc, char *argv[]) { + isc_task_detach(&task); + isc_taskmgr_destroy(&taskmgr); + +- dst_lib_destroy(); + isc_hash_destroy(); ++ dst_lib_destroy(); + isc_entropy_detach(&ectx); + + isc_log_destroy(&lctx); +diff --git a/bin/tests/system/pipelined/tests.sh b/bin/tests/system/pipelined/tests.sh +index 61f1ff7..ed1302a 100644 +--- a/bin/tests/system/pipelined/tests.sh ++++ b/bin/tests/system/pipelined/tests.sh +@@ -19,7 +19,7 @@ status=0 + + echo_i "check pipelined TCP queries" + ret=0 +-$PIPEQUERIES -p ${PORT} < input > raw || ret=1 ++$PIPEQUERIES -p ${PORT} -r $RANDFILE < input > raw || ret=1 + awk '{ print $1 " " $5 }' < raw > output + sort < output > output-sorted + $DIFF ref output-sorted || { ret=1 ; echo_i "diff sorted failed"; } +@@ -43,7 +43,7 @@ status=`expr $status + $ret` + + echo_i "check keep-response-order" + ret=0 +-$PIPEQUERIES -p ${PORT} ++ < inputb > rawb || ret=1 ++$PIPEQUERIES -p ${PORT} -r $RANDFILE ++ < inputb > rawb || ret=1 + awk '{ print $1 " " $5 }' < rawb > outputb + $DIFF refb outputb || ret=1 + if [ $ret != 0 ]; then echo_i "failed"; fi +diff --git a/bin/tests/system/rsabigexponent/bigkey.c b/bin/tests/system/rsabigexponent/bigkey.c +index 4462f2e..f06268d 100644 +--- a/bin/tests/system/rsabigexponent/bigkey.c ++++ b/bin/tests/system/rsabigexponent/bigkey.c +@@ -20,6 +20,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -183,6 +184,9 @@ main(int argc, char **argv) { + + CHECK(isc_mem_create(0, 0, &mctx), "isc_mem_create()"); + CHECK(isc_entropy_create(mctx, &ectx), "isc_entropy_create()"); ++#ifdef ISC_PLATFORM_CRYPTORANDOM ++ isc_entropy_usehook(ectx, true); ++#endif + CHECK(isc_entropy_usebestsource(ectx, &source, + "../random.data", + ISC_ENTROPY_KEYBOARDNO), +diff --git a/bin/tests/system/tkey/keycreate.c b/bin/tests/system/tkey/keycreate.c +index 653c951..fe8698e 100644 +--- a/bin/tests/system/tkey/keycreate.c ++++ b/bin/tests/system/tkey/keycreate.c +@@ -206,6 +206,7 @@ sendquery(isc_task_t *task, isc_event_t *event) { + int + main(int argc, char *argv[]) { + char *ourkeyname; ++ char *randomfile; + isc_taskmgr_t *taskmgr; + isc_timermgr_t *timermgr; + isc_socketmgr_t *socketmgr; +@@ -225,10 +226,21 @@ main(int argc, char *argv[]) { + + RUNCHECK(isc_app_start()); + ++ randomfile = NULL; ++ + if (argc < 2) { + fprintf(stderr, "I:no DH key provided\n"); + exit(-1); + } ++ if (strcmp(argv[1], "-r") == 0) { ++ if (argc < 4) { ++ fprintf(stderr, "I:no DH key provided\n"); ++ exit(-1); ++ } ++ randomfile = argv[2]; ++ argv += 2; ++ argc -= 2; ++ } + ourkeyname = argv[1]; + + if (argc >= 3) +@@ -242,14 +254,22 @@ main(int argc, char *argv[]) { + + ectx = NULL; + RUNCHECK(isc_entropy_create(mctx, &ectx)); +- RUNCHECK(isc_entropy_createfilesource(ectx, "../random.data")); +- RUNCHECK(isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE)); ++#ifdef ISC_PLATFORM_CRYPTORANDOM ++ if (randomfile != NULL && ++ strcmp(randomfile, ISC_PLATFORM_CRYPTORANDOM) == 0) { ++ randomfile = NULL; ++ isc_entropy_usehook(ectx, true); ++ } ++#endif ++ if (randomfile != NULL) ++ RUNCHECK(isc_entropy_createfilesource(ectx, randomfile)); + + log = NULL; + logconfig = NULL; + RUNCHECK(isc_log_create(mctx, &log, &logconfig)); + + RUNCHECK(dst_lib_init(mctx, ectx, ISC_ENTROPY_GOODONLY)); ++ RUNCHECK(isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE)); + + taskmgr = NULL; + RUNCHECK(isc_taskmgr_create(mctx, 1, 0, &taskmgr)); +@@ -328,8 +348,8 @@ main(int argc, char *argv[]) { + + isc_log_destroy(&log); + +- dst_lib_destroy(); + isc_hash_destroy(); ++ dst_lib_destroy(); + isc_entropy_detach(&ectx); + + isc_mem_destroy(&mctx); +diff --git a/bin/tests/system/tkey/keydelete.c b/bin/tests/system/tkey/keydelete.c +index 70a40c3..2146f9b 100644 +--- a/bin/tests/system/tkey/keydelete.c ++++ b/bin/tests/system/tkey/keydelete.c +@@ -136,6 +136,7 @@ sendquery(isc_task_t *task, isc_event_t *event) { + int + main(int argc, char **argv) { + char *keyname; ++ char *randomfile; + isc_taskmgr_t *taskmgr; + isc_timermgr_t *timermgr; + isc_socketmgr_t *socketmgr; +@@ -156,10 +157,21 @@ main(int argc, char **argv) { + + RUNCHECK(isc_app_start()); + ++ randomfile = NULL; ++ + if (argc < 2) { + fprintf(stderr, "I:no key to delete\n"); + exit(-1); + } ++ if (strcmp(argv[1], "-r") == 0) { ++ if (argc < 4) { ++ fprintf(stderr, "I:no DH key provided\n"); ++ exit(-1); ++ } ++ randomfile = argv[2]; ++ argv += 2; ++ argc -= 2; ++ } + keyname = argv[1]; + + dns_result_register(); +@@ -169,14 +181,22 @@ main(int argc, char **argv) { + + ectx = NULL; + RUNCHECK(isc_entropy_create(mctx, &ectx)); +- RUNCHECK(isc_entropy_createfilesource(ectx, "../random.data")); +- RUNCHECK(isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE)); ++#ifdef ISC_PLATFORM_CRYPTORANDOM ++ if (randomfile != NULL && ++ strcmp(randomfile, ISC_PLATFORM_CRYPTORANDOM) == 0) { ++ randomfile = NULL; ++ isc_entropy_usehook(ectx, true); ++ } ++#endif ++ if (randomfile != NULL) ++ RUNCHECK(isc_entropy_createfilesource(ectx, randomfile)); + + log = NULL; + logconfig = NULL; + RUNCHECK(isc_log_create(mctx, &log, &logconfig)); + + RUNCHECK(dst_lib_init(mctx, ectx, ISC_ENTROPY_GOODONLY)); ++ RUNCHECK(isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE)); + + taskmgr = NULL; + RUNCHECK(isc_taskmgr_create(mctx, 1, 0, &taskmgr)); +@@ -264,8 +284,8 @@ main(int argc, char **argv) { + + isc_log_destroy(&log); + +- dst_lib_destroy(); + isc_hash_destroy(); ++ dst_lib_destroy(); + isc_entropy_detach(&ectx); + + isc_mem_destroy(&mctx); +diff --git a/bin/tests/system/tkey/tests.sh b/bin/tests/system/tkey/tests.sh +index 9f90dd7..fad6c83 100644 +--- a/bin/tests/system/tkey/tests.sh ++++ b/bin/tests/system/tkey/tests.sh +@@ -33,7 +33,7 @@ for owner in . foo.example. + do + echo "I:creating new key using owner name \"$owner\"" + ret=0 +- keyname=`$KEYCREATE $dhkeyname $owner` || ret=1 ++ keyname=`$KEYCREATE -r $RANDFILE $dhkeyname $owner` || ret=1 + if [ $ret != 0 ]; then + echo "I:failed" + status=`expr $status + $ret` +@@ -55,7 +55,7 @@ do + + echo "I:deleting new key" + ret=0 +- $KEYDELETE $keyname || ret=1 ++ $KEYDELETE -r $RANDFILE $keyname || ret=1 + if [ $ret != 0 ]; then + echo "I:failed" + fi +@@ -75,7 +75,7 @@ done + + echo "I:creating new key using owner name bar.example." + ret=0 +-keyname=`$KEYCREATE $dhkeyname bar.example.` || ret=1 ++keyname=`$KEYCREATE -r $RANDFILE $dhkeyname bar.example.` || ret=1 + if [ $ret != 0 ]; then + echo "I:failed" + status=`expr $status + $ret` +@@ -116,7 +116,7 @@ status=`expr $status + $ret` + + echo "I:recreating the bar.example. key" + ret=0 +-keyname=`$KEYCREATE $dhkeyname bar.example.` || ret=1 ++keyname=`$KEYCREATE -r $RANDFILE $dhkeyname bar.example.` || ret=1 + if [ $ret != 0 ]; then + echo "I:failed" + status=`expr $status + $ret` +diff --git a/bin/tools/mdig.c b/bin/tools/mdig.c +index bf6dbb6..0416b21 100644 +--- a/bin/tools/mdig.c ++++ b/bin/tools/mdig.c +@@ -1972,12 +1972,11 @@ main(int argc, char *argv[]) { + + ectx = NULL; + RUNCHECK(isc_entropy_create(mctx, &ectx)); ++ RUNCHECK(dst_lib_init(mctx, ectx, ISC_ENTROPY_GOODONLY)); + RUNCHECK(isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE)); + RUNCHECK(isc_entropy_getdata(ectx, cookie_secret, + sizeof(cookie_secret), NULL, 0)); + +- RUNCHECK(dst_lib_init(mctx, ectx, ISC_ENTROPY_GOODONLY)); +- + ISC_LIST_INIT(queries); + parse_args(false, argc, argv); + if (server == NULL) +diff --git a/configure b/configure +index ed002e0..a578874 100755 +--- a/configure ++++ b/configure +@@ -640,6 +640,7 @@ ac_includes_default="\ + + ac_subst_vars='LTLIBOBJS + LIBOBJS ++LIBDIR_SUFFIX + BUILD_LIBS + BUILD_LDFLAGS + BUILD_CPPFLAGS +@@ -821,6 +822,7 @@ XMLSTATS + NZDTARGETS + NZDSRCS + NZD_TOOLS ++ISC_PLATFORM_CRYPTORANDOM + PKCS11_TEST + PKCS11_ED25519 + PKCS11_GOST +@@ -1045,6 +1047,7 @@ with_eddsa + with_aes + enable_openssl_hash + with_cc_alg ++enable_crypto_rand + with_lmdb + with_libxml2 + with_libjson +@@ -1744,6 +1747,7 @@ Optional Features: + --enable-threads enable multithreading + --enable-native-pkcs11 use native PKCS11 for all crypto [default=no] + --enable-openssl-hash use OpenSSL for hash functions [default=no] ++ --enable-crypto-rand use the crypto provider for random [default=yes] + --enable-largefile 64-bit file support + --enable-backtrace log stack backtrace on abort [default=yes] + --enable-symtable use internal symbol table for backtrace +@@ -17115,6 +17119,7 @@ case "$use_openssl" in + $as_echo "disabled because of native PKCS11" >&6; } + DST_OPENSSL_INC="" + CRYPTO="-DPKCS11CRYPTO" ++ CRYPTOLIB="pkcs11" + OPENSSLECDSALINKOBJS="" + OPENSSLECDSALINKSRCS="" + OPENSSLEDDSALINKOBJS="" +@@ -17129,6 +17134,7 @@ $as_echo "disabled because of native PKCS11" >&6; } + $as_echo "no" >&6; } + DST_OPENSSL_INC="" + CRYPTO="" ++ CRYPTOLIB="" + OPENSSLECDSALINKOBJS="" + OPENSSLECDSALINKSRCS="" + OPENSSLEDDSALINKOBJS="" +@@ -17141,6 +17147,7 @@ $as_echo "no" >&6; } + auto) + DST_OPENSSL_INC="" + CRYPTO="" ++ CRYPTOLIB="" + OPENSSLECDSALINKOBJS="" + OPENSSLECDSALINKSRCS="" + OPENSSLEDDSALINKOBJS="" +@@ -17150,7 +17157,7 @@ $as_echo "no" >&6; } + OPENSSLLINKOBJS="" + OPENSSLLINKSRCS="" + as_fn_error $? "OpenSSL was not found in any of $openssldirs; use --with-openssl=/path +-If you don't want OpenSSL, use --without-openssl" "$LINENO" 5 ++If you do not want OpenSSL, use --without-openssl" "$LINENO" 5 + ;; + *) + if test "yes" = "$want_native_pkcs11" +@@ -17181,6 +17188,7 @@ $as_echo "not found" >&6; } + as_fn_error $? "\"$use_openssl/include/openssl/opensslv.h\" not found" "$LINENO" 5 + fi + CRYPTO='-DOPENSSL' ++ CRYPTOLIB="openssl" + if test "/usr" = "$use_openssl" + then + DST_OPENSSL_INC="" +@@ -17806,8 +17814,6 @@ fi + # Use OpenSSL for hash functions + # + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for using OpenSSL for hash functions" >&5 +-$as_echo_n "checking for using OpenSSL for hash functions... " >&6; } + ISC_PLATFORM_OPENSSLHASH="#undef ISC_PLATFORM_OPENSSLHASH" + case $want_openssl_hash in + yes) +@@ -18182,6 +18188,86 @@ if test "rt" = "$have_clock_gt"; then + LIBS="-lrt $LIBS" + fi + ++# ++# Use the crypto provider (OpenSSL/PKCS#11) for random functions ++# ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for using the crypto library (vs. builtin) for random functions" >&5 ++$as_echo_n "checking for using the crypto library (vs. builtin) for random functions... " >&6; } ++# Check whether --enable-crypto-rand was given. ++if test "${enable_crypto_rand+set}" = set; then : ++ enableval=$enable_crypto_rand; want_crypto_rand="$enableval" ++else ++ want_crypto_rand="auto" ++fi ++ ++if test "$want_crypto_rand" = "auto" ++then ++ case "$CRYPTOLIB" in ++ "") ++ want_crypto_rand="no" ++ ;; ++ pkcs11) ++ want_crypto_rand="yes" ++ ;; ++ openssl) ++ saved_cflags="$CFLAGS" ++ saved_libs="$LIBS" ++ CFLAGS="$CFLAGS $DST_OPENSSL_INC" ++ LIBS="$LIBS $DST_OPENSSL_LIBS" ++ if test "$cross_compiling" = yes; then : ++ want_crypto_rand="yes" ++else ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++#include ++ ++unsigned char buf[128]; ++ ++int main() ++{ ++ if (RAND_bytes(buf, 128) != 1) ++ return (1); ++ return (0); ++} ++ ++_ACEOF ++if ac_fn_c_try_run "$LINENO"; then : ++ want_crypto_rand="yes" ++else ++ want_crypto_rand="no" ++fi ++rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ ++ conftest.$ac_objext conftest.beam conftest.$ac_ext ++fi ++ ++ CFLAGS="$saved_cflags" ++ LIBS="$saved_libs" ++ ;; ++ *) ++ as_fn_error $? "Unknown crypto library define $CRYPTOLIB" "$LINENO" 5 ++ ;; ++ esac ++fi ++case $want_crypto_rand in ++ yes) ++ if test "$CRYPTOLIB" = "" ++ then ++ as_fn_error $? "No crypto library for random functions" "$LINENO" 5 ++ fi ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"$CRYPTOLIB\"" >&5 ++$as_echo "\"$CRYPTOLIB\"" >&6; } ++ ISC_PLATFORM_CRYPTORANDOM="#define ISC_PLATFORM_CRYPTORANDOM \"$CRYPTOLIB\"" ++ ;; ++ no) ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } ++ ISC_PLATFORM_CRYPTORANDOM="#undef ISC_PLATFORM_CRYPTORANDOM" ++ ;; ++esac ++ ++ + # + # was --with-lmdb specified? + # +@@ -20264,9 +20350,12 @@ _ACEOF + if ac_fn_c_try_compile "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: size_t for buflen; int for flags" >&5 + $as_echo "size_t for buflen; int for flags" >&6; } +- $as_echo "#define IRS_GETNAMEINFO_SOCKLEN_T size_t" >>confdefs.h ++ # Changed to solve multilib conflict on Fedora ++ # AC_DEFINE(IRS_GETNAMEINFO_SOCKLEN_T, size_t) ++ # AC_DEFINE(IRS_GETNAMEINFO_BUFLEN_T, size_t) ++ $as_echo "#define IRS_GETNAMEINFO_SOCKLEN_T socklen_t" >>confdefs.h + +- $as_echo "#define IRS_GETNAMEINFO_BUFLEN_T size_t" >>confdefs.h ++ $as_echo "#define IRS_GETNAMEINFO_BUFLEN_T socklen_t" >>confdefs.h + + $as_echo "#define IRS_GETNAMEINFO_FLAGS_T int" >>confdefs.h + +@@ -21581,12 +21670,7 @@ ISC_PLATFORM_USEGCCASM="#undef ISC_PLATFORM_USEGCCASM" + ISC_PLATFORM_USESTDASM="#undef ISC_PLATFORM_USESTDASM" + ISC_PLATFORM_USEMACASM="#undef ISC_PLATFORM_USEMACASM" + if test "yes" = "$use_atomic"; then +- have_atomic=yes # set default +- case "$host" in +- i[3456]86-*) +- # XXX: some old x86 architectures actually do not support +- # (some of) these operations. Do we need stricter checks? +- # The cast to long int works around a bug in the HP C Compiler ++ # The cast to long int works around a bug in the HP C Compiler + # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects + # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. + # This bug is HP SR number 8606223364. +@@ -21619,6 +21703,11 @@ cat >>confdefs.h <<_ACEOF + _ACEOF + + ++ have_atomic=yes # set default ++ case "$host" in ++ i[3456]86-*) ++ # XXX: some old x86 architectures actually do not support ++ # (some of) these operations. Do we need stricter checks? + if test $ac_cv_sizeof_void_p = 8; then + arch=x86_64 + have_xaddq=yes +@@ -21627,39 +21716,6 @@ _ACEOF + fi + ;; + x86_64-*|amd64-*) +- # The cast to long int works around a bug in the HP C Compiler +-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +-# This bug is HP SR number 8606223364. +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5 +-$as_echo_n "checking size of void *... " >&6; } +-if ${ac_cv_sizeof_void_p+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" "$ac_includes_default"; then : +- +-else +- if test "$ac_cv_type_void_p" = yes; then +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error 77 "cannot compute sizeof (void *) +-See \`config.log' for more details" "$LINENO" 5; } +- else +- ac_cv_sizeof_void_p=0 +- fi +-fi +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5 +-$as_echo "$ac_cv_sizeof_void_p" >&6; } +- +- +- +-cat >>confdefs.h <<_ACEOF +-#define SIZEOF_VOID_P $ac_cv_sizeof_void_p +-_ACEOF +- +- + if test $ac_cv_sizeof_void_p = 8; then + arch=x86_64 + have_xaddq=yes +@@ -21690,6 +21746,10 @@ $as_echo_n "checking architecture type for atomic operations... " >&6; } + $as_echo "$arch" >&6; } + fi + ++if test ! "$arch" = "x86_64" -a "$have_xaddq" = "yes"; then ++ as_fn_error $? "XADDQ present but disabled by Fedora patch!" "$LINENO" 5 ++fi ++ + if test "yes" = "$have_atomic"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking compiler support for inline assembly code" >&5 + $as_echo_n "checking compiler support for inline assembly code... " >&6; } +@@ -24244,6 +24304,30 @@ CFLAGS="$CFLAGS $SO_CFLAGS" + # + dlzdir='${DLZ_DRIVER_DIR}' + ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for target libdir" >&5 ++$as_echo_n "checking for target libdir... " >&6; } ++if test "$cross_compiling" = yes; then : ++ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++as_fn_error $? "cannot run test program while cross compiling ++See \`config.log' for more details" "$LINENO" 5; } ++else ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++int main(void) {exit((sizeof(void *) == 8) ? 0 : 1);} ++_ACEOF ++if ac_fn_c_try_run "$LINENO"; then : ++ target_lib=lib64 ++else ++ target_lib=lib ++fi ++rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ ++ conftest.$ac_objext conftest.beam conftest.$ac_ext ++fi ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: \"$target_lib\"" >&5 ++$as_echo "\"$target_lib\"" >&6; } ++ + # + # Private autoconf macro to simplify configuring drivers: + # +@@ -24574,11 +24658,11 @@ $as_echo "no" >&6; } + $as_echo "using mysql with libs ${mysql_lib} and includes ${mysql_include}" >&6; } + ;; + *) +- if test -d "$use_dlz_mysql/lib/mysql" ++ if test -d $use_dlz_mysql/${target_lib}/mysql + then +- mysql_lib="$use_dlz_mysql/lib/mysql" ++ mysql_lib=$use_dlz_mysql/${target_lib}/mysql + else +- mysql_lib="$use_dlz_mysql/lib" ++ mysql_lib=$use_dlz_mysql/${target_lib} + fi + + CONTRIB_DLZ="$CONTRIB_DLZ -DDLZ_MYSQL" +@@ -24663,7 +24747,7 @@ $as_echo "" >&6; } + # Check other locations for includes. + # Order is important (sigh). + +- bdb_incdirs="/db53 /db51 /db48 /db47 /db46 /db45 /db44 /db43 /db42 /db41 /db4 /db" ++ bdb_incdirs="/db53 /db51 /db48 /db47 /db46 /db45 /db44 /db43 /db42 /db41 /db4 /libdb /db" + # include a blank element first + for d in "" $bdb_incdirs + do +@@ -24688,57 +24772,9 @@ $as_echo "" >&6; } + bdb_libnames="db53 db-5.3 db51 db-5.1 db48 db-4.8 db47 db-4.7 db46 db-4.6 db45 db-4.5 db44 db-4.4 db43 db-4.3 db42 db-4.2 db41 db-4.1 db" + for d in $bdb_libnames + do +- if test "$dd" = "/usr" +- then +- as_ac_Lib=`$as_echo "ac_cv_lib_$d''_db_create" | $as_tr_sh` +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for db_create in -l$d" >&5 +-$as_echo_n "checking for db_create in -l$d... " >&6; } +-if eval \${$as_ac_Lib+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_check_lib_save_LIBS=$LIBS +-LIBS="-l$d $LIBS" +-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 db_create (); +-int +-main () +-{ +-return db_create (); +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- eval "$as_ac_Lib=yes" +-else +- eval "$as_ac_Lib=no" +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-LIBS=$ac_check_lib_save_LIBS +-fi +-eval ac_res=\$$as_ac_Lib +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +-$as_echo "$ac_res" >&6; } +-if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : +- dlz_bdb_libs="-l${d}" +-fi +- +- if test $dlz_bdb_libs != "yes" +- then +- break +- fi +- elif test -f "$dd/lib/lib${d}.so" ++ if test -f "$dd/${target_lib}/lib${d}.so" + then +- dlz_bdb_libs="-L${dd}/lib -l${d}" ++ dlz_bdb_libs="-L${dd}/${target_lib}/libdb -l${d}" + break + fi + done +@@ -24897,10 +24933,10 @@ $as_echo "no" >&6; } + DLZ_DRIVER_INCLUDES="$DLZ_DRIVER_INCLUDES -I$use_dlz_ldap/include" + DLZ_DRIVER_LDAP_INCLUDES="-I$use_dlz_ldap/include" + fi +- if test -n "-L$use_dlz_ldap/lib -lldap -llber" ++ if test -n "-L$use_dlz_ldap/${target_lib} -lldap -llber" + then +- DLZ_DRIVER_LIBS="$DLZ_DRIVER_LIBS -L$use_dlz_ldap/lib -lldap -llber" +- DLZ_DRIVER_LDAP_LIBS="-L$use_dlz_ldap/lib -lldap -llber" ++ DLZ_DRIVER_LIBS="$DLZ_DRIVER_LIBS -L$use_dlz_ldap/${target_lib} -lldap -llber" ++ DLZ_DRIVER_LDAP_LIBS="-L$use_dlz_ldap/${target_lib} -lldap -llber" + fi + + +@@ -24986,11 +25022,11 @@ fi + odbcdirs="/usr /usr/local /usr/pkg" + for d in $odbcdirs + do +- if test -f $d/include/sql.h -a -f $d/lib/libodbc.a ++ if test -f $d/include/sql.h -a -f $d/${target_lib}/libodbc.a + then + use_dlz_odbc=$d + dlz_odbc_include="-I$use_dlz_odbc/include" +- dlz_odbc_libs="-L$use_dlz_odbc/lib -lodbc" ++ dlz_odbc_libs="-L$use_dlz_odbc/${target_lib} -lodbc" + break + fi + done +@@ -25265,6 +25301,8 @@ DNS_CRYPTO_LIBS="$NEWFLAGS" + + + ++ ++ + # + # Commands to run at the end of config.status. + # Don't just put these into configure, it won't work right if somebody +@@ -27644,6 +27682,8 @@ report() { + echo " IPv6 support (--enable-ipv6)" + test "X$CRYPTO" = "X" -o "yes" = "$want_native_pkcs11" || \ + echo " OpenSSL cryptography/DNSSEC (--with-openssl)" ++ test "no" = "$want_crypto_rand" || \ ++ echo " Crypto provider entropy source (--enable-crypto-rand)" + test "X$PYTHON" = "X" || echo " Python tools (--with-python)" + test "X$XMLSTATS" = "X" || echo " XML statistics (--with-libxml2)" + test "X$JSONSTATS" = "X" || echo " JSON statistics (--with-libjson)" +@@ -27684,6 +27724,8 @@ report() { + echo " Very verbose query trace logging (--enable-querytrace)" + test "no" = "$with_cmocka" || echo " CMocka Unit Testing Framework (--with-cmocka)" + ++ echo " Cryptographic library for DNSSEC: $CRYPTOLIB" ++ + echo " Dynamically loadable zone (DLZ) drivers:" + test "no" = "$use_dlz_bdb" || \ + echo " Berkeley DB (--with-dlz-bdb)" +@@ -27731,6 +27773,8 @@ report() { + echo " ECDSA algorithm support (--with-ecdsa)" + test "X$CRYPTO" = "X" -o "yes" = "$OPENSSL_ED25519" -o "yes" = "$PKCS11_ED25519" || \ + echo " EDDSA algorithm support (--with-eddsa)" ++ test "yes" = "$want_crypto_rand" || \ ++ echo " Crypto provider entropy source (--enable-crypto-rand)" + + test "yes" = "$enable_seccomp" || \ + echo " Use libseccomp system call filtering (--enable-seccomp)" +diff --git a/configure.ac b/configure.ac +index 45a8126..bb1345b 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -1537,6 +1537,7 @@ case "$use_openssl" in + AC_MSG_RESULT(disabled because of native PKCS11) + DST_OPENSSL_INC="" + CRYPTO="-DPKCS11CRYPTO" ++ CRYPTOLIB="pkcs11" + OPENSSLECDSALINKOBJS="" + OPENSSLECDSALINKSRCS="" + OPENSSLEDDSALINKOBJS="" +@@ -1550,6 +1551,7 @@ case "$use_openssl" in + AC_MSG_RESULT(no) + DST_OPENSSL_INC="" + CRYPTO="" ++ CRYPTOLIB="" + OPENSSLECDSALINKOBJS="" + OPENSSLECDSALINKSRCS="" + OPENSSLEDDSALINKOBJS="" +@@ -1562,6 +1564,7 @@ case "$use_openssl" in + auto) + DST_OPENSSL_INC="" + CRYPTO="" ++ CRYPTOLIB="" + OPENSSLECDSALINKOBJS="" + OPENSSLECDSALINKSRCS="" + OPENSSLEDDSALINKOBJS="" +@@ -1572,7 +1575,7 @@ case "$use_openssl" in + OPENSSLLINKSRCS="" + AC_MSG_ERROR( + [OpenSSL was not found in any of $openssldirs; use --with-openssl=/path +-If you don't want OpenSSL, use --without-openssl]) ++If you do not want OpenSSL, use --without-openssl]) + ;; + *) + if test "yes" = "$want_native_pkcs11" +@@ -1602,6 +1605,7 @@ If you don't want OpenSSL, use --without-openssl]) + AC_MSG_ERROR(["$use_openssl/include/openssl/opensslv.h" not found]) + fi + CRYPTO='-DOPENSSL' ++ CRYPTOLIB="openssl" + if test "/usr" = "$use_openssl" + then + DST_OPENSSL_INC="" +@@ -2037,7 +2041,6 @@ fi + # Use OpenSSL for hash functions + # + +-AC_MSG_CHECKING(for using OpenSSL for hash functions) + ISC_PLATFORM_OPENSSLHASH="#undef ISC_PLATFORM_OPENSSLHASH" + case $want_openssl_hash in + yes) +@@ -2309,6 +2312,67 @@ if test "rt" = "$have_clock_gt"; then + LIBS="-lrt $LIBS" + fi + ++# ++# Use the crypto provider (OpenSSL/PKCS#11) for random functions ++# ++ ++AC_MSG_CHECKING(for using the crypto library (vs. builtin) for random functions) ++AC_ARG_ENABLE(crypto-rand, ++ [ --enable-crypto-rand use the crypto provider for random [[default=yes]]], ++ want_crypto_rand="$enableval", want_crypto_rand="auto") ++if test "$want_crypto_rand" = "auto" ++then ++ case "$CRYPTOLIB" in ++ "") ++ want_crypto_rand="no" ++ ;; ++ pkcs11) ++ want_crypto_rand="yes" ++ ;; ++ openssl) ++ saved_cflags="$CFLAGS" ++ saved_libs="$LIBS" ++ CFLAGS="$CFLAGS $DST_OPENSSL_INC" ++ LIBS="$LIBS $DST_OPENSSL_LIBS" ++ AC_TRY_RUN([ ++#include ++ ++unsigned char buf[128]; ++ ++int main() ++{ ++ if (RAND_bytes(buf, 128) != 1) ++ return (1); ++ return (0); ++} ++], ++ [want_crypto_rand="yes"], ++ [want_crypto_rand="no"], ++ [want_crypto_rand="yes"]) ++ CFLAGS="$saved_cflags" ++ LIBS="$saved_libs" ++ ;; ++ *) ++ AC_MSG_ERROR([Unknown crypto library define $CRYPTOLIB]) ++ ;; ++ esac ++fi ++case $want_crypto_rand in ++ yes) ++ if test "$CRYPTOLIB" = "" ++ then ++ AC_MSG_ERROR([No crypto library for random functions]) ++ fi ++ AC_MSG_RESULT(["$CRYPTOLIB"]) ++ ISC_PLATFORM_CRYPTORANDOM="#define ISC_PLATFORM_CRYPTORANDOM \"$CRYPTOLIB\"" ++ ;; ++ no) ++ AC_MSG_RESULT(no) ++ ISC_PLATFORM_CRYPTORANDOM="#undef ISC_PLATFORM_CRYPTORANDOM" ++ ;; ++esac ++AC_SUBST(ISC_PLATFORM_CRYPTORANDOM) ++ + # + # was --with-lmdb specified? + # +@@ -4105,12 +4169,12 @@ ISC_PLATFORM_USEGCCASM="#undef ISC_PLATFORM_USEGCCASM" + ISC_PLATFORM_USESTDASM="#undef ISC_PLATFORM_USESTDASM" + ISC_PLATFORM_USEMACASM="#undef ISC_PLATFORM_USEMACASM" + if test "yes" = "$use_atomic"; then ++ AC_CHECK_SIZEOF([void *]) + have_atomic=yes # set default + case "$host" in + [i[3456]86-*]) + # XXX: some old x86 architectures actually do not support + # (some of) these operations. Do we need stricter checks? +- AC_CHECK_SIZEOF([void *]) + if test $ac_cv_sizeof_void_p = 8; then + arch=x86_64 + have_xaddq=yes +@@ -4119,7 +4183,6 @@ if test "yes" = "$use_atomic"; then + fi + ;; + x86_64-*|amd64-*) +- AC_CHECK_SIZEOF([void *]) + if test $ac_cv_sizeof_void_p = 8; then + arch=x86_64 + have_xaddq=yes +@@ -5527,6 +5590,8 @@ report() { + echo " IPv6 support (--enable-ipv6)" + test "X$CRYPTO" = "X" -o "yes" = "$want_native_pkcs11" || \ + echo " OpenSSL cryptography/DNSSEC (--with-openssl)" ++ test "no" = "$want_crypto_rand" || \ ++ echo " Crypto provider entropy source (--enable-crypto-rand)" + test "X$PYTHON" = "X" || echo " Python tools (--with-python)" + test "X$XMLSTATS" = "X" || echo " XML statistics (--with-libxml2)" + test "X$JSONSTATS" = "X" || echo " JSON statistics (--with-libjson)" +@@ -5567,6 +5632,8 @@ report() { + echo " Very verbose query trace logging (--enable-querytrace)" + test "no" = "$with_cmocka" || echo " CMocka Unit Testing Framework (--with-cmocka)" + ++ echo " Cryptographic library for DNSSEC: $CRYPTOLIB" ++ + echo " Dynamically loadable zone (DLZ) drivers:" + test "no" = "$use_dlz_bdb" || \ + echo " Berkeley DB (--with-dlz-bdb)" +@@ -5614,6 +5681,8 @@ report() { + echo " ECDSA algorithm support (--with-ecdsa)" + test "X$CRYPTO" = "X" -o "yes" = "$OPENSSL_ED25519" -o "yes" = "$PKCS11_ED25519" || \ + echo " EDDSA algorithm support (--with-eddsa)" ++ test "yes" = "$want_crypto_rand" || \ ++ echo " Crypto provider entropy source (--enable-crypto-rand)" + + test "yes" = "$enable_seccomp" || \ + echo " Use libseccomp system call filtering (--enable-seccomp)" +diff --git a/lib/dns/dst_api.c b/lib/dns/dst_api.c +index ec6e00e..1614afa 100644 +--- a/lib/dns/dst_api.c ++++ b/lib/dns/dst_api.c +@@ -277,6 +277,12 @@ dst_lib_init2(isc_mem_t *mctx, isc_entropy_t *ectx, + #ifdef GSSAPI + RETERR(dst__gssapi_init(&dst_t_func[DST_ALG_GSSAPI])); + #endif ++#if defined(OPENSSL) || defined(PKCS11CRYPTO) ++#ifdef ISC_PLATFORM_CRYPTORANDOM ++ if (dst_entropy_pool != NULL) ++ isc_entropy_sethook(dst_random_getdata); ++#endif ++#endif /* defined(OPENSSL) || defined(PKCS11CRYPTO) */ + dst_initialized = true; + return (ISC_R_SUCCESS); + +@@ -296,11 +302,19 @@ dst_lib_destroy(void) { + for (i = 0; i < DST_MAX_ALGS; i++) + if (dst_t_func[i] != NULL && dst_t_func[i]->cleanup != NULL) + dst_t_func[i]->cleanup(); ++#if defined(OPENSSL) || defined(PKCS11CRYPTO) ++#ifdef ISC_PLATFORM_CRYPTORANDOM ++ if (dst_entropy_pool != NULL) { ++ isc_entropy_usehook(dst_entropy_pool, false); ++ isc_entropy_sethook(NULL); ++ } ++#endif + #ifdef OPENSSL + dst__openssl_destroy(); + #elif PKCS11CRYPTO + (void) dst__pkcs11_destroy(); + #endif /* if OPENSSL, elif PKCS11CRYPTO */ ++#endif /* defined(OPENSSL) || defined(PKCS11CRYPTO) */ + if (dst__memory_pool != NULL) + isc_mem_detach(&dst__memory_pool); + if (dst_entropy_pool != NULL) +@@ -2002,13 +2016,17 @@ dst__entropy_getdata(void *buf, unsigned int len, bool pseudo) { + flags &= ~ISC_ENTROPY_GOODONLY; + else + flags |= ISC_ENTROPY_BLOCKING; ++#ifdef ISC_PLATFORM_CRYPTORANDOM ++ return (dst_random_getdata(buf, len, NULL, flags)); ++#else + return (isc_entropy_getdata(dst_entropy_pool, buf, len, NULL, flags)); ++#endif + #endif /* PKCS11CRYPTO */ + } + + unsigned int + dst__entropy_status(void) { +-#ifndef PKCS11CRYPTO ++#if !defined(PKCS11CRYPTO) && !defined(ISC_PLATFORM_CRYPTORANDOM) + #ifdef GSSAPI + unsigned int flags = dst_entropy_flags; + isc_result_t ret; +@@ -2031,6 +2049,7 @@ dst__entropy_status(void) { + #endif + return (isc_entropy_status(dst_entropy_pool)); + #else ++ /* Doesn't matter as it is not used in this case. */ + return (0); + #endif + } +diff --git a/lib/dns/include/dst/dst.h b/lib/dns/include/dst/dst.h +index 1924e74..6813c96 100644 +--- a/lib/dns/include/dst/dst.h ++++ b/lib/dns/include/dst/dst.h +@@ -159,6 +159,14 @@ dst_lib_destroy(void); + * Releases all resources allocated by DST. + */ + ++isc_result_t ++dst_random_getdata(void *data, unsigned int length, ++ unsigned int *returned, unsigned int flags); ++/*%< ++ * \brief Return data from the crypto random generator. ++ * Specialization of isc_entropy_getdata(). ++ */ ++ + bool + dst_algorithm_supported(unsigned int alg); + /*%< +diff --git a/lib/dns/lib.c b/lib/dns/lib.c +index 304814b..60543c4 100644 +--- a/lib/dns/lib.c ++++ b/lib/dns/lib.c +@@ -18,6 +18,7 @@ + #include + #include + ++#include + #include + #include + #include +@@ -78,6 +79,7 @@ static unsigned int references = 0; + static void + initialize(void) { + isc_result_t result; ++ isc_entropy_t *ectx = NULL; + + REQUIRE(initialize_done == false); + +@@ -88,11 +90,14 @@ initialize(void) { + result = dns_ecdb_register(dns_g_mctx, &dbimp); + if (result != ISC_R_SUCCESS) + goto cleanup_mctx; +- result = isc_hash_create(dns_g_mctx, NULL, DNS_NAME_MAXWIRE); ++ result = isc_entropy_create(dns_g_mctx, &ectx); + if (result != ISC_R_SUCCESS) + goto cleanup_db; ++ result = isc_hash_create(dns_g_mctx, NULL, DNS_NAME_MAXWIRE); ++ if (result != ISC_R_SUCCESS) ++ goto cleanup_ectx; + +- result = dst_lib_init(dns_g_mctx, NULL, 0); ++ result = dst_lib_init(dns_g_mctx, ectx, 0); + if (result != ISC_R_SUCCESS) + goto cleanup_hash; + +@@ -100,11 +105,17 @@ initialize(void) { + if (result != ISC_R_SUCCESS) + goto cleanup_dst; + ++ isc_hash_init(); ++ isc_entropy_detach(&ectx); ++ + initialize_done = true; + return; + + cleanup_dst: + dst_lib_destroy(); ++ cleanup_ectx: ++ if (ectx != NULL) ++ isc_entropy_detach(&ectx); + cleanup_hash: + isc_hash_destroy(); + cleanup_db: +diff --git a/lib/dns/openssl_link.c b/lib/dns/openssl_link.c +index d65ce26..6849732 100644 +--- a/lib/dns/openssl_link.c ++++ b/lib/dns/openssl_link.c +@@ -31,6 +31,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -46,8 +47,6 @@ + #include + #endif + +-static RAND_METHOD *rm = NULL; +- + #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER) + static isc_mutex_t *locks = NULL; + static int nlocks; +@@ -57,6 +56,9 @@ static int nlocks; + static ENGINE *e = NULL; + #endif + ++#ifndef ISC_PLATFORM_CRYPTORANDOM ++static RAND_METHOD *rm = NULL; ++ + static int + entropy_get(unsigned char *buf, int num) { + isc_result_t result; +@@ -102,6 +104,7 @@ entropy_add(const void *buf, int num, double entropy) { + return (1); + } + #endif ++#endif /* !ISC_PLATFORM_CRYPTORANDOM */ + + #if OPENSSL_VERSION_NUMBER >= 0x10000000L && OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER) + static void +@@ -192,7 +195,7 @@ _set_thread_id(CRYPTO_THREADID *id) + isc_result_t + dst__openssl_init(const char *engine) { + isc_result_t result; +-#if !defined(OPENSSL_NO_ENGINE) ++#if !defined(OPENSSL_NO_ENGINE) && !defined(ISC_PLATFORM_CRYPTORANDOM) + ENGINE *re; + #else + UNUSED(engine); +@@ -222,6 +225,7 @@ dst__openssl_init(const char *engine) { + ERR_load_crypto_strings(); + #endif + ++#ifndef ISC_PLATFORM_CRYPTORANDOM + rm = mem_alloc(sizeof(RAND_METHOD) FILELINE); + if (rm == NULL) { + result = ISC_R_NOMEMORY; +@@ -233,6 +237,7 @@ dst__openssl_init(const char *engine) { + rm->add = entropy_add; + rm->pseudorand = entropy_getpseudo; + rm->status = entropy_status; ++#endif + + #if !defined(OPENSSL_NO_ENGINE) + #if !defined(CONF_MFLAGS_DEFAULT_SECTION) +@@ -266,6 +271,7 @@ dst__openssl_init(const char *engine) { + } + } + ++#ifndef ISC_PLATFORM_CRYPTORANDOM + re = ENGINE_get_default_RAND(); + if (re == NULL) { + re = ENGINE_new(); +@@ -278,9 +284,21 @@ dst__openssl_init(const char *engine) { + ENGINE_free(re); + } else + ENGINE_finish(re); ++#endif + #else ++#ifndef ISC_PLATFORM_CRYPTORANDOM + RAND_set_rand_method(rm); ++#endif + #endif /* !defined(OPENSSL_NO_ENGINE) */ ++ ++ /* Protect ourselves against unseeded PRNG */ ++ if (RAND_status() != 1) { ++ FATAL_ERROR(__FILE__, __LINE__, ++ "OpenSSL pseudorandom number generator " ++ "cannot be initialized (see the `PRNG not " ++ "seeded' message in the OpenSSL FAQ)"); ++ } ++ + return (ISC_R_SUCCESS); + + #if !defined(OPENSSL_NO_ENGINE) +@@ -288,10 +306,14 @@ dst__openssl_init(const char *engine) { + if (e != NULL) + ENGINE_free(e); + e = NULL; ++#ifndef ISC_PLATFORM_CRYPTORANDOM + mem_free(rm FILELINE); + rm = NULL; + #endif ++#endif ++#ifndef ISC_PLATFORM_CRYPTORANDOM + cleanup_mutexinit: ++#endif + #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER) + CRYPTO_set_locking_callback(NULL); + DESTROYMUTEXBLOCK(locks, nlocks); +@@ -306,14 +328,17 @@ void + dst__openssl_destroy(void) { + #if !defined(LIBRESSL_VERSION_NUMBER) && (OPENSSL_VERSION_NUMBER >= 0x10100000L) + OPENSSL_cleanup(); ++#ifndef ISC_PLATFORM_CRYPTORANDOM + if (rm != NULL) { + mem_free(rm FILELINE); + rm = NULL; + } ++#endif + #else + /* + * Sequence taken from apps_shutdown() in . + */ ++#ifndef ISC_PLATFORM_CRYPTORANDOM + if (rm != NULL) { + #if OPENSSL_VERSION_NUMBER >= 0x00907000L + RAND_cleanup(); +@@ -321,6 +346,7 @@ dst__openssl_destroy(void) { + mem_free(rm FILELINE); + rm = NULL; + } ++#endif + #if (OPENSSL_VERSION_NUMBER >= 0x00907000L) + CONF_modules_free(); + #endif +@@ -456,11 +482,45 @@ dst__openssl_getengine(const char *engine) { + } + #endif + +-#else /* OPENSSL */ ++isc_result_t ++dst_random_getdata(void *data, unsigned int length, ++ unsigned int *returned, unsigned int flags) { ++#ifdef ISC_PLATFORM_CRYPTORANDOM ++#ifndef DONT_REQUIRE_DST_LIB_INIT ++ INSIST(dst__memory_pool != NULL); ++#endif ++ REQUIRE(data != NULL); ++ REQUIRE(length > 0); + +-#include ++#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER) ++ if ((flags & ISC_ENTROPY_GOODONLY) == 0) { ++ if (RAND_pseudo_bytes((unsigned char *)data, (int)length) < 0) ++ return (dst__openssl_toresult2("RAND_pseudo_bytes", ++ DST_R_OPENSSLFAILURE)); ++ } else { ++ if (RAND_bytes((unsigned char *)data, (int)length) != 1) ++ return (dst__openssl_toresult2("RAND_bytes", ++ DST_R_OPENSSLFAILURE)); ++ } ++#else ++ UNUSED(flags); + +-EMPTY_TRANSLATION_UNIT ++ if (RAND_bytes((unsigned char *)data, (int)length) != 1) ++ return (dst__openssl_toresult2("RAND_bytes", ++ DST_R_OPENSSLFAILURE)); ++#endif ++ if (returned != NULL) ++ *returned = length; ++ return (ISC_R_SUCCESS); ++#else ++ UNUSED(data); ++ UNUSED(length); ++ UNUSED(returned); ++ UNUSED(flags); ++ ++ return (ISC_R_NOTIMPLEMENTED); ++#endif ++} + + #endif /* OPENSSL */ + /*! \file */ +diff --git a/lib/dns/pkcs11.c b/lib/dns/pkcs11.c +index 5a2c502..8eaef53 100644 +--- a/lib/dns/pkcs11.c ++++ b/lib/dns/pkcs11.c +@@ -13,12 +13,15 @@ + + #include + ++#include ++ + #include + #include + + #include + #include + ++#include "dst_internal.h" + #include "dst_pkcs11.h" + + isc_result_t +@@ -34,12 +37,32 @@ dst__pkcs11_toresult(const char *funcname, const char *file, int line, + return (fallback); + } + ++isc_result_t ++dst_random_getdata(void *data, unsigned int length, ++ unsigned int *returned, unsigned int flags) { ++#ifdef ISC_PLATFORM_CRYPTORANDOM ++ isc_result_t ret; + +-#else /* PKCS11CRYPTO */ ++#ifndef DONT_REQUIRE_DST_LIB_INIT ++ INSIST(dst__memory_pool != NULL); ++#endif ++ REQUIRE(data != NULL); ++ REQUIRE(length > 0); ++ UNUSED(flags); + +-#include ++ ret = pk11_rand_bytes(data, (int) length); ++ if ((ret == ISC_R_SUCCESS) && (returned != NULL)) ++ *returned = length; ++ return (ret); ++#else ++ UNUSED(data); ++ UNUSED(length); ++ UNUSED(returned); ++ UNUSED(flags); + +-EMPTY_TRANSLATION_UNIT ++ return (ISC_R_NOTIMPLEMENTED); ++#endif ++} + + #endif /* PKCS11CRYPTO */ + /*! \file */ +diff --git a/lib/dns/tests/Kyuafile b/lib/dns/tests/Kyuafile +index 937b548..f3c0e38 100644 +--- a/lib/dns/tests/Kyuafile ++++ b/lib/dns/tests/Kyuafile +@@ -10,6 +10,7 @@ tap_test_program{name='dh_test'} + tap_test_program{name='dispatch_test'} + tap_test_program{name='dnstap_test'} + tap_test_program{name='dst_test'} ++tap_test_program{name='dstrandom_test'} + tap_test_program{name='geoip_test'} + tap_test_program{name='gost_test'} + tap_test_program{name='keytable_test'} +diff --git a/lib/dns/tests/Makefile.in b/lib/dns/tests/Makefile.in +index 90dc3a6..7671e1d 100644 +--- a/lib/dns/tests/Makefile.in ++++ b/lib/dns/tests/Makefile.in +@@ -37,6 +37,7 @@ SRCS = acl_test.c \ + dnstap_test.c \ + dst_test.c \ + dnstest.c \ ++ dstrandom_test.c \ + geoip_test.c \ + gost_test.c \ + keytable_test.c \ +@@ -69,6 +70,7 @@ TARGETS = acl_test@EXEEXT@ \ + dh_test@EXEEXT@ \ + dispatch_test@EXEEXT@ \ + dnstap_test@EXEEXT@ \ ++ dstrandom_test@EXEEXT@ \ + dst_test@EXEEXT@ \ + geoip_test@EXEEXT@ \ + gost_test@EXEEXT@ \ +@@ -258,6 +260,11 @@ zt_test@EXEEXT@: zt_test.@O@ dnstest.@O@ ${ISCDEPLIBS} ${DNSDEPLIBS} + ${LDFLAGS} -o $@ zt_test.@O@ dnstest.@O@ \ + ${DNSLIBS} ${ISCLIBS} ${LIBS} + ++dstrandom_test@EXEEXT@: dstrandom_test.@O@ ${ISCDEPLIBS} ${DNSDEPLIBS} ++ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \ ++ dstrandom_test.@O@ ${DNSLIBS} \ ++ ${ISCLIBS} ${ISCPK11LIBS} ${LIBS} ++ + unit:: + sh ${top_builddir}/unit/unittest.sh + +diff --git a/lib/dns/tests/dstrandom_test.c b/lib/dns/tests/dstrandom_test.c +new file mode 100644 +index 0000000..bd3d164 +--- /dev/null ++++ b/lib/dns/tests/dstrandom_test.c +@@ -0,0 +1,115 @@ ++/* ++ * Copyright (C) Internet Systems Consortium, Inc. ("ISC") ++ * ++ * This Source Code Form is subject to the terms of the Mozilla Public ++ * License, v. 2.0. If a copy of the MPL was not distributed with this ++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. ++ * ++ * See the COPYRIGHT file distributed with this work for additional ++ * information regarding copyright ownership. ++ */ ++ ++#include ++ ++#if HAVE_CMOCKA ++ ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++ ++#define UNIT_TESTING ++#include ++ ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++isc_mem_t *mctx = NULL; ++isc_entropy_t *ectx = NULL; ++unsigned char buffer[128]; ++ ++/* isc_entropy_getdata() examples */ ++static void ++isc_entropy_getdata_test(void **state) { ++ isc_result_t result; ++ unsigned int returned, status; ++ const char *randomfile = "testdata/dstrandom/random.data"; ++ int ret; ++ ++ UNUSED(state); ++ ++ isc_mem_debugging |= ISC_MEM_DEBUGRECORD; ++ result = isc_mem_create(0, 0, &mctx); ++ assert_int_equal(result, ISC_R_SUCCESS); ++ result = isc_entropy_create(mctx, &ectx); ++ assert_int_equal(result, ISC_R_SUCCESS); ++ result = dst_lib_init(mctx, ectx, 0); ++ assert_int_equal(result, ISC_R_SUCCESS); ++ ++#ifdef ISC_PLATFORM_CRYPTORANDOM ++ isc_entropy_usehook(ectx, true); ++ ++ returned = 0; ++ result = isc_entropy_getdata(ectx, buffer, sizeof(buffer), ++ &returned, 0); ++ assert_int_equal(result, ISC_R_SUCCESS); ++ assert_int_equal(returned, sizeof(buffer)); ++ ++ status = isc_entropy_status(ectx); ++ assert_int_equal(status, 0); ++ ++ isc_entropy_usehook(ectx, false); ++#endif ++ ++ ret = chdir(TESTS); ++ assert_int_equal(ret, 0); ++ ++ result = isc_entropy_createfilesource(ectx, randomfile); ++ assert_int_equal(result, ISC_R_SUCCESS); ++ ++ returned = 0; ++ result = isc_entropy_getdata(ectx, buffer, sizeof(buffer), ++ &returned, 0); ++ assert_int_equal(result, ISC_R_SUCCESS); ++ assert_int_equal(returned, sizeof(buffer)); ++ ++ status = isc_entropy_status(ectx); ++ assert_true(status > 0); ++ ++ dst_lib_destroy(); ++ isc_entropy_detach(&ectx); ++ assert_null(ectx); ++ ++ isc_mem_destroy(&mctx); ++ assert_null(mctx); ++} ++ ++int ++main(void) { ++ const struct CMUnitTest tests[] = { ++ cmocka_unit_test(isc_entropy_getdata_test), ++ }; ++ ++ return (cmocka_run_group_tests(tests, NULL, NULL)); ++} ++ ++#else /* HAVE_CMOCKA */ ++ ++#include ++ ++int ++main(void) { ++ printf("1..0 # Skipped: cmocka not available\n"); ++ return (0); ++} ++ ++#endif +diff --git a/lib/dns/win32/libdns.def.in b/lib/dns/win32/libdns.def.in +index 5c45d59..34b660c 100644 +--- a/lib/dns/win32/libdns.def.in ++++ b/lib/dns/win32/libdns.def.in +@@ -1484,6 +1484,13 @@ dst_lib_destroy + dst_lib_init + dst_lib_init2 + dst_lib_initmsgcat ++@IF PKCS11 ++dst_random_getdata ++@ELSE PKCS11 ++@IF OPENSSL ++dst_random_getdata ++@END OPENSSL ++@END PKCS11 + dst_region_computeid + dst_region_computerid + dst_result_register +diff --git a/lib/isc/entropy.c b/lib/isc/entropy.c +index ab2f617..ed05ed6 100644 +--- a/lib/isc/entropy.c ++++ b/lib/isc/entropy.c +@@ -104,11 +104,15 @@ struct isc_entropy { + uint32_t initialized; + uint32_t initcount; + isc_entropypool_t pool; ++ bool usehook; + unsigned int nsources; + isc_entropysource_t *nextsource; + ISC_LIST(isc_entropysource_t) sources; + }; + ++/*% Global Hook */ ++static isc_entropy_getdata_t hook; ++ + /*% Sample Queue */ + typedef struct { + uint32_t last_time; /*%< last time recorded */ +@@ -557,6 +561,11 @@ isc_entropy_getdata(isc_entropy_t *ent, void *data, unsigned int length, + + LOCK(&ent->lock); + ++ if (ent->usehook && (hook != NULL)) { ++ UNLOCK(&ent->lock); ++ return (hook(data, length, returned, flags)); ++ } ++ + remain = length; + buf = data; + total = 0; +@@ -708,6 +717,7 @@ isc_entropy_create(isc_mem_t *mctx, isc_entropy_t **entp) { + ent->refcnt = 1; + ent->initialized = 0; + ent->initcount = 0; ++ ent->usehook = false; + ent->magic = ENTROPY_MAGIC; + + isc_entropypool_init(&ent->pool); +@@ -1286,3 +1296,17 @@ isc_entropy_usebestsource(isc_entropy_t *ectx, isc_entropysource_t **source, + */ + return (final_result); + } ++ ++void ++isc_entropy_usehook(isc_entropy_t *ectx, bool onoff) { ++ REQUIRE(VALID_ENTROPY(ectx)); ++ ++ LOCK(&ectx->lock); ++ ectx->usehook = onoff; ++ UNLOCK(&ectx->lock); ++} ++ ++void ++isc_entropy_sethook(isc_entropy_getdata_t myhook) { ++ hook = myhook; ++} +diff --git a/lib/isc/include/isc/entropy.h b/lib/isc/include/isc/entropy.h +index 4bba8e1..632166a 100644 +--- a/lib/isc/include/isc/entropy.h ++++ b/lib/isc/include/isc/entropy.h +@@ -304,6 +304,18 @@ isc_entropy_usebestsource(isc_entropy_t *ectx, isc_entropysource_t **source, + * isc_entropy_createcallbacksource(). + */ + ++void ++isc_entropy_usehook(isc_entropy_t *ectx, bool onoff); ++/*!< ++ * \brief Mark/unmark the given entropy structure as being hooked. ++ */ ++ ++void ++isc_entropy_sethook(isc_entropy_getdata_t myhook); ++/*!< ++ * \brief Set the getdata hook (e.g., for a crypto random generator). ++ */ ++ + ISC_LANG_ENDDECLS + + #endif /* ISC_ENTROPY_H */ +diff --git a/lib/isc/include/isc/platform.h.in b/lib/isc/include/isc/platform.h.in +index 9c7c342..ee8dc3e 100644 +--- a/lib/isc/include/isc/platform.h.in ++++ b/lib/isc/include/isc/platform.h.in +@@ -341,6 +341,11 @@ + */ + @ISC_PLATFORM_HAVESTRINGSH@ + ++/* ++ * Define if the random functions are provided by crypto. ++ */ ++@ISC_PLATFORM_CRYPTORANDOM@ ++ + /* + * Define if the hash functions must be provided by OpenSSL. + */ +diff --git a/lib/isc/include/isc/types.h b/lib/isc/include/isc/types.h +index 42ff7e0..8d87c44 100644 +--- a/lib/isc/include/isc/types.h ++++ b/lib/isc/include/isc/types.h +@@ -93,6 +93,8 @@ typedef struct isc_time isc_time_t; /*%< Time */ + typedef struct isc_timer isc_timer_t; /*%< Timer */ + typedef struct isc_timermgr isc_timermgr_t; /*%< Timer Manager */ + ++typedef isc_result_t (*isc_entropy_getdata_t)(void *, unsigned int, ++ unsigned int *, unsigned int); + typedef void (*isc_taskaction_t)(isc_task_t *, isc_event_t *); + typedef int (*isc_sockfdwatch_t)(isc_task_t *, isc_socket_t *, void *, int); + +diff --git a/lib/isc/pk11.c b/lib/isc/pk11.c +index 8e6ed93..ceb5a2c 100644 +--- a/lib/isc/pk11.c ++++ b/lib/isc/pk11.c +@@ -321,14 +321,16 @@ pk11_rand_seed_fromfile(const char *randomfile) { + ret = isc_stdio_open(randomfile, "r", &stream); + if (ret != ISC_R_SUCCESS) + goto cleanup; +- ret = isc_stdio_read(seed, 1, SEEDSIZE, stream, &cc); +- if (ret!= ISC_R_SUCCESS) +- goto cleanup; ++ while (ret == ISC_R_SUCCESS) { ++ ret = isc_stdio_read(seed, 1, SEEDSIZE, stream, &cc); ++ if ((ret != ISC_R_SUCCESS) && (ret != ISC_R_EOF)) ++ goto cleanup; ++ (void) pkcs_C_SeedRandom(ctx.session, seed, (CK_ULONG) cc); ++ } + ret = isc_stdio_close(stream); + stream = NULL; +- if (ret!= ISC_R_SUCCESS) ++ if (ret != ISC_R_SUCCESS) + goto cleanup; +- (void) pkcs_C_SeedRandom(ctx.session, seed, (CK_ULONG) cc); + + cleanup: + if (stream != NULL) +diff --git a/lib/isc/win32/include/isc/platform.h.in b/lib/isc/win32/include/isc/platform.h.in +index 5b8a2c9..913a2ce 100644 +--- a/lib/isc/win32/include/isc/platform.h.in ++++ b/lib/isc/win32/include/isc/platform.h.in +@@ -69,6 +69,11 @@ + #define ISC_PLATFORM_NORETURN_PRE __declspec(noreturn) + #define ISC_PLATFORM_NORETURN_POST + ++/* ++ * Define if the random functions are provided by crypto. ++ */ ++@ISC_PLATFORM_CRYPTORANDOM@ ++ + /* + * Define if the hash functions must be provided by OpenSSL. + */ +diff --git a/win32utils/Configure b/win32utils/Configure +index ccaf067..240fb80 100644 +--- a/win32utils/Configure ++++ b/win32utils/Configure +@@ -382,6 +382,7 @@ my @substdefh = ("ALLOW_FILTER_AAAA", + my %configdefp; + + my @substdefp = ("ISC_PLATFORM_BUSYWAITNOP", ++ "ISC_PLATFORM_CRYPTORANDOM", + "ISC_PLATFORM_HAVEATOMICSTORE", + "ISC_PLATFORM_HAVEATOMICSTOREQ", + "ISC_PLATFORM_HAVECMPXCHG", +@@ -517,7 +518,8 @@ my @allcond = (@substcond, "NOTYET", "NOLONGER"); + + # enable-xxx/disable-xxx + +-my @enablelist = ("developer", ++my @enablelist = ("crypto-rand", ++ "developer", + "fixed-rrset", + "intrinsics", + "isc-spnego", +@@ -581,6 +583,7 @@ my @help = ( + "\nOptional Features:\n", + " enable-intrinsics enable instrinsic/atomic functions [default=yes]\n", + " enable-native-pkcs11 use native PKCS#11 for all crypto [default=no]\n", ++" enable-crypto-rand use crypto provider for random [default=yes]\n", + " enable-openssl-hash use OpenSSL for hash functions [default=yes]\n", + " enable-isc-spnego use SPNEGO from lib/dns [default=yes]\n", + " enable-filter-aaaa enable filtering of AAAA records [default=yes]\n", +@@ -630,7 +633,9 @@ my $want_clean = "no"; + my $want_unknown = "no"; + my $unknown_value; + my $enable_intrinsics = "yes"; ++my $cryptolib = ""; + my $enable_native_pkcs11 = "no"; ++my $enable_crypto_rand = "yes"; + my $enable_openssl_hash = "auto"; + my $enable_filter_aaaa = "yes"; + my $enable_isc_spnego = "yes"; +@@ -850,6 +855,10 @@ sub myenable { + if ($val =~ /^yes$/i) { + $enable_native_pkcs11 = "yes"; + } ++ } elsif ($key =~ /^crypto-rand$/i) { ++ if ($val =~ /^no$/i) { ++ $enable_crypto_rand = "no"; ++ } + } elsif ($key =~ /^openssl-hash$/i) { + if ($val =~ /^yes$/i) { + $enable_openssl_hash = "yes"; +@@ -1158,6 +1167,11 @@ if ($verbose) { + } else { + print "native-pkcs11: disabled\n"; + } ++ if ($enable_crypto_rand eq "yes") { ++ print "crypto-rand: enabled\n"; ++ } else { ++ print "crypto-rand: disabled\n"; ++ } + if ($enable_openssl_hash eq "yes") { + print "openssl-hash: enabled\n"; + } else { +@@ -1516,6 +1530,7 @@ if ($enable_intrinsics eq "yes") { + + # enable-native-pkcs11 + if ($enable_native_pkcs11 eq "yes") { ++ $cryptolib = "pkcs11"; + if ($use_openssl eq "auto") { + $use_openssl = "no"; + } +@@ -1725,6 +1740,7 @@ if ($use_openssl eq "yes") { + $openssl_dll = File::Spec->catdir($openssl_path, "@dirlist[0]"); + } + ++ $cryptolib = "openssl"; + $configcond{"OPENSSL"} = 1; + $configdefd{"CRYPTO"} = "OPENSSL"; + $configvar{"OPENSSL_PATH"} = "$openssl_path"; +@@ -2296,6 +2312,15 @@ if ($use_aes eq "yes") { + } + + ++# enable-crypto-rand ++if ($enable_crypto_rand eq "yes") { ++ if (($use_openssl eq "no") && ($enable_native_pkcs11 eq "no")) { ++ die "No crypto provider for random functions\n"; ++ } ++ $configdefp{"ISC_PLATFORM_CRYPTORANDOM"} = "\"$cryptolib\""; ++} ++print "Cryptographic library for DNSSEC: $cryptolib"; ++ + # enable-openssl-hash + if ($enable_openssl_hash eq "yes") { + if ($use_openssl eq "no") { +@@ -3671,6 +3696,7 @@ exit 0; + # --enable-developer partially supported + # --enable-newstats (9.9/9.9sub only) + # --enable-native-pkcs11 supported ++# --enable-crypto-rand supported + # --enable-openssl-version-check included without a way to disable it + # --enable-openssl-hash supported + # --enable-threads included without a way to disable it +-- +2.20.1 + diff --git a/SOURCES/bind-9.11-rt46047.patch b/SOURCES/bind-9.11-rt46047.patch new file mode 100644 index 0000000..8f413f6 --- /dev/null +++ b/SOURCES/bind-9.11-rt46047.patch @@ -0,0 +1,799 @@ +From 5a465424f5249ceaf0547ab90361a16eb08f7a2b Mon Sep 17 00:00:00 2001 +From: Evan Hunt +Date: Thu, 28 Sep 2017 10:09:22 -0700 +Subject: [PATCH] completed and corrected the crypto-random change + +4724. [func] By default, BIND now uses the random number + functions provided by the crypto library (i.e., + OpenSSL or a PKCS#11 provider) as a source of + randomness rather than /dev/random. This is + suitable for virtual machine environments + which have limited entropy pools and lack + hardware random number generators. + + This can be overridden by specifying another + entropy source via the "random-device" option + in named.conf, or via the -r command line option; + however, for functions requiring full cryptographic + strength, such as DNSSEC key generation, this + cannot be overridden. In particular, the -r + command line option no longer has any effect on + dnssec-keygen. + + This can be disabled by building with + "configure --disable-crypto-rand". + [RT #31459] [RT #46047] +--- + bin/confgen/keygen.c | 12 +++--- + bin/dnssec/dnssec-keygen.docbook | 24 +++++++---- + bin/dnssec/dnssectool.c | 12 +++--- + bin/named/client.c | 3 +- + bin/named/config.c | 4 +- + bin/named/controlconf.c | 19 +++++--- + bin/named/include/named/server.h | 2 + + bin/named/interfacemgr.c | 1 + + bin/named/query.c | 1 + + bin/named/server.c | 52 ++++++++++++++-------- + bin/nsupdate/nsupdate.c | 4 +- + bin/tests/system/pipelined/pipequeries.c | 4 +- + bin/tests/system/tkey/keycreate.c | 4 +- + bin/tests/system/tkey/keydelete.c | 5 +-- + doc/arm/Bv9ARM-book.xml | 55 +++++++++++++++++------- + doc/arm/notes-rh-changes.xml | 43 ++++++++++++++++++ + doc/arm/notes.xml | 1 + + lib/dns/dst_api.c | 4 +- + lib/dns/include/dst/dst.h | 14 +++++- + lib/dns/openssl_link.c | 3 +- + lib/isc/include/isc/entropy.h | 50 +++++++++++++++------ + lib/isc/include/isc/random.h | 28 +++++++----- + lib/isccfg/namedconf.c | 2 +- + 23 files changed, 241 insertions(+), 106 deletions(-) + create mode 100644 doc/arm/notes-rh-changes.xml + +diff --git a/bin/confgen/keygen.c b/bin/confgen/keygen.c +index 295e16f..0f79aa8 100644 +--- a/bin/confgen/keygen.c ++++ b/bin/confgen/keygen.c +@@ -161,17 +161,15 @@ generate_key(isc_mem_t *mctx, const char *randomfile, dns_secalg_t alg, + + DO("create entropy context", isc_entropy_create(mctx, &ectx)); + +- if (randomfile != NULL && strcmp(randomfile, "keyboard") == 0) { +- randomfile = NULL; +- open_keyboard = ISC_ENTROPY_KEYBOARDYES; +- } + #ifdef ISC_PLATFORM_CRYPTORANDOM +- if (randomfile != NULL && +- strcmp(randomfile, ISC_PLATFORM_CRYPTORANDOM) == 0) { +- randomfile = NULL; ++ if (randomfile == NULL) { + isc_entropy_usehook(ectx, true); + } + #endif ++ if (randomfile != NULL && strcmp(randomfile, "keyboard") == 0) { ++ randomfile = NULL; ++ open_keyboard = ISC_ENTROPY_KEYBOARDYES; ++ } + DO("start entropy source", isc_entropy_usebestsource(ectx, + &entropy_source, + randomfile, +diff --git a/bin/dnssec/dnssec-keygen.docbook b/bin/dnssec/dnssec-keygen.docbook +index 0ae6b41..4562430 100644 +--- a/bin/dnssec/dnssec-keygen.docbook ++++ b/bin/dnssec/dnssec-keygen.docbook +@@ -348,15 +348,23 @@ + -r randomdev + + +- Specifies the source of randomness. If the operating +- system does not provide a /dev/random +- or equivalent device, the default source of randomness +- is keyboard input. randomdev +- specifies ++ Specifies a source of randomness. Normally, when generating ++ DNSSEC keys, this option has no effect; the random number ++ generation function provided by the cryptographic library will ++ be used. ++ ++ ++ If that behavior is disabled at compile time, however, ++ the specified file will be used as entropy source ++ for key generation. randomdev is + the name of a character device or file containing random +- data to be used instead of the default. The special value +- keyboard indicates that keyboard +- input should be used. ++ data to be used. The special value keyboard ++ indicates that keyboard input should be used. ++ ++ ++ The default is /dev/random if the ++ operating system provides it or an equivalent device; ++ if not, the default source of randomness is keyboard input. + + + +diff --git a/bin/dnssec/dnssectool.c b/bin/dnssec/dnssectool.c +index 31a99e7..38c83ed 100644 +--- a/bin/dnssec/dnssectool.c ++++ b/bin/dnssec/dnssectool.c +@@ -241,18 +241,16 @@ setup_entropy(isc_mem_t *mctx, const char *randomfile, isc_entropy_t **ectx) { + ISC_LIST_INIT(sources); + } + ++#ifdef ISC_PLATFORM_CRYPTORANDOM ++ if (randomfile == NULL) { ++ isc_entropy_usehook(*ectx, true); ++ } ++#endif + if (randomfile != NULL && strcmp(randomfile, "keyboard") == 0) { + usekeyboard = ISC_ENTROPY_KEYBOARDYES; + randomfile = NULL; + } + +-#ifdef ISC_PLATFORM_CRYPTORANDOM +- if (randomfile != NULL && +- strcmp(randomfile, ISC_PLATFORM_CRYPTORANDOM) == 0) { +- randomfile = NULL; +- isc_entropy_usehook(*ectx, true); +- } +-#endif + result = isc_entropy_usebestsource(*ectx, &source, randomfile, + usekeyboard); + +diff --git a/bin/named/client.c b/bin/named/client.c +index 50fa2cd..524d9a3 100644 +--- a/bin/named/client.c ++++ b/bin/named/client.c +@@ -1762,7 +1762,8 @@ ns_client_addopt(ns_client_t *client, dns_message_t *message, + + isc_buffer_init(&buf, cookie, sizeof(cookie)); + isc_stdtime_get(&now); +- isc_random_get(&nonce); ++ nonce = ((isc_rng_random(ns_g_server->rngctx) << 16) | ++ isc_rng_random(ns_g_server->rngctx)); + + compute_cookie(client, now, nonce, ns_g_server->secret, &buf); + +diff --git a/bin/named/config.c b/bin/named/config.c +index dbdff64..63da4b0 100644 +--- a/bin/named/config.c ++++ b/bin/named/config.c +@@ -98,7 +98,9 @@ options {\n\ + # pid-file \"" NS_LOCALSTATEDIR "/run/named/named.pid\"; /* or /lwresd.pid */\n\ + port 53;\n\ + prefetch 2 9;\n" +-#ifdef PATH_RANDOMDEV ++#if defined(ISC_PLATFORM_CRYPTORANDOM) ++" random-device none;\n" ++#elif defined(PATH_RANDOMDEV) + " random-device \"" PATH_RANDOMDEV "\";\n" + #endif + " recursing-file \"named.recursing\";\n\ +diff --git a/bin/named/controlconf.c b/bin/named/controlconf.c +index d955c2f..40621f2 100644 +--- a/bin/named/controlconf.c ++++ b/bin/named/controlconf.c +@@ -325,9 +325,10 @@ log_invalid(isccc_ccmsg_t *ccmsg, isc_result_t result) { + + static void + control_recvmessage(isc_task_t *task, isc_event_t *event) { +- controlconnection_t *conn; +- controllistener_t *listener; +- controlkey_t *key; ++ controlconnection_t *conn = NULL; ++ controllistener_t *listener = NULL; ++ ns_server_t *server = NULL; ++ controlkey_t *key = NULL; + isccc_sexpr_t *request = NULL; + isccc_sexpr_t *response = NULL; + uint32_t algorithm; +@@ -338,16 +339,17 @@ control_recvmessage(isc_task_t *task, isc_event_t *event) { + isc_buffer_t *text; + isc_result_t result; + isc_result_t eresult; +- isccc_sexpr_t *_ctrl; ++ isccc_sexpr_t *_ctrl = NULL; + isccc_time_t sent; + isccc_time_t exp; + uint32_t nonce; +- isccc_sexpr_t *data; ++ isccc_sexpr_t *data = NULL; + + REQUIRE(event->ev_type == ISCCC_EVENT_CCMSG); + + conn = event->ev_arg; + listener = conn->listener; ++ server = listener->controls->server; + algorithm = DST_ALG_UNKNOWN; + secret.rstart = NULL; + text = NULL; +@@ -458,8 +460,11 @@ control_recvmessage(isc_task_t *task, isc_event_t *event) { + * Establish nonce. + */ + if (conn->nonce == 0) { +- while (conn->nonce == 0) +- isc_random_get(&conn->nonce); ++ while (conn->nonce == 0) { ++ uint16_t r1 = isc_rng_random(server->rngctx); ++ uint16_t r2 = isc_rng_random(server->rngctx); ++ conn->nonce = (r1 << 16) | r2; ++ } + eresult = ISC_R_SUCCESS; + } else + eresult = ns_control_docommand(request, listener->readonly, &text); +diff --git a/bin/named/include/named/server.h b/bin/named/include/named/server.h +index 7ee8f66..8982d26 100644 +--- a/bin/named/include/named/server.h ++++ b/bin/named/include/named/server.h +@@ -20,6 +20,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -134,6 +135,7 @@ struct ns_server { + char * lockfile; + + uint16_t transfer_tcp_message_size; ++ isc_rng_t * rngctx; + }; + + struct ns_altsecret { +diff --git a/bin/named/interfacemgr.c b/bin/named/interfacemgr.c +index 9dea7c1..272d300 100644 +--- a/bin/named/interfacemgr.c ++++ b/bin/named/interfacemgr.c +@@ -17,6 +17,7 @@ + + #include + #include ++#include + #include + #include + #include +diff --git a/bin/named/query.c b/bin/named/query.c +index c9e5469..0940714 100644 +--- a/bin/named/query.c ++++ b/bin/named/query.c +@@ -19,6 +19,7 @@ + #include + #include + #include ++#include + #include + #include + #include +diff --git a/bin/named/server.c b/bin/named/server.c +index 36fc047..3c1eec0 100644 +--- a/bin/named/server.c ++++ b/bin/named/server.c +@@ -8208,21 +8208,32 @@ load_configuration(const char *filename, ns_server_t *server, + * Open the source of entropy. + */ + if (first_time) { ++ const char *randomdev = NULL; ++ int level = ISC_LOG_ERROR; + obj = NULL; + result = ns_config_get(maps, "random-device", &obj); +- if (result != ISC_R_SUCCESS) { ++ if (result == ISC_R_SUCCESS) { ++ if (!cfg_obj_isvoid(obj)) { ++ level = ISC_LOG_INFO; ++ randomdev = cfg_obj_asstring(obj); ++ } ++ } ++ if (randomdev == NULL) { ++#ifdef ISC_PLATFORM_CRYPTORANDOM ++ isc_entropy_usehook(ns_g_entropy, true); ++#else ++ if ((obj != NULL) && !cfg_obj_isvoid(obj)) ++ level = ISC_LOG_INFO; + isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, +- NS_LOGMODULE_SERVER, ISC_LOG_INFO, ++ NS_LOGMODULE_SERVER, level, + "no source of entropy found"); ++ if ((obj == NULL) || cfg_obj_isvoid(obj)) { ++ CHECK(ISC_R_FAILURE); ++ } ++#endif + } else { +- const char *randomdev = cfg_obj_asstring(obj); +-#ifdef ISC_PLATFORM_CRYPTORANDOM +- if (strcmp(randomdev, ISC_PLATFORM_CRYPTORANDOM) == 0) +- isc_entropy_usehook(ns_g_entropy, true); +-#else +- int level = ISC_LOG_ERROR; + result = isc_entropy_createfilesource(ns_g_entropy, +- randomdev); ++ randomdev); + #ifdef PATH_RANDOMDEV + if (ns_g_fallbackentropy != NULL) { + level = ISC_LOG_INFO; +@@ -8233,8 +8244,8 @@ load_configuration(const char *filename, ns_server_t *server, + NS_LOGCATEGORY_GENERAL, + NS_LOGMODULE_SERVER, + level, +- "could not open entropy source " +- "%s: %s", ++ "could not open " ++ "entropy source %s: %s", + randomdev, + isc_result_totext(result)); + } +@@ -8254,7 +8265,6 @@ load_configuration(const char *filename, ns_server_t *server, + } + isc_entropy_detach(&ns_g_fallbackentropy); + } +-#endif + #endif + } + +@@ -9022,6 +9032,7 @@ ns_server_create(isc_mem_t *mctx, ns_server_t **serverp) { + server->in_roothints = NULL; + server->blackholeacl = NULL; + server->keepresporder = NULL; ++ server->rngctx = NULL; + + /* Must be first. */ + CHECKFATAL(dst_lib_init2(ns_g_mctx, ns_g_entropy, +@@ -9048,6 +9059,9 @@ ns_server_create(isc_mem_t *mctx, ns_server_t **serverp) { + CHECKFATAL(dns_tkeyctx_create(ns_g_mctx, ns_g_entropy, + &server->tkeyctx), + "creating TKEY context"); ++ server->rngctx = NULL; ++ CHECKFATAL(isc_rng_create(ns_g_mctx, ns_g_entropy, &server->rngctx), ++ "creating random numbers context"); + + /* + * Setup the server task, which is responsible for coordinating +@@ -9254,7 +9268,8 @@ ns_server_destroy(ns_server_t **serverp) { + + if (server->zonemgr != NULL) + dns_zonemgr_detach(&server->zonemgr); +- ++ if (server->rngctx != NULL) ++ isc_rng_detach(&server->rngctx); + if (server->tkeyctx != NULL) + dns_tkeyctx_destroy(&server->tkeyctx); + +@@ -13230,10 +13245,10 @@ newzone_cfgctx_destroy(void **cfgp) { + + static isc_result_t + generate_salt(unsigned char *salt, size_t saltlen) { +- int i, n; ++ size_t i, n; + union { + unsigned char rnd[256]; +- uint32_t rnd32[64]; ++ uint16_t rnd16[128]; + } rnd; + unsigned char text[512 + 1]; + isc_region_t r; +@@ -13243,9 +13258,10 @@ generate_salt(unsigned char *salt, size_t saltlen) { + if (saltlen > 256U) + return (ISC_R_RANGE); + +- n = (int) (saltlen + sizeof(uint32_t) - 1) / sizeof(uint32_t); +- for (i = 0; i < n; i++) +- isc_random_get(&rnd.rnd32[i]); ++ n = (saltlen + sizeof(uint16_t) - 1) / sizeof(uint16_t); ++ for (i = 0; i < n; i++) { ++ rnd.rnd16[i] = isc_rng_random(ns_g_server->rngctx); ++ } + + memmove(salt, rnd.rnd, saltlen); + +diff --git a/bin/nsupdate/nsupdate.c b/bin/nsupdate/nsupdate.c +index 0286987..0376377 100644 +--- a/bin/nsupdate/nsupdate.c ++++ b/bin/nsupdate/nsupdate.c +@@ -283,9 +283,7 @@ setup_entropy(isc_mem_t *mctx, const char *randomfile, isc_entropy_t **ectx) { + } + + #ifdef ISC_PLATFORM_CRYPTORANDOM +- if (randomfile != NULL && +- strcmp(randomfile, ISC_PLATFORM_CRYPTORANDOM) == 0) { +- randomfile = NULL; ++ if (randomfile == NULL) { + isc_entropy_usehook(*ectx, true); + } + #endif +diff --git a/bin/tests/system/pipelined/pipequeries.c b/bin/tests/system/pipelined/pipequeries.c +index f0a6ff2..55064f6 100644 +--- a/bin/tests/system/pipelined/pipequeries.c ++++ b/bin/tests/system/pipelined/pipequeries.c +@@ -280,9 +280,7 @@ main(int argc, char *argv[]) { + ectx = NULL; + RUNCHECK(isc_entropy_create(mctx, &ectx)); + #ifdef ISC_PLATFORM_CRYPTORANDOM +- if (randomfile != NULL && +- strcmp(randomfile, ISC_PLATFORM_CRYPTORANDOM) == 0) { +- randomfile = NULL; ++ if (randomfile == NULL) { + isc_entropy_usehook(ectx, true); + } + #endif +diff --git a/bin/tests/system/tkey/keycreate.c b/bin/tests/system/tkey/keycreate.c +index fe8698e..937fcc3 100644 +--- a/bin/tests/system/tkey/keycreate.c ++++ b/bin/tests/system/tkey/keycreate.c +@@ -255,9 +255,7 @@ main(int argc, char *argv[]) { + ectx = NULL; + RUNCHECK(isc_entropy_create(mctx, &ectx)); + #ifdef ISC_PLATFORM_CRYPTORANDOM +- if (randomfile != NULL && +- strcmp(randomfile, ISC_PLATFORM_CRYPTORANDOM) == 0) { +- randomfile = NULL; ++ if (randomfile == NULL) { + isc_entropy_usehook(ectx, true); + } + #endif +diff --git a/bin/tests/system/tkey/keydelete.c b/bin/tests/system/tkey/keydelete.c +index 2146f9b..64b8e74 100644 +--- a/bin/tests/system/tkey/keydelete.c ++++ b/bin/tests/system/tkey/keydelete.c +@@ -171,6 +171,7 @@ main(int argc, char **argv) { + randomfile = argv[2]; + argv += 2; + argc -= 2; ++ POST(argc); + } + keyname = argv[1]; + +@@ -182,9 +183,7 @@ main(int argc, char **argv) { + ectx = NULL; + RUNCHECK(isc_entropy_create(mctx, &ectx)); + #ifdef ISC_PLATFORM_CRYPTORANDOM +- if (randomfile != NULL && +- strcmp(randomfile, ISC_PLATFORM_CRYPTORANDOM) == 0) { +- randomfile = NULL; ++ if (randomfile == NULL) { + isc_entropy_usehook(ectx, true); + } + #endif +diff --git a/doc/arm/Bv9ARM-book.xml b/doc/arm/Bv9ARM-book.xml +index 33e06e6..539973c 100644 +--- a/doc/arm/Bv9ARM-book.xml ++++ b/doc/arm/Bv9ARM-book.xml +@@ -5076,22 +5076,45 @@ badresp:1,adberr:0,findfail:0,valfail:0] + random-device + + +- The source of entropy to be used by the server. Entropy is +- primarily needed +- for DNSSEC operations, such as TKEY transactions and dynamic +- update of signed +- zones. This options specifies the device (or file) from which +- to read +- entropy. If this is a file, operations requiring entropy will +- fail when the +- file has been exhausted. If not specified, the default value +- is +- /dev/random +- (or equivalent) when present, and none otherwise. The +- random-device option takes +- effect during +- the initial configuration load at server startup time and +- is ignored on subsequent reloads. ++ Specifies a source of entropy to be used by the server. ++ This is a device or file from which to read entropy. ++ If it is a file, operations requiring entropy ++ will fail when the file has been exhausted. ++ ++ ++ Entropy is needed for cryptographic operations such as ++ TKEY transactions, dynamic update of signed zones, and ++ generation of TSIG session keys. It is also used for ++ seeding and stirring the pseudo-random number generator, ++ which is used for less critical functions requiring ++ randomness such as generation of DNS message transaction ++ ID's. ++ ++ ++ If random-device is not specified, or ++ if it is set to none, entropy will be ++ read from the random number generation function supplied ++ by the cryptographic library with which BIND was linked ++ (i.e. OpenSSL or a PKCS#11 provider). ++ ++ ++ The random-device option takes ++ effect during the initial configuration load at server ++ startup time and is ignored on subsequent reloads. ++ ++ ++ If BIND is built with ++ configure --disable-crypto-rand, then ++ entropy is not sourced from the ++ cryptographic library. In this case, if ++ random-device is not specified, the ++ default value is the system random device, ++ /dev/random or the equivalent. ++ This default can be overridden with ++ configure --with-randomdev. ++ If no system random device exists, then no entropy source ++ will be configured, and named will only ++ be able to use pseudo-random numbers. + + + +diff --git a/doc/arm/notes-rh-changes.xml b/doc/arm/notes-rh-changes.xml +new file mode 100644 +index 0000000..11c3a7c +--- /dev/null ++++ b/doc/arm/notes-rh-changes.xml +@@ -0,0 +1,43 @@ ++ ++ ++ ++
Red Hat Specific Changes ++ ++ ++ ++ By default, BIND now uses the random number generation functions ++ in the cryptographic library (i.e., OpenSSL or a PKCS#11 ++ provider) as a source of high-quality randomness rather than ++ /dev/random. This is suitable for virtual ++ machine environments, which may have limited entropy pools and ++ lack hardware random number generators. ++ ++ ++ This can be overridden by specifying another entropy source via ++ the random-device option in ++ named.conf, or via the -r ++ command line option. However, for functions requiring full ++ cryptographic strength, such as DNSSEC key generation, this ++ cannot be overridden. In particular, the ++ -r command line option no longer has any ++ effect on dnssec-keygen. ++ ++ ++ This can be disabled by building with ++ configure --disable-crypto-rand, in which ++ case /dev/random will be the default ++ entropy source. [RT #31459] [RT #46047] ++ ++ ++ ++
++ +diff --git a/doc/arm/notes.xml b/doc/arm/notes.xml +index b16dab6..763ff7e 100644 +--- a/doc/arm/notes.xml ++++ b/doc/arm/notes.xml +@@ -36,6 +36,7 @@ + + + ++ + + + +diff --git a/lib/dns/dst_api.c b/lib/dns/dst_api.c +index 1614afa..0f52df9 100644 +--- a/lib/dns/dst_api.c ++++ b/lib/dns/dst_api.c +@@ -2017,10 +2017,12 @@ dst__entropy_getdata(void *buf, unsigned int len, bool pseudo) { + else + flags |= ISC_ENTROPY_BLOCKING; + #ifdef ISC_PLATFORM_CRYPTORANDOM ++ /* get entropy directly from crypto provider */ + return (dst_random_getdata(buf, len, NULL, flags)); + #else ++ /* get entropy from entropy source or hook function */ + return (isc_entropy_getdata(dst_entropy_pool, buf, len, NULL, flags)); +-#endif ++#endif /* ISC_PLATFORM_CRYPTORANDOM */ + #endif /* PKCS11CRYPTO */ + } + +diff --git a/lib/dns/include/dst/dst.h b/lib/dns/include/dst/dst.h +index 6813c96..665574d 100644 +--- a/lib/dns/include/dst/dst.h ++++ b/lib/dns/include/dst/dst.h +@@ -163,8 +163,18 @@ isc_result_t + dst_random_getdata(void *data, unsigned int length, + unsigned int *returned, unsigned int flags); + /*%< +- * \brief Return data from the crypto random generator. +- * Specialization of isc_entropy_getdata(). ++ * Gets random data from the random generator provided by the ++ * crypto library, if BIND was built with --enable-crypto-rand. ++ * ++ * See isc_entropy_getdata() for parameter usage. Normally when ++ * this function is available, it will be set up as a hook in the ++ * entropy context, so that isc_entropy_getdata() is a front-end to ++ * this function. ++ * ++ * Returns: ++ * \li ISC_R_SUCCESS on success ++ * \li ISC_R_NOTIMPLEMENTED if BIND is built with --disable-crypto-rand ++ * \li DST_R_OPENSSLFAILURE, DST_R_CRYPTOFAILURE, or other codes on error + */ + + bool +diff --git a/lib/dns/openssl_link.c b/lib/dns/openssl_link.c +index 6849732..e00a0e4 100644 +--- a/lib/dns/openssl_link.c ++++ b/lib/dns/openssl_link.c +@@ -484,7 +484,8 @@ dst__openssl_getengine(const char *engine) { + + isc_result_t + dst_random_getdata(void *data, unsigned int length, +- unsigned int *returned, unsigned int flags) { ++ unsigned int *returned, unsigned int flags) ++{ + #ifdef ISC_PLATFORM_CRYPTORANDOM + #ifndef DONT_REQUIRE_DST_LIB_INIT + INSIST(dst__memory_pool != NULL); +diff --git a/lib/isc/include/isc/entropy.h b/lib/isc/include/isc/entropy.h +index 632166a..c7cb17d 100644 +--- a/lib/isc/include/isc/entropy.h ++++ b/lib/isc/include/isc/entropy.h +@@ -9,8 +9,6 @@ + * information regarding copyright ownership. + */ + +-/* $Id: entropy.h,v 1.35 2009/10/19 02:37:08 marka Exp $ */ +- + #ifndef ISC_ENTROPY_H + #define ISC_ENTROPY_H 1 + +@@ -191,9 +189,8 @@ isc_entropy_createcallbacksource(isc_entropy_t *ent, + /*!< + * \brief Create an entropy source that is polled via a callback. + * +- * This would +- * be used when keyboard input is used, or a GUI input method. It can +- * also be used to hook in any external entropy source. ++ * This would be used when keyboard input is used, or a GUI input method. ++ * It can also be used to hook in any external entropy source. + * + * Samples are added via isc_entropy_addcallbacksample(), below. + * _addcallbacksample() is the only function which may be called from +@@ -234,15 +231,32 @@ isc_result_t + isc_entropy_getdata(isc_entropy_t *ent, void *data, unsigned int length, + unsigned int *returned, unsigned int flags); + /*!< +- * \brief Extract data from the entropy pool. This may load the pool from various +- * sources. ++ * \brief Get random data from entropy pool 'ent'. ++ * ++ * If a hook has been set up using isc_entropy_sethook() and ++ * isc_entropy_usehook(), then the hook function will be called to get ++ * random data. ++ * ++ * Otherwise, randomness is extracted from the entropy pool set up in BIND. ++ * This may cause the pool to be loaded from various sources. Ths is done ++ * by stirring the pool and returning a part of hash as randomness. ++ * (Note that no secrets are given away here since parts of the hash are ++ * XORed together before returning.) ++ * ++ * 'flags' may contain ISC_ENTROPY_GOODONLY, ISC_ENTROPY_PARTIAL, or ++ * ISC_ENTROPY_BLOCKING. These will be honored if the hook function is ++ * not in use. If it is, the flags will be passed to the hook function ++ * but it may ignore them. + * +- * Do this by stiring the pool and returning a part of hash as randomness. +- * Note that no secrets are given away here since parts of the hash are +- * xored together before returned. ++ * Up to 'length' bytes of randomness are retrieved and copied into 'data'. ++ * (If 'returned' is not NULL, and the number of bytes copied is less than ++ * 'length' - which may happen if ISC_ENTROPY_PARTIAL was used - then the ++ * number of bytes copied will be stored in *returned.) + * +- * Honor the request from the caller to only return good data, any data, +- * etc. ++ * Returns: ++ * \li ISC_R_SUCCESS on success ++ * \li ISC_R_NOENTROPY if entropy pool is empty ++ * \li other error codes are possible when a hook is in use + */ + + void +@@ -307,13 +321,21 @@ isc_entropy_usebestsource(isc_entropy_t *ectx, isc_entropysource_t **source, + void + isc_entropy_usehook(isc_entropy_t *ectx, bool onoff); + /*!< +- * \brief Mark/unmark the given entropy structure as being hooked. ++ * \brief Configure entropy context 'ectx' to use the hook function ++ * ++ * Sets the entropy context to call the hook function for random number ++ * generation, if such a function has been configured via ++ * isc_entropy_sethook(), whenever isc_entropy_getdata() is called. + */ + + void + isc_entropy_sethook(isc_entropy_getdata_t myhook); + /*!< +- * \brief Set the getdata hook (e.g., for a crypto random generator). ++ * \brief Set the hook function. ++ * ++ * The hook function is a global value: only one hook function ++ * can be set in the system. Individual entropy contexts may be ++ * configured to use it, or not, by calling isc_entropy_usehook(). + */ + + ISC_LANG_ENDDECLS +diff --git a/lib/isc/include/isc/random.h b/lib/isc/include/isc/random.h +index f8aed34..17c551b 100644 +--- a/lib/isc/include/isc/random.h ++++ b/lib/isc/include/isc/random.h +@@ -9,8 +9,6 @@ + * information regarding copyright ownership. + */ + +-/* $Id: random.h,v 1.20 2009/01/17 23:47:43 tbox Exp $ */ +- + #ifndef ISC_RANDOM_H + #define ISC_RANDOM_H 1 + +@@ -21,13 +19,23 @@ + #include + + /*! \file isc/random.h +- * \brief Implements a random state pool which will let the caller return a +- * series of possibly non-reproducible random values. ++ * \brief Implements pseudo random number generators. ++ * ++ * Two pseudo-random number generators are implemented, in isc_random_* ++ * and isc_rng_*. Neither one is very strong; they should not be used ++ * in cryptography functions. ++ * ++ * isc_random_* is based on arc4random if it is available on the system. ++ * Otherwise it is based on the posix srand() and rand() functions. ++ * It is useful for jittering values a bit here and there, such as ++ * timeouts, etc, but should not be relied upon to generate ++ * unpredictable sequences (for example, when choosing transaction IDs). + * +- * Note that the +- * strength of these numbers is not all that high, and should not be +- * used in cryptography functions. It is useful for jittering values +- * a bit here and there, such as timeouts, etc. ++ * isc_rng_* is based on ChaCha20, and is seeded and stirred from the ++ * system entropy source. It is stronger than isc_random_* and can ++ * be used for generating unpredictable sequences. It is still not as ++ * good as using system entropy directly (see entropy.h) and should not ++ * be used for cryptographic functions such as key generation. + */ + + ISC_LANG_BEGINDECLS +@@ -115,8 +123,8 @@ isc_rng_random(isc_rng_t *rngctx); + uint16_t + isc_rng_uniformrandom(isc_rng_t *rngctx, uint16_t upper_bound); + /*%< +- * Returns a uniformly distributed pseudo random 16-bit unsigned +- * integer. ++ * Returns a uniformly distributed pseudo-random 16-bit unsigned integer ++ * less than 'upper_bound'. + */ + + ISC_LANG_ENDDECLS +diff --git a/lib/isccfg/namedconf.c b/lib/isccfg/namedconf.c +index 03890a3..7bad989 100644 +--- a/lib/isccfg/namedconf.c ++++ b/lib/isccfg/namedconf.c +@@ -1109,7 +1109,7 @@ options_clauses[] = { + { "pid-file", &cfg_type_qstringornone, 0 }, + { "port", &cfg_type_uint32, 0 }, + { "querylog", &cfg_type_boolean, 0 }, +- { "random-device", &cfg_type_qstring, 0 }, ++ { "random-device", &cfg_type_qstringornone, 0 }, + { "recursing-file", &cfg_type_qstring, 0 }, + { "recursive-clients", &cfg_type_uint32, 0 }, + { "reserved-sockets", &cfg_type_uint32, 0 }, +-- +2.20.1 + diff --git a/SOURCES/bind-9.11-serve-stale.patch b/SOURCES/bind-9.11-serve-stale.patch new file mode 100644 index 0000000..350fe62 --- /dev/null +++ b/SOURCES/bind-9.11-serve-stale.patch @@ -0,0 +1,3858 @@ +From 2bdcb7159b1ac097355e95864e979b4f68bc1a4e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Petr=20Men=C5=A1=C3=ADk?= +Date: Thu, 7 Nov 2019 14:31:03 +0100 +Subject: [PATCH] Implement serve-stale in 9.11 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Squashed commit of the following: + +commit 32f47f36e545223b2a4757588d7bd4af8c5f5760 +Author: Petr Menšík +Date: Tue Sep 3 18:45:54 2019 +0200 + + convert serve_stale to db_test + + Manual checkout from commit e8f61dd315c5d1c88915bb79361182241e42e47a. + Use test modified for cmocka, including serve-stale tests. + +commit 071eb1fb0786f6d614955813d99c3caabff33383 +Author: Michał Kępień +Date: Fri Apr 27 09:13:26 2018 +0200 + + Detect recursion loops during query processing + + Interrupt query processing when query_recurse() attempts to ask the same + name servers for the same QNAME/QTYPE tuple for two times in a row as + this indicates that query processing may be stuck for an indeterminate + period of time, e.g. due to interactions between features able to + restart query_lookup(). + + (cherry picked from commit 46bb4dd124ed031d4c219d1e37a3c6322092e30c) + +commit c12090bc361c7fa4522ace73899e778e44e9b295 +Author: Petr Menšík +Date: Mon Sep 2 11:12:32 2019 +0200 + + Fix test name used in whole test-suite + + Correct name is serve-stale + +commit ff4d826f295d268a248ca06941d65c903e1b405c +Author: Petr Menšík +Date: Fri Aug 30 17:43:28 2019 +0200 + + Clean files in more generic rules + +commit 8d81ed15eda9a2a11e1433d1fdddacfc772708b6 +Author: Petr Menšík +Date: Thu Aug 29 21:27:57 2019 +0200 + + [rt46602] Pass port numbers to tests via environment variables + + Manually applied commit f5d8f079008b648d2e343543e66dd728054c6101 + +commit 94fafa477891576286def8c4041ad127734af2d1 +Author: Tony Finch +Date: Tue Apr 10 16:17:57 2018 +0100 + + Move serve-stale logging to its own category, so that its verbosity can be curtailed. + + (cherry picked from commit 4b442c309dfb2c8880b19af4133047655bb734df) + +commit e0c884bee98c3d2533dfaa667f58c6a80d8a3a00 +Author: Michał Kępień +Date: Fri Apr 27 09:13:26 2018 +0200 + + Prevent check_stale_header() from leaking rdataset headers + + check_stale_header() fails to update the pointer to the previous header + while processing rdataset headers eligible for serve-stale, thus + enabling rdataset headers to be leaked (i.e. disassociated from a node + and left on the relevant TTL heap) while iterating through a node. This + can lead to several different assertion failures. Add the missing + pointer update. + + (cherry picked from commit 391fac1fc8d2e470287b5cc4344b3adb90c6f54a) + +commit d724cc1d80ee8d46113eaf82549d49636739b67c +Author: Matthijs Mekking +Date: Thu Jan 24 10:24:44 2019 +0100 + + Print in dump-file stale ttl + + This change makes rndc dumpdb correctly print the "; stale" line. + It also provides extra information on how long this data may still + be served to clients (in other words how long the stale RRset may + still be used). + + (cherry picked from commit 924ebc605db798e2a383ee5eaaebad739e7c789c) + +commit 625da4bd4590ac6108bb30eddd23ceffb245ae49 +Author: Michał Kępień +Date: Mon Oct 22 15:26:45 2018 +0200 + + Check serve-stale behavior with a cold cache + + Ensure that serve-stale works as expected when returning stale answers + is enabled, the authoritative server does not respond, and there is no + cached answer available. + + (cherry picked from commit 27cfe83a388147edfa0451b28c06c746912ea684) + +commit d67ae10461c409fdafdbbe64f857db2552b71059 +Author: Michał Kępień +Date: Mon Oct 22 15:26:45 2018 +0200 + + Check TTL of stale answers + + Make sure that stale answers returned when the serve-stale feature is + enabled have a TTL matching the value of the stale-answer-ttl setting. + + (cherry picked from commit 893ab37ce78c658215bd3a019f25afe795b37d5a) + +commit 50459107805e68e4a63a8e497bf58ef3ce013ddb +Author: Michał Kępień +Date: Mon Jul 9 14:35:12 2018 +0200 + + Do not use Net::DNS::Nameserver in the "serve-stale" system test + + Net::DNS versions older than 0.67 respond to queries sent to a + Net::DNS::Nameserver even if its ReplyHandler returns undef. This makes + the "serve-stale" system test fail as it takes advantage of the newer + behavior. Since the latest Net::DNS version available with stock + RHEL/CentOS 6 packages is 0.65 and we officially support that operating + system, bin/tests/system/serve-stale/ans2/ans.pl should behave + consistently for various Net::DNS versions. Ensure that by reworking it + so that it does not use Net::DNS::Nameserver. + + (cherry picked from commit c4209418a50c09142375f7edadca731c526f3d3a) + +commit 4b5befc714bb386bd245b1c14ce3bce5ae6fb5fa +Author: Petr Menšík +Date: Tue Jun 5 21:38:29 2018 +0200 + + Fix server-stale requirement, skip without Time::HiRes + + (cherry picked from commit 7a0c7bf9c8e6a724e52635eed213ad25b9504e66) + +commit 5ce51a3a7e5ef3087c4d022e3fca42fb2fd0c996 +Author: Ondřej Surý +Date: Wed Oct 18 13:01:14 2017 +0200 + + [rt46602] Update server-stale test to run on port passed from run.sh script + + (cherry picked from commit f83ebd34b9555a5a834c58146035173bcbd01dda) + +commit 3954a9bf3437f6fab050294a7f2f954a23d161ec +Author: Ondřej Surý +Date: Wed Oct 18 14:18:59 2017 +0200 + + [rt46602] Add serve-stale working files to .gitignore + + (cherry picked from commit cba162e70e7fac43435a606106841a69ce468526) + +commit 112aa21f5fa875494820e4d1eb70e41e10e1aae7 +Author: Mark Andrews +Date: Thu Oct 12 15:33:47 2017 +1100 + + test for Net::DNS::Nameserver + + (cherry picked from commit 5b60d0608ac2852753180b762d1917163f9dc315) + +commit 9d610e46af8a636f44914cee4cf8b2016054db1e +Author: Mark Andrews +Date: Thu Oct 12 15:19:45 2017 +1100 + + add Net::DNS prerequiste test + + (cherry picked from commit fa644181f51559da3e3913acd72dbc3f6d916e71) + +commit e4ea7ba88d9a9a0c79579400c68a5dabe03e8572 +Author: Mark Andrews +Date: Wed Sep 6 19:26:10 2017 +1000 + + add quotes arount $send_response + + (cherry picked from commit 023ab19634b287543169e9b7b5259f3126cd60ff) + +commit 0af0c5d33c2de34da164571288b650282c6be10a +Author: Mark Andrews +Date: Thu Nov 23 16:11:49 2017 +1100 + + initalise serve_stale_ttl + + (cherry picked from commit 2f4e0e5a81278f59037bf06ae99ff52245cd57e9) + +commit fbadd90ee81863d617c4c319d5f0079b877fe102 +Author: Evan Hunt +Date: Thu Sep 14 11:48:21 2017 -0700 + + [master] add thanks to APNIC and add missing note for serve-stale + +commit deb8adaa59955970b9d2f2fe58060a3cbf08312b +Author: Mark Andrews +Date: Wed Sep 6 12:16:10 2017 +1000 + + silence 'staleanswersok' may be used uninitialized in this function warning. [RT #14147 + +commit 0e2d03823768dc545015e6ce309777210f4a9f85 +Author: Petr Menšík +Date: Thu Aug 29 19:57:58 2019 +0200 + + More fixes to merge + +commit 360e25ffe7623ea0a2eec49395001f4940967776 +Author: Mark Andrews +Date: Wed Sep 6 09:58:29 2017 +1000 + + 4700. [func] Serving of stale answers is now supported. This + allows named to provide stale cached answers when + the authoritative server is under attack. + See max-stale-ttl, stale-answer-enable, + stale-answer-ttl. [RT #44790] + +Signed-off-by: Petr Menšík +--- + bin/named/config.c | 9 +- + bin/named/control.c | 2 + + bin/named/include/named/control.h | 1 + + bin/named/include/named/log.h | 1 + + bin/named/include/named/query.h | 15 + + bin/named/include/named/server.h | 13 +- + bin/named/log.c | 1 + + bin/named/query.c | 164 +++++- + bin/named/server.c | 177 +++++- + bin/named/statschannel.c | 6 + + bin/rndc/rndc.c | 2 + + bin/rndc/rndc.docbook | 19 + + bin/tests/system/chain/prereq.sh | 7 + + bin/tests/system/conf.sh.in | 2 +- + bin/tests/system/dyndb/driver/db.c | 2 + + bin/tests/system/serve-stale/.gitignore | 11 + + bin/tests/system/serve-stale/ans2/ans.pl.in | 178 ++++++ + bin/tests/system/serve-stale/clean.sh | 15 + + .../system/serve-stale/ns1/named1.conf.in | 35 ++ + .../system/serve-stale/ns1/named2.conf.in | 35 ++ + bin/tests/system/serve-stale/ns1/root.db | 5 + + .../system/serve-stale/ns3/named.conf.in | 35 ++ + bin/tests/system/serve-stale/prereq.sh | 38 ++ + bin/tests/system/serve-stale/setup.sh | 13 + + bin/tests/system/serve-stale/tests.sh | 536 ++++++++++++++++++ + doc/arm/Bv9ARM-book.xml | 69 ++- + doc/arm/logging-categories.xml | 11 + + doc/arm/notes-rh-changes.xml | 14 +- + doc/misc/options | 10 + + lib/bind9/check.c | 78 ++- + lib/dns/cache.c | 38 +- + lib/dns/db.c | 22 + + lib/dns/ecdb.c | 4 +- + lib/dns/include/dns/cache.h | 21 + + lib/dns/include/dns/db.h | 35 ++ + lib/dns/include/dns/rdataset.h | 11 + + lib/dns/include/dns/resolver.h | 43 +- + lib/dns/include/dns/types.h | 6 + + lib/dns/include/dns/view.h | 3 + + lib/dns/master.c | 14 +- + lib/dns/masterdump.c | 23 + + lib/dns/rbtdb.c | 207 ++++++- + lib/dns/resolver.c | 78 ++- + lib/dns/sdb.c | 4 +- + lib/dns/sdlz.c | 4 +- + lib/dns/tests/db_test.c | 198 ++++++- + lib/dns/view.c | 3 + + lib/isccfg/namedconf.c | 5 + + 48 files changed, 2121 insertions(+), 102 deletions(-) + create mode 100644 bin/tests/system/serve-stale/.gitignore + create mode 100644 bin/tests/system/serve-stale/ans2/ans.pl.in + create mode 100644 bin/tests/system/serve-stale/clean.sh + create mode 100644 bin/tests/system/serve-stale/ns1/named1.conf.in + create mode 100644 bin/tests/system/serve-stale/ns1/named2.conf.in + create mode 100644 bin/tests/system/serve-stale/ns1/root.db + create mode 100644 bin/tests/system/serve-stale/ns3/named.conf.in + create mode 100644 bin/tests/system/serve-stale/prereq.sh + create mode 100644 bin/tests/system/serve-stale/setup.sh + create mode 100755 bin/tests/system/serve-stale/tests.sh + +diff --git a/bin/named/config.c b/bin/named/config.c +index 63da4b0..b598f9b 100644 +--- a/bin/named/config.c ++++ b/bin/named/config.c +@@ -182,13 +182,14 @@ options {\n\ + #ifdef HAVE_LMDB + " lmdb-mapsize 32M;\n" + #endif +-" max-acache-size 16M;\n\ +- max-cache-size 90%;\n\ ++" max-cache-size 90%;\n\ ++ max-acache-size 16M;\n\ + max-cache-ttl 604800; /* 1 week */\n\ + max-clients-per-query 100;\n\ + max-ncache-ttl 10800; /* 3 hours */\n\ + max-recursion-depth 7;\n\ + max-recursion-queries 75;\n\ ++ max-stale-ttl 604800; /* 1 week */\n\ + message-compression yes;\n\ + # min-roots ;\n\ + minimal-any false;\n\ +@@ -203,10 +204,14 @@ options {\n\ + request-expire true;\n\ + request-ixfr true;\n\ + require-server-cookie no;\n\ ++ resolver-nonbackoff-tries 3;\n\ ++ resolver-retry-interval 800; /* in milliseconds */\n\ + # rfc2308-type1 ;\n\ + root-key-sentinel yes;\n\ + servfail-ttl 1;\n\ + # sortlist \n\ ++ stale-answer-enable false;\n\ ++ stale-answer-ttl 1; /* 1 second */\n\ + # topology \n\ + transfer-format many-answers;\n\ + v6-bias 50;\n\ +diff --git a/bin/named/control.c b/bin/named/control.c +index df23c26..8b79850 100644 +--- a/bin/named/control.c ++++ b/bin/named/control.c +@@ -282,6 +282,8 @@ ns_control_docommand(isccc_sexpr_t *message, bool readonly, + result = ns_server_validation(ns_g_server, lex, text); + } else if (command_compare(command, NS_COMMAND_ZONESTATUS)) { + result = ns_server_zonestatus(ns_g_server, lex, text); ++ } else if (command_compare(command, NS_COMMAND_SERVESTALE)) { ++ result = ns_server_servestale(ns_g_server, lex, text); + } else { + isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, + NS_LOGMODULE_CONTROL, ISC_LOG_WARNING, +diff --git a/bin/named/include/named/control.h b/bin/named/include/named/control.h +index 8705fdd..1634154 100644 +--- a/bin/named/include/named/control.h ++++ b/bin/named/include/named/control.h +@@ -69,6 +69,7 @@ + #define NS_COMMAND_MKEYS "managed-keys" + #define NS_COMMAND_DNSTAPREOPEN "dnstap-reopen" + #define NS_COMMAND_DNSTAP "dnstap" ++#define NS_COMMAND_SERVESTALE "serve-stale" + + isc_result_t + ns_controls_create(ns_server_t *server, ns_controls_t **ctrlsp); +diff --git a/bin/named/include/named/log.h b/bin/named/include/named/log.h +index 56bfcd4..cd8db60 100644 +--- a/bin/named/include/named/log.h ++++ b/bin/named/include/named/log.h +@@ -32,6 +32,7 @@ + #define NS_LOGCATEGORY_UPDATE_SECURITY (&ns_g_categories[6]) + #define NS_LOGCATEGORY_QUERY_ERRORS (&ns_g_categories[7]) + #define NS_LOGCATEGORY_TAT (&ns_g_categories[8]) ++#define NS_LOGCATEGORY_SERVE_STALE (&ns_g_categories[9]) + + /* + * Backwards compatibility. +diff --git a/bin/named/include/named/query.h b/bin/named/include/named/query.h +index 9661f56..445b578 100644 +--- a/bin/named/include/named/query.h ++++ b/bin/named/include/named/query.h +@@ -35,6 +35,18 @@ typedef struct ns_dbversion { + ISC_LINK(struct ns_dbversion) link; + } ns_dbversion_t; + ++/*% ++ * nameserver recursion parameters, to uniquely identify a recursion ++ * query; this is used to detect a recursion loop ++ */ ++typedef struct ns_query_recparam { ++ dns_rdatatype_t qtype; ++ dns_name_t * qname; ++ dns_fixedname_t fqname; ++ dns_name_t * qdomain; ++ dns_fixedname_t fqdomain; ++} ns_query_recparam_t; ++ + /*% nameserver query structure */ + struct ns_query { + unsigned int attributes; +@@ -63,6 +75,7 @@ struct ns_query { + unsigned int dns64_aaaaoklen; + unsigned int dns64_options; + unsigned int dns64_ttl; ++ + struct { + dns_db_t * db; + dns_zone_t * zone; +@@ -76,6 +89,8 @@ struct ns_query { + bool authoritative; + bool is_zone; + } redirect; ++ ++ ns_query_recparam_t recparam; + dns_keytag_t root_key_sentinel_keyid; + bool root_key_sentinel_is_ta; + bool root_key_sentinel_not_ta; +diff --git a/bin/named/include/named/server.h b/bin/named/include/named/server.h +index 8982d26..919ac28 100644 +--- a/bin/named/include/named/server.h ++++ b/bin/named/include/named/server.h +@@ -224,7 +224,10 @@ enum { + + dns_nsstatscounter_tcphighwater = 57, + +- dns_nsstatscounter_max = 58 ++ dns_nsstatscounter_trystale = 58, ++ dns_nsstatscounter_usedstale = 59, ++ ++ dns_nsstatscounter_max = 60 + }; + + /*% +@@ -763,4 +766,12 @@ ns_server_mkeys(ns_server_t *server, isc_lex_t *lex, isc_buffer_t **text); + isc_result_t + ns_server_dnstap(ns_server_t *server, isc_lex_t *lex, isc_buffer_t **text); + ++ ++/*% ++ * Control whether stale answers are served or not when configured in ++ * named.conf. ++ */ ++isc_result_t ++ns_server_servestale(ns_server_t *server, isc_lex_t *lex, ++ isc_buffer_t **text); + #endif /* NAMED_SERVER_H */ +diff --git a/bin/named/log.c b/bin/named/log.c +index 3aa25e9..12f178b 100644 +--- a/bin/named/log.c ++++ b/bin/named/log.c +@@ -38,6 +38,7 @@ static isc_logcategory_t categories[] = { + { "update-security", 0 }, + { "query-errors", 0 }, + { "trust-anchor-telemetry", 0 }, ++ { "serve-stale", 0 }, + { NULL, 0 } + }; + +diff --git a/bin/named/query.c b/bin/named/query.c +index 0940714..882d69c 100644 +--- a/bin/named/query.c ++++ b/bin/named/query.c +@@ -125,10 +125,14 @@ + #define REDIRECT(c) (((c)->query.attributes & \ + NS_QUERYATTR_REDIRECT) != 0) + +-/*% No QNAME Proof? */ ++/*% Does the rdataset 'r' have an attached 'No QNAME Proof'? */ + #define NOQNAME(r) (((r)->attributes & \ + DNS_RDATASETATTR_NOQNAME) != 0) + ++/*% Does the rdataset 'r' contain a stale answer? */ ++#define STALE(r) (((r)->attributes & \ ++ DNS_RDATASETATTR_STALE) != 0) ++ + #ifdef WANT_QUERYTRACE + static inline void + client_trace(ns_client_t *client, int level, const char *message) { +@@ -217,6 +221,10 @@ static bool + rpz_ck_dnssec(ns_client_t *client, isc_result_t qresult, + dns_rdataset_t *rdataset, dns_rdataset_t *sigrdataset); + ++static void ++recparam_update(ns_query_recparam_t *param, dns_rdatatype_t qtype, ++ const dns_name_t *qname, const dns_name_t *qdomain); ++ + /*% + * Increment query statistics counters. + */ +@@ -470,6 +478,7 @@ query_reset(ns_client_t *client, bool everything) { + client->query.isreferral = false; + client->query.dns64_options = 0; + client->query.dns64_ttl = UINT32_MAX; ++ recparam_update(&client->query.recparam, 0, NULL, NULL); + client->query.root_key_sentinel_keyid = 0; + client->query.root_key_sentinel_is_ta = false; + client->query.root_key_sentinel_not_ta = false; +@@ -4254,6 +4263,54 @@ query_prefetch(ns_client_t *client, dns_name_t *qname, + dns_rdataset_clearprefetch(rdataset); + } + ++/*% ++ * Check whether the recursion parameters in 'param' match the current query's ++ * recursion parameters provided in 'qtype', 'qname', and 'qdomain'. ++ */ ++static bool ++recparam_match(const ns_query_recparam_t *param, dns_rdatatype_t qtype, ++ const dns_name_t *qname, const dns_name_t *qdomain) ++{ ++ REQUIRE(param != NULL); ++ ++ return (param->qtype == qtype && ++ param->qname != NULL && qname != NULL && ++ param->qdomain != NULL && qdomain != NULL && ++ dns_name_equal(param->qname, qname) && ++ dns_name_equal(param->qdomain, qdomain)); ++} ++ ++/*% ++ * Update 'param' with current query's recursion parameters provided in ++ * 'qtype', 'qname', and 'qdomain'. ++ */ ++static void ++recparam_update(ns_query_recparam_t *param, dns_rdatatype_t qtype, ++ const dns_name_t *qname, const dns_name_t *qdomain) ++{ ++ isc_result_t result; ++ ++ REQUIRE(param != NULL); ++ ++ param->qtype = qtype; ++ ++ if (qname == NULL) { ++ param->qname = NULL; ++ } else { ++ param->qname = dns_fixedname_initname(¶m->fqname); ++ result = dns_name_copy(qname, param->qname, NULL); ++ RUNTIME_CHECK(result == ISC_R_SUCCESS); ++ } ++ ++ if (qdomain == NULL) { ++ param->qdomain = NULL; ++ } else { ++ param->qdomain = dns_fixedname_initname(¶m->fqdomain); ++ result = dns_name_copy(qdomain, param->qdomain, NULL); ++ RUNTIME_CHECK(result == ISC_R_SUCCESS); ++ } ++} ++ + static isc_result_t + query_recurse(ns_client_t *client, dns_rdatatype_t qtype, dns_name_t *qname, + dns_name_t *qdomain, dns_rdataset_t *nameservers, +@@ -4263,6 +4320,19 @@ query_recurse(ns_client_t *client, dns_rdatatype_t qtype, dns_name_t *qname, + dns_rdataset_t *rdataset, *sigrdataset; + isc_sockaddr_t *peeraddr; + ++ /* ++ * Check recursion parameters from the previous query to see if they ++ * match. If not, update recursion parameters and proceed. ++ */ ++ if (recparam_match(&client->query.recparam, qtype, qname, qdomain)) { ++ ns_client_log(client, NS_LOGCATEGORY_CLIENT, ++ NS_LOGMODULE_QUERY, ISC_LOG_INFO, ++ "recursion loop detected"); ++ return (ISC_R_FAILURE); ++ } ++ ++ recparam_update(&client->query.recparam, qtype, qname, qdomain); ++ + if (!resuming) + inc_stats(client, dns_nsstatscounter_recursion); + +@@ -6780,6 +6850,7 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype) + int line = -1; + bool dns64_exclude, dns64, rpz; + bool nxrewrite = false; ++ bool want_stale = false; + bool redirected = false; + dns_clientinfomethods_t cm; + dns_clientinfo_t ci; +@@ -7089,6 +7160,7 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype) + type = qtype; + + restart: ++ // query_start + CTRACE(ISC_LOG_DEBUG(3), "query_find: restart"); + want_restart = false; + authoritative = false; +@@ -7233,6 +7305,7 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype) + } + + db_find: ++ // query_lookup + CTRACE(ISC_LOG_DEBUG(3), "query_find: db_find"); + /* + * We'll need some resources... +@@ -7290,6 +7363,35 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype) + if (!is_zone) + dns_cache_updatestats(client->view->cache, result); + ++ if (want_stale) { ++ char namebuf[DNS_NAME_FORMATSIZE]; ++ bool success; ++ ++ client->query.dboptions &= ~DNS_DBFIND_STALEOK; ++ want_stale = false; ++ ++ if (dns_rdataset_isassociated(rdataset) && ++ dns_rdataset_count(rdataset) > 0 && ++ STALE(rdataset)) { ++ rdataset->ttl = client->view->staleanswerttl; ++ success = true; ++ } else { ++ success = false; ++ } ++ ++ dns_name_format(client->query.qname, ++ namebuf, sizeof(namebuf)); ++ isc_log_write(ns_g_lctx, NS_LOGCATEGORY_SERVE_STALE, ++ NS_LOGMODULE_QUERY, ISC_LOG_INFO, ++ "%s resolver failure, stale answer %s", ++ namebuf, success ? "used" : "unavailable"); ++ ++ if (!success) { ++ QUERY_ERROR(DNS_R_SERVFAIL); ++ goto cleanup; ++ } ++ } ++ + resume: + CTRACE(ISC_LOG_DEBUG(3), "query_find: resume"); + +@@ -7635,6 +7737,7 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype) + * The cache doesn't even have the root NS. Get them from + * the hints DB. + */ ++ // query_notfound + INSIST(!is_zone); + if (db != NULL) + dns_db_detach(&db); +@@ -7697,12 +7800,14 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype) + */ + /* FALLTHROUGH */ + case DNS_R_DELEGATION: ++ // query_delegation + authoritative = false; + if (is_zone) { + /* + * Look to see if we are authoritative for the + * child zone if the query type is DS. + */ ++ // query_zone_delegation + if (!RECURSIONOK(client) && + (options & DNS_GETDB_NOEXACT) != 0 && + qtype == dns_rdatatype_ds) { +@@ -8089,6 +8194,7 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype) + false, true); + } + } ++ // query_nxdomain + if (dns_rdataset_isassociated(rdataset)) { + /* + * If we've got a NSEC record, we need to save the +@@ -8409,7 +8515,8 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype) + /* + * If we have a zero ttl from the cache refetch it. + */ +- if (!is_zone && !resuming && rdataset->ttl == 0 && ++ // query_cname ++ if (!is_zone && !resuming && !STALE(rdataset) && rdataset->ttl == 0 && + RECURSIONOK(client)) + { + if (dns_rdataset_isassociated(rdataset)) +@@ -8627,7 +8734,11 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype) + "query_find: unexpected error after resuming: %s", + isc_result_totext(result)); + CTRACE(ISC_LOG_ERROR, errmsg); +- QUERY_ERROR(DNS_R_SERVFAIL); ++ if (resuming) { ++ want_stale = true; ++ } else { ++ QUERY_ERROR(DNS_R_SERVFAIL); ++ } + goto cleanup; + } + +@@ -8883,7 +8994,7 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype) + /* + * If we have a zero ttl from the cache refetch it. + */ +- if (!is_zone && !resuming && rdataset->ttl == 0 && ++ if (!is_zone && !resuming && !STALE(rdataset) && rdataset->ttl == 0 && + RECURSIONOK(client)) + { + if (dns_rdataset_isassociated(rdataset)) +@@ -8894,6 +9005,7 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype) + if (node != NULL) + dns_db_detachnode(db, &node); + ++ // query_respond + INSIST(!REDIRECT(client)); + result = query_recurse(client, qtype, + client->query.qname, +@@ -9174,6 +9286,7 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype) + dns_fixedname_name(&wildcardname), + true, false); + cleanup: ++ // query_done + CTRACE(ISC_LOG_DEBUG(3), "query_find: cleanup"); + /* + * General cleanup. +@@ -9230,6 +9343,49 @@ query_find(ns_client_t *client, dns_fetchevent_t *event, dns_rdatatype_t qtype) + goto restart; + } + ++ if (want_stale) { ++ dns_ttl_t stale_ttl = 0; ++ isc_result_t result; ++ bool staleanswersok = false; ++ ++ /* ++ * Stale answers only make sense if stale_ttl > 0 but ++ * we want rndc to be able to control returning stale ++ * answers if they are configured. ++ */ ++ dns_db_attach(client->view->cachedb, &db); ++ result = dns_db_getservestalettl(db, &stale_ttl); ++ if (result == ISC_R_SUCCESS && stale_ttl > 0) { ++ switch (client->view->staleanswersok) { ++ case dns_stale_answer_yes: ++ staleanswersok = true; ++ break; ++ case dns_stale_answer_conf: ++ staleanswersok = ++ client->view->staleanswersenable; ++ break; ++ case dns_stale_answer_no: ++ staleanswersok = false; ++ break; ++ } ++ } else { ++ staleanswersok = false; ++ } ++ ++ if (staleanswersok) { ++ client->query.dboptions |= DNS_DBFIND_STALEOK; ++ inc_stats(client, dns_nsstatscounter_trystale); ++ if (client->query.fetch != NULL) ++ dns_resolver_destroyfetch( ++ &client->query.fetch); ++ goto db_find; ++ } ++ dns_db_detach(&db); ++ want_stale = false; ++ QUERY_ERROR(DNS_R_SERVFAIL); ++ goto cleanup; ++ } ++ + if (eresult != ISC_R_SUCCESS && + (!PARTIALANSWER(client) || WANTRECURSION(client) + || eresult == DNS_R_DROP)) { +diff --git a/bin/named/server.c b/bin/named/server.c +index 0c1f08b..d195bca 100644 +--- a/bin/named/server.c ++++ b/bin/named/server.c +@@ -1722,7 +1722,8 @@ static bool + cache_sharable(dns_view_t *originview, dns_view_t *view, + bool new_zero_no_soattl, + unsigned int new_cleaning_interval, +- uint64_t new_max_cache_size) ++ uint64_t new_max_cache_size, ++ uint32_t new_stale_ttl) + { + /* + * If the cache cannot even reused for the same view, it cannot be +@@ -1737,6 +1738,7 @@ cache_sharable(dns_view_t *originview, dns_view_t *view, + */ + if (dns_cache_getcleaninginterval(originview->cache) != + new_cleaning_interval || ++ dns_cache_getservestalettl(originview->cache) != new_stale_ttl || + dns_cache_getcachesize(originview->cache) != new_max_cache_size) { + return (false); + } +@@ -3292,6 +3294,7 @@ configure_view(dns_view_t *view, dns_viewlist_t *viewlist, + size_t max_acache_size; + size_t max_adb_size; + uint32_t lame_ttl, fail_ttl; ++ uint32_t max_stale_ttl; + dns_tsig_keyring_t *ring = NULL; + dns_view_t *pview = NULL; /* Production view */ + isc_mem_t *cmctx = NULL, *hmctx = NULL; +@@ -3320,6 +3323,7 @@ configure_view(dns_view_t *view, dns_viewlist_t *viewlist, + bool old_rpz_ok = false; + isc_dscp_t dscp4 = -1, dscp6 = -1; + dns_dyndbctx_t *dctx = NULL; ++ unsigned int resolver_param; + + REQUIRE(DNS_VIEW_VALID(view)); + +@@ -3734,6 +3738,24 @@ configure_view(dns_view_t *view, dns_viewlist_t *viewlist, + if (view->maxncachettl > 7 * 24 * 3600) + view->maxncachettl = 7 * 24 * 3600; + ++ obj = NULL; ++ result = ns_config_get(maps, "max-stale-ttl", &obj); ++ INSIST(result == ISC_R_SUCCESS); ++ max_stale_ttl = cfg_obj_asuint32(obj); ++ ++ obj = NULL; ++ result = ns_config_get(maps, "stale-answer-enable", &obj); ++ INSIST(result == ISC_R_SUCCESS); ++ view->staleanswersenable = cfg_obj_asboolean(obj); ++ ++ result = dns_viewlist_find(&ns_g_server->viewlist, view->name, ++ view->rdclass, &pview); ++ if (result == ISC_R_SUCCESS) { ++ view->staleanswersok = pview->staleanswersok; ++ dns_view_detach(&pview); ++ } else ++ view->staleanswersok = dns_stale_answer_conf; ++ + /* + * Configure the view's cache. + * +@@ -3767,7 +3789,8 @@ configure_view(dns_view_t *view, dns_viewlist_t *viewlist, + nsc = cachelist_find(cachelist, cachename, view->rdclass); + if (nsc != NULL) { + if (!cache_sharable(nsc->primaryview, view, zero_no_soattl, +- cleaning_interval, max_cache_size)) { ++ cleaning_interval, max_cache_size, ++ max_stale_ttl)) { + isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, + NS_LOGMODULE_SERVER, ISC_LOG_ERROR, + "views %s and %s can't share the cache " +@@ -3866,9 +3889,15 @@ configure_view(dns_view_t *view, dns_viewlist_t *viewlist, + + dns_cache_setcleaninginterval(cache, cleaning_interval); + dns_cache_setcachesize(cache, max_cache_size); ++ dns_cache_setservestalettl(cache, max_stale_ttl); + + dns_cache_detach(&cache); + ++ obj = NULL; ++ result = ns_config_get(maps, "stale-answer-ttl", &obj); ++ INSIST(result == ISC_R_SUCCESS); ++ view->staleanswerttl = ISC_MAX(cfg_obj_asuint32(obj), 1); ++ + /* + * Resolver. + * +@@ -4057,6 +4086,21 @@ configure_view(dns_view_t *view, dns_viewlist_t *viewlist, + maxbits = 4096; + view->maxbits = maxbits; + ++ /* ++ * Set resolver retry parameters. ++ */ ++ obj = NULL; ++ CHECK(ns_config_get(maps, "resolver-retry-interval", &obj)); ++ resolver_param = cfg_obj_asuint32(obj); ++ if (resolver_param > 0) ++ dns_resolver_setretryinterval(view->resolver, resolver_param); ++ ++ obj = NULL; ++ CHECK(ns_config_get(maps, "resolver-nonbackoff-tries", &obj)); ++ resolver_param = cfg_obj_asuint32(obj); ++ if (resolver_param > 0) ++ dns_resolver_setnonbackofftries(view->resolver, resolver_param); ++ + /* + * Set supported DNSSEC algorithms. + */ +@@ -14423,3 +14467,132 @@ ns_server_dnstap(ns_server_t *server, isc_lex_t *lex, isc_buffer_t **text) { + return (ISC_R_NOTIMPLEMENTED); + #endif + } ++ ++isc_result_t ++ns_server_servestale(ns_server_t *server, isc_lex_t *lex, ++ isc_buffer_t **text) ++{ ++ char *ptr, *classtxt, *viewtxt = NULL; ++ char msg[128]; ++ dns_rdataclass_t rdclass = dns_rdataclass_in; ++ dns_view_t *view; ++ bool found = false; ++ dns_stale_answer_t staleanswersok = dns_stale_answer_conf; ++ bool wantstatus = false; ++ isc_result_t result = ISC_R_SUCCESS; ++ ++ /* Skip the command name. */ ++ ptr = next_token(lex, text); ++ if (ptr == NULL) ++ return (ISC_R_UNEXPECTEDEND); ++ ++ ptr = next_token(lex, NULL); ++ if (ptr == NULL) ++ return (ISC_R_UNEXPECTEDEND); ++ ++ if (strcasecmp(ptr, "on") == 0 || strcasecmp(ptr, "yes") == 0) { ++ staleanswersok = dns_stale_answer_yes; ++ } else if (strcasecmp(ptr, "off") == 0 || strcasecmp(ptr, "no") == 0) { ++ staleanswersok = dns_stale_answer_no; ++ } else if (strcasecmp(ptr, "reset") == 0) { ++ staleanswersok = dns_stale_answer_conf; ++ } else if (strcasecmp(ptr, "status") == 0) { ++ wantstatus = true; ++ } else ++ return (DNS_R_SYNTAX); ++ ++ /* Look for the optional class name. */ ++ classtxt = next_token(lex, text); ++ if (classtxt != NULL) { ++ /* Look for the optional view name. */ ++ viewtxt = next_token(lex, text); ++ } ++ ++ if (classtxt != NULL) { ++ isc_textregion_t r; ++ ++ r.base = classtxt; ++ r.length = strlen(classtxt); ++ result = dns_rdataclass_fromtext(&rdclass, &r); ++ if (result != ISC_R_SUCCESS) { ++ if (viewtxt == NULL) { ++ viewtxt = classtxt; ++ classtxt = NULL; ++ result = ISC_R_SUCCESS; ++ } else { ++ snprintf(msg, sizeof(msg), ++ "unknown class '%s'", classtxt); ++ (void) putstr(text, msg); ++ goto cleanup; ++ } ++ } ++ } ++ ++ result = isc_task_beginexclusive(server->task); ++ RUNTIME_CHECK(result == ISC_R_SUCCESS); ++ ++ for (view = ISC_LIST_HEAD(server->viewlist); ++ view != NULL; ++ view = ISC_LIST_NEXT(view, link)) ++ { ++ dns_ttl_t stale_ttl = 0; ++ dns_db_t *db = NULL; ++ ++ if (classtxt != NULL && rdclass != view->rdclass) ++ continue; ++ ++ if (viewtxt != NULL && strcmp(view->name, viewtxt) != 0) ++ continue; ++ ++ if (!wantstatus) { ++ view->staleanswersok = staleanswersok; ++ found = true; ++ continue; ++ } ++ ++ db = NULL; ++ dns_db_attach(view->cachedb, &db); ++ (void)dns_db_getservestalettl(db, &stale_ttl); ++ dns_db_detach(&db); ++ if (found) ++ CHECK(putstr(text, "\n")); ++ CHECK(putstr(text, view->name)); ++ CHECK(putstr(text, ": ")); ++ switch (view->staleanswersok) { ++ case dns_stale_answer_yes: ++ if (stale_ttl > 0) ++ CHECK(putstr(text, "on (rndc)")); ++ else ++ CHECK(putstr(text, "off (not-cached)")); ++ break; ++ case dns_stale_answer_no: ++ CHECK(putstr(text, "off (rndc)")); ++ break; ++ case dns_stale_answer_conf: ++ if (view->staleanswersenable && stale_ttl > 0) ++ CHECK(putstr(text, "on")); ++ else if (view->staleanswersenable) ++ CHECK(putstr(text, "off (not-cached)")); ++ else ++ CHECK(putstr(text, "off")); ++ break; ++ } ++ if (stale_ttl > 0) { ++ snprintf(msg, sizeof(msg), ++ " (stale-answer-ttl=%u max-stale-ttl=%u)", ++ view->staleanswerttl, stale_ttl); ++ CHECK(putstr(text, msg)); ++ } ++ found = true; ++ } ++ isc_task_endexclusive(ns_g_server->task); ++ ++ if (!found) ++ result = ISC_R_NOTFOUND; ++ ++cleanup: ++ if (isc_buffer_usedlength(*text) > 0) ++ (void) putnull(text); ++ ++ return (result); ++} +diff --git a/bin/named/statschannel.c b/bin/named/statschannel.c +index 4cdf7d6..5b413e7 100644 +--- a/bin/named/statschannel.c ++++ b/bin/named/statschannel.c +@@ -297,6 +297,12 @@ init_desc(void) { + "QryNXRedirRLookup"); + SET_NSSTATDESC(badcookie, "sent badcookie response", "QryBADCOOKIE"); + SET_NSSTATDESC(keytagopt, "Keytag option received", "KeyTagOpt"); ++ SET_NSSTATDESC(trystale, ++ "attempts to use stale cache data after lookup failure", ++ "QryTryStale"); ++ SET_NSSTATDESC(usedstale, ++ "successful uses of stale cache data after lookup failure", ++ "QryUsedStale"); + INSIST(i == dns_nsstatscounter_max); + + /* Initialize resolver statistics */ +diff --git a/bin/rndc/rndc.c b/bin/rndc/rndc.c +index 8083654..d519983 100644 +--- a/bin/rndc/rndc.c ++++ b/bin/rndc/rndc.c +@@ -160,6 +160,8 @@ command is one of the following:\n\ + scan Scan available network interfaces for changes.\n\ + secroots [view ...]\n\ + Write security roots to the secroots file.\n\ ++ serve-stale ( yes | no | reset ) [class [view]]\n\ ++ Control whether stale answers are returned\n\ + showzone zone [class [view]]\n\ + Print a zone's configuration.\n\ + sign zone [class [view]]\n\ +diff --git a/bin/rndc/rndc.docbook b/bin/rndc/rndc.docbook +index 06b073a..6ae8e5d 100644 +--- a/bin/rndc/rndc.docbook ++++ b/bin/rndc/rndc.docbook +@@ -688,6 +688,25 @@ + + + ++ ++ serve-stale ( on | off | reset | status) class view ++ ++ ++ Enable, disable, or reset the serving of stale answers ++ as configured in named.conf. Serving of stale answers ++ will remain disabled across named.conf ++ reloads if disabled via rndc until it is reset via rndc. ++ ++ ++ Status will report whether serving of stale answers is ++ currently enabled, disabled or not configured for a ++ view. If serving of stale records is configured then ++ the values of stale-answer-ttl and max-stale-ttl are ++ reported. ++ ++ ++ ++ + + secroots - view ... + +diff --git a/bin/tests/system/chain/prereq.sh b/bin/tests/system/chain/prereq.sh +index f3f1939..9ff3f07 100644 +--- a/bin/tests/system/chain/prereq.sh ++++ b/bin/tests/system/chain/prereq.sh +@@ -48,3 +48,10 @@ else + echo_i "This test requires the Net::DNS::Nameserver library." >&2 + exit 1 + fi ++if $PERL -e 'use Net::DNS::Nameserver;' 2>/dev/null ++then ++ : ++else ++ echo "I:This test requires the Net::DNS::Nameserver library." >&2 ++ exit 1 ++fi +diff --git a/bin/tests/system/conf.sh.in b/bin/tests/system/conf.sh.in +index f781966..d20a830 100644 +--- a/bin/tests/system/conf.sh.in ++++ b/bin/tests/system/conf.sh.in +@@ -125,7 +125,7 @@ PARALLELDIRS="dnssec rpzrecurse \ + reclimit redirect resolver rndc rootkeysentinel rpz \ + rrchecker rrl rrsetorder rsabigexponent runtime \ + sfcache smartsign sortlist \ +- spf staticstub statistics statschannel stub \ ++ spf serve-stale staticstub statistics statschannel stub \ + tcp tsig tsiggss \ + unknown upforwd verify views wildcard \ + xfer xferquota zero zonechecks" +diff --git a/bin/tests/system/dyndb/driver/db.c b/bin/tests/system/dyndb/driver/db.c +index 02aa6ab..a77c7de 100644 +--- a/bin/tests/system/dyndb/driver/db.c ++++ b/bin/tests/system/dyndb/driver/db.c +@@ -629,6 +629,8 @@ static dns_dbmethods_t sampledb_methods = { + hashsize, + NULL, + NULL, ++ NULL, ++ NULL, + }; + + /* Auxiliary driver functions. */ +diff --git a/bin/tests/system/serve-stale/.gitignore b/bin/tests/system/serve-stale/.gitignore +new file mode 100644 +index 0000000..2272eef +--- /dev/null ++++ b/bin/tests/system/serve-stale/.gitignore +@@ -0,0 +1,11 @@ ++/ans2/ans.pid ++/ans2/ans.pl ++/dig.out* ++/ns1/named.conf ++/ns3/named.conf ++/ns3/root.bk ++/rndc.out* ++named.lock ++named.pid ++named.port ++named.run +diff --git a/bin/tests/system/serve-stale/ans2/ans.pl.in b/bin/tests/system/serve-stale/ans2/ans.pl.in +new file mode 100644 +index 0000000..2b39eca +--- /dev/null ++++ b/bin/tests/system/serve-stale/ans2/ans.pl.in +@@ -0,0 +1,178 @@ ++#!/usr/bin/env perl ++# ++# Copyright (C) 2014-2016 Internet Systems Consortium, Inc. ("ISC") ++# ++# This Source Code Form is subject to the terms of the Mozilla Public ++# License, v. 2.0. If a copy of the MPL was not distributed with this ++# file, You can obtain one at http://mozilla.org/MPL/2.0/. ++ ++use strict; ++use warnings; ++ ++use IO::File; ++use IO::Socket; ++use Getopt::Long; ++use Net::DNS; ++use Time::HiRes qw(usleep nanosleep); ++ ++my $pidf = new IO::File "ans.pid", "w" or die "cannot open pid file: $!"; ++print $pidf "$$\n" or die "cannot write pid file: $!"; ++$pidf->close or die "cannot close pid file: $!"; ++sub rmpid { unlink "ans.pid"; exit 1; }; ++ ++$SIG{INT} = \&rmpid; ++$SIG{TERM} = \&rmpid; ++ ++my $send_response = 1; ++ ++my $localaddr = "10.53.0.2"; ++my $localport = @PORT@; ++my $udpsock = IO::Socket::INET->new(LocalAddr => "$localaddr", ++ LocalPort => $localport, Proto => "udp", Reuse => 1) or die "$!"; ++ ++# ++# Delegation ++# ++my $SOA = "example 300 IN SOA . . 0 0 0 0 300"; ++my $NS = "example 300 IN NS ns.example"; ++my $A = "ns.example 300 IN A $localaddr"; ++# ++# Records to be TTL stretched ++# ++my $TXT = "data.example 1 IN TXT \"A text record with a 1 second ttl\""; ++my $negSOA = "example 1 IN SOA . . 0 0 0 0 300"; ++ ++sub reply_handler { ++ my ($qname, $qclass, $qtype) = @_; ++ my ($rcode, @ans, @auth, @add); ++ ++ print ("request: $qname/$qtype\n"); ++ STDOUT->flush(); ++ ++ # Control whether we send a response or not. ++ # We always respond to control commands. ++ if ($qname eq "enable" ) { ++ if ($qtype eq "TXT") { ++ $send_response = 1; ++ my $rr = new Net::DNS::RR("$qname 0 $qclass TXT \"$send_response\""); ++ push @ans, $rr; ++ } ++ $rcode = "NOERROR"; ++ return ($rcode, \@ans, \@auth, \@add, { aa => 1 }); ++ } elsif ($qname eq "disable" ) { ++ if ($qtype eq "TXT") { ++ $send_response = 0; ++ my $rr = new Net::DNS::RR("$qname 0 $qclass TXT \"$send_response\""); ++ push @ans, $rr; ++ } ++ $rcode = "NOERROR"; ++ return ($rcode, \@ans, \@auth, \@add, { aa => 1 }); ++ } ++ ++ # If we are not responding to queries we are done. ++ return if (!$send_response); ++ ++ # Construct the response and send it. ++ if ($qname eq "ns.example" ) { ++ if ($qtype eq "A") { ++ my $rr = new Net::DNS::RR($A); ++ push @ans, $rr; ++ } else { ++ my $rr = new Net::DNS::RR($SOA); ++ push @auth, $rr; ++ } ++ $rcode = "NOERROR"; ++ } elsif ($qname eq "example") { ++ if ($qtype eq "NS") { ++ my $rr = new Net::DNS::RR($NS); ++ push @auth, $rr; ++ $rr = new Net::DNS::RR($A); ++ push @add, $rr; ++ } elsif ($qtype eq "SOA") { ++ my $rr = new Net::DNS::RR($SOA); ++ push @ans, $rr; ++ } else { ++ my $rr = new Net::DNS::RR($SOA); ++ push @auth, $rr; ++ } ++ $rcode = "NOERROR"; ++ } elsif ($qname eq "nodata.example") { ++ my $rr = new Net::DNS::RR($negSOA); ++ push @auth, $rr; ++ $rcode = "NOERROR"; ++ } elsif ($qname eq "data.example") { ++ if ($qtype eq "TXT") { ++ my $rr = new Net::DNS::RR($TXT); ++ push @ans, $rr; ++ } else { ++ my $rr = new Net::DNS::RR($negSOA); ++ push @auth, $rr; ++ } ++ $rcode = "NOERROR"; ++ } elsif ($qname eq "nxdomain.example") { ++ my $rr = new Net::DNS::RR($negSOA); ++ push @auth, $rr; ++ $rcode = "NXDOMAIN"; ++ } else { ++ my $rr = new Net::DNS::RR($SOA); ++ push @auth, $rr; ++ $rcode = "NXDOMAIN"; ++ } ++ ++ # mark the answer as authoritive (by setting the 'aa' flag ++ return ($rcode, \@ans, \@auth, \@add, { aa => 1 }); ++} ++ ++GetOptions( ++ 'port=i' => \$localport, ++); ++ ++my $rin; ++my $rout; ++ ++for (;;) { ++ $rin = ''; ++ vec($rin, fileno($udpsock), 1) = 1; ++ ++ select($rout = $rin, undef, undef, undef); ++ ++ if (vec($rout, fileno($udpsock), 1)) { ++ my ($buf, $request, $err); ++ $udpsock->recv($buf, 512); ++ ++ if ($Net::DNS::VERSION > 0.68) { ++ $request = new Net::DNS::Packet(\$buf, 0); ++ $@ and die $@; ++ } else { ++ my $err; ++ ($request, $err) = new Net::DNS::Packet(\$buf, 0); ++ $err and die $err; ++ } ++ ++ my @questions = $request->question; ++ my $qname = $questions[0]->qname; ++ my $qclass = $questions[0]->qclass; ++ my $qtype = $questions[0]->qtype; ++ my $id = $request->header->id; ++ ++ my ($rcode, $ans, $auth, $add, $headermask) = reply_handler($qname, $qclass, $qtype); ++ ++ if (!defined($rcode)) { ++ print " Silently ignoring query\n"; ++ next; ++ } ++ ++ my $reply = Net::DNS::Packet->new(); ++ $reply->header->qr(1); ++ $reply->header->aa(1) if $headermask->{'aa'}; ++ $reply->header->id($id); ++ $reply->header->rcode($rcode); ++ $reply->push("question", @questions); ++ $reply->push("answer", @$ans) if $ans; ++ $reply->push("authority", @$auth) if $auth; ++ $reply->push("additional", @$add) if $add; ++ ++ my $num_chars = $udpsock->send($reply->data); ++ print " Sent $num_chars bytes via UDP\n"; ++ } ++} +diff --git a/bin/tests/system/serve-stale/clean.sh b/bin/tests/system/serve-stale/clean.sh +new file mode 100644 +index 0000000..2397326 +--- /dev/null ++++ b/bin/tests/system/serve-stale/clean.sh +@@ -0,0 +1,15 @@ ++# Copyright (C) 2017 Internet Systems Consortium, Inc. ("ISC") ++# ++# This Source Code Form is subject to the terms of the Mozilla Public ++# License, v. 2.0. If a copy of the MPL was not distributed with this ++# file, You can obtain one at http://mozilla.org/MPL/2.0/. ++ ++rm -f test.output ++rm -f dig.out.test* ++rm -f ans2/ans.pl ++rm -f ns3/root.bk ++rm -f rndc.out.test* ++rm -f ns*/named.memstats ++rm -f ns*/managed-keys.bind ++rm -f ns*/named.conf ++rm -f ns*/named.run +diff --git a/bin/tests/system/serve-stale/ns1/named1.conf.in b/bin/tests/system/serve-stale/ns1/named1.conf.in +new file mode 100644 +index 0000000..8a75a10 +--- /dev/null ++++ b/bin/tests/system/serve-stale/ns1/named1.conf.in +@@ -0,0 +1,35 @@ ++/* ++ * Copyright (C) 2017 Internet Systems Consortium, Inc. ("ISC") ++ * ++ * This Source Code Form is subject to the terms of the Mozilla Public ++ * License, v. 2.0. If a copy of the MPL was not distributed with this ++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. ++ */ ++ ++key rndc_key { ++ secret "1234abcd8765"; ++ algorithm hmac-sha256; ++}; ++ ++controls { ++ inet 10.53.0.1 port @CONTROLPORT@ allow { any; } keys { rndc_key; }; ++}; ++ ++options { ++ query-source address 10.53.0.1; ++ notify-source 10.53.0.1; ++ transfer-source 10.53.0.1; ++ port @PORT@; ++ pid-file "named.pid"; ++ listen-on { 10.53.0.1; }; ++ listen-on-v6 { none; }; ++ recursion yes; ++ max-stale-ttl 3600; ++ stale-answer-ttl 1; ++ stale-answer-enable yes; ++}; ++ ++zone "." { ++ type master; ++ file "root.db"; ++}; +diff --git a/bin/tests/system/serve-stale/ns1/named2.conf.in b/bin/tests/system/serve-stale/ns1/named2.conf.in +new file mode 100644 +index 0000000..072e6ec +--- /dev/null ++++ b/bin/tests/system/serve-stale/ns1/named2.conf.in +@@ -0,0 +1,35 @@ ++/* ++ * Copyright (C) 2017 Internet Systems Consortium, Inc. ("ISC") ++ * ++ * This Source Code Form is subject to the terms of the Mozilla Public ++ * License, v. 2.0. If a copy of the MPL was not distributed with this ++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. ++ */ ++ ++key rndc_key { ++ secret "1234abcd8765"; ++ algorithm hmac-sha256; ++}; ++ ++controls { ++ inet 10.53.0.1 port @CONTROLPORT@ allow { any; } keys { rndc_key; }; ++}; ++ ++options { ++ query-source address 10.53.0.1; ++ notify-source 10.53.0.1; ++ transfer-source 10.53.0.1; ++ port @PORT@; ++ pid-file "named.pid"; ++ listen-on { 10.53.0.1; }; ++ listen-on-v6 { none; }; ++ recursion yes; ++ max-stale-ttl 7200; ++ stale-answer-ttl 2; ++ stale-answer-enable yes; ++}; ++ ++zone "." { ++ type master; ++ file "root.db"; ++}; +diff --git a/bin/tests/system/serve-stale/ns1/root.db b/bin/tests/system/serve-stale/ns1/root.db +new file mode 100644 +index 0000000..eb9ad3e +--- /dev/null ++++ b/bin/tests/system/serve-stale/ns1/root.db +@@ -0,0 +1,5 @@ ++. 300 SOA . . 0 0 0 0 0 ++. 300 NS ns.nil. ++ns.nil. 300 A 10.53.0.1 ++example. 300 NS ns.example. ++ns.example. 300 A 10.53.0.2 +diff --git a/bin/tests/system/serve-stale/ns3/named.conf.in b/bin/tests/system/serve-stale/ns3/named.conf.in +new file mode 100644 +index 0000000..24a3293 +--- /dev/null ++++ b/bin/tests/system/serve-stale/ns3/named.conf.in +@@ -0,0 +1,35 @@ ++/* ++ * Copyright (C) 2017 Internet Systems Consortium, Inc. ("ISC") ++ * ++ * This Source Code Form is subject to the terms of the Mozilla Public ++ * License, v. 2.0. If a copy of the MPL was not distributed with this ++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. ++ */ ++ ++key rndc_key { ++ secret "1234abcd8765"; ++ algorithm hmac-sha256; ++}; ++ ++controls { ++ inet 10.53.0.3 port @CONTROLPORT@ allow { any; } keys { rndc_key; }; ++}; ++ ++options { ++ query-source address 10.53.0.3; ++ notify-source 10.53.0.3; ++ transfer-source 10.53.0.3; ++ port @PORT@; ++ pid-file "named.pid"; ++ listen-on { 10.53.0.3; }; ++ listen-on-v6 { none; }; ++ recursion yes; ++ // max-stale-ttl 3600; ++ // stale-answer-ttl 3; ++}; ++ ++zone "." { ++ type slave; ++ masters { 10.53.0.1; }; ++ file "root.bk"; ++}; +diff --git a/bin/tests/system/serve-stale/prereq.sh b/bin/tests/system/serve-stale/prereq.sh +new file mode 100644 +index 0000000..a3bbef8 +--- /dev/null ++++ b/bin/tests/system/serve-stale/prereq.sh +@@ -0,0 +1,38 @@ ++#!/bin/sh ++# ++# Copyright (C) 2011, 2012, 2014, 2016 Internet Systems Consortium, Inc. ("ISC") ++# ++# This Source Code Form is subject to the terms of the Mozilla Public ++# License, v. 2.0. If a copy of the MPL was not distributed with this ++# file, You can obtain one at http://mozilla.org/MPL/2.0/. ++ ++SYSTEMTESTTOP=.. ++. $SYSTEMTESTTOP/conf.sh ++ ++if $PERL -e 'use Net::DNS;' 2>/dev/null ++then ++ if $PERL -e 'use Net::DNS; die if ($Net::DNS::VERSION >= 0.69 && $Net::DNS::VERSION <= 0.74);' 2>/dev/null ++ then ++ : ++ else ++ echo "I:Net::DNS versions 0.69 to 0.74 have bugs that cause this test to fail: please update." >&2 ++ exit 1 ++ fi ++else ++ echo "I:This test requires the Net::DNS library." >&2 ++ exit 1 ++fi ++if $PERL -e 'use Net::DNS::Nameserver;' 2>/dev/null ++then ++ : ++else ++ echo "I:This test requires the Net::DNS::Nameserver library." >&2 ++ exit 1 ++fi ++if $PERL -e 'use Time::HiRes;' 2>/dev/null ++then ++ : ++else ++ echo "I:This test requires the Time::HiRes library." >&2 ++ exit 1 ++fi +diff --git a/bin/tests/system/serve-stale/setup.sh b/bin/tests/system/serve-stale/setup.sh +new file mode 100644 +index 0000000..690f43c +--- /dev/null ++++ b/bin/tests/system/serve-stale/setup.sh +@@ -0,0 +1,13 @@ ++#!/bin/sh ++# Copyright (C) 2017 Internet Systems Consortium, Inc. ("ISC") ++# ++# This Source Code Form is subject to the terms of the Mozilla Public ++# License, v. 2.0. If a copy of the MPL was not distributed with this ++# file, You can obtain one at http://mozilla.org/MPL/2.0/. ++ ++SYSTEMTESTTOP=.. ++. $SYSTEMTESTTOP/conf.sh ++ ++copy_setports ns1/named1.conf.in ns1/named.conf ++copy_setports ans2/ans.pl.in ans2/ans.pl ++copy_setports ns3/named.conf.in ns3/named.conf +diff --git a/bin/tests/system/serve-stale/tests.sh b/bin/tests/system/serve-stale/tests.sh +new file mode 100755 +index 0000000..201c996 +--- /dev/null ++++ b/bin/tests/system/serve-stale/tests.sh +@@ -0,0 +1,536 @@ ++#!/bin/sh ++# ++# Copyright (C) 2000, 2001, 2004, 2007, 2009-2016 Internet Systems Consortium, Inc. ("ISC") ++# ++# This Source Code Form is subject to the terms of the Mozilla Public ++# License, v. 2.0. If a copy of the MPL was not distributed with this ++# file, You can obtain one at http://mozilla.org/MPL/2.0/. ++ ++SYSTEMTESTTOP=.. ++. $SYSTEMTESTTOP/conf.sh ++ ++while getopts "p:c:" flag; do ++ case "$flag" in ++ p) port=$OPTARG ;; ++ c) controlport=$OPTARG ;; ++ *) exit 1 ;; ++ esac ++done ++ ++RNDCCMD="$RNDC -c $SYSTEMTESTTOP/common/rndc.conf -p ${CONTROLPORT} -s" ++ ++echo "RNDCCMD: ${RNDCCMD}" ++ ++status=0 ++n=0 ++ ++#echo "I:check ans.pl server ($n)" ++#$DIG -p ${PORT} @10.53.0.2 example NS ++#$DIG -p ${PORT} @10.53.0.2 example SOA ++#$DIG -p ${PORT} @10.53.0.2 ns.example A ++#$DIG -p ${PORT} @10.53.0.2 ns.example AAAA ++#$DIG -p ${PORT} @10.53.0.2 txt enable ++#$DIG -p ${PORT} @10.53.0.2 txt disable ++#$DIG -p ${PORT} @10.53.0.2 ns.example AAAA ++#$DIG -p ${PORT} @10.53.0.2 txt enable ++#$DIG -p ${PORT} @10.53.0.2 ns.example AAAA ++##$DIG -p ${PORT} @10.53.0.2 data.example TXT ++#$DIG -p ${PORT} @10.53.0.2 nodata.example TXT ++#$DIG -p ${PORT} @10.53.0.2 nxdomain.example TXT ++ ++n=`expr $n + 1` ++echo "I:prime cache data.example ($n)" ++ret=0 ++$DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$n ++grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 ++grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:prime cache nodata.example ($n)" ++ret=0 ++$DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$n ++grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 ++grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:prime cache nxdomain.example ($n)" ++ret=0 ++$DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$n ++grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1 ++grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:disable responses from authoritative server ($n)" ++ret=0 ++$DIG -p ${PORT} @10.53.0.2 txt disable > dig.out.test$n ++grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1 ++grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++sleep 1 ++ ++n=`expr $n + 1` ++echo "I:check 'rndc serve-stale status' ($n)" ++ret=0 ++$RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1 ++grep '_default: on (stale-answer-ttl=1 max-stale-ttl=3600)' rndc.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:check stale data.example ($n)" ++ret=0 ++$DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$n ++grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 ++grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1 ++grep "example.*1.*IN" dig.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:check stale nodata.example ($n)" ++ret=0 ++$DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$n ++grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 ++grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 ++grep "example.*1.*IN" dig.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:check stale nxdomain.example ($n)" ++ret=0 ++$DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$n ++grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1 ++grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 ++grep "example.*1.*IN" dig.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:running 'rndc serve-stale off' ($n)" ++ret=0 ++$RNDCCMD 10.53.0.1 serve-stale off || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:check 'rndc serve-stale status' ($n)" ++ret=0 ++$RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1 ++grep '_default: off (rndc) (stale-answer-ttl=1 max-stale-ttl=3600)' rndc.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:check stale data.example (serve-stale off) ($n)" ++ret=0 ++$DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$n ++grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:check stale nodata.example (serve-stale off) ($n)" ++ret=0 ++$DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$n ++grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:check stale nxdomain.example (serve-stale off) ($n)" ++ret=0 ++$DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$n ++grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:running 'rndc serve-stale on' ($n)" ++ret=0 ++$RNDCCMD 10.53.0.1 serve-stale on || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:check 'rndc serve-stale status' ($n)" ++ret=0 ++$RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1 ++grep '_default: on (rndc) (stale-answer-ttl=1 max-stale-ttl=3600)' rndc.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:check stale data.example (serve-stale on) ($n)" ++ret=0 ++$DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$n ++grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 ++grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1 ++grep "example.*1.*IN" dig.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:check stale nodata.example (serve-stale on) ($n)" ++ret=0 ++$DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$n ++grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 ++grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 ++grep "example.*1.*IN" dig.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:check stale nxdomain.example (serve-stale on) ($n)" ++ret=0 ++$DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$n ++grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1 ++grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 ++grep "example.*1.*IN" dig.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:running 'rndc serve-stale no' ($n)" ++ret=0 ++$RNDCCMD 10.53.0.1 serve-stale no || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:check 'rndc serve-stale status' ($n)" ++ret=0 ++$RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1 ++grep '_default: off (rndc) (stale-answer-ttl=1 max-stale-ttl=3600)' rndc.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:check stale data.example (serve-stale no) ($n)" ++ret=0 ++$DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$n ++grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:check stale nodata.example (serve-stale no) ($n)" ++ret=0 ++$DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$n ++grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:check stale nxdomain.example (serve-stale no) ($n)" ++ret=0 ++$DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$n ++grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:running 'rndc serve-stale yes' ($n)" ++ret=0 ++$RNDCCMD 10.53.0.1 serve-stale yes || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:check 'rndc serve-stale status' ($n)" ++ret=0 ++$RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1 ++grep '_default: on (rndc) (stale-answer-ttl=1 max-stale-ttl=3600)' rndc.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:check stale data.example (serve-stale yes) ($n)" ++ret=0 ++$DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$n ++grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 ++grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1 ++grep "example.*1.*IN" dig.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:check stale nodata.example (serve-stale yes) ($n)" ++ret=0 ++$DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$n ++grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 ++grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 ++grep "example.*1.*IN" dig.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:check stale nxdomain.example (serve-stale yes) ($n)" ++ret=0 ++$DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$n ++grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1 ++grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 ++grep "example.*1.*IN" dig.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:running 'rndc serve-stale off' ($n)" ++ret=0 ++$RNDCCMD 10.53.0.1 serve-stale off || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:running 'rndc serve-stale reset' ($n)" ++ret=0 ++$RNDCCMD 10.53.0.1 serve-stale reset || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:check 'rndc serve-stale status' ($n)" ++ret=0 ++$RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1 ++grep '_default: on (stale-answer-ttl=1 max-stale-ttl=3600)' rndc.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:check stale data.example (serve-stale reset) ($n)" ++ret=0 ++$DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$n ++grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 ++grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1 ++grep "example.*1.*IN" dig.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:check stale nodata.example (serve-stale reset) ($n)" ++ret=0 ++$DIG -p ${PORT} @10.53.0.1 nodata.example TXT > dig.out.test$n ++grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 ++grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 ++grep "example.*1.*IN" dig.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:check stale nxdomain.example (serve-stale reset) ($n)" ++ret=0 ++$DIG -p ${PORT} @10.53.0.1 nxdomain.example TXT > dig.out.test$n ++grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1 ++grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 ++grep "example.*1.*IN" dig.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:running 'rndc serve-stale off' ($n)" ++ret=0 ++$RNDCCMD 10.53.0.1 serve-stale off || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:check 'rndc serve-stale status' ($n)" ++ret=0 ++$RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1 ++grep '_default: off (rndc) (stale-answer-ttl=1 max-stale-ttl=3600)' rndc.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:updating ns1/named.conf ($n)" ++ret=0 ++sed -e "s/@PORT@/${PORT}/g;s/@CONTROLPORT@/${CONTROLPORT}/g" < ns1/named2.conf.in > ns1/named.conf ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:running 'rndc reload' ($n)" ++ret=0 ++$RNDCCMD 10.53.0.1 reload > rndc.out.test$n 2>&1 || ret=1 ++grep "server reload successful" rndc.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:check 'rndc serve-stale status' ($n)" ++ret=0 ++$RNDCCMD 10.53.0.1 serve-stale status > rndc.out.test$n 2>&1 || ret=1 ++grep '_default: off (rndc) (stale-answer-ttl=2 max-stale-ttl=7200)' rndc.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:check 'rndc serve-stale' ($n)" ++ret=0 ++$RNDCCMD 10.53.0.1 serve-stale > rndc.out.test$n 2>&1 && ret=1 ++grep "unexpected end of input" rndc.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:check 'rndc serve-stale unknown' ($n)" ++ret=0 ++$RNDCCMD 10.53.0.1 serve-stale unknown > rndc.out.test$n 2>&1 && ret=1 ++grep "syntax error" rndc.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo_i "flush cache, re-enable serve-stale and query again ($n)" ++ret=0 ++$RNDCCMD 10.53.0.1 flushtree example > rndc.out.test$n.1 2>&1 || ret=1 ++$RNDCCMD 10.53.0.1 serve-stale on > rndc.out.test$n.2 2>&1 || ret=1 ++$DIG -p ${PORT} @10.53.0.1 data.example TXT > dig.out.test$n ++grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1 ++grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo_i "failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++ret=0 ++$DIG -p ${PORT} @10.53.0.2 txt enable > dig.out.test$n ++grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1 ++grep "TXT.\"1\"" dig.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:prime cache data.example (max-stale-ttl default) ($n)" ++ret=0 ++$DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$n ++grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 ++grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1 ++grep "example.*1.*IN" dig.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:prime cache nodata.example (max-stale-ttl default) ($n)" ++ret=0 ++$DIG -p ${PORT} @10.53.0.3 nodata.example TXT > dig.out.test$n ++grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 ++grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 ++grep "example.*1.*IN" dig.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:prime cache nxdomain.example (max-stale-ttl default) ($n)" ++ret=0 ++$DIG -p ${PORT} @10.53.0.3 nxdomain.example TXT > dig.out.test$n ++grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1 ++grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 ++grep "example.*1.*IN" dig.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:disable responses from authoritative server ($n)" ++ret=0 ++$DIG -p ${PORT} @10.53.0.2 txt disable > dig.out.test$n ++grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1 ++grep "TXT.\"0\"" dig.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++sleep 1 ++ ++n=`expr $n + 1` ++echo "I:check 'rndc serve-stale status' ($n)" ++ret=0 ++$RNDCCMD 10.53.0.3 serve-stale status > rndc.out.test$n 2>&1 || ret=1 ++grep '_default: off (stale-answer-ttl=1 max-stale-ttl=604800)' rndc.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:check fail of data.example (max-stale-ttl default) ($n)" ++ret=0 ++$DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$n ++grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1 ++grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:check fail of nodata.example (max-stale-ttl default) ($n)" ++ret=0 ++$DIG -p ${PORT} @10.53.0.3 nodata.example TXT > dig.out.test$n ++grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1 ++grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:check fail of nxdomain.example (max-stale-ttl default) ($n)" ++ret=0 ++$DIG -p ${PORT} @10.53.0.3 nxdomain.example TXT > dig.out.test$n ++grep "status: SERVFAIL" dig.out.test$n > /dev/null || ret=1 ++grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:check 'rndc serve-stale on' ($n)" ++ret=0 ++$RNDCCMD 10.53.0.3 serve-stale on > rndc.out.test$n 2>&1 || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:check 'rndc serve-stale status' ($n)" ++ret=0 ++$RNDCCMD 10.53.0.3 serve-stale status > rndc.out.test$n 2>&1 || ret=1 ++grep '_default: on (rndc) (stale-answer-ttl=1 max-stale-ttl=604800)' rndc.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:check data.example (max-stale-ttl default) ($n)" ++ret=0 ++$DIG -p ${PORT} @10.53.0.3 data.example TXT > dig.out.test$n ++grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 ++grep "ANSWER: 1," dig.out.test$n > /dev/null || ret=1 ++grep "example.*1.*IN" dig.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:check nodata.example (max-stale-ttl default) ($n)" ++ret=0 ++$DIG -p ${PORT} @10.53.0.3 nodata.example TXT > dig.out.test$n ++grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 ++grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 ++grep "example.*1.*IN" dig.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++n=`expr $n + 1` ++echo "I:check nxdomain.example (max-stale-ttl default) ($n)" ++ret=0 ++$DIG -p ${PORT} @10.53.0.3 nxdomain.example TXT > dig.out.test$n ++grep "status: NXDOMAIN" dig.out.test$n > /dev/null || ret=1 ++grep "ANSWER: 0," dig.out.test$n > /dev/null || ret=1 ++grep "example.*1.*IN" dig.out.test$n > /dev/null || ret=1 ++if [ $ret != 0 ]; then echo "I:failed"; fi ++status=`expr $status + $ret` ++ ++echo "I:exit status: $status" ++[ $status -eq 0 ] || exit 1 +diff --git a/doc/arm/Bv9ARM-book.xml b/doc/arm/Bv9ARM-book.xml +index 539973c..8528649 100644 +--- a/doc/arm/Bv9ARM-book.xml ++++ b/doc/arm/Bv9ARM-book.xml +@@ -4376,6 +4376,9 @@ badresp:1,adberr:0,findfail:0,valfail:0] + statement in the named.conf file: +
+ ++ [ max-stale-ttl number ; ] ++ [ stale-answer-enable yes_or_no ; ] ++ [ stale-answer-ttl number ; ] + + +
<command>options</command> Statement Definition and +@@ -4469,6 +4472,7 @@ badresp:1,adberr:0,findfail:0,valfail:0] + <command>dnssec-validation</command>, + <command>max-cache-ttl</command>, + <command>max-ncache-ttl</command>, ++ <command>max-stale-ttl</command>, + <command>max-cache-size</command>, and + <command>zero-no-soa-ttl</command>. + </para> +@@ -5480,7 +5484,6 @@ options { + </listitem> + </varlistentry> + +- + <varlistentry> + <term><command>max-zone-ttl</command></term> + <listitem> +@@ -5516,6 +5519,21 @@ options { + </listitem> + </varlistentry> + ++ <varlistentry> ++ <term><command>stale-answer-ttl</command></term> ++ <listitem> ++ <para> ++ Specifies the TTL to be returned on stale answers. ++ The default is 1 second. The minimal allowed is ++ also 1 second; a value of 0 will be updated silently ++ to 1 second. For stale answers to be returned ++ <option>max-stale-ttl</option> must be set to a ++ non zero value and they must not have been disabled ++ by <command>rndc</command>. ++ </para> ++ </listitem> ++ </varlistentry> ++ + <varlistentry> + <term><command>serial-update-method</command></term> + <listitem> +@@ -6275,6 +6293,22 @@ options { + </listitem> + </varlistentry> + ++ <varlistentry> ++ <term><command>serve-stale-enable</command></term> ++ <listitem> ++ <para> ++ Enable the returning of stale answers when the ++ nameservers for the zone are not answering. This ++ is off by default but can be enabled/disabled via ++ <command>rndc server-stale on</command> and ++ <command>rndc server-stale off</command> which ++ override the named.conf setting. <command>rndc ++ server-stale reset</command> will restore control ++ via named.conf. ++ </para> ++ </listitem> ++ </varlistentry> ++ + <varlistentry> + <term><command>nocookie-udp-size</command></term> + <listitem> +@@ -7483,14 +7517,20 @@ options { + <term><command>resolver-query-timeout</command></term> + <listitem> + <para> +- The amount of time in seconds that the resolver ++ The amount of time in milliseconds that the resolver + will spend attempting to resolve a recursive + query before failing. The default and minimum +- is <literal>10</literal> and the maximum is +- <literal>30</literal>. Setting it to ++ is <literal>10000</literal> and the maximum is ++ <literal>30000</literal>. Setting it to + <literal>0</literal> will result in the default + being used. + </para> ++ <para> ++ This value was originally specified in seconds. ++ Values less than or equal to 300 will be be treated ++ as seconds and converted to milliseconds before ++ applying the above limits. ++ </para> + </listitem> + </varlistentry> + </variablelist> +@@ -8976,6 +9016,27 @@ avoid-v6-udp-ports { 40000; range 50000 60000; }; + </listitem> + </varlistentry> + ++ <varlistentry> ++ <term><command>max-stale-ttl</command></term> ++ <listitem> ++ <para> ++ Sets the maximum time for which the server will ++ retain records past their normal expiry to ++ return them as stale records when the servers ++ for those records are not reachable. The default ++ is to not retain the record. ++ </para> ++ <para> ++ <command>rndc serve-stale</command> can be used ++ to disable and re-enable the serving of stale ++ records at runtime. Reloading or reconfiguring ++ <command>named</command> will not re-enable serving ++ of stale records if they have been disabled via ++ <command>rndc</command>. ++ </para> ++ </listitem> ++ </varlistentry> ++ + <varlistentry> + <term><command>min-roots</command></term> + <listitem> +diff --git a/doc/arm/logging-categories.xml b/doc/arm/logging-categories.xml +index 181def7..59f6afb 100644 +--- a/doc/arm/logging-categories.xml ++++ b/doc/arm/logging-categories.xml +@@ -311,6 +311,17 @@ + </para> + </entry> + </row> ++ <row rowsep="0"> ++ <entry colname="1"> ++ <para><command>serve-stale</command></para> ++ </entry> ++ <entry colname="2"> ++ <para> ++ Whether or not a stale answer is used ++ following a resolver failure. ++ </para> ++ </entry> ++ </row> + <row rowsep="0"> + <entry colname="1"> + <para><command>spill</command></para> +diff --git a/doc/arm/notes-rh-changes.xml b/doc/arm/notes-rh-changes.xml +index 11c3a7c..ba3c2cc 100644 +--- a/doc/arm/notes-rh-changes.xml ++++ b/doc/arm/notes-rh-changes.xml +@@ -13,6 +13,9 @@ + <section xml:id="relnotes_rh_changes"><info><title>Red Hat Specific Changes + + ++ ++ This version includes some features not present in releases by ISC. ++ + + By default, BIND now uses the random number generation functions + in the cryptographic library (i.e., OpenSSL or a PKCS#11 +@@ -37,7 +40,16 @@ + case /dev/random will be the default + entropy source. [RT #31459] [RT #46047] + +- ++ ++ When acting as a recursive resolver, named ++ can now continue returning answers whose TTLs have expired ++ when the authoritative server is under attack and unable to ++ respond. This is controlled by the ++ stale-answer-enable, ++ stale-answer-ttl and ++ max-stale-ttl options. [RT #44790] ++ ++ + +
+ +diff --git a/doc/misc/options b/doc/misc/options +index e11beed..fde93c7 100644 +--- a/doc/misc/options ++++ b/doc/misc/options +@@ -225,6 +225,7 @@ options { + max-refresh-time ; + max-retry-time ; + max-rsa-exponent-size ; ++ max-stale-ttl ; + max-transfer-idle-in ; + max-transfer-idle-out ; + max-transfer-time-in ; +@@ -298,7 +299,9 @@ options { + request-sit ; // obsolete + require-server-cookie ; + reserved-sockets ; ++ resolver-nonbackoff-tries ; + resolver-query-timeout ; ++ resolver-retry-interval ; + response-policy { zone [ log ] [ max-policy-ttl + ] [ policy ( cname | disabled | drop | given | no-op + | nodata | nxdomain | passthru | tcp-only ) ] [ +@@ -328,6 +331,8 @@ options { + sit-secret ; // obsolete + sortlist { ; ... }; + stacksize ( default | unlimited | ); ++ stale-answer-enable ; ++ stale-answer-ttl ; + startup-notify-rate ; + statistics-file ; + statistics-interval ; // not yet implemented +@@ -539,6 +544,7 @@ view [ ] { + max-recursion-queries ; + max-refresh-time ; + max-retry-time ; ++ max-stale-ttl ; + max-transfer-idle-in ; + max-transfer-idle-out ; + max-transfer-time-in ; +@@ -600,7 +606,9 @@ view [ ] { + request-nsid ; + request-sit ; // obsolete + require-server-cookie ; ++ resolver-nonbackoff-tries ; + resolver-query-timeout ; ++ resolver-retry-interval ; + response-policy { zone [ log ] [ max-policy-ttl + ] [ policy ( cname | disabled | drop | given | no-op + | nodata | nxdomain | passthru | tcp-only ) ] [ +@@ -655,6 +663,8 @@ view [ ] { + sig-signing-type ; + sig-validity-interval [ ]; + sortlist { ; ... }; ++ stale-answer-enable ; ++ stale-answer-ttl ; + suppress-initial-notify ; // not yet implemented + topology { ; ... }; // not implemented + transfer-format ( many-answers | one-answer ); +diff --git a/lib/bind9/check.c b/lib/bind9/check.c +index 5c057a4..7b82618 100644 +--- a/lib/bind9/check.c ++++ b/lib/bind9/check.c +@@ -99,7 +99,8 @@ check_orderent(const cfg_obj_t *ent, isc_log_t *logctx) { + cfg_obj_log(obj, logctx, ISC_LOG_ERROR, + "rrset-order: invalid class '%s'", + r.base); +- result = ISC_R_FAILURE; ++ if (result == ISC_R_SUCCESS) ++ result = ISC_R_FAILURE; + } + } + +@@ -112,7 +113,8 @@ check_orderent(const cfg_obj_t *ent, isc_log_t *logctx) { + cfg_obj_log(obj, logctx, ISC_LOG_ERROR, + "rrset-order: invalid type '%s'", + r.base); +- result = ISC_R_FAILURE; ++ if (result == ISC_R_SUCCESS) ++ result = ISC_R_FAILURE; + } + } + +@@ -126,7 +128,8 @@ check_orderent(const cfg_obj_t *ent, isc_log_t *logctx) { + if (tresult != ISC_R_SUCCESS) { + cfg_obj_log(obj, logctx, ISC_LOG_ERROR, + "rrset-order: invalid name '%s'", str); +- result = ISC_R_FAILURE; ++ if (result == ISC_R_SUCCESS) ++ result = ISC_R_FAILURE; + } + } + +@@ -135,14 +138,16 @@ check_orderent(const cfg_obj_t *ent, isc_log_t *logctx) { + strcasecmp("order", cfg_obj_asstring(obj)) != 0) { + cfg_obj_log(ent, logctx, ISC_LOG_ERROR, + "rrset-order: keyword 'order' missing"); +- result = ISC_R_FAILURE; ++ if (result == ISC_R_SUCCESS) ++ result = ISC_R_FAILURE; + } + + obj = cfg_tuple_get(ent, "ordering"); + if (!cfg_obj_isstring(obj)) { + cfg_obj_log(ent, logctx, ISC_LOG_ERROR, + "rrset-order: missing ordering"); +- result = ISC_R_FAILURE; ++ if (result == ISC_R_SUCCESS) ++ result = ISC_R_FAILURE; + } else if (strcasecmp(cfg_obj_asstring(obj), "fixed") == 0) { + #if !DNS_RDATASET_FIXED + cfg_obj_log(obj, logctx, ISC_LOG_WARNING, +@@ -154,7 +159,8 @@ check_orderent(const cfg_obj_t *ent, isc_log_t *logctx) { + cfg_obj_log(obj, logctx, ISC_LOG_ERROR, + "rrset-order: invalid order '%s'", + cfg_obj_asstring(obj)); +- result = ISC_R_FAILURE; ++ if (result == ISC_R_SUCCESS) ++ result = ISC_R_FAILURE; + } + return (result); + } +@@ -174,7 +180,7 @@ check_order(const cfg_obj_t *options, isc_log_t *logctx) { + element = cfg_list_next(element)) + { + tresult = check_orderent(cfg_listelt_value(element), logctx); +- if (tresult != ISC_R_SUCCESS) ++ if (result == ISC_R_SUCCESS && tresult != ISC_R_SUCCESS) + result = tresult; + } + return (result); +@@ -204,7 +210,8 @@ check_dual_stack(const cfg_obj_t *options, isc_log_t *logctx) { + if (val > UINT16_MAX) { + cfg_obj_log(obj, logctx, ISC_LOG_ERROR, + "port '%u' out of range", val); +- result = ISC_R_FAILURE; ++ if (result == ISC_R_SUCCESS) ++ result = ISC_R_RANGE; + } + } + obj = cfg_tuple_get(alternates, "addresses"); +@@ -224,7 +231,8 @@ check_dual_stack(const cfg_obj_t *options, isc_log_t *logctx) { + if (tresult != ISC_R_SUCCESS) { + cfg_obj_log(obj, logctx, ISC_LOG_ERROR, + "bad name '%s'", str); +- result = ISC_R_FAILURE; ++ if (result == ISC_R_SUCCESS) ++ result = tresult; + } + obj = cfg_tuple_get(value, "port"); + if (cfg_obj_isuint32(obj)) { +@@ -232,7 +240,8 @@ check_dual_stack(const cfg_obj_t *options, isc_log_t *logctx) { + if (val > UINT16_MAX) { + cfg_obj_log(obj, logctx, ISC_LOG_ERROR, + "port '%u' out of range", val); +- result = ISC_R_FAILURE; ++ if (result == ISC_R_SUCCESS) ++ result = ISC_R_RANGE; + } + } + } +@@ -1267,7 +1276,8 @@ check_options(const cfg_obj_t *options, isc_log_t *logctx, isc_mem_t *mctx, + cfg_obj_log(obj, logctx, ISC_LOG_ERROR, + "auto-dnssec may only be activated at the " + "zone level"); +- result = ISC_R_FAILURE; ++ if (result == ISC_R_SUCCESS) ++ result = ISC_R_FAILURE; + } + } + +@@ -1287,7 +1297,7 @@ check_options(const cfg_obj_t *options, isc_log_t *logctx, isc_mem_t *mctx, + { + obj = cfg_listelt_value(element); + tresult = mustbesecure(obj, symtab, logctx, mctx); +- if (tresult != ISC_R_SUCCESS) ++ if (result == ISC_R_SUCCESS && tresult != ISC_R_SUCCESS) + result = tresult; + } + if (symtab != NULL) +@@ -1306,7 +1316,8 @@ check_options(const cfg_obj_t *options, isc_log_t *logctx, isc_mem_t *mctx, + cfg_obj_log(obj, logctx, ISC_LOG_ERROR, + "%s: invalid name '%s'", + server_contact[i], str); +- result = ISC_R_FAILURE; ++ if (result == ISC_R_SUCCESS) ++ result = ISC_R_FAILURE; + } + } + } +@@ -1326,7 +1337,8 @@ check_options(const cfg_obj_t *options, isc_log_t *logctx, isc_mem_t *mctx, + cfg_obj_log(obj, logctx, ISC_LOG_ERROR, + "disable-empty-zone: invalid name '%s'", + str); +- result = ISC_R_FAILURE; ++ if (result == ISC_R_SUCCESS) ++ result = ISC_R_FAILURE; + } + } + +@@ -1340,11 +1352,12 @@ check_options(const cfg_obj_t *options, isc_log_t *logctx, isc_mem_t *mctx, + strlen(cfg_obj_asstring(obj)) > 1024U) { + cfg_obj_log(obj, logctx, ISC_LOG_ERROR, + "'server-id' too big (>1024 bytes)"); +- result = ISC_R_FAILURE; ++ if (result == ISC_R_SUCCESS) ++ result = ISC_R_FAILURE; + } + + tresult = check_dscp(options, logctx); +- if (tresult != ISC_R_SUCCESS) ++ if (result == ISC_R_SUCCESS && tresult != ISC_R_SUCCESS) + result = tresult; + + obj = NULL; +@@ -1354,11 +1367,13 @@ check_options(const cfg_obj_t *options, isc_log_t *logctx, isc_mem_t *mctx, + if (lifetime > 604800) { /* 7 days */ + cfg_obj_log(obj, logctx, ISC_LOG_ERROR, + "'nta-lifetime' cannot exceed one week"); +- result = ISC_R_RANGE; ++ if (result == ISC_R_SUCCESS) ++ result = ISC_R_RANGE; + } else if (lifetime == 0) { + cfg_obj_log(obj, logctx, ISC_LOG_ERROR, + "'nta-lifetime' may not be zero"); +- result = ISC_R_RANGE; ++ if (result == ISC_R_SUCCESS) ++ result = ISC_R_RANGE; + } + } + +@@ -1369,7 +1384,8 @@ check_options(const cfg_obj_t *options, isc_log_t *logctx, isc_mem_t *mctx, + if (recheck > 604800) { /* 7 days */ + cfg_obj_log(obj, logctx, ISC_LOG_ERROR, + "'nta-recheck' cannot exceed one week"); +- result = ISC_R_RANGE; ++ if (result == ISC_R_SUCCESS) ++ result = ISC_R_RANGE; + } + + if (recheck > lifetime) +@@ -1387,7 +1403,8 @@ check_options(const cfg_obj_t *options, isc_log_t *logctx, isc_mem_t *mctx, + if (strcasecmp(ccalg, "aes") == 0) { + cfg_obj_log(obj, logctx, ISC_LOG_ERROR, + "cookie-algorithm: '%s' not supported", ccalg); +- result = ISC_R_NOTIMPLEMENTED; ++ if (result == ISC_R_SUCCESS) ++ result = ISC_R_NOTIMPLEMENTED; + } + #endif + +@@ -1476,7 +1493,8 @@ check_options(const cfg_obj_t *options, isc_log_t *logctx, isc_mem_t *mctx, + cfg_obj_log(obj, logctx, ISC_LOG_ERROR, + "%s out of range (%u < %u)", + fstrm[i].name, value, fstrm[i].min); +- result = ISC_R_RANGE; ++ if (result == ISC_R_SUCCESS) ++ result = ISC_R_RANGE; + } + + if (strcmp(fstrm[i].name, "fstrm-set-input-queue-size") == 0) { +@@ -1490,7 +1508,8 @@ check_options(const cfg_obj_t *options, isc_log_t *logctx, isc_mem_t *mctx, + "%s '%u' not a power-of-2", + fstrm[i].name, + cfg_obj_asuint32(obj)); +- result = ISC_R_RANGE; ++ if (result == ISC_R_SUCCESS) ++ result = ISC_R_RANGE; + } + } + } +@@ -1508,7 +1527,8 @@ check_options(const cfg_obj_t *options, isc_log_t *logctx, isc_mem_t *mctx, + "%" PRId64 "' " + "is too small", + mapsize); +- return (ISC_R_RANGE); ++ if (result == ISC_R_SUCCESS) ++ result = ISC_R_RANGE; + } else if (mapsize > (1ULL << 40)) { /* 1 terabyte */ + cfg_obj_log(obj, logctx, + ISC_LOG_ERROR, +@@ -1516,10 +1536,20 @@ check_options(const cfg_obj_t *options, isc_log_t *logctx, isc_mem_t *mctx, + "%" PRId64 "' " + "is too large", + mapsize); +- return (ISC_R_RANGE); ++ if (result == ISC_R_SUCCESS) ++ result = ISC_R_RANGE; + } + } + ++ obj = NULL; ++ (void)cfg_map_get(options, "resolver-nonbackoff-tries", &obj); ++ if (obj != NULL && cfg_obj_asuint32(obj) == 0U) { ++ cfg_obj_log(obj, logctx, ISC_LOG_ERROR, ++ "'resolver-nonbackoff-tries' must be >= 1"); ++ if (result == ISC_R_SUCCESS) ++ result = ISC_R_RANGE; ++ } ++ + return (result); + } + +diff --git a/lib/dns/cache.c b/lib/dns/cache.c +index 4701ff8..97e427a 100644 +--- a/lib/dns/cache.c ++++ b/lib/dns/cache.c +@@ -138,6 +138,7 @@ struct dns_cache { + int db_argc; + char **db_argv; + size_t size; ++ dns_ttl_t serve_stale_ttl; + isc_stats_t *stats; + + /* Locked by 'filelock'. */ +@@ -167,9 +168,13 @@ overmem_cleaning_action(isc_task_t *task, isc_event_t *event); + + static inline isc_result_t + cache_create_db(dns_cache_t *cache, dns_db_t **db) { +- return (dns_db_create(cache->mctx, cache->db_type, dns_rootname, +- dns_dbtype_cache, cache->rdclass, +- cache->db_argc, cache->db_argv, db)); ++ isc_result_t result; ++ result = dns_db_create(cache->mctx, cache->db_type, dns_rootname, ++ dns_dbtype_cache, cache->rdclass, ++ cache->db_argc, cache->db_argv, db); ++ if (result == ISC_R_SUCCESS) ++ dns_db_setservestalettl(*db, cache->serve_stale_ttl); ++ return (result); + } + + isc_result_t +@@ -238,6 +243,7 @@ dns_cache_create3(isc_mem_t *cmctx, isc_mem_t *hmctx, isc_taskmgr_t *taskmgr, + cache->references = 1; + cache->live_tasks = 0; + cache->rdclass = rdclass; ++ cache->serve_stale_ttl = 0; + + cache->stats = NULL; + result = isc_stats_create(cmctx, &cache->stats, +@@ -1092,6 +1098,32 @@ dns_cache_getcachesize(dns_cache_t *cache) { + return (size); + } + ++void ++dns_cache_setservestalettl(dns_cache_t *cache, dns_ttl_t ttl) { ++ REQUIRE(VALID_CACHE(cache)); ++ ++ LOCK(&cache->lock); ++ cache->serve_stale_ttl = ttl; ++ UNLOCK(&cache->lock); ++ ++ (void)dns_db_setservestalettl(cache->db, ttl); ++} ++ ++dns_ttl_t ++dns_cache_getservestalettl(dns_cache_t *cache) { ++ dns_ttl_t ttl; ++ isc_result_t result; ++ ++ REQUIRE(VALID_CACHE(cache)); ++ ++ /* ++ * Could get it straight from the dns_cache_t, but use db ++ * to confirm the value that the db is really using. ++ */ ++ result = dns_db_getservestalettl(cache->db, &ttl); ++ return result == ISC_R_SUCCESS ? ttl : 0; ++} ++ + /* + * The cleaner task is shutting down; do the necessary cleanup. + */ +diff --git a/lib/dns/db.c b/lib/dns/db.c +index ee3e00d..576aa65 100644 +--- a/lib/dns/db.c ++++ b/lib/dns/db.c +@@ -1130,3 +1130,25 @@ dns_db_nodefullname(dns_db_t *db, dns_dbnode_t *node, dns_name_t *name) { + return (ISC_R_NOTIMPLEMENTED); + return ((db->methods->nodefullname)(db, node, name)); + } ++ ++isc_result_t ++dns_db_setservestalettl(dns_db_t *db, dns_ttl_t ttl) ++{ ++ REQUIRE(DNS_DB_VALID(db)); ++ REQUIRE((db->attributes & DNS_DBATTR_CACHE) != 0); ++ ++ if (db->methods->setservestalettl != NULL) ++ return ((db->methods->setservestalettl)(db, ttl)); ++ return (ISC_R_NOTIMPLEMENTED); ++} ++ ++isc_result_t ++dns_db_getservestalettl(dns_db_t *db, dns_ttl_t *ttl) ++{ ++ REQUIRE(DNS_DB_VALID(db)); ++ REQUIRE((db->attributes & DNS_DBATTR_CACHE) != 0); ++ ++ if (db->methods->getservestalettl != NULL) ++ return ((db->methods->getservestalettl)(db, ttl)); ++ return (ISC_R_NOTIMPLEMENTED); ++} +diff --git a/lib/dns/ecdb.c b/lib/dns/ecdb.c +index 47994ea..23bfe7d 100644 +--- a/lib/dns/ecdb.c ++++ b/lib/dns/ecdb.c +@@ -588,7 +588,9 @@ static dns_dbmethods_t ecdb_methods = { + NULL, /* setcachestats */ + NULL, /* hashsize */ + NULL, /* nodefullname */ +- NULL /* getsize */ ++ NULL, /* getsize */ ++ NULL, /* setservestalettl */ ++ NULL /* getservestalettl */ + }; + + static isc_result_t +diff --git a/lib/dns/include/dns/cache.h b/lib/dns/include/dns/cache.h +index 62797db..714b78e 100644 +--- a/lib/dns/include/dns/cache.h ++++ b/lib/dns/include/dns/cache.h +@@ -260,6 +260,27 @@ dns_cache_getcachesize(dns_cache_t *cache); + * Get the maximum cache size. + */ + ++void ++dns_cache_setservestalettl(dns_cache_t *cache, dns_ttl_t ttl); ++/*%< ++ * Sets the maximum length of time that cached answers may be retained ++ * past their normal TTL. Default value for the library is 0, disabling ++ * the use of stale data. ++ * ++ * Requires: ++ *\li 'cache' to be valid. ++ */ ++ ++dns_ttl_t ++dns_cache_getservestalettl(dns_cache_t *cache); ++/*%< ++ * Gets the maximum length of time that cached answers may be kept past ++ * normal expiry. ++ * ++ * Requires: ++ *\li 'cache' to be valid. ++ */ ++ + isc_result_t + dns_cache_flush(dns_cache_t *cache); + /*%< +diff --git a/lib/dns/include/dns/db.h b/lib/dns/include/dns/db.h +index ae6ae36..5079053 100644 +--- a/lib/dns/include/dns/db.h ++++ b/lib/dns/include/dns/db.h +@@ -197,6 +197,8 @@ typedef struct dns_dbmethods { + dns_name_t *name); + isc_result_t (*getsize)(dns_db_t *db, dns_dbversion_t *version, + uint64_t *records, uint64_t *bytes); ++ isc_result_t (*setservestalettl)(dns_db_t *db, dns_ttl_t ttl); ++ isc_result_t (*getservestalettl)(dns_db_t *db, dns_ttl_t *ttl); + } dns_dbmethods_t; + + typedef isc_result_t +@@ -255,6 +257,7 @@ struct dns_dbonupdatelistener { + #define DNS_DBFIND_FORCENSEC3 0x0080 + #define DNS_DBFIND_ADDITIONALOK 0x0100 + #define DNS_DBFIND_NOZONECUT 0x0200 ++#define DNS_DBFIND_STALEOK 0x0400 + /*@}*/ + + /*@{*/ +@@ -1685,6 +1688,38 @@ dns_db_nodefullname(dns_db_t *db, dns_dbnode_t *node, dns_name_t *name); + * \li 'db' is a valid database + * \li 'node' and 'name' are not NULL + */ ++ ++isc_result_t ++dns_db_setservestalettl(dns_db_t *db, dns_ttl_t ttl); ++/*%< ++ * Sets the maximum length of time that cached answers may be retained ++ * past their normal TTL. Default value for the library is 0, disabling ++ * the use of stale data. ++ * ++ * Requires: ++ * \li 'db' is a valid cache database. ++ * \li 'ttl' is the number of seconds to retain data past its normal expiry. ++ * ++ * Returns: ++ * \li #ISC_R_SUCCESS ++ * \li #ISC_R_NOTIMPLEMENTED - Not supported by this DB implementation. ++ */ ++ ++isc_result_t ++dns_db_getservestalettl(dns_db_t *db, dns_ttl_t *ttl); ++/*%< ++ * Gets maximum length of time that cached answers may be kept past ++ * normal TTL expiration. ++ * ++ * Requires: ++ * \li 'db' is a valid cache database. ++ * \li 'ttl' is the number of seconds to retain data past its normal expiry. ++ * ++ * Returns: ++ * \li #ISC_R_SUCCESS ++ * \li #ISC_R_NOTIMPLEMENTED - Not supported by this DB implementation. ++ */ ++ + ISC_LANG_ENDDECLS + + #endif /* DNS_DB_H */ +diff --git a/lib/dns/include/dns/rdataset.h b/lib/dns/include/dns/rdataset.h +index 5295d8e..97071ed 100644 +--- a/lib/dns/include/dns/rdataset.h ++++ b/lib/dns/include/dns/rdataset.h +@@ -128,6 +128,7 @@ struct dns_rdataset { + unsigned int magic; /* XXX ? */ + dns_rdatasetmethods_t * methods; + ISC_LINK(dns_rdataset_t) link; ++ + /* + * XXX do we need these, or should they be retrieved by methods? + * Leaning towards the latter, since they are not frequently required +@@ -136,12 +137,19 @@ struct dns_rdataset { + dns_rdataclass_t rdclass; + dns_rdatatype_t type; + dns_ttl_t ttl; ++ /* ++ * Stale ttl is used to see how long this RRset can still be used ++ * to serve to clients, after the TTL has expired. ++ */ ++ dns_ttl_t stale_ttl; + dns_trust_t trust; + dns_rdatatype_t covers; ++ + /* + * attributes + */ + unsigned int attributes; ++ + /*% + * the counter provides the starting point in the "cyclic" order. + * The value UINT32_MAX has a special meaning of "picking up a +@@ -149,11 +157,13 @@ struct dns_rdataset { + * increment the counter. + */ + uint32_t count; ++ + /* + * This RRSIG RRset should be re-generated around this time. + * Only valid if DNS_RDATASETATTR_RESIGN is set in attributes. + */ + isc_stdtime_t resign; ++ + /*@{*/ + /*% + * These are for use by the rdataset implementation, and MUST NOT +@@ -206,6 +216,7 @@ struct dns_rdataset { + #define DNS_RDATASETATTR_OPTOUT 0x00100000 /*%< OPTOUT proof */ + #define DNS_RDATASETATTR_NEGATIVE 0x00200000 + #define DNS_RDATASETATTR_PREFETCH 0x00400000 ++#define DNS_RDATASETATTR_STALE 0x01000000 + + /*% + * _OMITDNSSEC: +diff --git a/lib/dns/include/dns/resolver.h b/lib/dns/include/dns/resolver.h +index 6da41b7..7b397cb 100644 +--- a/lib/dns/include/dns/resolver.h ++++ b/lib/dns/include/dns/resolver.h +@@ -547,9 +547,12 @@ dns_resolver_getmustbesecure(dns_resolver_t *resolver, dns_name_t *name); + + + void +-dns_resolver_settimeout(dns_resolver_t *resolver, unsigned int seconds); ++dns_resolver_settimeout(dns_resolver_t *resolver, unsigned int timeout); + /*%< +- * Set the length of time the resolver will work on a query, in seconds. ++ * Set the length of time the resolver will work on a query, in milliseconds. ++ * ++ * 'timeout' was originally defined in seconds, and later redefined to be in ++ * milliseconds. Values less than or equal to 300 are treated as seconds. + * + * If timeout is 0, the default timeout will be applied. + * +@@ -560,7 +563,8 @@ dns_resolver_settimeout(dns_resolver_t *resolver, unsigned int seconds); + unsigned int + dns_resolver_gettimeout(dns_resolver_t *resolver); + /*%< +- * Get the current length of time the resolver will work on a query, in seconds. ++ * Get the current length of time the resolver will work on a query, ++ * in milliseconds. + * + * Requires: + * \li resolver to be valid. +@@ -582,6 +586,39 @@ dns_resolver_getzeronosoattl(dns_resolver_t *resolver); + void + dns_resolver_setzeronosoattl(dns_resolver_t *resolver, bool state); + ++unsigned int ++dns_resolver_getretryinterval(dns_resolver_t *resolver); ++ ++void ++dns_resolver_setretryinterval(dns_resolver_t *resolver, unsigned int interval); ++/*%< ++ * Sets the amount of time, in millseconds, that is waited for a reply ++ * to a server before another server is tried. Interacts with the ++ * value of dns_resolver_getnonbackofftries() by trying that number of times ++ * at this interval, before doing exponential backoff and doubling the interval ++ * on each subsequent try, to a maximum of 10 seconds. Defaults to 800 ms; ++ * silently capped at 2000 ms. ++ * ++ * Requires: ++ * \li resolver to be valid. ++ * \li interval > 0. ++ */ ++ ++unsigned int ++dns_resolver_getnonbackofftries(dns_resolver_t *resolver); ++ ++void ++dns_resolver_setnonbackofftries(dns_resolver_t *resolver, unsigned int tries); ++/*%< ++ * Sets the number of failures of getting a reply from remote servers for ++ * a query before backing off by doubling the retry interval for each ++ * subsequent request sent. Defaults to 3. ++ * ++ * Requires: ++ * \li resolver to be valid. ++ * \li tries > 0. ++ */ ++ + unsigned int + dns_resolver_getoptions(dns_resolver_t *resolver); + +diff --git a/lib/dns/include/dns/types.h b/lib/dns/include/dns/types.h +index 567e8a8..7bf2b60 100644 +--- a/lib/dns/include/dns/types.h ++++ b/lib/dns/include/dns/types.h +@@ -385,6 +385,12 @@ typedef enum { + dns_updatemethod_date + } dns_updatemethod_t; + ++typedef enum { ++ dns_stale_answer_no, ++ dns_stale_answer_yes, ++ dns_stale_answer_conf ++} dns_stale_answer_t; ++ + /* + * Functions. + */ +diff --git a/lib/dns/include/dns/view.h b/lib/dns/include/dns/view.h +index c849dec..647ca2a 100644 +--- a/lib/dns/include/dns/view.h ++++ b/lib/dns/include/dns/view.h +@@ -229,6 +229,9 @@ struct dns_view { + dns_dtenv_t *dtenv; /* Dnstap environment */ + dns_dtmsgtype_t dttypes; /* Dnstap message types + to log */ ++ dns_ttl_t staleanswerttl; ++ dns_stale_answer_t staleanswersok; /* rndc setting */ ++ bool staleanswersenable; /* named.conf setting */ + }; + + #define DNS_VIEW_MAGIC ISC_MAGIC('V','i','e','w') +diff --git a/lib/dns/master.c b/lib/dns/master.c +index 2a87bca..ac4bb19 100644 +--- a/lib/dns/master.c ++++ b/lib/dns/master.c +@@ -1948,12 +1948,18 @@ load_text(dns_loadctx_t *lctx) { + + if ((lctx->options & DNS_MASTER_AGETTL) != 0) { + /* +- * Adjust the TTL for $DATE. If the RR has already +- * expired, ignore it. ++ * Adjust the TTL for $DATE. If the RR has ++ * already expired, set its TTL to 0. This ++ * should be okay even if the TTL stretching ++ * feature is not in effect, because it will ++ * just be quickly expired by the cache, and the ++ * way this was written before the patch it ++ * could potentially add 0 TTLs anyway. + */ + if (lctx->ttl < ttl_offset) +- continue; +- lctx->ttl -= ttl_offset; ++ lctx->ttl = 0; ++ else ++ lctx->ttl -= ttl_offset; + } + + /* +diff --git a/lib/dns/masterdump.c b/lib/dns/masterdump.c +index 13d1a3e..873b694 100644 +--- a/lib/dns/masterdump.c ++++ b/lib/dns/masterdump.c +@@ -81,6 +81,9 @@ struct dns_master_style { + */ + #define DNS_TOTEXT_LINEBREAK_MAXLEN 100 + ++/*% Does the rdataset 'r' contain a stale answer? */ ++#define STALE(r) (((r)->attributes & DNS_RDATASETATTR_STALE) != 0) ++ + /*% + * Context structure for a masterfile dump in progress. + */ +@@ -94,6 +97,7 @@ typedef struct dns_totext_ctx { + dns_fixedname_t origin_fixname; + uint32_t current_ttl; + bool current_ttl_valid; ++ dns_ttl_t serve_stale_ttl; + } dns_totext_ctx_t; + + LIBDNS_EXTERNAL_DATA const dns_master_style_t +@@ -382,6 +386,7 @@ totext_ctx_init(const dns_master_style_t *style, dns_totext_ctx_t *ctx) { + ctx->neworigin = NULL; + ctx->current_ttl = 0; + ctx->current_ttl_valid = false; ++ ctx->serve_stale_ttl = 0; + + return (ISC_R_SUCCESS); + } +@@ -1028,6 +1033,11 @@ dump_rdatasets_text(isc_mem_t *mctx, dns_name_t *name, + (ctx->style.flags & DNS_STYLEFLAG_NCACHE) == 0) { + /* Omit negative cache entries */ + } else { ++ if (STALE(rds)) { ++ fprintf(f, "; stale (for %u more seconds)\n", ++ (rds->stale_ttl - ++ ctx->serve_stale_ttl)); ++ } + isc_result_t result = + dump_rdataset(mctx, name, rds, ctx, + buffer, f); +@@ -1496,6 +1506,16 @@ dumpctx_create(isc_mem_t *mctx, dns_db_t *db, dns_dbversion_t *version, + dns_db_attach(db, &dctx->db); + + dctx->do_date = dns_db_iscache(dctx->db); ++ if (dctx->do_date) { ++ /* ++ * Adjust the date backwards by the serve-stale TTL, if any. ++ * This is so the TTL will be loaded correctly when next ++ * started. ++ */ ++ (void)dns_db_getservestalettl(dctx->db, ++ &dctx->tctx.serve_stale_ttl); ++ dctx->now -= dctx->tctx.serve_stale_ttl; ++ } + + if (dctx->format == dns_masterformat_text && + (dctx->tctx.style.flags & DNS_STYLEFLAG_REL_OWNER) != 0) { +@@ -1555,6 +1575,9 @@ writeheader(dns_dumpctx_t *dctx) { + * it in the zone case. + */ + if (dctx->do_date) { ++ fprintf(dctx->f, ++ "; using a %d second stale ttl\n", ++ dctx->tctx.serve_stale_ttl); + result = dns_time32_totext(dctx->now, &buffer); + RUNTIME_CHECK(result == ISC_R_SUCCESS); + isc_buffer_usedregion(&buffer, &r); +diff --git a/lib/dns/rbtdb.c b/lib/dns/rbtdb.c +index 738aa20..5055fcb 100644 +--- a/lib/dns/rbtdb.c ++++ b/lib/dns/rbtdb.c +@@ -488,6 +488,7 @@ typedef ISC_LIST(rdatasetheader_t) rdatasetheaderlist_t; + typedef ISC_LIST(dns_rbtnode_t) rbtnodelist_t; + + #define RDATASET_ATTR_NONEXISTENT 0x0001 ++/*%< May be potentially served as stale data. */ + #define RDATASET_ATTR_STALE 0x0002 + #define RDATASET_ATTR_IGNORE 0x0004 + #define RDATASET_ATTR_RETAIN 0x0008 +@@ -500,6 +501,8 @@ typedef ISC_LIST(dns_rbtnode_t) rbtnodelist_t; + #define RDATASET_ATTR_CASESET 0x0400 + #define RDATASET_ATTR_ZEROTTL 0x0800 + #define RDATASET_ATTR_CASEFULLYLOWER 0x1000 ++/*%< Ancient - awaiting cleanup. */ ++#define RDATASET_ATTR_ANCIENT 0x2000 + + typedef struct acache_cbarg { + dns_rdatasetadditional_t type; +@@ -550,6 +553,8 @@ struct acachectl { + (((header)->attributes & RDATASET_ATTR_ZEROTTL) != 0) + #define CASEFULLYLOWER(header) \ + (((header)->attributes & RDATASET_ATTR_CASEFULLYLOWER) != 0) ++#define ANCIENT(header) \ ++ (((header)->attributes & RDATASET_ATTR_ANCIENT) != 0) + + + #define ACTIVE(header, now) \ +@@ -609,6 +614,12 @@ typedef enum { + expire_flush + } expire_t; + ++typedef enum { ++ rdataset_ttl_fresh, ++ rdataset_ttl_stale, ++ rdataset_ttl_ancient ++} rdataset_ttl_t; ++ + typedef struct rbtdb_version { + /* Not locked */ + rbtdb_serial_t serial; +@@ -676,6 +687,12 @@ struct dns_rbtdb { + dns_dbnode_t *soanode; + dns_dbnode_t *nsnode; + ++ /* ++ * Maximum length of time to keep using a stale answer past its ++ * normal TTL expiry. ++ */ ++ dns_ttl_t serve_stale_ttl; ++ + /* + * This is a linked list used to implement the LRU cache. There will + * be node_lock_count linked lists here. Nodes in bucket 1 will be +@@ -719,6 +736,8 @@ struct dns_rbtdb { + #define RBTDB_ATTR_LOADED 0x01 + #define RBTDB_ATTR_LOADING 0x02 + ++#define KEEPSTALE(rbtdb) ((rbtdb)->serve_stale_ttl > 0) ++ + /*% + * Search Context + */ +@@ -1784,15 +1803,15 @@ rollback_node(dns_rbtnode_t *node, rbtdb_serial_t serial) { + } + + static inline void +-mark_stale_header(dns_rbtdb_t *rbtdb, rdatasetheader_t *header) { ++mark_header_ancient(dns_rbtdb_t *rbtdb, rdatasetheader_t *header) { + + /* +- * If we are already stale there is nothing to do. ++ * If we are already ancient there is nothing to do. + */ +- if ((header->attributes & RDATASET_ATTR_STALE) != 0) ++ if (ANCIENT(header)) + return; + +- header->attributes |= RDATASET_ATTR_STALE; ++ header->attributes |= RDATASET_ATTR_ANCIENT; + header->node->dirty = 1; + + /* +@@ -1833,8 +1852,8 @@ clean_cache_node(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node) { + /* + * If current is nonexistent or stale, we can clean it up. + */ +- if ((current->attributes & +- (RDATASET_ATTR_NONEXISTENT|RDATASET_ATTR_STALE)) != 0) { ++ if (NONEXISTENT(current) || ANCIENT(current) || ++ (STALE(current) && ! KEEPSTALE(rbtdb))) { + if (top_prev != NULL) + top_prev->next = current->next; + else +@@ -2076,6 +2095,80 @@ delete_node(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node) { + } + } + ++#if 0 ++static void ++clean_now_or_later(dns_rbtnode_t *node, dns_rbtdb_t *rbtdb, ++ rdatasetheader_t *header, rdatasetheader_t **header_prevp) ++{ ++ if (dns_rbtnode_refcurrent(node) == 0) { ++ isc_mem_t *mctx; ++ ++ /* ++ * header->down can be non-NULL if the refcount has just ++ * decremented to 0 but decrement_reference() has not performed ++ * clean_cache_node(), in which case we need to purge the stale ++ * headers first. ++ */ ++ mctx = rbtdb->common.mctx; ++ clean_stale_headers(rbtdb, mctx, header); ++ if (*header_prevp != NULL) ++ (*header_prevp)->next = header->next; ++ else ++ node->data = header->next; ++ free_rdataset(rbtdb, mctx, header); ++ } else { ++ header->attributes |= RDATASET_ATTR_STALE | ++ RDATASET_ATTR_ANCIENT; ++ node->dirty = 1; ++ *header_prevp = header; ++ } ++} ++ ++static rdataset_ttl_t ++check_ttl(dns_rbtnode_t *node, rbtdb_search_t *search, ++ rdatasetheader_t *header, rdatasetheader_t **header_prevp, ++ nodelock_t *lock, isc_rwlocktype_t *locktype) ++{ ++ dns_rbtdb_t *rbtdb = search->rbtdb; ++ ++ if (header->rdh_ttl > search->now) ++ return rdataset_ttl_fresh; ++ ++ /* ++ * This rdataset is stale, but perhaps still usable. ++ */ ++ if (KEEPSTALE(rbtdb) && ++ header->rdh_ttl + rbtdb->serve_stale_ttl > search->now) { ++ header->attributes |= RDATASET_ATTR_STALE; ++ /* Doesn't set dirty because it doesn't need removal. */ ++ return rdataset_ttl_stale; ++ } ++ ++ /* ++ * This rdataset is so stale it is no longer usable, even with ++ * KEEPSTALE. If no one else is using the node, we can clean it up ++ * right now, otherwise we mark it as ancient, and the node as dirty, ++ * so it will get cleaned up later. ++ */ ++ if ((header->rdh_ttl <= search->now - RBTDB_VIRTUAL) && ++ (*locktype == isc_rwlocktype_write || ++ NODE_TRYUPGRADE(lock) == ISC_R_SUCCESS)) { ++ /* ++ * We update the node's status only when we can get write ++ * access; otherwise, we leave others to this work. Periodical ++ * cleaning will eventually take the job as the last resort. ++ * We won't downgrade the lock, since other rdatasets are ++ * probably stale, too. ++ */ ++ *locktype = isc_rwlocktype_write; ++ clean_now_or_later(node, rbtdb, header, header_prevp); ++ } else ++ *header_prevp = header; ++ ++ return rdataset_ttl_ancient; ++} ++#endif ++ + /* + * Caller must be holding the node lock. + */ +@@ -3308,6 +3401,12 @@ bind_rdataset(dns_rbtdb_t *rbtdb, dns_rbtnode_t *node, + rdataset->attributes |= DNS_RDATASETATTR_OPTOUT; + if (PREFETCH(header)) + rdataset->attributes |= DNS_RDATASETATTR_PREFETCH; ++ if (STALE(header)) { ++ rdataset->attributes |= DNS_RDATASETATTR_STALE; ++ rdataset->stale_ttl = ++ (rbtdb->serve_stale_ttl + header->rdh_ttl) - now; ++ rdataset->ttl = 0; ++ } + rdataset->private1 = rbtdb; + rdataset->private2 = node; + raw = (unsigned char *)header + sizeof(*header); +@@ -4648,6 +4747,19 @@ check_stale_header(dns_rbtnode_t *node, rdatasetheader_t *header, + #endif + + if (!ACTIVE(header, search->now)) { ++ dns_ttl_t stale = header->rdh_ttl + ++ search->rbtdb->serve_stale_ttl; ++ /* ++ * If this data is in the stale window keep it and if ++ * DNS_DBFIND_STALEOK is not set we tell the caller to ++ * skip this record. ++ */ ++ if (KEEPSTALE(search->rbtdb) && stale > search->now) { ++ header->attributes |= RDATASET_ATTR_STALE; ++ *header_prev = header; ++ return ((search->options & DNS_DBFIND_STALEOK) == 0); ++ } ++ + /* + * This rdataset is stale. If no one else is using the + * node, we can clean it up right now, otherwise we mark +@@ -4687,7 +4799,7 @@ check_stale_header(dns_rbtnode_t *node, rdatasetheader_t *header, + node->data = header->next; + free_rdataset(search->rbtdb, mctx, header); + } else { +- mark_stale_header(search->rbtdb, header); ++ mark_header_ancient(search->rbtdb, header); + *header_prev = header; + } + } else +@@ -5125,7 +5237,7 @@ cache_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version, + &locktype, lock, &search, + &header_prev)) { + /* Do nothing. */ +- } else if (EXISTS(header) && (!STALE(header))) { ++ } else if (EXISTS(header) && !ANCIENT(header)) { + /* + * We now know that there is at least one active + * non-stale rdataset at this node. +@@ -5603,7 +5715,7 @@ expirenode(dns_db_t *db, dns_dbnode_t *node, isc_stdtime_t now) { + * refcurrent(rbtnode) must be non-zero. This is so + * because 'node' is an argument to the function. + */ +- mark_stale_header(rbtdb, header); ++ mark_header_ancient(rbtdb, header); + if (log) + isc_log_write(dns_lctx, category, module, + level, "overmem cache: stale %s", +@@ -5611,7 +5723,7 @@ expirenode(dns_db_t *db, dns_dbnode_t *node, isc_stdtime_t now) { + } else if (force_expire) { + if (! RETAIN(header)) { + set_ttl(rbtdb, header, 0); +- mark_stale_header(rbtdb, header); ++ mark_header_ancient(rbtdb, header); + } else if (log) { + isc_log_write(dns_lctx, category, module, + level, "overmem cache: " +@@ -5868,9 +5980,9 @@ cache_findrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version, + * non-zero. This is so because 'node' is an + * argument to the function. + */ +- mark_stale_header(rbtdb, header); ++ mark_header_ancient(rbtdb, header); + } +- } else if (EXISTS(header) && (!STALE(header))) { ++ } else if (EXISTS(header) && !ANCIENT(header)) { + if (header->type == matchtype) + found = header; + else if (header->type == RBTDB_RDATATYPE_NCACHEANY || +@@ -6160,7 +6272,7 @@ add32(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion, + topheader = topheader->next) + { + set_ttl(rbtdb, topheader, 0); +- mark_stale_header(rbtdb, topheader); ++ mark_header_ancient(rbtdb, topheader); + } + goto find_header; + } +@@ -6218,7 +6330,7 @@ add32(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion, + * ncache entry. + */ + set_ttl(rbtdb, topheader, 0); +- mark_stale_header(rbtdb, topheader); ++ mark_header_ancient(rbtdb, topheader); + topheader = NULL; + goto find_header; + } +@@ -6256,8 +6368,11 @@ add32(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion, + } + + /* +- * Trying to add an rdataset with lower trust to a cache DB +- * has no effect, provided that the cache data isn't stale. ++ * Trying to add an rdataset with lower trust to a cache ++ * DB has no effect, provided that the cache data isn't ++ * stale. If the cache data is stale, new lower trust ++ * data will supersede it below. Unclear what the best ++ * policy is here. + */ + if (rbtversion == NULL && trust < header->trust && + (ACTIVE(header, now) || header_nx)) { +@@ -6286,6 +6401,10 @@ add32(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion, + + if ((options & DNS_DBADD_EXACT) != 0) + flags |= DNS_RDATASLAB_EXACT; ++ /* ++ * TTL use here is irrelevant to the cache; ++ * merge is only done with zonedbs. ++ */ + if ((options & DNS_DBADD_EXACTTTL) != 0 && + newheader->rdh_ttl != header->rdh_ttl) + result = DNS_R_NOTEXACT; +@@ -6329,11 +6448,12 @@ add32(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion, + } + } + /* +- * Don't replace existing NS, A and AAAA RRsets +- * in the cache if they are already exist. This +- * prevents named being locked to old servers. +- * Don't lower trust of existing record if the +- * update is forced. ++ * Don't replace existing NS, A and AAAA RRsets in the ++ * cache if they are already exist. This prevents named ++ * being locked to old servers. Don't lower trust of ++ * existing record if the update is forced. Nothing ++ * special to be done w.r.t stale data; it gets replaced ++ * normally further down. + */ + if (IS_CACHE(rbtdb) && ACTIVE(header, now) && + header->type == dns_rdatatype_ns && +@@ -6508,10 +6628,10 @@ add32(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion, + changed->dirty = true; + if (rbtversion == NULL) { + set_ttl(rbtdb, header, 0); +- mark_stale_header(rbtdb, header); ++ mark_header_ancient(rbtdb, header); + if (sigheader != NULL) { + set_ttl(rbtdb, sigheader, 0); +- mark_stale_header(rbtdb, sigheader); ++ mark_header_ancient(rbtdb, sigheader); + } + } + if (rbtversion != NULL && !header_nx) { +@@ -8310,6 +8430,30 @@ nodefullname(dns_db_t *db, dns_dbnode_t *node, dns_name_t *name) { + return (result); + } + ++static isc_result_t ++setservestalettl(dns_db_t *db, dns_ttl_t ttl) { ++ dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; ++ ++ REQUIRE(VALID_RBTDB(rbtdb)); ++ REQUIRE(IS_CACHE(rbtdb)); ++ ++ /* currently no bounds checking. 0 means disable. */ ++ rbtdb->serve_stale_ttl = ttl; ++ return ISC_R_SUCCESS; ++} ++ ++static isc_result_t ++getservestalettl(dns_db_t *db, dns_ttl_t *ttl) { ++ dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)db; ++ ++ REQUIRE(VALID_RBTDB(rbtdb)); ++ REQUIRE(IS_CACHE(rbtdb)); ++ ++ *ttl = rbtdb->serve_stale_ttl; ++ return ISC_R_SUCCESS; ++} ++ ++ + static dns_dbmethods_t zone_methods = { + attach, + detach, +@@ -8355,7 +8499,9 @@ static dns_dbmethods_t zone_methods = { + NULL, + hashsize, + nodefullname, +- getsize ++ getsize, ++ NULL, ++ NULL + }; + + static dns_dbmethods_t cache_methods = { +@@ -8403,7 +8549,9 @@ static dns_dbmethods_t cache_methods = { + setcachestats, + hashsize, + nodefullname, +- NULL ++ NULL, ++ setservestalettl, ++ getservestalettl + }; + + isc_result_t +@@ -8674,7 +8822,7 @@ dns_rbtdb_create + rbtdb->rpzs = NULL; + rbtdb->load_rpzs = NULL; + rbtdb->rpz_num = DNS_RPZ_INVALID_NUM; +- ++ rbtdb->serve_stale_ttl = 0; + /* + * Version Initialization. + */ +@@ -9092,7 +9240,8 @@ rdatasetiter_first(dns_rdatasetiter_t *iterator) { + * rdatasets to work. + */ + if (NONEXISTENT(header) || +- (now != 0 && now > header->rdh_ttl)) ++ (now != 0 && now > header->rdh_ttl ++ + rbtdb->serve_stale_ttl)) + header = NULL; + break; + } else +@@ -10280,7 +10429,7 @@ static inline bool + need_headerupdate(rdatasetheader_t *header, isc_stdtime_t now) { + if ((header->attributes & + (RDATASET_ATTR_NONEXISTENT | +- RDATASET_ATTR_STALE | ++ RDATASET_ATTR_ANCIENT | + RDATASET_ATTR_ZEROTTL)) != 0) + return (false); + +@@ -10386,7 +10535,7 @@ expire_header(dns_rbtdb_t *rbtdb, rdatasetheader_t *header, + bool tree_locked, expire_t reason) + { + set_ttl(rbtdb, header, 0); +- mark_stale_header(rbtdb, header); ++ mark_header_ancient(rbtdb, header); + + /* + * Caller must hold the node (write) lock. +diff --git a/lib/dns/resolver.c b/lib/dns/resolver.c +index 04a58c0..164fc01 100644 +--- a/lib/dns/resolver.c ++++ b/lib/dns/resolver.c +@@ -141,16 +141,17 @@ + #endif /* WANT_QUERYTRACE */ + + #define US_PER_SEC 1000000U ++#define US_PER_MSEC 1000U + /* + * The maximum time we will wait for a single query. + */ +-#define MAX_SINGLE_QUERY_TIMEOUT 9U +-#define MAX_SINGLE_QUERY_TIMEOUT_US (MAX_SINGLE_QUERY_TIMEOUT*US_PER_SEC) ++#define MAX_SINGLE_QUERY_TIMEOUT 9000U ++#define MAX_SINGLE_QUERY_TIMEOUT_US (MAX_SINGLE_QUERY_TIMEOUT*US_PER_MSEC) + + /* + * We need to allow a individual query time to complete / timeout. + */ +-#define MINIMUM_QUERY_TIMEOUT (MAX_SINGLE_QUERY_TIMEOUT + 1U) ++#define MINIMUM_QUERY_TIMEOUT (MAX_SINGLE_QUERY_TIMEOUT + 1000U) + + /* The default time in seconds for the whole query to live. */ + #ifndef DEFAULT_QUERY_TIMEOUT +@@ -159,7 +160,7 @@ + + /* The maximum time in seconds for the whole query to live. */ + #ifndef MAXIMUM_QUERY_TIMEOUT +-#define MAXIMUM_QUERY_TIMEOUT 30 ++#define MAXIMUM_QUERY_TIMEOUT 30000 + #endif + + /* The default maximum number of recursions to follow before giving up. */ +@@ -496,6 +497,10 @@ struct dns_resolver { + unsigned int maxqueries; + isc_result_t quotaresp[2]; + ++ /* Additions for serve-stale feature. */ ++ unsigned int retryinterval; /* in milliseconds */ ++ unsigned int nonbackofftries; ++ + /* Locked by lock. */ + unsigned int references; + bool exiting; +@@ -1617,14 +1622,12 @@ fctx_setretryinterval(fetchctx_t *fctx, unsigned int rtt) { + unsigned int seconds; + unsigned int us; + ++ us = fctx->res->retryinterval * 1000; + /* +- * We retry every .8 seconds the first two times through the address +- * list, and then we do exponential back-off. ++ * Exponential backoff after the first few tries. + */ +- if (fctx->restarts < 3) +- us = 800000; +- else +- us = (800000 << (fctx->restarts - 2)); ++ if (fctx->restarts >= fctx->res->nonbackofftries) ++ us <<= (fctx->restarts - fctx->res->nonbackofftries - 1); + + /* + * Add a fudge factor to the expected rtt based on the current +@@ -4481,7 +4484,8 @@ fctx_create(dns_resolver_t *res, dns_name_t *name, dns_rdatatype_t type, + /* + * Compute an expiration time for the entire fetch. + */ +- isc_interval_set(&interval, res->query_timeout, 0); ++ isc_interval_set(&interval, res->query_timeout / 1000, ++ res->query_timeout % 1000 * 1000000); + iresult = isc_time_nowplusinterval(&fctx->expires, &interval); + if (iresult != ISC_R_SUCCESS) { + UNEXPECTED_ERROR(__FILE__, __LINE__, +@@ -8965,6 +8969,8 @@ dns_resolver_create(dns_view_t *view, + res->spillattimer = NULL; + res->zspill = 0; + res->zero_no_soa_ttl = false; ++ res->retryinterval = 30000; ++ res->nonbackofftries = 3; + res->query_timeout = DEFAULT_QUERY_TIMEOUT; + res->maxdepth = DEFAULT_RECURSION_DEPTH; + res->maxqueries = DEFAULT_MAX_QUERIES; +@@ -10291,17 +10297,20 @@ dns_resolver_gettimeout(dns_resolver_t *resolver) { + } + + void +-dns_resolver_settimeout(dns_resolver_t *resolver, unsigned int seconds) { ++dns_resolver_settimeout(dns_resolver_t *resolver, unsigned int timeout) { + REQUIRE(VALID_RESOLVER(resolver)); + +- if (seconds == 0) +- seconds = DEFAULT_QUERY_TIMEOUT; +- if (seconds > MAXIMUM_QUERY_TIMEOUT) +- seconds = MAXIMUM_QUERY_TIMEOUT; +- if (seconds < MINIMUM_QUERY_TIMEOUT) +- seconds = MINIMUM_QUERY_TIMEOUT; ++ if (timeout <= 300) ++ timeout *= 1000; ++ ++ if (timeout == 0) ++ timeout = DEFAULT_QUERY_TIMEOUT; ++ if (timeout > MAXIMUM_QUERY_TIMEOUT) ++ timeout = MAXIMUM_QUERY_TIMEOUT; ++ if (timeout < MINIMUM_QUERY_TIMEOUT) ++ timeout = MINIMUM_QUERY_TIMEOUT; + +- resolver->query_timeout = seconds; ++ resolver->query_timeout = timeout; + } + + void +@@ -10398,3 +10407,34 @@ dns_resolver_getquotaresponse(dns_resolver_t *resolver, dns_quotatype_t which) + + return (resolver->quotaresp[which]); + } ++ ++unsigned int ++dns_resolver_getretryinterval(dns_resolver_t *resolver) { ++ REQUIRE(VALID_RESOLVER(resolver)); ++ ++ return (resolver->retryinterval); ++} ++ ++void ++dns_resolver_setretryinterval(dns_resolver_t *resolver, unsigned int interval) ++{ ++ REQUIRE(VALID_RESOLVER(resolver)); ++ REQUIRE(interval > 0); ++ ++ resolver->retryinterval = ISC_MIN(interval, 2000); ++} ++ ++unsigned int ++dns_resolver_getnonbackofftries(dns_resolver_t *resolver) { ++ REQUIRE(VALID_RESOLVER(resolver)); ++ ++ return (resolver->nonbackofftries); ++} ++ ++void ++dns_resolver_setnonbackofftries(dns_resolver_t *resolver, unsigned int tries) { ++ REQUIRE(VALID_RESOLVER(resolver)); ++ REQUIRE(tries > 0); ++ ++ resolver->nonbackofftries = tries; ++} +diff --git a/lib/dns/sdb.c b/lib/dns/sdb.c +index d4c8c67..ee9be79 100644 +--- a/lib/dns/sdb.c ++++ b/lib/dns/sdb.c +@@ -1368,7 +1368,9 @@ static dns_dbmethods_t sdb_methods = { + NULL, /* setcachestats */ + NULL, /* hashsize */ + NULL, /* nodefullname */ +- NULL /* getsize */ ++ NULL, /* getsize */ ++ NULL, /* setservestalettl */ ++ NULL /* getservestalettl */ + }; + + static isc_result_t +diff --git a/lib/dns/sdlz.c b/lib/dns/sdlz.c +index 0b9620c..331992e 100644 +--- a/lib/dns/sdlz.c ++++ b/lib/dns/sdlz.c +@@ -1336,7 +1336,9 @@ static dns_dbmethods_t sdlzdb_methods = { + NULL, /* setcachestats */ + NULL, /* hashsize */ + NULL, /* nodefullname */ +- NULL /* getsize */ ++ NULL, /* getsize */ ++ NULL, /* setservestalettl */ ++ NULL /* getservestalettl */ + }; + + /* +diff --git a/lib/dns/tests/db_test.c b/lib/dns/tests/db_test.c +index 35cf21d..bf39545 100644 +--- a/lib/dns/tests/db_test.c ++++ b/lib/dns/tests/db_test.c +@@ -28,8 +28,9 @@ + + #include + #include +-#include + #include ++#include ++#include + + #include "dnstest.h" + +@@ -76,7 +77,7 @@ getoriginnode_test(void **state) { + assert_int_equal(result, ISC_R_SUCCESS); + + result = dns_db_create(mymctx, "rbt", dns_rootname, dns_dbtype_zone, +- dns_rdataclass_in, 0, NULL, &db); ++ dns_rdataclass_in, 0, NULL, &db); + assert_int_equal(result, ISC_R_SUCCESS); + + result = dns_db_getoriginnode(db, &node); +@@ -91,6 +92,197 @@ getoriginnode_test(void **state) { + isc_mem_detach(&mymctx); + } + ++/* test getservestalettl and setservestalettl */ ++static void ++getsetservestalettl_test(void **state) { ++ dns_db_t *db = NULL; ++ isc_mem_t *mymctx = NULL; ++ isc_result_t result; ++ dns_ttl_t ttl; ++ ++ UNUSED(state); ++ ++ result = isc_mem_create(0, 0, &mymctx); ++ assert_int_equal(result, ISC_R_SUCCESS); ++ ++ result = dns_db_create(mymctx, "rbt", dns_rootname, dns_dbtype_cache, ++ dns_rdataclass_in, 0, NULL, &db); ++ assert_int_equal(result, ISC_R_SUCCESS); ++ ++ ttl = 5000; ++ result = dns_db_getservestalettl(db, &ttl); ++ assert_int_equal(result, ISC_R_SUCCESS); ++ assert_int_equal(ttl, 0); ++ ++ ttl = 6 * 3600; ++ result = dns_db_setservestalettl(db, ttl); ++ assert_int_equal(result, ISC_R_SUCCESS); ++ ++ ttl = 5000; ++ result = dns_db_getservestalettl(db, &ttl); ++ assert_int_equal(result, ISC_R_SUCCESS); ++ assert_int_equal(ttl, 6 * 3600); ++ ++ dns_db_detach(&db); ++ isc_mem_detach(&mymctx); ++} ++ ++/* check DNS_DBFIND_STALEOK works */ ++static void ++dns_dbfind_staleok_test(void **state) { ++ dns_db_t *db = NULL; ++ dns_dbnode_t *node = NULL; ++ dns_fixedname_t example_fixed; ++ dns_fixedname_t found_fixed; ++ dns_name_t *example; ++ dns_name_t *found; ++ dns_rdatalist_t rdatalist; ++ dns_rdataset_t rdataset; ++ int count; ++ int pass; ++ isc_mem_t *mymctx = NULL; ++ isc_result_t result; ++ unsigned char data[] = { 0x0a, 0x00, 0x00, 0x01 }; ++ ++ UNUSED(state); ++ ++ result = isc_mem_create(0, 0, &mymctx); ++ assert_int_equal(result, ISC_R_SUCCESS); ++ ++ result = dns_db_create(mymctx, "rbt", dns_rootname, dns_dbtype_cache, ++ dns_rdataclass_in, 0, NULL, &db); ++ assert_int_equal(result, ISC_R_SUCCESS); ++ ++ example = dns_fixedname_initname(&example_fixed); ++ found = dns_fixedname_initname(&found_fixed); ++ ++ result = dns_name_fromstring(example, "example", 0, NULL); ++ assert_int_equal(result, ISC_R_SUCCESS); ++ ++ /* ++ * Pass 0: default; no stale processing permitted. ++ * Pass 1: stale processing for 1 second. ++ * Pass 2: stale turned off after being on. ++ */ ++ for (pass = 0; pass < 3; pass++) { ++ dns_rdata_t rdata = DNS_RDATA_INIT; ++ ++ /* 10.0.0.1 */ ++ rdata.data = data; ++ rdata.length = 4; ++ rdata.rdclass = dns_rdataclass_in; ++ rdata.type = dns_rdatatype_a; ++ ++ dns_rdatalist_init(&rdatalist); ++ rdatalist.ttl = 2; ++ rdatalist.type = dns_rdatatype_a; ++ rdatalist.rdclass = dns_rdataclass_in; ++ ISC_LIST_APPEND(rdatalist.rdata, &rdata, link); ++ ++ switch (pass) { ++ case 0: ++ /* default: stale processing off */ ++ break; ++ case 1: ++ /* turn on stale processing */ ++ result = dns_db_setservestalettl(db, 1); ++ assert_int_equal(result, ISC_R_SUCCESS); ++ break; ++ case 2: ++ /* turn off stale processing */ ++ result = dns_db_setservestalettl(db, 0); ++ assert_int_equal(result, ISC_R_SUCCESS); ++ break; ++ } ++ ++ dns_rdataset_init(&rdataset); ++ result = dns_rdatalist_tordataset(&rdatalist, &rdataset); ++ assert_int_equal(result, ISC_R_SUCCESS); ++ ++ result = dns_db_findnode(db, example, true, &node); ++ assert_int_equal(result, ISC_R_SUCCESS); ++ ++ result = dns_db_addrdataset(db, node, NULL, 0, &rdataset, 0, ++ NULL); ++ assert_int_equal(result, ISC_R_SUCCESS); ++ ++ dns_db_detachnode(db, &node); ++ dns_rdataset_disassociate(&rdataset); ++ ++ result = dns_db_find(db, example, NULL, dns_rdatatype_a, ++ 0, 0, &node, found, &rdataset, NULL); ++ assert_int_equal(result, ISC_R_SUCCESS); ++ ++ /* ++ * May loop for up to 2 seconds performing non stale lookups. ++ */ ++ count = 0; ++ do { ++ count++; ++ assert_in_range(count, 0, 20); /* loop sanity */ ++ assert_int_equal(rdataset.attributes & ++ DNS_RDATASETATTR_STALE, 0); ++ assert_true(rdataset.ttl > 0); ++ dns_db_detachnode(db, &node); ++ dns_rdataset_disassociate(&rdataset); ++ ++ usleep(100000); /* 100 ms */ ++ ++ result = dns_db_find(db, example, NULL, ++ dns_rdatatype_a, 0, 0, ++ &node, found, &rdataset, NULL); ++ } while (result == ISC_R_SUCCESS); ++ ++ assert_int_equal(result, ISC_R_NOTFOUND); ++ ++ /* ++ * Check whether we can get stale data. ++ */ ++ result = dns_db_find(db, example, NULL, dns_rdatatype_a, ++ DNS_DBFIND_STALEOK, 0, ++ &node, found, &rdataset, NULL); ++ switch (pass) { ++ case 0: ++ assert_int_equal(result, ISC_R_NOTFOUND); ++ break; ++ case 1: ++ /* ++ * Should loop for 1 second with stale lookups then ++ * stop. ++ */ ++ count = 0; ++ do { ++ count++; ++ assert_in_range(count, 0, 49); /* loop sanity */ ++ assert_int_equal(result, ISC_R_SUCCESS); ++ assert_int_equal(rdataset.ttl, 0); ++ assert_int_equal(rdataset.attributes & ++ DNS_RDATASETATTR_STALE, ++ DNS_RDATASETATTR_STALE); ++ dns_db_detachnode(db, &node); ++ dns_rdataset_disassociate(&rdataset); ++ ++ usleep(100000); /* 100 ms */ ++ ++ result = dns_db_find(db, example, NULL, ++ dns_rdatatype_a, ++ DNS_DBFIND_STALEOK, ++ 0, &node, found, ++ &rdataset, NULL); ++ } while (result == ISC_R_SUCCESS); ++ assert_in_range(count, 1, 10); ++ assert_int_equal(result, ISC_R_NOTFOUND); ++ break; ++ case 2: ++ assert_int_equal(result, ISC_R_NOTFOUND); ++ break; ++ } ++ } ++ ++ dns_db_detach(&db); ++ isc_mem_detach(&mymctx); ++} ++ + /* database class */ + static void + class_test(void **state) { +@@ -213,6 +405,8 @@ int + main(void) { + const struct CMUnitTest tests[] = { + cmocka_unit_test(getoriginnode_test), ++ cmocka_unit_test(getsetservestalettl_test), ++ cmocka_unit_test(dns_dbfind_staleok_test), + cmocka_unit_test_setup_teardown(class_test, + _setup, _teardown), + cmocka_unit_test_setup_teardown(dbtype_test, +diff --git a/lib/dns/view.c b/lib/dns/view.c +index a1a4301..abf6a4c 100644 +--- a/lib/dns/view.c ++++ b/lib/dns/view.c +@@ -229,6 +229,9 @@ dns_view_create(isc_mem_t *mctx, dns_rdataclass_t rdclass, + view->flush = false; + view->dlv = NULL; + view->maxudp = 0; ++ view->staleanswerttl = 1; ++ view->staleanswersok = dns_stale_answer_conf; ++ view->staleanswersenable = false; + view->nocookieudp = 0; + view->maxbits = 0; + view->v4_aaaa = dns_aaaa_ok; +diff --git a/lib/isccfg/namedconf.c b/lib/isccfg/namedconf.c +index 7bad989..bbf4b45 100644 +--- a/lib/isccfg/namedconf.c ++++ b/lib/isccfg/namedconf.c +@@ -1778,6 +1778,7 @@ view_clauses[] = { + { "max-ncache-ttl", &cfg_type_uint32, 0 }, + { "max-recursion-depth", &cfg_type_uint32, 0 }, + { "max-recursion-queries", &cfg_type_uint32, 0 }, ++ { "max-stale-ttl", &cfg_type_ttlval, 0 }, + { "max-udp-size", &cfg_type_uint32, 0 }, + { "message-compression", &cfg_type_boolean, 0 }, + { "min-roots", &cfg_type_uint32, CFG_CLAUSEFLAG_NOTIMP }, +@@ -1806,7 +1807,9 @@ view_clauses[] = { + { "request-nsid", &cfg_type_boolean, 0 }, + { "request-sit", &cfg_type_boolean, CFG_CLAUSEFLAG_OBSOLETE }, + { "require-server-cookie", &cfg_type_boolean, 0 }, ++ { "resolver-nonbackoff-tries", &cfg_type_uint32, 0 }, + { "resolver-query-timeout", &cfg_type_uint32, 0 }, ++ { "resolver-retry-interval", &cfg_type_uint32, 0 }, + { "response-policy", &cfg_type_rpz, 0 }, + { "rfc2308-type1", &cfg_type_boolean, CFG_CLAUSEFLAG_NYI }, + { "root-delegation-only", &cfg_type_optional_exclude, 0 }, +@@ -1815,6 +1818,8 @@ view_clauses[] = { + { "send-cookie", &cfg_type_boolean, 0 }, + { "servfail-ttl", &cfg_type_ttlval, 0 }, + { "sortlist", &cfg_type_bracketed_aml, 0 }, ++ { "stale-answer-enable", &cfg_type_boolean, 0 }, ++ { "stale-answer-ttl", &cfg_type_ttlval, 0 }, + { "suppress-initial-notify", &cfg_type_boolean, CFG_CLAUSEFLAG_NYI }, + { "topology", &cfg_type_bracketed_aml, CFG_CLAUSEFLAG_NOTIMP }, + { "transfer-format", &cfg_type_transferformat, 0 }, +-- +2.20.1 + diff --git a/SOURCES/bind-9.11-unit-disable-random.patch b/SOURCES/bind-9.11-unit-disable-random.patch new file mode 100644 index 0000000..553f725 --- /dev/null +++ b/SOURCES/bind-9.11-unit-disable-random.patch @@ -0,0 +1,30 @@ +From 373f07148217a8e70e33446f5108fb42d1079ba6 Mon Sep 17 00:00:00 2001 +From: Petr Mensik +Date: Thu, 21 Feb 2019 22:42:27 +0100 +Subject: [PATCH] Disable random_test + +It fails too often on some architecture, failing the whole build along. +Because it runs two times for pkcs11 and normal build and any of +subtests can occasionally fail, stop it. + +It can be used again by defining 'unstable' variable in Kyuafile. +--- + lib/isc/tests/Kyuafile | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/lib/isc/tests/Kyuafile b/lib/isc/tests/Kyuafile +index 4cd2574..9df2340 100644 +--- a/lib/isc/tests/Kyuafile ++++ b/lib/isc/tests/Kyuafile +@@ -19,7 +19,7 @@ tap_test_program{name='pool_test'} + tap_test_program{name='print_test'} + tap_test_program{name='queue_test'} + tap_test_program{name='radix_test'} +-tap_test_program{name='random_test'} ++tap_test_program{name='random_test', required_configs='unstable'} + tap_test_program{name='regex_test'} + tap_test_program{name='result_test'} + tap_test_program{name='safe_test'} +-- +2.20.1 + diff --git a/SOURCES/bind-9.11-zone2ldap.patch b/SOURCES/bind-9.11-zone2ldap.patch new file mode 100644 index 0000000..a816240 --- /dev/null +++ b/SOURCES/bind-9.11-zone2ldap.patch @@ -0,0 +1,196 @@ +From 0430b3ac66169eea7a74aaa8bfca50400d3497cf Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Petr=20Men=C5=A1=C3=ADk?= +Date: Tue, 18 Dec 2018 16:06:26 +0100 +Subject: [PATCH] Make absolute hostname by dns API instead of strings + +Duplicate all strings in dc_list. Free allocated memory on each record. +--- + bin/sdb_tools/zone2ldap.c | 71 +++++++++++++++++++++++++-------------- + 1 file changed, 45 insertions(+), 26 deletions(-) + +diff --git a/bin/sdb_tools/zone2ldap.c b/bin/sdb_tools/zone2ldap.c +index 76186b5..28df191 100644 +--- a/bin/sdb_tools/zone2ldap.c ++++ b/bin/sdb_tools/zone2ldap.c +@@ -87,6 +87,10 @@ int get_attr_list_size (char **tmp); + /* Get a DN */ + char *build_dn_from_dc_list (char **dc_list, unsigned int ttl, int flag, char *zone); + ++/* Free a DN list */ ++static void ++free_dc_list(char **dc_list); ++ + /* Add to RR list */ + void add_to_rr_list (char *dn, char *name, char *type, char *data, + unsigned int ttl, unsigned int flags); +@@ -123,6 +127,7 @@ static char dNSTTL []="dNSTTL"; + static char zoneName []="zoneName"; + static char dc []="dc"; + static char sameZone []="@"; ++static char dot []="."; + /* LDAPMod mod_values: */ + static char *objectClasses []= { &(topClass[0]), &(dNSZoneClass[0]), NULL }; + static char *topObjectClasses []= { &(topClass[0]), &(dcObjectClass[0]), &(dNSZoneClass[0]), NULL }; +@@ -396,6 +401,8 @@ main (int argc, char **argv) + } + + } ++ ++ free_dc_list(dc_list); + } + else + { +@@ -451,12 +458,18 @@ generate_ldap (dns_name_t * dnsname, dns_rdata_t * rdata, unsigned int ttl) + char data[2048]; + char **dc_list; + char *dn; ++ size_t argzone_len; ++ bool omit_dot; + + isc_buffer_t buff; + isc_result_t result; + + isc_buffer_init (&buff, name, sizeof (name)); + result = dns_name_totext (dnsname, true, &buff); ++ argzone_len = strlen(argzone); ++ /* If argzone is absolute, output absolute name too */ ++ omit_dot = (!(argzone_len > 0 && argzone[argzone_len-1] == '.')); ++ result = dns_name_totext (dnsname, omit_dot, &buff); + isc_result_check (result, "dns_name_totext"); + name[isc_buffer_usedlength (&buff)] = 0; + +@@ -478,6 +491,7 @@ generate_ldap (dns_name_t * dnsname, dns_rdata_t * rdata, unsigned int ttl) + printf ("Adding %s (%s %s) to run queue list.\n", dn, type, data); + + add_to_rr_list (dn, dc_list[len], (char*)type, (char*)data, ttl, DNS_OBJECT); ++ free_dc_list(dc_list); + } + + +@@ -538,12 +552,9 @@ add_to_rr_list (char *dn, char *name, char *type, + if (tmp->attrs == (LDAPMod **) NULL) + fatal("calloc"); + +- for (i = 0; i < (int)flags; i++) +- { +- tmp->attrs[i] = (LDAPMod *) malloc (sizeof (LDAPMod)); +- if (tmp->attrs[i] == (LDAPMod *) NULL) +- fatal("malloc"); +- } ++ tmp->attrs[0] = (LDAPMod *) malloc (sizeof (LDAPMod)); ++ if (tmp->attrs[0] == (LDAPMod *) NULL) ++ fatal("malloc"); + tmp->attrs[0]->mod_op = LDAP_MOD_ADD; + tmp->attrs[0]->mod_type = objectClass; + +@@ -559,9 +570,18 @@ add_to_rr_list (char *dn, char *name, char *type, + return; + } + ++ for (i = 1; i < (int)flags-1; i++) ++ { ++ tmp->attrs[i] = (LDAPMod *) malloc (sizeof (LDAPMod)); ++ if (tmp->attrs[i] == (LDAPMod *) NULL) ++ fatal("malloc"); ++ } ++ tmp->attrs[i] = NULL; ++ ++ + tmp->attrs[1]->mod_op = LDAP_MOD_ADD; + tmp->attrs[1]->mod_type = relativeDomainName; +- tmp->attrs[1]->mod_values = (char **) calloc (sizeof (char *), 2); ++ tmp->attrs[1]->mod_values = (char **) calloc (sizeof (char *), 3); + + if (tmp->attrs[1]->mod_values == (char **)NULL) + fatal("calloc"); +@@ -705,25 +725,16 @@ char ** + hostname_to_dn_list (char *hostname, char *zone, unsigned int flags) + { + char *tmp; +- int i = 0; ++ int i = 0, j = 0; + char *hname=0L, *last=0L; + int hlen=strlen(hostname), zlen=(strlen(zone)); + + /* printf("hostname: %s zone: %s\n",hostname, zone); */ +- hname=0L; + if(flags == DNS_OBJECT) + { +- if( (zone[ zlen - 1 ] == '.') && (hostname[hlen - 1] != '.') ) +- { +- hname=(char*)malloc(hlen + 1); +- hlen += 1; +- sprintf(hname, "%s.", hostname); +- hostname = hname; +- } + if(strcmp(hostname, zone) == 0) + { +- if( hname == 0 ) +- hname=strdup(hostname); ++ hname=strdup(hostname); + last = strdup(sameZone); + }else + { +@@ -731,8 +742,6 @@ hostname_to_dn_list (char *hostname, char *zone, unsigned int flags) + ||( strcmp( hostname + (hlen - zlen), zone ) != 0) + ) + { +- if( hname != 0 ) +- free(hname); + hname=(char*)malloc( hlen + zlen + 1); + if( *zone == '.' ) + sprintf(hname, "%s%s", hostname, zone); +@@ -740,8 +749,7 @@ hostname_to_dn_list (char *hostname, char *zone, unsigned int flags) + sprintf(hname,"%s",zone); + }else + { +- if( hname == 0 ) +- hname = strdup(hostname); ++ hname = strdup(hostname); + } + last = hname; + } +@@ -754,18 +762,21 @@ hostname_to_dn_list (char *hostname, char *zone, unsigned int flags) + for (tmp = strrchr (hname, '.'); tmp != (char *) 0; + tmp = strrchr (hname, '.')) + { +- if( *( tmp + 1 ) != '\0' ) ++ tmp[0] = '\0'; ++ if( tmp[1] != '\0' ) + { +- *tmp = '\0'; + dn_buffer[i++] = ++tmp; + }else + { /* trailing '.' ! */ +- dn_buffer[i++] = strdup("."); +- *tmp = '\0'; ++ dn_buffer[i++] = dot; + if( tmp == hname ) + break; + } + } ++ for (j=0; j +Date: Thu, 27 Feb 2020 15:35:31 +0100 +Subject: [PATCH] Fix rwlock to be thread-safe +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This is a backport of the following commits + +commit 4cf275ba8aa1caf47ed763b51c37fa561005cb8d +Author: Ondřej Surý +Date: Wed Feb 12 09:17:55 2020 +0100 + + Replace non-loop usage of atomic_compare_exchange_weak with strong variant + +commit b43f5e023885dac9f1ffdace54720150768a333b +Author: Ondřej Surý +Date: Sat Feb 1 10:48:20 2020 +0100 + + Convert all atomic operations in isc_rwlock to release-acquire memory ordering + +commit 49462cf9747261cbc39d5fa4c691b64ac5472af4 +Author: Ondřej Surý +Date: Tue May 14 00:19:11 2019 +0700 + + Make isc_rwlock.c thread-safe + +commit 9d5df99a9d9d13c9487969b6fa3818a8b83b4ee2 +Author: Ondřej Surý +Date: Thu Aug 23 15:30:06 2018 +0200 + + Directly use return value of atomic_compare_exchange_strong_explicit insteaf of comparing expected value + +commit b5709e5531d9d45f9fc3db129c11ad474477d7b6 +Author: Ondřej Surý +Date: Fri Aug 17 19:21:12 2018 +0200 + + Explicitly load atomic values in lib/isc/rwlock.c +--- + lib/isc/rwlock.c | 275 ++++++++++++++++++----------------------------- + 1 file changed, 107 insertions(+), 168 deletions(-) + +diff --git a/lib/isc/rwlock.c b/lib/isc/rwlock.c +index 9533c0f828..5591eff719 100644 +--- a/lib/isc/rwlock.c ++++ b/lib/isc/rwlock.c +@@ -46,6 +46,26 @@ + #if defined(ISC_RWLOCK_USEATOMIC) + static isc_result_t + isc__rwlock_lock(isc_rwlock_t *rwl, isc_rwlocktype_t type); ++ ++#ifndef ISC_RWLOCK_USESTDATOMIC ++#error non-stdatomic support removed ++#endif ++ ++#define atomic_load_acquire(o) \ ++ atomic_load_explicit((o), memory_order_acquire) ++#define atomic_store_release(o, v) \ ++ atomic_store_explicit((o), (v), memory_order_release) ++#define atomic_fetch_add_release(o, v) \ ++ atomic_fetch_add_explicit((o), (v), memory_order_release) ++#define atomic_fetch_sub_release(o, v) \ ++ atomic_fetch_sub_explicit((o), (v), memory_order_release) ++#define atomic_compare_exchange_weak_acq_rel(o, e, d) \ ++ atomic_compare_exchange_weak_explicit((o), (e), (d), \ ++ memory_order_acq_rel, \ ++ memory_order_acquire) ++#define atomic_compare_exchange_strong_acq_rel(o, e, d) \ ++ atomic_compare_exchange_strong_explicit( \ ++ (o), (e), (d), memory_order_acq_rel, memory_order_acquire) + #endif + + #ifdef ISC_RWLOCK_TRACE +@@ -108,13 +128,13 @@ isc_rwlock_init(isc_rwlock_t *rwl, unsigned int read_quota, + */ + rwl->magic = 0; + +- rwl->spins = 0; + #if defined(ISC_RWLOCK_USEATOMIC) +- rwl->write_requests = 0; +- rwl->write_completions = 0; +- rwl->cnt_and_flag = 0; ++ atomic_init(&rwl->spins, 0); ++ atomic_init(&rwl->write_requests, 0); ++ atomic_init(&rwl->write_completions, 0); ++ atomic_init(&rwl->cnt_and_flag, 0); + rwl->readers_waiting = 0; +- rwl->write_granted = 0; ++ atomic_init(&rwl->write_granted, 0); + if (read_quota != 0) { + UNEXPECTED_ERROR(__FILE__, __LINE__, + "read quota is not supported"); +@@ -123,6 +143,7 @@ isc_rwlock_init(isc_rwlock_t *rwl, unsigned int read_quota, + write_quota = RWLOCK_DEFAULT_WRITE_QUOTA; + rwl->write_quota = write_quota; + #else ++ rwl->spins = 0; + rwl->type = isc_rwlocktype_read; + rwl->original = isc_rwlocktype_none; + rwl->active = 0; +@@ -178,16 +199,9 @@ void + isc_rwlock_destroy(isc_rwlock_t *rwl) { + REQUIRE(VALID_RWLOCK(rwl)); + +-#if defined(ISC_RWLOCK_USEATOMIC) +- REQUIRE(rwl->write_requests == rwl->write_completions && +- rwl->cnt_and_flag == 0 && rwl->readers_waiting == 0); +-#else +- LOCK(&rwl->lock); +- REQUIRE(rwl->active == 0 && +- rwl->readers_waiting == 0 && +- rwl->writers_waiting == 0); +- UNLOCK(&rwl->lock); +-#endif ++ REQUIRE(atomic_load_acquire(&rwl->write_requests) == ++ atomic_load_acquire(&rwl->write_completions) && ++ atomic_load_acquire(&rwl->cnt_and_flag) == 0 && rwl->readers_waiting == 0); + + rwl->magic = 0; + (void)isc_condition_destroy(&rwl->readable); +@@ -274,10 +288,13 @@ isc__rwlock_lock(isc_rwlock_t *rwl, isc_rwlocktype_t type) { + #endif + + if (type == isc_rwlocktype_read) { +- if (rwl->write_requests != rwl->write_completions) { ++ if (atomic_load_acquire(&rwl->write_requests) != ++ atomic_load_acquire(&rwl->write_completions)) ++ { + /* there is a waiting or active writer */ + LOCK(&rwl->lock); +- if (rwl->write_requests != rwl->write_completions) { ++ if (atomic_load_acquire(&rwl->write_requests) != ++ atomic_load_acquire(&rwl->write_completions)) { + rwl->readers_waiting++; + WAIT(&rwl->readable, &rwl->lock); + rwl->readers_waiting--; +@@ -285,23 +302,24 @@ isc__rwlock_lock(isc_rwlock_t *rwl, isc_rwlocktype_t type) { + UNLOCK(&rwl->lock); + } + +-#if defined(ISC_RWLOCK_USESTDATOMIC) +- cntflag = atomic_fetch_add_explicit(&rwl->cnt_and_flag, +- READER_INCR, +- memory_order_relaxed); +-#else +- cntflag = isc_atomic_xadd(&rwl->cnt_and_flag, READER_INCR); +-#endif ++ cntflag = atomic_fetch_add_release(&rwl->cnt_and_flag, ++ READER_INCR); + POST(cntflag); + while (1) { +- if ((rwl->cnt_and_flag & WRITER_ACTIVE) == 0) ++ if ((atomic_load_acquire(&rwl->cnt_and_flag) ++ & WRITER_ACTIVE) == 0) ++ { + break; ++ } + + /* A writer is still working */ + LOCK(&rwl->lock); + rwl->readers_waiting++; +- if ((rwl->cnt_and_flag & WRITER_ACTIVE) != 0) ++ if ((atomic_load_acquire(&rwl->cnt_and_flag) ++ & WRITER_ACTIVE) != 0) ++ { + WAIT(&rwl->readable, &rwl->lock); ++ } + rwl->readers_waiting--; + UNLOCK(&rwl->lock); + +@@ -336,20 +354,19 @@ isc__rwlock_lock(isc_rwlock_t *rwl, isc_rwlocktype_t type) { + * quota, reset the condition (race among readers doesn't + * matter). + */ +- rwl->write_granted = 0; ++ atomic_store_release(&rwl->write_granted, 0); + } else { + int32_t prev_writer; + + /* enter the waiting queue, and wait for our turn */ +-#if defined(ISC_RWLOCK_USESTDATOMIC) +- prev_writer = atomic_fetch_add_explicit(&rwl->write_requests, 1, +- memory_order_relaxed); +-#else +- prev_writer = isc_atomic_xadd(&rwl->write_requests, 1); +-#endif +- while (rwl->write_completions != prev_writer) { ++ prev_writer = atomic_fetch_add_release(&rwl->write_requests, 1); ++ while (atomic_load_acquire(&rwl->write_completions) ++ != prev_writer) ++ { + LOCK(&rwl->lock); +- if (rwl->write_completions != prev_writer) { ++ if (atomic_load_acquire(&rwl->write_completions) ++ != prev_writer) ++ { + WAIT(&rwl->writeable, &rwl->lock); + UNLOCK(&rwl->lock); + continue; +@@ -359,29 +376,24 @@ isc__rwlock_lock(isc_rwlock_t *rwl, isc_rwlocktype_t type) { + } + + while (1) { +-#if defined(ISC_RWLOCK_USESTDATOMIC) + int_fast32_t cntflag2 = 0; +- atomic_compare_exchange_strong_explicit +- (&rwl->cnt_and_flag, &cntflag2, WRITER_ACTIVE, +- memory_order_relaxed, memory_order_relaxed); +-#else +- int32_t cntflag2; +- cntflag2 = isc_atomic_cmpxchg(&rwl->cnt_and_flag, 0, +- WRITER_ACTIVE); +-#endif +- +- if (cntflag2 == 0) ++ if (atomic_compare_exchange_weak_acq_rel( ++ &rwl->cnt_and_flag, &cntflag2, WRITER_ACTIVE)) ++ { + break; ++ } + + /* Another active reader or writer is working. */ + LOCK(&rwl->lock); +- if (rwl->cnt_and_flag != 0) ++ if (atomic_load_acquire(&rwl->cnt_and_flag) != 0) { + WAIT(&rwl->writeable, &rwl->lock); ++ } + UNLOCK(&rwl->lock); + } + +- INSIST((rwl->cnt_and_flag & WRITER_ACTIVE) != 0); +- rwl->write_granted++; ++ INSIST((atomic_load_acquire(&rwl->cnt_and_flag) ++ & WRITER_ACTIVE)); ++ atomic_fetch_add_release(&rwl->write_granted, 1); + } + + #ifdef ISC_RWLOCK_TRACE +@@ -395,12 +407,10 @@ isc__rwlock_lock(isc_rwlock_t *rwl, isc_rwlocktype_t type) { + isc_result_t + isc_rwlock_lock(isc_rwlock_t *rwl, isc_rwlocktype_t type) { + int32_t cnt = 0; +- int32_t max_cnt = rwl->spins * 2 + 10; ++ int32_t spins = atomic_load_acquire(&rwl->spins) * 2 + 10; ++ int32_t max_cnt = ISC_MAX(spins, RWLOCK_MAX_ADAPTIVE_COUNT); + isc_result_t result = ISC_R_SUCCESS; + +- if (max_cnt > RWLOCK_MAX_ADAPTIVE_COUNT) +- max_cnt = RWLOCK_MAX_ADAPTIVE_COUNT; +- + do { + if (cnt++ >= max_cnt) { + result = isc__rwlock_lock(rwl, type); +@@ -411,7 +421,7 @@ isc_rwlock_lock(isc_rwlock_t *rwl, isc_rwlocktype_t type) { + #endif + } while (isc_rwlock_trylock(rwl, type) != ISC_R_SUCCESS); + +- rwl->spins += (cnt - rwl->spins) / 8; ++ atomic_fetch_add_release(&rwl->spins, (cnt - spins) / 8); + + return (result); + } +@@ -429,36 +439,28 @@ isc_rwlock_trylock(isc_rwlock_t *rwl, isc_rwlocktype_t type) { + + if (type == isc_rwlocktype_read) { + /* If a writer is waiting or working, we fail. */ +- if (rwl->write_requests != rwl->write_completions) ++ if (atomic_load_acquire(&rwl->write_requests) != ++ atomic_load_acquire(&rwl->write_completions)) + return (ISC_R_LOCKBUSY); + + /* Otherwise, be ready for reading. */ +-#if defined(ISC_RWLOCK_USESTDATOMIC) +- cntflag = atomic_fetch_add_explicit(&rwl->cnt_and_flag, +- READER_INCR, +- memory_order_relaxed); +-#else +- cntflag = isc_atomic_xadd(&rwl->cnt_and_flag, READER_INCR); +-#endif ++ cntflag = atomic_fetch_add_release(&rwl->cnt_and_flag, ++ READER_INCR); + if ((cntflag & WRITER_ACTIVE) != 0) { + /* + * A writer is working. We lose, and cancel the read + * request. + */ +-#if defined(ISC_RWLOCK_USESTDATOMIC) +- cntflag = atomic_fetch_sub_explicit +- (&rwl->cnt_and_flag, READER_INCR, +- memory_order_relaxed); +-#else +- cntflag = isc_atomic_xadd(&rwl->cnt_and_flag, +- -READER_INCR); +-#endif ++ cntflag = atomic_fetch_sub_release( ++ &rwl->cnt_and_flag, READER_INCR); + /* + * If no other readers are waiting and we've suspended + * new writers in this short period, wake them up. + */ + if (cntflag == READER_INCR && +- rwl->write_completions != rwl->write_requests) { ++ atomic_load_acquire(&rwl->write_completions) != ++ atomic_load_acquire(&rwl->write_requests)) ++ { + LOCK(&rwl->lock); + BROADCAST(&rwl->writeable); + UNLOCK(&rwl->lock); +@@ -468,31 +470,19 @@ isc_rwlock_trylock(isc_rwlock_t *rwl, isc_rwlocktype_t type) { + } + } else { + /* Try locking without entering the waiting queue. */ +-#if defined(ISC_RWLOCK_USESTDATOMIC) + int_fast32_t zero = 0; +- if (!atomic_compare_exchange_strong_explicit +- (&rwl->cnt_and_flag, &zero, WRITER_ACTIVE, +- memory_order_relaxed, memory_order_relaxed)) ++ if (!atomic_compare_exchange_strong_acq_rel( ++ &rwl->cnt_and_flag, &zero, WRITER_ACTIVE)) ++ { + return (ISC_R_LOCKBUSY); +-#else +- cntflag = isc_atomic_cmpxchg(&rwl->cnt_and_flag, 0, +- WRITER_ACTIVE); +- if (cntflag != 0) +- return (ISC_R_LOCKBUSY); +-#endif ++ } + + /* + * XXXJT: jump into the queue, possibly breaking the writer + * order. + */ +-#if defined(ISC_RWLOCK_USESTDATOMIC) +- atomic_fetch_sub_explicit(&rwl->write_completions, 1, +- memory_order_relaxed); +-#else +- (void)isc_atomic_xadd(&rwl->write_completions, -1); +-#endif +- +- rwl->write_granted++; ++ atomic_fetch_sub_release(&rwl->write_completions, 1); ++ atomic_fetch_add_release(&rwl->write_granted, 1); + } + + #ifdef ISC_RWLOCK_TRACE +@@ -507,14 +497,12 @@ isc_result_t + isc_rwlock_tryupgrade(isc_rwlock_t *rwl) { + REQUIRE(VALID_RWLOCK(rwl)); + +-#if defined(ISC_RWLOCK_USESTDATOMIC) + { + int_fast32_t reader_incr = READER_INCR; + + /* Try to acquire write access. */ +- atomic_compare_exchange_strong_explicit +- (&rwl->cnt_and_flag, &reader_incr, WRITER_ACTIVE, +- memory_order_relaxed, memory_order_relaxed); ++ atomic_compare_exchange_strong_acq_rel( ++ &rwl->cnt_and_flag, &reader_incr, WRITER_ACTIVE); + /* + * There must have been no writer, and there must have + * been at least one reader. +@@ -527,36 +515,11 @@ isc_rwlock_tryupgrade(isc_rwlock_t *rwl) { + * We are the only reader and have been upgraded. + * Now jump into the head of the writer waiting queue. + */ +- atomic_fetch_sub_explicit(&rwl->write_completions, 1, +- memory_order_relaxed); ++ atomic_fetch_sub_release(&rwl->write_completions, 1); + } else + return (ISC_R_LOCKBUSY); + + } +-#else +- { +- int32_t prevcnt; +- +- /* Try to acquire write access. */ +- prevcnt = isc_atomic_cmpxchg(&rwl->cnt_and_flag, +- READER_INCR, WRITER_ACTIVE); +- /* +- * There must have been no writer, and there must have +- * been at least one reader. +- */ +- INSIST((prevcnt & WRITER_ACTIVE) == 0 && +- (prevcnt & ~WRITER_ACTIVE) != 0); +- +- if (prevcnt == READER_INCR) { +- /* +- * We are the only reader and have been upgraded. +- * Now jump into the head of the writer waiting queue. +- */ +- (void)isc_atomic_xadd(&rwl->write_completions, -1); +- } else +- return (ISC_R_LOCKBUSY); +- } +-#endif + + return (ISC_R_SUCCESS); + } +@@ -567,33 +530,15 @@ isc_rwlock_downgrade(isc_rwlock_t *rwl) { + + REQUIRE(VALID_RWLOCK(rwl)); + +-#if defined(ISC_RWLOCK_USESTDATOMIC) +- { +- /* Become an active reader. */ +- prev_readers = atomic_fetch_add_explicit(&rwl->cnt_and_flag, +- READER_INCR, +- memory_order_relaxed); +- /* We must have been a writer. */ +- INSIST((prev_readers & WRITER_ACTIVE) != 0); +- +- /* Complete write */ +- atomic_fetch_sub_explicit(&rwl->cnt_and_flag, WRITER_ACTIVE, +- memory_order_relaxed); +- atomic_fetch_add_explicit(&rwl->write_completions, 1, +- memory_order_relaxed); +- } +-#else +- { +- /* Become an active reader. */ +- prev_readers = isc_atomic_xadd(&rwl->cnt_and_flag, READER_INCR); +- /* We must have been a writer. */ +- INSIST((prev_readers & WRITER_ACTIVE) != 0); +- +- /* Complete write */ +- (void)isc_atomic_xadd(&rwl->cnt_and_flag, -WRITER_ACTIVE); +- (void)isc_atomic_xadd(&rwl->write_completions, 1); +- } +-#endif ++ /* Become an active reader. */ ++ prev_readers = atomic_fetch_add_release(&rwl->cnt_and_flag, ++ READER_INCR); ++ /* We must have been a writer. */ ++ INSIST((prev_readers & WRITER_ACTIVE) != 0); ++ ++ /* Complete write */ ++ atomic_fetch_sub_release(&rwl->cnt_and_flag, WRITER_ACTIVE); ++ atomic_fetch_add_release(&rwl->write_completions, 1); + + /* Resume other readers */ + LOCK(&rwl->lock); +@@ -614,20 +559,16 @@ isc_rwlock_unlock(isc_rwlock_t *rwl, isc_rwlocktype_t type) { + #endif + + if (type == isc_rwlocktype_read) { +-#if defined(ISC_RWLOCK_USESTDATOMIC) +- prev_cnt = atomic_fetch_sub_explicit(&rwl->cnt_and_flag, +- READER_INCR, +- memory_order_relaxed); +-#else +- prev_cnt = isc_atomic_xadd(&rwl->cnt_and_flag, -READER_INCR); +-#endif ++ prev_cnt = atomic_fetch_sub_release(&rwl->cnt_and_flag, ++ READER_INCR); + /* + * If we're the last reader and any writers are waiting, wake + * them up. We need to wake up all of them to ensure the + * FIFO order. + */ + if (prev_cnt == READER_INCR && +- rwl->write_completions != rwl->write_requests) { ++ atomic_load_acquire(&rwl->write_completions) != ++ atomic_load_acquire(&rwl->write_requests)) { + LOCK(&rwl->lock); + BROADCAST(&rwl->writeable); + UNLOCK(&rwl->lock); +@@ -639,19 +580,16 @@ isc_rwlock_unlock(isc_rwlock_t *rwl, isc_rwlocktype_t type) { + * Reset the flag, and (implicitly) tell other writers + * we are done. + */ +-#if defined(ISC_RWLOCK_USESTDATOMIC) +- atomic_fetch_sub_explicit(&rwl->cnt_and_flag, WRITER_ACTIVE, +- memory_order_relaxed); +- atomic_fetch_add_explicit(&rwl->write_completions, 1, +- memory_order_relaxed); +-#else +- (void)isc_atomic_xadd(&rwl->cnt_and_flag, -WRITER_ACTIVE); +- (void)isc_atomic_xadd(&rwl->write_completions, 1); +-#endif +- +- if (rwl->write_granted >= rwl->write_quota || +- rwl->write_requests == rwl->write_completions || +- (rwl->cnt_and_flag & ~WRITER_ACTIVE) != 0) { ++ atomic_fetch_sub_release(&rwl->cnt_and_flag, WRITER_ACTIVE); ++ atomic_fetch_add_release(&rwl->write_completions, 1); ++ ++ if ((atomic_load_acquire(&rwl->write_granted) >= ++ rwl->write_quota) || ++ (atomic_load_acquire(&rwl->write_requests) == ++ atomic_load_acquire(&rwl->write_completions)) || ++ (atomic_load_acquire(&rwl->cnt_and_flag) ++ & ~WRITER_ACTIVE)) ++ { + /* + * We have passed the write quota, no writer is + * waiting, or some readers are almost ready, pending +@@ -668,7 +606,8 @@ isc_rwlock_unlock(isc_rwlock_t *rwl, isc_rwlocktype_t type) { + UNLOCK(&rwl->lock); + } + +- if (rwl->write_requests != rwl->write_completions && ++ if ((atomic_load_acquire(&rwl->write_requests) != ++ atomic_load_acquire(&rwl->write_completions)) && + wakeup_writers) { + LOCK(&rwl->lock); + BROADCAST(&rwl->writeable); +-- +2.21.0 + diff --git a/SOURCES/bind-9.3.1rc1-sdb_tools-Makefile.in b/SOURCES/bind-9.3.1rc1-sdb_tools-Makefile.in new file mode 100644 index 0000000..c7e0868 --- /dev/null +++ b/SOURCES/bind-9.3.1rc1-sdb_tools-Makefile.in @@ -0,0 +1,63 @@ +srcdir = @srcdir@ +VPATH = @srcdir@ +top_srcdir = @top_srcdir@ + +VERSION=@BIND9_VERSION@ + +@BIND9_MAKE_INCLUDES@ + +CINCLUDES = -I${srcdir}/include -I${srcdir}/unix/include \ + ${LWRES_INCLUDES} ${DNS_INCLUDES} ${BIND9_INCLUDES} \ + ${ISCCFG_INCLUDES} ${ISCCC_INCLUDES} ${ISC_INCLUDES} + +CDEFINES = -DBIND9 + +DNSLIBS = ../../lib/dns/libdns.@A@ @DNS_CRYPTO_LIBS@ +ISCCFGLIBS = ../../lib/isccfg/libisccfg.@A@ +ISCCCLIBS = ../../lib/isccc/libisccc.@A@ +ISCLIBS = ../../lib/isc/libisc.@A@ +LWRESLIBS = ../../lib/lwres/liblwres.@A@ +BIND9LIBS = ../../lib/bind9/libbind9.@A@ + +DNSDEPLIBS = ../../lib/dns/libdns.@A@ +ISCCFGDEPLIBS = ../../lib/isccfg/libisccfg.@A@ +ISCCCDEPLIBS = ../../lib/isccc/libisccc.@A@ +ISCDEPLIBS = ../../lib/isc/libisc.@A@ +LWRESDEPLIBS = ../../lib/lwres/liblwres.@A@ +BIND9DEPLIBS = ../../lib/bind9/libbind9.@A@ + +DEPLIBS = ${LWRESDEPLIBS} ${DNSDEPLIBS} ${BIND9DEPLIBS} \ + ${ISCCFGDEPLIBS} ${ISCCCDEPLIBS} ${ISCDEPLIBS} + +LIBS = ${LWRESLIBS} ${DNSLIBS} ${BIND9LIBS} \ + ${ISCCFGLIBS} ${ISCCCLIBS} ${ISCLIBS} ${DBDRIVER_LIBS} @LIBS@ + +TARGETS = zone2ldap@EXEEXT@ zonetodb@EXEEXT@ + +OBJS = zone2ldap.@O@ zonetodb.@O@ + +SRCS = zone2ldap.c zonetodb.c + +MANPAGES = zone2ldap.1 + +EXT_CFLAGS = + +@BIND9_MAKE_RULES@ + +zone2ldap@EXEEXT@: zone2ldap.@O@ ${DEPLIBS} + ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ zone2ldap.@O@ -lldap -llber ${LIBS} + +zonetodb@EXEEXT@: zonetodb.@O@ ${DEPLIBS} + ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ zonetodb.@O@ -lpq ${LIBS} + +clean distclean manclean maintainer-clean:: + rm -f ${TARGETS} ${OBJS} + +installdirs: + $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${sbindir} + $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${mandir}/man1 + +install:: ${TARGETS} installdirs + ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} zone2ldap@EXEEXT@ ${DESTDIR}${sbindir} + ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} zonetodb@EXEEXT@ ${DESTDIR}${sbindir} + ${INSTALL_DATA} ${srcdir}/zone2ldap.1 ${DESTDIR}${mandir}/man1/zone2ldap.1 diff --git a/SOURCES/bind-9.3.2-redhat_doc.patch b/SOURCES/bind-9.3.2-redhat_doc.patch new file mode 100644 index 0000000..4c9d90d --- /dev/null +++ b/SOURCES/bind-9.3.2-redhat_doc.patch @@ -0,0 +1,62 @@ +diff --git a/bin/named/named.8 b/bin/named/named.8 +index cd990a9..890be36 100644 +--- a/bin/named/named.8 ++++ b/bin/named/named.8 +@@ -358,6 +358,57 @@ The default configuration file\&. + /var/run/named/named\&.pid + .RS 4 + The default process\-id file\&. ++.PP ++.SH "NOTES" ++.PP ++.TP ++\fBRed Hat SELinux BIND Security Profile:\fR ++.PP ++By default, Red Hat ships BIND with the most secure SELinux policy ++that will not prevent normal BIND operation and will prevent exploitation ++of all known BIND security vulnerabilities . See the selinux(8) man page ++for information about SElinux. ++.PP ++It is not necessary to run named in a chroot environment if the Red Hat ++SELinux policy for named is enabled. When enabled, this policy is far ++more secure than a chroot environment. Users are recommended to enable ++SELinux and remove the bind-chroot package. ++.PP ++With this extra security comes some restrictions: ++.PP ++By default, the SELinux policy does not allow named to write any master ++zone database files. Only the root user may create files in the $ROOTDIR/var/named ++zone database file directory (the options { "directory" } option), where ++$ROOTDIR is set in /etc/sysconfig/named. ++.PP ++The "named" group must be granted read privelege to ++these files in order for named to be enabled to read them. ++.PP ++Any file created in the zone database file directory is automatically assigned ++the SELinux file context named_zone_t . ++.PP ++By default, SELinux prevents any role from modifying named_zone_t files; this ++means that files in the zone database directory cannot be modified by dynamic ++DNS (DDNS) updates or zone transfers. ++.PP ++The Red Hat BIND distribution and SELinux policy creates three directories where ++named is allowed to create and modify files: /var/named/slaves, /var/named/dynamic ++/var/named/data. By placing files you want named to modify, such as ++slave or DDNS updateable zone files and database / statistics dump files in ++these directories, named will work normally and no further operator action is ++required. Files in these directories are automatically assigned the 'named_cache_t' ++file context, which SELinux allows named to write. ++.PP ++\fBRed Hat BIND SDB support:\fR ++.PP ++Red Hat ships named with compiled in Simplified Database Backend modules that ISC ++provides in the "contrib/sdb" directory. Install bind-sdb package if you want use them ++.PP ++The SDB modules for LDAP, PostGreSQL, DirDB and SQLite are compiled into named-sdb. ++.PP ++See the documentation for the various SDB modules in /usr/share/doc/bind-sdb-*/ . ++.br ++.PP + .RE + .SH "SEE ALSO" + .PP diff --git a/SOURCES/bind-9.3.2b1-fix_sdb_ldap.patch b/SOURCES/bind-9.3.2b1-fix_sdb_ldap.patch new file mode 100644 index 0000000..35c8542 --- /dev/null +++ b/SOURCES/bind-9.3.2b1-fix_sdb_ldap.patch @@ -0,0 +1,519 @@ +diff --git a/bin/sdb_tools/Makefile.in b/bin/sdb_tools/Makefile.in +index 95ab742..6069f09 100644 +--- a/bin/sdb_tools/Makefile.in ++++ b/bin/sdb_tools/Makefile.in +@@ -32,11 +32,11 @@ DEPLIBS = ${LWRESDEPLIBS} ${DNSDEPLIBS} ${BIND9DEPLIBS} \ + LIBS = ${LWRESLIBS} ${DNSLIBS} ${BIND9LIBS} \ + ${ISCCFGLIBS} ${ISCCCLIBS} ${ISCLIBS} ${DBDRIVER_LIBS} @LIBS@ + +-TARGETS = zone2ldap@EXEEXT@ zonetodb@EXEEXT@ zone2sqlite@EXEEXT@ ++TARGETS = zone2ldap@EXEEXT@ ldap2zone@EXEEXT@ zonetodb@EXEEXT@ zone2sqlite@EXEEXT@ + +-OBJS = zone2ldap.@O@ zonetodb.@O@ zone2sqlite.@O@ ++OBJS = zone2ldap.@O@ ldap2zone.@O@ zonetodb.@O@ zone2sqlite.@O@ + +-SRCS = zone2ldap.c zonetodb.c zone2sqlite.c ++SRCS = zone2ldap.c ldap2zone.c zonetodb.c zone2sqlite.c + + MANPAGES = zone2ldap.1 + +@@ -53,6 +53,9 @@ zonetodb@EXEEXT@: zonetodb.@O@ ${DEPLIBS} + zone2sqlite@EXEEXT@: zone2sqlite.@O@ ${DEPLIBS} + ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${ALL_CFLAGS} ${LDFLAGS} -o $@ zone2sqlite.@O@ -lsqlite3 -lssl ${LIBS} + ++ldap2zone@EXEEXT@: ldap2zone.@O@ ${DEPLIBS} ++ ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${ALL_CFLAGS} ${LDFLAGS} -o $@ ldap2zone.@O@ -lldap -llber ${LIBS} ++ + clean distclean manclean maintainer-clean:: + rm -f ${TARGETS} ${OBJS} + +@@ -62,6 +65,7 @@ installdirs: + + install:: ${TARGETS} installdirs + ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} zone2ldap@EXEEXT@ ${DESTDIR}${sbindir} ++ ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} ldap2zone@EXEEXT@ ${DESTDIR}${sbindir} + ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} zonetodb@EXEEXT@ ${DESTDIR}${sbindir} + ${LIBTOOL_MODE_INSTALL} ${INSTALL_PROGRAM} zone2sqlite@EXEEXT@ ${DESTDIR}${sbindir} + ${INSTALL_DATA} ${srcdir}/zone2ldap.1 ${DESTDIR}${mandir}/man1/zone2ldap.1 +diff --git a/bin/sdb_tools/zone2ldap.c b/bin/sdb_tools/zone2ldap.c +index aa2c711..76186b5 100644 +--- a/bin/sdb_tools/zone2ldap.c ++++ b/bin/sdb_tools/zone2ldap.c +@@ -66,6 +66,9 @@ ldap_info; + /* usage Info */ + void usage (void); + ++/* Check for existence of (and possibly add) containing dNSZone objects */ ++int lookup_dns_zones( ldap_info *ldinfo); ++ + /* Add to the ldap dit */ + void add_ldap_values (ldap_info * ldinfo); + +@@ -82,7 +85,7 @@ char **hostname_to_dn_list (char *hostname, char *zone, unsigned int flags); + int get_attr_list_size (char **tmp); + + /* Get a DN */ +-char *build_dn_from_dc_list (char **dc_list, unsigned int ttl, int flag); ++char *build_dn_from_dc_list (char **dc_list, unsigned int ttl, int flag, char *zone); + + /* Add to RR list */ + void add_to_rr_list (char *dn, char *name, char *type, char *data, +@@ -104,11 +107,27 @@ void + init_ldap_conn (); + void usage(); + +-char *argzone, *ldapbase, *binddn, *bindpw = NULL; +-const char *ldapsystem = "localhost"; +-static const char *objectClasses[] = +- { "top", "dNSZone", NULL }; +-static const char *topObjectClasses[] = { "top", NULL }; ++static char *argzone, *ldapbase, *binddn, *bindpw = NULL; ++ ++/* these are needed to placate gcc4's const-ness const-ernations : */ ++static char localhost[] = "localhost"; ++static char *ldapsystem=&(localhost[0]); ++/* dnszone schema class names: */ ++static char topClass [] ="top"; ++static char dNSZoneClass[] ="dNSZone"; ++static char objectClass [] ="objectClass"; ++static char dcObjectClass[]="dcObject"; ++/* dnszone schema attribute names: */ ++static char relativeDomainName[]="relativeDomainName"; ++static char dNSTTL []="dNSTTL"; ++static char zoneName []="zoneName"; ++static char dc []="dc"; ++static char sameZone []="@"; ++/* LDAPMod mod_values: */ ++static char *objectClasses []= { &(topClass[0]), &(dNSZoneClass[0]), NULL }; ++static char *topObjectClasses []= { &(topClass[0]), &(dcObjectClass[0]), &(dNSZoneClass[0]), NULL }; ++static char *dn_buffer [64]={NULL}; ++ + LDAP *conn; + unsigned int debug = 0; + +@@ -132,12 +151,12 @@ main (int argc, char **argv) + isc_result_t result; + char *basedn; + ldap_info *tmp; +- LDAPMod *base_attrs[2]; +- LDAPMod base; ++ LDAPMod *base_attrs[5]; ++ LDAPMod base, dcBase, znBase, rdnBase; + isc_buffer_t buff; + char *zonefile=0L; + char fullbasedn[1024]; +- char *ctmp; ++ char *ctmp, *zn, *dcp[2], *znp[2], *rdn[2]; + dns_fixedname_t fixedzone, fixedname; + dns_rdataset_t rdataset; + char **dc_list; +@@ -150,7 +169,7 @@ main (int argc, char **argv) + extern char *optarg; + extern int optind, opterr, optopt; + int create_base = 0; +- int topt; ++ int topt, dcn, zdn, znlen; + + if (argc < 2) + { +@@ -158,7 +177,7 @@ main (int argc, char **argv) + exit (-1); + } + +- while ((topt = getopt (argc, argv, "D:w:b:z:f:h:?dcv")) != -1) ++ while ((topt = getopt (argc, argv, "D:Ww:b:z:f:h:?dcv")) != -1) + { + switch (topt) + { +@@ -181,6 +200,9 @@ main (int argc, char **argv) + if (bindpw == NULL) + fatal("strdup"); + break; ++ case 'W': ++ bindpw = getpass("Enter LDAP Password: "); ++ break; + case 'b': + ldapbase = strdup (optarg); + if (ldapbase == NULL) +@@ -300,27 +322,62 @@ main (int argc, char **argv) + { + if (debug) + printf ("Creating base zone DN %s\n", argzone); +- ++ + dc_list = hostname_to_dn_list (argzone, argzone, DNS_TOP); +- basedn = build_dn_from_dc_list (dc_list, 0, NO_SPEC); + +- for (ctmp = &basedn[strlen (basedn)]; ctmp >= &basedn[0]; ctmp--) ++ basedn = build_dn_from_dc_list (dc_list, 0, NO_SPEC, argzone); ++ if (debug) ++ printf ("base DN %s\n", basedn); ++ ++ for (ctmp = &basedn[strlen (basedn)], dcn=0; ctmp >= &basedn[0]; ctmp--) + { +- if ((*ctmp == ',') || (ctmp == &basedn[0])) ++ if ((*ctmp == ',') || (ctmp == &basedn[0])) + { ++ + base.mod_op = LDAP_MOD_ADD; +- base.mod_type = (char*)"objectClass"; +- base.mod_values = (char**)topObjectClasses; ++ base.mod_type = objectClass; ++ base.mod_values = topObjectClasses; + base_attrs[0] = (void*)&base; +- base_attrs[1] = NULL; +- ++ ++ dcBase.mod_op = LDAP_MOD_ADD; ++ dcBase.mod_type = dc; ++ dcp[0]=dc_list[dcn]; ++ dcp[1]=0L; ++ dcBase.mod_values=dcp; ++ base_attrs[1] = (void*)&dcBase; ++ ++ znBase.mod_op = LDAP_MOD_ADD; ++ znBase.mod_type = zoneName; ++ for( zdn = dcn, znlen = 0; zdn >= 0; zdn-- ) ++ znlen += strlen(dc_list[zdn])+1; ++ znp[0] = (char*)malloc(znlen+1); ++ znp[1] = 0L; ++ for( zdn = dcn, zn=znp[0]; zdn >= 0; zdn-- ) ++ zn+=sprintf(zn,"%s%s",dc_list[zdn], ++ ((zdn > 0) && (*(dc_list[zdn-1])!='.')) ? "." : "" ++ ); ++ ++ znBase.mod_values = znp; ++ base_attrs[2] = (void*)&znBase; ++ ++ rdnBase.mod_op = LDAP_MOD_ADD; ++ rdnBase.mod_type = relativeDomainName; ++ rdn[0] = strdup(sameZone); ++ rdn[1] = 0L; ++ rdnBase.mod_values = rdn; ++ base_attrs[3] = (void*)&rdnBase; ++ ++ dcn++; ++ ++ base.mod_values = topObjectClasses; ++ base_attrs[4] = NULL; ++ + if (ldapbase) + { + if (ctmp != &basedn[0]) + sprintf (fullbasedn, "%s,%s", ctmp + 1, ldapbase); + else +- sprintf (fullbasedn, "%s,%s", ctmp, ldapbase); +- ++ sprintf (fullbasedn, "%s,%s", ctmp, ldapbase); + } + else + { +@@ -329,8 +386,13 @@ main (int argc, char **argv) + else + sprintf (fullbasedn, "%s", ctmp); + } ++ ++ if( debug ) ++ printf("Full base dn: %s\n", fullbasedn); ++ + result = ldap_add_s (conn, fullbasedn, base_attrs); + ldap_result_check ("intial ldap_add_s", fullbasedn, result); ++ + } + + } +@@ -408,14 +470,14 @@ generate_ldap (dns_name_t * dnsname, dns_rdata_t * rdata, unsigned int ttl) + isc_result_check (result, "dns_rdata_totext"); + data[isc_buffer_usedlength (&buff)] = 0; + +- dc_list = hostname_to_dn_list (name, argzone, DNS_OBJECT); ++ dc_list = hostname_to_dn_list ((char*)name, argzone, DNS_OBJECT); + len = (get_attr_list_size (dc_list) - 2); +- dn = build_dn_from_dc_list (dc_list, ttl, WI_SPEC); ++ dn = build_dn_from_dc_list (dc_list, ttl, WI_SPEC, argzone); + + if (debug) + printf ("Adding %s (%s %s) to run queue list.\n", dn, type, data); + +- add_to_rr_list (dn, dc_list[len], type, data, ttl, DNS_OBJECT); ++ add_to_rr_list (dn, dc_list[len], (char*)type, (char*)data, ttl, DNS_OBJECT); + } + + +@@ -455,7 +517,8 @@ add_to_rr_list (char *dn, char *name, char *type, + int attrlist; + char ldap_type_buffer[128]; + char charttl[64]; +- ++ char *zn; ++ int znlen; + + if ((tmp = locate_by_dn (dn)) == NULL) + { +@@ -482,13 +545,13 @@ add_to_rr_list (char *dn, char *name, char *type, + fatal("malloc"); + } + tmp->attrs[0]->mod_op = LDAP_MOD_ADD; +- tmp->attrs[0]->mod_type = (char*)"objectClass"; ++ tmp->attrs[0]->mod_type = objectClass; + + if (flags == DNS_OBJECT) +- tmp->attrs[0]->mod_values = (char**)objectClasses; ++ tmp->attrs[0]->mod_values = objectClasses; + else + { +- tmp->attrs[0]->mod_values = (char**)topObjectClasses; ++ tmp->attrs[0]->mod_values =topObjectClasses; + tmp->attrs[1] = NULL; + tmp->attrcnt = 2; + tmp->next = ldap_info_base; +@@ -497,7 +560,7 @@ add_to_rr_list (char *dn, char *name, char *type, + } + + tmp->attrs[1]->mod_op = LDAP_MOD_ADD; +- tmp->attrs[1]->mod_type = (char*)"relativeDomainName"; ++ tmp->attrs[1]->mod_type = relativeDomainName; + tmp->attrs[1]->mod_values = (char **) calloc (sizeof (char *), 2); + + if (tmp->attrs[1]->mod_values == (char **)NULL) +@@ -526,7 +589,7 @@ add_to_rr_list (char *dn, char *name, char *type, + fatal("strdup"); + + tmp->attrs[3]->mod_op = LDAP_MOD_ADD; +- tmp->attrs[3]->mod_type = (char*)"dNSTTL"; ++ tmp->attrs[3]->mod_type = dNSTTL; + tmp->attrs[3]->mod_values = (char **) calloc (sizeof (char *), 2); + + if (tmp->attrs[3]->mod_values == (char **)NULL) +@@ -539,14 +602,25 @@ add_to_rr_list (char *dn, char *name, char *type, + if (tmp->attrs[3]->mod_values[0] == NULL) + fatal("strdup"); + ++ znlen=strlen(gbl_zone); ++ if ( *(gbl_zone + (znlen-1)) == '.' ) ++ { /* ldapdb MUST search by relative zone name */ ++ zn = (char*)malloc(znlen); ++ strncpy(zn,gbl_zone,znlen-1); ++ *(zn + (znlen-1))='\0'; ++ }else ++ { ++ zn = gbl_zone; ++ } ++ + tmp->attrs[4]->mod_op = LDAP_MOD_ADD; +- tmp->attrs[4]->mod_type = (char*)"zoneName"; ++ tmp->attrs[4]->mod_type = zoneName; + tmp->attrs[4]->mod_values = (char **)calloc(sizeof(char *), 2); + + if (tmp->attrs[4]->mod_values == (char **)NULL) + fatal("calloc"); + +- tmp->attrs[4]->mod_values[0] = gbl_zone; ++ tmp->attrs[4]->mod_values[0] = zn; + tmp->attrs[4]->mod_values[1] = NULL; + + tmp->attrs[5] = NULL; +@@ -557,7 +631,7 @@ add_to_rr_list (char *dn, char *name, char *type, + else + { + +- for (i = 0; tmp->attrs[i] != NULL; i++) ++ for (i = 0; tmp->attrs[i] != NULL; i++) + { + sprintf (ldap_type_buffer, "%sRecord", type); + if (!strncmp +@@ -631,44 +705,70 @@ char ** + hostname_to_dn_list (char *hostname, char *zone, unsigned int flags) + { + char *tmp; +- static char *dn_buffer[64]; + int i = 0; +- char *zname; +- char *hnamebuff; +- +- zname = strdup (hostname); +- if (zname == NULL) +- fatal("strdup"); +- +- if (flags == DNS_OBJECT) +- { +- +- if (strlen (zname) != strlen (zone)) +- { +- tmp = &zname[strlen (zname) - strlen (zone)]; +- *--tmp = '\0'; +- hnamebuff = strdup (zname); +- if (hnamebuff == NULL) +- fatal("strdup"); +- zname = ++tmp; +- } +- else +- hnamebuff = (char*)"@"; +- } +- else +- { +- zname = zone; +- hnamebuff = NULL; +- } +- +- for (tmp = strrchr (zname, '.'); tmp != (char *) 0; +- tmp = strrchr (zname, '.')) +- { +- *tmp++ = '\0'; +- dn_buffer[i++] = tmp; +- } +- dn_buffer[i++] = zname; +- dn_buffer[i++] = hnamebuff; ++ char *hname=0L, *last=0L; ++ int hlen=strlen(hostname), zlen=(strlen(zone)); ++ ++/* printf("hostname: %s zone: %s\n",hostname, zone); */ ++ hname=0L; ++ if(flags == DNS_OBJECT) ++ { ++ if( (zone[ zlen - 1 ] == '.') && (hostname[hlen - 1] != '.') ) ++ { ++ hname=(char*)malloc(hlen + 1); ++ hlen += 1; ++ sprintf(hname, "%s.", hostname); ++ hostname = hname; ++ } ++ if(strcmp(hostname, zone) == 0) ++ { ++ if( hname == 0 ) ++ hname=strdup(hostname); ++ last = strdup(sameZone); ++ }else ++ { ++ if( (hlen < zlen) ++ ||( strcmp( hostname + (hlen - zlen), zone ) != 0) ++ ) ++ { ++ if( hname != 0 ) ++ free(hname); ++ hname=(char*)malloc( hlen + zlen + 1); ++ if( *zone == '.' ) ++ sprintf(hname, "%s%s", hostname, zone); ++ else ++ sprintf(hname,"%s",zone); ++ }else ++ { ++ if( hname == 0 ) ++ hname = strdup(hostname); ++ } ++ last = hname; ++ } ++ }else ++ { /* flags == DNS_TOP */ ++ hname = strdup(zone); ++ last = hname; ++ } ++ ++ for (tmp = strrchr (hname, '.'); tmp != (char *) 0; ++ tmp = strrchr (hname, '.')) ++ { ++ if( *( tmp + 1 ) != '\0' ) ++ { ++ *tmp = '\0'; ++ dn_buffer[i++] = ++tmp; ++ }else ++ { /* trailing '.' ! */ ++ dn_buffer[i++] = strdup("."); ++ *tmp = '\0'; ++ if( tmp == hname ) ++ break; ++ } ++ } ++ if( ( last != hname ) && (tmp != hname) ) ++ dn_buffer[i++] = hname; ++ dn_buffer[i++] = last; + dn_buffer[i] = NULL; + + return dn_buffer; +@@ -680,24 +780,32 @@ hostname_to_dn_list (char *hostname, char *zone, unsigned int flags) + * exception of "@"/SOA. */ + + char * +-build_dn_from_dc_list (char **dc_list, unsigned int ttl, int flag) ++build_dn_from_dc_list (char **dc_list, unsigned int ttl, int flag, char *zone) + { + int size; +- int x; ++ int x, znlen; + static char dn[1024]; + char tmp[128]; ++ char zn[DNS_NAME_MAXTEXT+1]; + + bzero (tmp, sizeof (tmp)); + bzero (dn, sizeof (dn)); + size = get_attr_list_size (dc_list); ++ znlen = strlen(zone); ++ if ( *(zone + (znlen-1)) == '.' ) ++ { /* ldapdb MUST search by relative zone name */ ++ memcpy(&(zn[0]),zone,znlen-1); ++ *(zn + (znlen-1))='\0'; ++ zone = zn; ++ } + for (x = size - 2; x > 0; x--) + { + if (flag == WI_SPEC) + { + if (x == (size - 2) && (strncmp (dc_list[x], "@", 1) == 0) && (ttl)) +- sprintf (tmp, "relativeDomainName=%s + dNSTTL=%u,", dc_list[x], ttl); ++ sprintf (tmp, "zoneName=%s + relativeDomainName=%s,", zone, dc_list[x]); + else if (x == (size - 2)) +- sprintf(tmp, "relativeDomainName=%s,",dc_list[x]); ++ sprintf(tmp, "zoneName=%s + relativeDomainName=%s,", zone, dc_list[x]); + else + sprintf(tmp,"dc=%s,", dc_list[x]); + } +@@ -723,6 +831,7 @@ void + init_ldap_conn () + { + int result; ++ char ldb_tag[]="LDAP Bind"; + conn = ldap_open (ldapsystem, LDAP_PORT); + if (conn == NULL) + { +@@ -732,7 +841,7 @@ init_ldap_conn () + } + + result = ldap_simple_bind_s (conn, binddn, bindpw); +- ldap_result_check ("ldap_simple_bind_s", (char*)"LDAP Bind", result); ++ ldap_result_check ("ldap_simple_bind_s", ldb_tag , result); + } + + /* Like isc_result_check, only for LDAP */ +@@ -749,8 +858,6 @@ ldap_result_check (const char *msg, char *dn, int err) + } + } + +- +- + /* For running the ldap_info run queue. */ + void + add_ldap_values (ldap_info * ldinfo) +@@ -758,14 +865,14 @@ add_ldap_values (ldap_info * ldinfo) + int result; + char dnbuffer[1024]; + +- + if (ldapbase != NULL) + sprintf (dnbuffer, "%s,%s", ldinfo->dn, ldapbase); + else + sprintf (dnbuffer, "%s", ldinfo->dn); + + result = ldap_add_s (conn, dnbuffer, ldinfo->attrs); +- ldap_result_check ("ldap_add_s", dnbuffer, result); ++ ldap_result_check ("ldap_add_s", dnbuffer, result); ++ + } + + +@@ -776,5 +883,5 @@ void + usage () + { + fprintf (stderr, +- "zone2ldap -D [BIND DN] -w [BIND PASSWORD] -b [BASE DN] -z [ZONE] -f [ZONE FILE] -h [LDAP HOST] " ++ "zone2ldap -D [BIND DN] [-w BIND PASSWORD | -W:prompt] -b [BASE DN] -z [ZONE] -f [ZONE FILE] -h [LDAP HOST] " + "[-c Create LDAP Base structure][-d Debug Output (lots !)] \n ");} diff --git a/SOURCES/bind-9.3.2b2-sdbsrc.patch b/SOURCES/bind-9.3.2b2-sdbsrc.patch new file mode 100644 index 0000000..46e183c --- /dev/null +++ b/SOURCES/bind-9.3.2b2-sdbsrc.patch @@ -0,0 +1,230 @@ +diff --git a/contrib/sdb/bdb/bdb.c b/contrib/sdb/bdb/bdb.c +index 23594bb..b3c6619 100644 +--- a/contrib/sdb/bdb/bdb.c ++++ b/contrib/sdb/bdb/bdb.c +@@ -43,7 +43,7 @@ + #include + #include + +-#include ++#include "bdb.h" + #include + #include + +diff --git a/contrib/sdb/ldap/zone2ldap.c b/contrib/sdb/ldap/zone2ldap.c +index 07c89bc..23dd873 100644 +--- a/contrib/sdb/ldap/zone2ldap.c ++++ b/contrib/sdb/ldap/zone2ldap.c +@@ -63,16 +63,16 @@ typedef struct LDAP_INFO + ldap_info; + + /* usage Info */ +-void usage (); ++void usage (void); + + /* Add to the ldap dit */ + void add_ldap_values (ldap_info * ldinfo); + + /* Init an ldap connection */ +-void init_ldap_conn (); ++void init_ldap_conn (void); + + /* Ldap error checking */ +-void ldap_result_check (char *msg, char *dn, int err); ++void ldap_result_check (const char *msg, char *dn, int err); + + /* Put a hostname into a char ** array */ + char **hostname_to_dn_list (char *hostname, char *zone, unsigned int flags); +@@ -88,7 +88,7 @@ void add_to_rr_list (char *dn, char *name, char *type, char *data, + unsigned int ttl, unsigned int flags); + + /* Error checking */ +-void isc_result_check (isc_result_t res, char *errorstr); ++void isc_result_check (isc_result_t res, const char *errorstr); + + /* Generate LDIF Format files */ + void generate_ldap (dns_name_t * dnsname, dns_rdata_t * rdata, +@@ -97,11 +97,17 @@ void generate_ldap (dns_name_t * dnsname, dns_rdata_t * rdata, + /* head pointer to the list */ + ldap_info *ldap_info_base = NULL; + ++ldap_info * ++locate_by_dn (char *dn); ++void ++init_ldap_conn (); ++void usage(); ++ + char *argzone, *ldapbase, *binddn, *bindpw = NULL; +-char *ldapsystem = "localhost"; +-static char *objectClasses[] = ++const char *ldapsystem = "localhost"; ++static const char *objectClasses[] = + { "top", "dNSZone", NULL }; +-static char *topObjectClasses[] = { "top", NULL }; ++static const char *topObjectClasses[] = { "top", NULL }; + LDAP *conn; + unsigned int debug = 0; + +@@ -128,7 +134,7 @@ main (int argc, char **argv) + LDAPMod *base_attrs[2]; + LDAPMod base; + isc_buffer_t buff; +- char *zonefile; ++ char *zonefile=0L; + char fullbasedn[1024]; + char *ctmp; + dns_fixedname_t fixedzone, fixedname; +@@ -304,9 +310,9 @@ main (int argc, char **argv) + if ((*ctmp == ',') || (ctmp == &basedn[0])) + { + base.mod_op = LDAP_MOD_ADD; +- base.mod_type = "objectClass"; +- base.mod_values = topObjectClasses; +- base_attrs[0] = &base; ++ base.mod_type = (char*)"objectClass"; ++ base.mod_values = (char**)topObjectClasses; ++ base_attrs[0] = (void*)&base; + base_attrs[1] = NULL; + + if (ldapbase) +@@ -363,7 +369,7 @@ main (int argc, char **argv) + * I should probably rename this function, as not to cause any + * confusion with the isc* routines. Will exit on error. */ + void +-isc_result_check (isc_result_t res, char *errorstr) ++isc_result_check (isc_result_t res, const char *errorstr) + { + if (res != ISC_R_SUCCESS) + { +@@ -470,20 +476,20 @@ add_to_rr_list (char *dn, char *name, char *type, + if (tmp->attrs == (LDAPMod **) NULL) + fatal("calloc"); + +- for (i = 0; i < flags; i++) ++ for (i = 0; i < (int)flags; i++) + { + tmp->attrs[i] = (LDAPMod *) malloc (sizeof (LDAPMod)); + if (tmp->attrs[i] == (LDAPMod *) NULL) + fatal("malloc"); + } + tmp->attrs[0]->mod_op = LDAP_MOD_ADD; +- tmp->attrs[0]->mod_type = "objectClass"; ++ tmp->attrs[0]->mod_type = (char*)"objectClass"; + + if (flags == DNS_OBJECT) +- tmp->attrs[0]->mod_values = objectClasses; ++ tmp->attrs[0]->mod_values = (char**)objectClasses; + else + { +- tmp->attrs[0]->mod_values = topObjectClasses; ++ tmp->attrs[0]->mod_values = (char**)topObjectClasses; + tmp->attrs[1] = NULL; + tmp->attrcnt = 2; + tmp->next = ldap_info_base; +@@ -492,7 +498,7 @@ add_to_rr_list (char *dn, char *name, char *type, + } + + tmp->attrs[1]->mod_op = LDAP_MOD_ADD; +- tmp->attrs[1]->mod_type = "relativeDomainName"; ++ tmp->attrs[1]->mod_type = (char*)"relativeDomainName"; + tmp->attrs[1]->mod_values = (char **) calloc (sizeof (char *), 2); + + if (tmp->attrs[1]->mod_values == (char **)NULL) +@@ -521,7 +527,7 @@ add_to_rr_list (char *dn, char *name, char *type, + fatal("strdup"); + + tmp->attrs[3]->mod_op = LDAP_MOD_ADD; +- tmp->attrs[3]->mod_type = "dNSTTL"; ++ tmp->attrs[3]->mod_type = (char*)"dNSTTL"; + tmp->attrs[3]->mod_values = (char **) calloc (sizeof (char *), 2); + + if (tmp->attrs[3]->mod_values == (char **)NULL) +@@ -535,7 +541,7 @@ add_to_rr_list (char *dn, char *name, char *type, + fatal("strdup"); + + tmp->attrs[4]->mod_op = LDAP_MOD_ADD; +- tmp->attrs[4]->mod_type = "zoneName"; ++ tmp->attrs[4]->mod_type = (char*)"zoneName"; + tmp->attrs[4]->mod_values = (char **)calloc(sizeof(char *), 2); + + if (tmp->attrs[4]->mod_values == (char **)NULL) +@@ -648,7 +654,7 @@ hostname_to_dn_list (char *hostname, char *zone, unsigned int flags) + zname = ++tmp; + } + else +- hnamebuff = "@"; ++ hnamebuff = (char*)"@"; + } + else + { +@@ -727,12 +733,12 @@ init_ldap_conn () + } + + result = ldap_simple_bind_s (conn, binddn, bindpw); +- ldap_result_check ("ldap_simple_bind_s", "LDAP Bind", result); ++ ldap_result_check ("ldap_simple_bind_s", (char*)"LDAP Bind", result); + } + + /* Like isc_result_check, only for LDAP */ + void +-ldap_result_check (char *msg, char *dn, int err) ++ldap_result_check (const char *msg, char *dn, int err) + { + if ((err != LDAP_SUCCESS) && (err != LDAP_ALREADY_EXISTS)) + { +diff --git a/contrib/sdb/pgsql/pgsqldb.c b/contrib/sdb/pgsql/pgsqldb.c +index 50d3cba..516eb9f 100644 +--- a/contrib/sdb/pgsql/pgsqldb.c ++++ b/contrib/sdb/pgsql/pgsqldb.c +@@ -23,7 +23,7 @@ + #include + #include + +-#include ++#include + + #include + #include +diff --git a/contrib/sdb/pgsql/zonetodb.c b/contrib/sdb/pgsql/zonetodb.c +index b8f5912..ff2d135 100644 +--- a/contrib/sdb/pgsql/zonetodb.c ++++ b/contrib/sdb/pgsql/zonetodb.c +@@ -37,7 +37,7 @@ + #include + #include + +-#include ++#include + + /* + * Generate a PostgreSQL table from a zone. +@@ -54,6 +54,9 @@ char *dbname, *dbtable; + char str[10240]; + + void ++closeandexit(int status); ++ ++void + closeandexit(int status) { + if (conn != NULL) + PQfinish(conn); +@@ -61,6 +64,9 @@ closeandexit(int status) { + } + + void ++check_result(isc_result_t result, const char *message); ++ ++void + check_result(isc_result_t result, const char *message) { + if (result != ISC_R_SUCCESS) { + fprintf(stderr, "%s: %s\n", message, +@@ -84,7 +90,8 @@ quotestring(const unsigned char *source, unsigned char *dest) { + } + *dest++ = 0; + } +- ++void ++addrdata(dns_name_t *name, dns_ttl_t ttl, dns_rdata_t *rdata); + void + addrdata(dns_name_t *name, dns_ttl_t ttl, dns_rdata_t *rdata) { + unsigned char namearray[DNS_NAME_MAXTEXT + 1]; diff --git a/SOURCES/bind-9.5-PIE.patch b/SOURCES/bind-9.5-PIE.patch new file mode 100644 index 0000000..a525b9b --- /dev/null +++ b/SOURCES/bind-9.5-PIE.patch @@ -0,0 +1,27 @@ +--- bind-9.5.0b2/bin/named/Makefile.in.pie 2008-02-11 17:21:47.000000000 +0100 ++++ bind-9.5.0b2/bin/named/Makefile.in 2008-02-11 17:22:10.000000000 +0100 +@@ -100,8 +100,12 @@ HTMLPAGES = named.html lwresd.html named + + MANOBJS = ${MANPAGES} ${HTMLPAGES} + ++EXT_CFLAGS = -fpie ++ + @BIND9_MAKE_RULES@ + ++LDFLAGS += -pie -Wl,-z,relro,-z,now,-z,nodlopen,-z,noexecstack ++ + main.@O@: main.c + ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} \ + -DVERSION=\"${VERSION}\" \ +diff -up bind-9.5.0b2/bin/named/unix/Makefile.in.pie bind-9.5.0b2/bin/named/unix/Makefile.in +--- bind-9.5.0b2/bin/named/unix/Makefile.in.pie 2008-02-11 17:22:21.000000000 +0100 ++++ bind-9.5.0b2/bin/named/unix/Makefile.in 2008-02-11 17:23:00.000000000 +0100 +@@ -19,6 +19,8 @@ srcdir = @srcdir@ + VPATH = @srcdir@ + top_srcdir = @top_srcdir@ + ++EXT_CFLAGS = -fpie ++ + @BIND9_MAKE_INCLUDES@ + + CINCLUDES = -I${srcdir}/include -I${srcdir}/../include \ diff --git a/SOURCES/bind-9.5-dlz-64bit.patch b/SOURCES/bind-9.5-dlz-64bit.patch new file mode 100644 index 0000000..ec064c6 --- /dev/null +++ b/SOURCES/bind-9.5-dlz-64bit.patch @@ -0,0 +1,53 @@ +diff --git a/contrib/dlz/config.dlz.in b/contrib/dlz/config.dlz.in +index 47525af..eefe3c3 100644 +--- a/contrib/dlz/config.dlz.in ++++ b/contrib/dlz/config.dlz.in +@@ -17,6 +17,13 @@ + # + dlzdir='${DLZ_DRIVER_DIR}' + ++AC_MSG_CHECKING([for target libdir]) ++AC_RUN_IFELSE([int main(void) {exit((sizeof(void *) == 8) ? 0 : 1);}], ++ [target_lib=lib64], ++ [target_lib=lib], ++) ++AC_MSG_RESULT(["$target_lib"]) ++ + # + # Private autoconf macro to simplify configuring drivers: + # +@@ -292,9 +299,9 @@ case "$use_dlz_bdb" in + then + break + fi +- elif test -f "$dd/lib/lib${d}.so" ++ elif test -f "$dd/${target_lib}/lib${d}.so" + then +- dlz_bdb_libs="-L${dd}/lib -l${d}" ++ dlz_bdb_libs="-L${dd}/${target_lib} -l${d}" + break + fi + done +@@ -396,7 +403,7 @@ case "$use_dlz_ldap" in + *) + DLZ_ADD_DRIVER(LDAP, dlz_ldap_driver, + [-I$use_dlz_ldap/include], +- [-L$use_dlz_ldap/lib -lldap -llber]) ++ [-L$use_dlz_ldap/${target_lib} -lldap -llber]) + + AC_MSG_RESULT( + [using LDAP from $use_dlz_ldap/lib and $use_dlz_ldap/include]) +@@ -432,11 +439,11 @@ then + odbcdirs="/usr /usr/local /usr/pkg" + for d in $odbcdirs + do +- if test -f $d/include/sql.h -a -f $d/lib/libodbc.a ++ if test -f $d/include/sql.h -a -f $d/${target_lib}/libodbc.a + then + use_dlz_odbc=$d + dlz_odbc_include="-I$use_dlz_odbc/include" +- dlz_odbc_libs="-L$use_dlz_odbc/lib -lodbc" ++ dlz_odbc_libs="-L$use_dlz_odbc/${target_lib} -lodbc" + break + fi + done diff --git a/SOURCES/bind-9.9.1-P2-dlz-libdb.patch b/SOURCES/bind-9.9.1-P2-dlz-libdb.patch new file mode 100644 index 0000000..866ed8f --- /dev/null +++ b/SOURCES/bind-9.9.1-P2-dlz-libdb.patch @@ -0,0 +1,31 @@ +diff -up bind-9.10.1b1/contrib/dlz/config.dlz.in.libdb bind-9.10.1b1/contrib/dlz/config.dlz.in +--- bind-9.10.1b1/contrib/dlz/config.dlz.in.libdb 2014-08-04 12:33:09.320735111 +0200 ++++ bind-9.10.1b1/contrib/dlz/config.dlz.in 2014-08-04 12:41:46.888241910 +0200 +@@ -263,7 +263,7 @@ case "$use_dlz_bdb" in + # Check other locations for includes. + # Order is important (sigh). + +- bdb_incdirs="/db53 /db51 /db48 /db47 /db46 /db45 /db44 /db43 /db42 /db41 /db4 /db" ++ bdb_incdirs="/db53 /db51 /db48 /db47 /db46 /db45 /db44 /db43 /db42 /db41 /db4 /libdb /db" + # include a blank element first + for d in "" $bdb_incdirs + do +@@ -288,16 +288,9 @@ case "$use_dlz_bdb" in + bdb_libnames="db53 db-5.3 db51 db-5.1 db48 db-4.8 db47 db-4.7 db46 db-4.6 db45 db-4.5 db44 db-4.4 db43 db-4.3 db42 db-4.2 db41 db-4.1 db" + for d in $bdb_libnames + do +- if test "$dd" = "/usr" ++ if test -f "$dd/${target_lib}/lib${d}.so" + then +- AC_CHECK_LIB($d, db_create, dlz_bdb_libs="-l${d}") +- if test $dlz_bdb_libs != "yes" +- then +- break +- fi +- elif test -f "$dd/${target_lib}/lib${d}.so" +- then +- dlz_bdb_libs="-L${dd}/${target_lib} -l${d}" ++ dlz_bdb_libs="-L${dd}/${target_lib}/libdb -l${d}" + break + fi + done diff --git a/SOURCES/bind-9.9.1-P2-multlib-conflict.patch b/SOURCES/bind-9.9.1-P2-multlib-conflict.patch new file mode 100644 index 0000000..8768b86 --- /dev/null +++ b/SOURCES/bind-9.9.1-P2-multlib-conflict.patch @@ -0,0 +1,54 @@ +diff --git a/config.h.in b/config.h.in +index 4ecaa8f..2f65ccc 100644 +--- a/config.h.in ++++ b/config.h.in +@@ -600,7 +600,7 @@ int sigwait(const unsigned int *set, int *sig); + #undef PREFER_GOSTASN1 + + /* The size of `void *', as computed by sizeof. */ +-#undef SIZEOF_VOID_P ++/* #undef SIZEOF_VOID_P */ + + /* Define to 1 if you have the ANSI C header files. */ + #undef STDC_HEADERS +diff --git a/isc-config.sh.in b/isc-config.sh.in +index a8a0a89..b5e94ed 100644 +--- a/isc-config.sh.in ++++ b/isc-config.sh.in +@@ -13,7 +13,18 @@ prefix=@prefix@ + exec_prefix=@exec_prefix@ + exec_prefix_set= + includedir=@includedir@ +-libdir=@libdir@ ++arch=$(uname -m) ++ ++case $arch in ++ x86_64 | amd64 | sparc64 | s390x | ppc64) ++ libdir=/usr/lib64 ++ sec_libdir=/usr/lib ++ ;; ++ * ) ++ libdir=/usr/lib ++ sec_libdir=/usr/lib64 ++ ;; ++esac + + usage() + { +@@ -132,6 +143,16 @@ if test x"$echo_libs" = x"true"; then + if test x"${exec_prefix_set}" = x"true"; then + libs="-L${exec_prefix}/lib" + else ++ if [ ! -x $libdir/libisc.so ] ; then ++ if [ ! -x $sec_libdir/libisc.so ] ; then ++ echo "Error: ISC libs not found in $libdir" ++ if [ -d $sec_libdir ] ; then ++ echo "Error: ISC libs not found in $sec_libdir" ++ fi ++ exit 1 ++ fi ++ libdir=$sec_libdir ++ fi + libs="-L${libdir}" + fi + if test x"$libirs" = x"true" ; then diff --git a/SOURCES/bind-95-rh452060.patch b/SOURCES/bind-95-rh452060.patch new file mode 100644 index 0000000..6f4a892 --- /dev/null +++ b/SOURCES/bind-95-rh452060.patch @@ -0,0 +1,42 @@ +diff --git a/bin/dig/dighost.c b/bin/dig/dighost.c +index c06c804..e75b8b7 100644 +--- a/bin/dig/dighost.c ++++ b/bin/dig/dighost.c +@@ -1816,6 +1816,13 @@ clear_query(dig_query_t *query) { + + if (query->timer != NULL) + isc_timer_detach(&query->timer); ++ ++ if (query->waiting_senddone) { ++ debug("send_done not yet called"); ++ query->pending_free = true; ++ return; ++ } ++ + lookup = query->lookup; + + if (lookup->current_query == query) +@@ -1841,10 +1848,7 @@ clear_query(dig_query_t *query) { + isc_mempool_put(commctx, query->recvspace); + isc_buffer_invalidate(&query->recvbuf); + isc_buffer_invalidate(&query->lengthbuf); +- if (query->waiting_senddone) +- query->pending_free = true; +- else +- isc_mem_free(mctx, query); ++ isc_mem_free(mctx, query); + } + + /*% +@@ -2895,9 +2899,9 @@ send_done(isc_task_t *_task, isc_event_t *event) { + isc_event_free(&event); + + if (query->pending_free) +- isc_mem_free(mctx, query); ++ clear_query(query); + +- check_if_done(); ++ check_next_lookup(l); + UNLOCK_LOOKUP; + } + diff --git a/SOURCES/bind-96-old-api.patch b/SOURCES/bind-96-old-api.patch new file mode 100644 index 0000000..d181d3e --- /dev/null +++ b/SOURCES/bind-96-old-api.patch @@ -0,0 +1,23 @@ +diff -up bind-9.6.0b1/contrib/sdb/ldap/ldapdb.c.old-api bind-9.6.0b1/contrib/sdb/ldap/ldapdb.c +--- bind-9.6.0b1/contrib/sdb/ldap/ldapdb.c.old-api 2008-11-24 13:28:13.000000000 +0100 ++++ bind-9.6.0b1/contrib/sdb/ldap/ldapdb.c 2008-11-24 13:28:23.000000000 +0100 +@@ -25,6 +25,7 @@ + /* Using LDAPv3 by default, change this if you want v2 */ + #ifndef LDAPDB_LDAP_VERSION + #define LDAPDB_LDAP_VERSION 3 ++#define LDAP_DEPRECATED 1 + #endif + + #include +diff -up bind-9.6.0b1/contrib/sdb/ldap/zone2ldap.c.old-api bind-9.6.0b1/contrib/sdb/ldap/zone2ldap.c +--- bind-9.6.0b1/contrib/sdb/ldap/zone2ldap.c.old-api 2008-11-24 13:29:05.000000000 +0100 ++++ bind-9.6.0b1/contrib/sdb/ldap/zone2ldap.c 2008-11-24 13:29:14.000000000 +0100 +@@ -13,6 +13,8 @@ + * ditched dNSDomain2 schema support. Version 0.3-ALPHA + */ + ++#define LDAP_DEPRECATED 1 ++ + #include + #include + #include diff --git a/SOURCES/bind.tmpfiles.d b/SOURCES/bind.tmpfiles.d new file mode 100644 index 0000000..640a656 --- /dev/null +++ b/SOURCES/bind.tmpfiles.d @@ -0,0 +1 @@ +d /run/named 0755 named named - diff --git a/SOURCES/bind93-rh490837.patch b/SOURCES/bind93-rh490837.patch new file mode 100644 index 0000000..6ea55ba --- /dev/null +++ b/SOURCES/bind93-rh490837.patch @@ -0,0 +1,81 @@ +diff --git a/lib/isc/include/isc/stdio.h b/lib/isc/include/isc/stdio.h +index 1f44b5a..a3625f9 100644 +--- a/lib/isc/include/isc/stdio.h ++++ b/lib/isc/include/isc/stdio.h +@@ -69,6 +69,9 @@ isc_stdio_sync(FILE *f); + * direct counterpart in the stdio library. + */ + ++isc_result_t ++isc_stdio_fgetc(FILE *f, int *ret); ++ + ISC_LANG_ENDDECLS + + #endif /* ISC_STDIO_H */ +diff --git a/lib/isc/lex.c b/lib/isc/lex.c +index a8955bc..fc6103b 100644 +--- a/lib/isc/lex.c ++++ b/lib/isc/lex.c +@@ -434,17 +434,14 @@ isc_lex_gettoken(isc_lex_t *lex, unsigned int options, isc_token_t *tokenp) { + if (source->is_file) { + stream = source->input; + +-#if defined(HAVE_FLOCKFILE) && defined(HAVE_GETCUNLOCKED) +- c = getc_unlocked(stream); +-#else +- c = getc(stream); +-#endif +- if (c == EOF) { +- if (ferror(stream)) { +- source->result = ISC_R_IOERROR; +- result = source->result; ++ result = isc_stdio_fgetc(stream, &c); ++ ++ if (result != ISC_R_SUCCESS) { ++ if (result != ISC_R_EOF) { ++ source->result = result; + goto done; + } ++ + source->at_eof = true; + } + } else { +diff --git a/lib/isc/unix/errno2result.c b/lib/isc/unix/errno2result.c +index 2f12bcc..5bfd648 100644 +--- a/lib/isc/unix/errno2result.c ++++ b/lib/isc/unix/errno2result.c +@@ -40,6 +40,7 @@ isc___errno2result(int posixerrno, bool dolog, + case EINVAL: /* XXX sometimes this is not for files */ + case ENAMETOOLONG: + case EBADF: ++ case EISDIR: + return (ISC_R_INVALIDFILE); + case ENOENT: + return (ISC_R_FILENOTFOUND); +diff --git a/lib/isc/unix/stdio.c b/lib/isc/unix/stdio.c +index e60fa65..77f0b13 100644 +--- a/lib/isc/unix/stdio.c ++++ b/lib/isc/unix/stdio.c +@@ -149,3 +149,22 @@ isc_stdio_sync(FILE *f) { + return (isc__errno2result(errno)); + } + ++isc_result_t ++isc_stdio_fgetc(FILE *f, int *ret) { ++ int r; ++ isc_result_t result = ISC_R_SUCCESS; ++ ++#if defined(HAVE_FLOCKFILE) && defined(HAVE_GETCUNLOCKED) ++ r = fgetc_unlocked(f); ++#else ++ r = fgets(f); ++#endif ++ ++ if (r == EOF) ++ result = ferror(f) ? isc__errno2result(errno) : ISC_R_EOF; ++ ++ *ret = r; ++ ++ return result; ++} ++ diff --git a/SOURCES/bind97-rh478718.patch b/SOURCES/bind97-rh478718.patch new file mode 100644 index 0000000..dfc4165 --- /dev/null +++ b/SOURCES/bind97-rh478718.patch @@ -0,0 +1,51 @@ +diff --git a/configure.ac b/configure.ac +index 26c509e..c1bfd62 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -4152,6 +4152,10 @@ if test "yes" = "$use_atomic"; then + AC_MSG_RESULT($arch) + fi + ++if test ! "$arch" = "x86_64" -a "$have_xaddq" = "yes"; then ++ AC_MSG_ERROR([XADDQ present but disabled by Fedora patch!]) ++fi ++ + if test "yes" = "$have_atomic"; then + AC_MSG_CHECKING([compiler support for inline assembly code]) + +diff --git a/lib/isc/include/isc/platform.h.in b/lib/isc/include/isc/platform.h.in +index c902d46..9c7c342 100644 +--- a/lib/isc/include/isc/platform.h.in ++++ b/lib/isc/include/isc/platform.h.in +@@ -284,19 +284,25 @@ + * If the "xaddq" operation (64bit xadd) is available on this architecture, + * ISC_PLATFORM_HAVEXADDQ will be defined. + */ +-@ISC_PLATFORM_HAVEXADDQ@ + + /* +- * If the 32-bit "atomic swap" operation is available on this +- * architecture, ISC_PLATFORM_HAVEATOMICSTORE" will be defined. ++ * If the 64-bit "atomic swap" operation is available on this ++ * architecture, ISC_PLATFORM_HAVEATOMICSTOREQ" will be defined. + */ +-@ISC_PLATFORM_HAVEATOMICSTORE@ ++ ++#ifdef __x86_64__ ++#define ISC_PLATFORM_HAVEXADDQ 1 ++#define ISC_PLATFORM_HAVEATOMICSTOREQ 1 ++#else ++#undef ISC_PLATFORM_HAVEXADDQ ++#undef ISC_PLATFORM_HAVEATOMICSTOREQ ++#endif + + /* +- * If the 64-bit "atomic swap" operation is available on this ++ * If the 32-bit "atomic swap" operation is available on this + * architecture, ISC_PLATFORM_HAVEATOMICSTORE" will be defined. + */ +-@ISC_PLATFORM_HAVEATOMICSTOREQ@ ++@ISC_PLATFORM_HAVEATOMICSTORE@ + + /* + * If the "compare-and-exchange" operation is available on this architecture, diff --git a/SOURCES/bind97-rh645544.patch b/SOURCES/bind97-rh645544.patch new file mode 100644 index 0000000..d1d8429 --- /dev/null +++ b/SOURCES/bind97-rh645544.patch @@ -0,0 +1,30 @@ +diff -up bind-9.9.4rc2/lib/dns/resolver.c.rh645544 bind-9.9.4rc2/lib/dns/resolver.c +--- bind-9.9.4rc2/lib/dns/resolver.c.rh645544 2013-08-19 10:30:52.000000000 +0200 ++++ bind-9.9.4rc2/lib/dns/resolver.c 2013-09-06 17:58:03.864165823 +0200 +@@ -1138,7 +1138,7 @@ log_edns(fetchctx_t *fctx) { + */ + dns_name_format(&fctx->domain, domainbuf, sizeof(domainbuf)); + isc_log_write(dns_lctx, DNS_LOGCATEGORY_EDNS_DISABLED, +- DNS_LOGMODULE_RESOLVER, ISC_LOG_INFO, ++ DNS_LOGMODULE_RESOLVER, ISC_LOG_DEBUG(1), + "success resolving '%s' (in '%s'?) after %s", + fctx->info, domainbuf, fctx->reason); + +@@ -3804,7 +3804,7 @@ log_lame(fetchctx_t *fctx, dns_adbaddrin + dns_name_format(&fctx->domain, domainbuf, sizeof(domainbuf)); + isc_sockaddr_format(&addrinfo->sockaddr, addrbuf, sizeof(addrbuf)); + isc_log_write(dns_lctx, DNS_LOGCATEGORY_LAME_SERVERS, +- DNS_LOGMODULE_RESOLVER, ISC_LOG_INFO, ++ DNS_LOGMODULE_RESOLVER, ISC_LOG_DEBUG(1), + "lame server resolving '%s' (in '%s'?): %s", + namebuf, domainbuf, addrbuf); + } +@@ -3831,7 +3831,7 @@ log_formerr(fetchctx_t *fctx, const char + } + + isc_log_write(dns_lctx, DNS_LOGCATEGORY_RESOLVER, +- DNS_LOGMODULE_RESOLVER, ISC_LOG_NOTICE, ++ DNS_LOGMODULE_RESOLVER, ISC_LOG_DEBUG(1), + "DNS format error from %s resolving %s%s%s: %s", + nsbuf, fctx->info, clmsg, clbuf, msgbuf); + } diff --git a/SOURCES/bind97-rh669163.patch b/SOURCES/bind97-rh669163.patch new file mode 100644 index 0000000..125049f --- /dev/null +++ b/SOURCES/bind97-rh669163.patch @@ -0,0 +1,14 @@ +diff -up bind-9.7.2-P3/lib/lwres/lwconfig.c.rh669163 bind-9.7.2-P3/lib/lwres/lwconfig.c +--- bind-9.7.2-P3/lib/lwres/lwconfig.c.rh669163 2011-01-28 14:48:38.934472578 +0100 ++++ bind-9.7.2-P3/lib/lwres/lwconfig.c 2011-01-28 14:49:50.421326035 +0100 +@@ -612,6 +612,10 @@ lwres_conf_parse(lwres_context_t *ctx, c + break; + } + ++ /* Ignore options with no parameters */ ++ if (stopchar == '\n') ++ continue; ++ + if (strlen(word) == 0U) + rval = LWRES_R_SUCCESS; + else if (strcmp(word, "nameserver") == 0) diff --git a/SOURCES/bind99-rh640538.patch b/SOURCES/bind99-rh640538.patch new file mode 100644 index 0000000..5066a14 --- /dev/null +++ b/SOURCES/bind99-rh640538.patch @@ -0,0 +1,44 @@ +diff --git a/bin/dig/dig.docbook b/bin/dig/dig.docbook +index 1079421..f11abd1 100644 +--- a/bin/dig/dig.docbook ++++ b/bin/dig/dig.docbook +@@ -1177,6 +1177,39 @@ dig +qr www.isc.org any -x 127.0.0.1 isc.org ns +noqr + +
+ ++ RETURN CODES ++ ++ Dig return codes are: ++ ++ ++ ++ 0: Everything went well, including things like NXDOMAIN ++ ++ ++ ++ ++ 1: Usage error ++ ++ ++ ++ ++ 8: Couldn't open batch file ++ ++ ++ ++ ++ 9: No reply from server ++ ++ ++ ++ ++ 10: Internal error ++ ++ ++ ++ ++ ++ + FILES + + /etc/resolv.conf diff --git a/SOURCES/dnszone.schema b/SOURCES/dnszone.schema new file mode 100644 index 0000000..cb72a3f --- /dev/null +++ b/SOURCES/dnszone.schema @@ -0,0 +1,148 @@ +# A schema for storing DNS zones in LDAP +# +attributetype ( 1.3.6.1.4.1.2428.20.0.0 NAME 'dNSTTL' + DESC 'An integer denoting time to live' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 ) + +attributetype ( 1.3.6.1.4.1.2428.20.0.1 NAME 'dNSClass' + DESC 'The class of a resource record' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) + +attributetype ( 1.3.6.1.4.1.2428.20.0.2 NAME 'zoneName' + DESC 'The name of a zone, i.e. the name of the highest node in the zone' + EQUALITY caseIgnoreIA5Match + SUBSTR caseIgnoreIA5SubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) + +attributetype ( 1.3.6.1.4.1.2428.20.0.3 NAME 'relativeDomainName' + DESC 'The starting labels of a domain name' + EQUALITY caseIgnoreIA5Match + SUBSTR caseIgnoreIA5SubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) + +attributetype ( 1.3.6.1.4.1.2428.20.1.12 NAME 'pTRRecord' + DESC 'domain name pointer, RFC 1035' + EQUALITY caseIgnoreIA5Match + SUBSTR caseIgnoreIA5SubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) + +attributetype ( 1.3.6.1.4.1.2428.20.1.13 NAME 'hInfoRecord' + DESC 'host information, RFC 1035' + EQUALITY caseIgnoreIA5Match + SUBSTR caseIgnoreIA5SubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) + +attributetype ( 1.3.6.1.4.1.2428.20.1.14 NAME 'mInfoRecord' + DESC 'mailbox or mail list information, RFC 1035' + EQUALITY caseIgnoreIA5Match + SUBSTR caseIgnoreIA5SubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) + +attributetype ( 1.3.6.1.4.1.2428.20.1.16 NAME 'tXTRecord' + DESC 'text string, RFC 1035' + EQUALITY caseIgnoreIA5Match + SUBSTR caseIgnoreIA5SubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) + +attributetype ( 1.3.6.1.4.1.2428.20.1.18 NAME 'aFSDBRecord' + DESC 'for AFS Data Base location, RFC 1183' + EQUALITY caseIgnoreIA5Match + SUBSTR caseIgnoreIA5SubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) + +attributetype ( 1.3.6.1.4.1.2428.20.1.24 NAME 'SigRecord' + DESC 'Signature, RFC 2535' + EQUALITY caseIgnoreIA5Match + SUBSTR caseIgnoreIA5SubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) + +attributetype ( 1.3.6.1.4.1.2428.20.1.25 NAME 'KeyRecord' + DESC 'Key, RFC 2535' + EQUALITY caseIgnoreIA5Match + SUBSTR caseIgnoreIA5SubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) + +attributetype ( 1.3.6.1.4.1.2428.20.1.28 NAME 'aAAARecord' + DESC 'IPv6 address, RFC 1886' + EQUALITY caseIgnoreIA5Match + SUBSTR caseIgnoreIA5SubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) + +attributetype ( 1.3.6.1.4.1.2428.20.1.29 NAME 'LocRecord' + DESC 'Location, RFC 1876' + EQUALITY caseIgnoreIA5Match + SUBSTR caseIgnoreIA5SubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) + +attributetype ( 1.3.6.1.4.1.2428.20.1.30 NAME 'nXTRecord' + DESC 'non-existant, RFC 2535' + EQUALITY caseIgnoreIA5Match + SUBSTR caseIgnoreIA5SubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) + +attributetype ( 1.3.6.1.4.1.2428.20.1.33 NAME 'sRVRecord' + DESC 'service location, RFC 2782' + EQUALITY caseIgnoreIA5Match + SUBSTR caseIgnoreIA5SubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) + +attributetype ( 1.3.6.1.4.1.2428.20.1.35 NAME 'nAPTRRecord' + DESC 'Naming Authority Pointer, RFC 2915' + EQUALITY caseIgnoreIA5Match + SUBSTR caseIgnoreIA5SubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) + +attributetype ( 1.3.6.1.4.1.2428.20.1.36 NAME 'kXRecord' + DESC 'Key Exchange Delegation, RFC 2230' + EQUALITY caseIgnoreIA5Match + SUBSTR caseIgnoreIA5SubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) + +attributetype ( 1.3.6.1.4.1.2428.20.1.37 NAME 'certRecord' + DESC 'certificate, RFC 2538' + EQUALITY caseIgnoreIA5Match + SUBSTR caseIgnoreIA5SubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) + +attributetype ( 1.3.6.1.4.1.2428.20.1.38 NAME 'a6Record' + DESC 'A6 Record Type, RFC 2874' + EQUALITY caseIgnoreIA5Match + SUBSTR caseIgnoreIA5SubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) + +attributetype ( 1.3.6.1.4.1.2428.20.1.39 NAME 'dNameRecord' + DESC 'Non-Terminal DNS Name Redirection, RFC 2672' + EQUALITY caseIgnoreIA5Match + SUBSTR caseIgnoreIA5SubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) + +attributetype ( 1.3.6.1.4.1.2428.20.1.43 NAME 'dSRecord' + DESC 'Delegation Signer, RFC 3658' + EQUALITY caseIgnoreIA5Match + SUBSTR caseIgnoreIA5SubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) + +attributetype ( 1.3.6.1.4.1.2428.20.1.46 NAME 'rRSIGRecord' + DESC 'RRSIG, RFC 3755' + EQUALITY caseIgnoreIA5Match + SUBSTR caseIgnoreIA5SubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) + +attributetype ( 1.3.6.1.4.1.2428.20.1.47 NAME 'nSECRecord' + DESC 'NSEC, RFC 3755' + EQUALITY caseIgnoreIA5Match + SUBSTR caseIgnoreIA5SubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) + +objectclass ( 1.3.6.1.4.1.2428.20.3 NAME 'dNSZone' + SUP top STRUCTURAL + MUST ( zoneName $ relativeDomainName ) + MAY ( DNSTTL $ DNSClass $ + ARecord $ MDRecord $ MXRecord $ NSRecord $ + SOARecord $ CNAMERecord $ PTRRecord $ HINFORecord $ + MINFORecord $ TXTRecord $ SIGRecord $ KEYRecord $ + AAAARecord $ LOCRecord $ NXTRecord $ SRVRecord $ + NAPTRRecord $ KXRecord $ CERTRecord $ A6Record $ + DNAMERecord ) ) diff --git a/SOURCES/generate-rndc-key.sh b/SOURCES/generate-rndc-key.sh new file mode 100755 index 0000000..dde7f70 --- /dev/null +++ b/SOURCES/generate-rndc-key.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +. /etc/rc.d/init.d/functions + +# This script generates /etc/rndc.key if doesn't exist AND if there is no rndc.conf + +if [ ! -s /etc/rndc.key -a ! -s /etc/rndc.conf ]; then + echo -n $"Generating /etc/rndc.key:" + if /usr/sbin/rndc-confgen -a -A hmac-sha256 -r /dev/urandom > /dev/null 2>&1 + then + chmod 640 /etc/rndc.key + chown root:named /etc/rndc.key + [ -x /sbin/restorecon ] && /sbin/restorecon /etc/rndc.key + success $"/etc/rndc.key generation" + echo + else + failure $"/etc/rndc.key generation" + echo + fi +fi diff --git a/SOURCES/ldap2zone.1 b/SOURCES/ldap2zone.1 new file mode 100644 index 0000000..a48c69f --- /dev/null +++ b/SOURCES/ldap2zone.1 @@ -0,0 +1,41 @@ +.\" Copyright (C) 2004, 2005 Stig Venaas +.\" +.\" Permission to use, copy, modify, and distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" Manpage written by Jan Gorig +.TH ldap2zone 1 "15 March 2010" "BIND9" +.SH NAME +ldap2zone - Creates zone file from LDAP dnszone information +.SH SYNOPSIS +.B ldap2zone zone-name LDAP-URL default-ttl [serial] +.SH DESCRIPTION +ldap2zone is a tool that reads info for a zone from LDAP and constructs a standard plain ascii zone file that is written to the standard output. The LDAP information has to be stored using the dnszone schema. The schema is used by BIND with LDAP back-end. + +\fBzone-name\fR +.RS 4 +Name of the zone, eg "mydomain.net." +.RE +.PP +\fBLDAP-URL\fR +.RS 4 +LDAP URL to dnszone information +.RE +.PP +\fBdefault-ttl\fR +.RS 4 +Default TTL value to be used in zone +.RE +.PP +\fBserial\fR +.RS 4 +(optional) Program checks this number to be different than SOA serial number. +.RE + +.SH "EXIT STATUS" +Exits with 0 on success or 1 on failure. +.SH "SEE ALSO" +named(8) ldap(3) +http://www.venaas.no/dns/ldap2zone/ +.SH "COPYRIGHT" +Copyright (C) 2004, 2005 Stig Venaas diff --git a/SOURCES/ldap2zone.c b/SOURCES/ldap2zone.c new file mode 100644 index 0000000..80e7919 --- /dev/null +++ b/SOURCES/ldap2zone.c @@ -0,0 +1,411 @@ +/* + * Copyright (C) 2004, 2005 Stig Venaas + * $Id: ldap2zone.c,v 1.1 2007/07/24 15:18:00 atkac Exp $ + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + */ + +#define LDAP_DEPRECATED 1 + +#include +#include +#include +#include + +#include + +struct string { + void *data; + size_t len; +}; + +struct assstack_entry { + struct string key; + struct string val; + struct assstack_entry *next; +}; + +struct assstack_entry *assstack_find(struct assstack_entry *stack, struct string *key); +void assstack_push(struct assstack_entry **stack, struct assstack_entry *item); +void assstack_insertbottom(struct assstack_entry **stack, struct assstack_entry *item); +void printsoa(struct string *soa); +void printrrs(char *defaultttl, struct assstack_entry *item); +void print_zone(char *defaultttl, struct assstack_entry *stack); +void usage(char *name); +void err(char *name, const char *msg); +int putrr(struct assstack_entry **stack, struct berval *name, char *type, char *ttl, struct berval *val); + +struct assstack_entry *assstack_find(struct assstack_entry *stack, struct string *key) { + for (; stack; stack = stack->next) + if (stack->key.len == key->len && !memcmp(stack->key.data, key->data, key->len)) + return stack; + return NULL; +} + +void assstack_push(struct assstack_entry **stack, struct assstack_entry *item) { + item->next = *stack; + *stack = item; +} + +void assstack_insertbottom(struct assstack_entry **stack, struct assstack_entry *item) { + struct assstack_entry *p; + + item->next = NULL; + if (!*stack) { + *stack = item; + return; + } + /* find end, should keep track of end somewhere */ + /* really a queue, not a stack */ + p = *stack; + while (p->next) + p = p->next; + p->next = item; +} + +void printsoa(struct string *soa) { + char *s; + size_t i; + + s = (char *)soa->data; + i = 0; + while (i < soa->len) { + putchar(s[i]); + if (s[i++] == ' ') + break; + } + while (i < soa->len) { + putchar(s[i]); + if (s[i++] == ' ') + break; + } + printf("(\n\t\t\t\t"); + while (i < soa->len) { + putchar(s[i]); + if (s[i++] == ' ') + break; + } + printf("; Serialnumber\n\t\t\t\t"); + while (i < soa->len) { + if (s[i] == ' ') + break; + putchar(s[i++]); + } + i++; + printf("\t; Refresh\n\t\t\t\t"); + while (i < soa->len) { + if (s[i] == ' ') + break; + putchar(s[i++]); + } + i++; + printf("\t; Retry\n\t\t\t\t"); + while (i < soa->len) { + if (s[i] == ' ') + break; + putchar(s[i++]); + } + i++; + printf("\t; Expire\n\t\t\t\t"); + while (i < soa->len) { + putchar(s[i++]); + } + printf(" )\t; Minimum TTL\n"); +} + +void printrrs(char *defaultttl, struct assstack_entry *item) { + struct assstack_entry *stack; + char *s; + int first; + size_t i; + char *ttl, *type; + int top; + + s = (char *)item->key.data; + + if (item->key.len == 1 && *s == '@') { + top = 1; + printf("@\t"); + } else { + top = 0; + for (i = 0; i < item->key.len; i++) + putchar(s[i]); + if (item->key.len < 8) + putchar('\t'); + putchar('\t'); + } + + first = 1; + for (stack = (struct assstack_entry *) item->val.data; stack; stack = stack->next) { + ttl = (char *)stack->key.data; + s = strchr(ttl, ' '); + *s++ = '\0'; + type = s; + + if (first) + first = 0; + else + printf("\t\t"); + + if (strcmp(defaultttl, ttl)) + printf("%s", ttl); + putchar('\t'); + + if (top) { + top = 0; + printf("IN\t%s\t", type); + /* Should always be SOA here */ + if (!strcmp(type, "SOA")) { + printsoa(&stack->val); + continue; + } + } else + printf("%s\t", type); + + s = (char *)stack->val.data; + for (i = 0; i < stack->val.len; i++) + putchar(s[i]); + putchar('\n'); + } +} + +void print_zone(char *defaultttl, struct assstack_entry *stack) { + printf("$TTL %s\n", defaultttl); + for (; stack; stack = stack->next) + printrrs(defaultttl, stack); +}; + +void usage(char *name) { + fprintf(stderr, "Usage:%s zone-name LDAP-URL default-ttl [serial]\n", name); + exit(1); +}; + +void err(char *name, const char *msg) { + fprintf(stderr, "%s: %s\n", name, msg); + exit(1); +}; + +int putrr(struct assstack_entry **stack, struct berval *name, char *type, char *ttl, struct berval *val) { + struct string key; + struct assstack_entry *rr, *rrdata; + + /* Do nothing if name or value have 0 length */ + if (!name->bv_len || !val->bv_len) + return 0; + + /* see if already have an entry for this name */ + key.len = name->bv_len; + key.data = name->bv_val; + + rr = assstack_find(*stack, &key); + if (!rr) { + /* Not found, create and push new entry */ + rr = (struct assstack_entry *) malloc(sizeof(struct assstack_entry)); + if (!rr) + return -1; + rr->key.len = name->bv_len; + rr->key.data = (void *) malloc(rr->key.len); + if (!rr->key.data) { + free(rr); + return -1; + } + memcpy(rr->key.data, name->bv_val, name->bv_len); + rr->val.len = sizeof(void *); + rr->val.data = NULL; + if (name->bv_len == 1 && *(char *)name->bv_val == '@') + assstack_push(stack, rr); + else + assstack_insertbottom(stack, rr); + } + + rrdata = (struct assstack_entry *) malloc(sizeof(struct assstack_entry)); + if (!rrdata) { + free(rr->key.data); + free(rr); + return -1; + } + rrdata->key.len = strlen(type) + strlen(ttl) + 1; + rrdata->key.data = (void *) malloc(rrdata->key.len); + if (!rrdata->key.data) { + free(rrdata); + free(rr->key.data); + free(rr); + return -1; + } + sprintf((char *)rrdata->key.data, "%s %s", ttl, type); + + rrdata->val.len = val->bv_len; + rrdata->val.data = (void *) malloc(val->bv_len); + if (!rrdata->val.data) { + free(rrdata->key.data); + free(rrdata); + free(rr->key.data); + free(rr); + return -1; + } + memcpy(rrdata->val.data, val->bv_val, val->bv_len); + + if (!strcmp(type, "SOA")) + assstack_push((struct assstack_entry **) &(rr->val.data), rrdata); + else + assstack_insertbottom((struct assstack_entry **) &(rr->val.data), rrdata); + return 0; +} + +int main(int argc, char **argv) { + char *s, *hostporturl, *base = NULL; + char *ttl, *defaultttl; + LDAP *ld; + char *fltr = NULL; + LDAPMessage *res, *e; + char *a, **ttlvals, **soavals, *serial; + struct berval **vals, **names; + char type[64]; + BerElement *ptr; + int i, j, rc, msgid; + struct assstack_entry *zone = NULL; + + if (argc < 4 || argc > 5) + usage(argv[0]); + + hostporturl = argv[2]; + + if (hostporturl != strstr( hostporturl, "ldap")) + err(argv[0], "Not an LDAP URL"); + + s = strchr(hostporturl, ':'); + + if (!s || strlen(s) < 3 || s[1] != '/' || s[2] != '/') + err(argv[0], "Not an LDAP URL"); + + s = strchr(s+3, '/'); + if (s) { + *s++ = '\0'; + base = s; + s = strchr(base, '?'); + if (s) + err(argv[0], "LDAP URL can only contain host, port and base"); + } + + defaultttl = argv[3]; + + rc = ldap_initialize(&ld, hostporturl); + if (rc != LDAP_SUCCESS) + err(argv[0], "ldap_initialize() failed"); + + if (argc == 5) { + /* serial number specified, check if different from one in SOA */ + fltr = (char *)malloc(strlen(argv[1]) + strlen("(&(relativeDomainName=@)(zoneName=))") + 1); + sprintf(fltr, "(&(relativeDomainName=@)(zoneName=%s))", argv[1]); + msgid = ldap_search(ld, base, LDAP_SCOPE_SUBTREE, fltr, NULL, 0); + if (msgid == -1) + err(argv[0], "ldap_search() failed"); + + while ((rc = ldap_result(ld, msgid, 0, NULL, &res)) != LDAP_RES_SEARCH_RESULT ) { + /* not supporting continuation references at present */ + if (rc != LDAP_RES_SEARCH_ENTRY) + err(argv[0], "ldap_result() returned cont.ref? Exiting"); + + /* only one entry per result message */ + e = ldap_first_entry(ld, res); + if (e == NULL) { + ldap_msgfree(res); + err(argv[0], "ldap_first_entry() failed"); + } + + soavals = ldap_get_values(ld, e, "SOARecord"); + if (soavals) + break; + } + + ldap_msgfree(res); + if (!soavals) { + err(argv[0], "No SOA Record found"); + } + + /* We have a SOA, compare serial numbers */ + /* Only checkinf first value, should be only one */ + s = strchr(soavals[0], ' '); + s++; + s = strchr(s, ' '); + s++; + serial = s; + s = strchr(s, ' '); + *s = '\0'; + if (!strcmp(serial, argv[4])) { + ldap_value_free(soavals); + err(argv[0], "serial numbers match"); + } + ldap_value_free(soavals); + } + + if (!fltr) + fltr = (char *)malloc(strlen(argv[1]) + strlen("(zoneName=)") + 1); + if (!fltr) + err(argv[0], "Malloc failed"); + sprintf(fltr, "(zoneName=%s)", argv[1]); + + msgid = ldap_search(ld, base, LDAP_SCOPE_SUBTREE, fltr, NULL, 0); + if (msgid == -1) + err(argv[0], "ldap_search() failed"); + + while ((rc = ldap_result(ld, msgid, 0, NULL, &res)) != LDAP_RES_SEARCH_RESULT ) { + /* not supporting continuation references at present */ + if (rc != LDAP_RES_SEARCH_ENTRY) + err(argv[0], "ldap_result() returned cont.ref? Exiting"); + + /* only one entry per result message */ + e = ldap_first_entry(ld, res); + if (e == NULL) { + ldap_msgfree(res); + err(argv[0], "ldap_first_entry() failed"); + } + + names = ldap_get_values_len(ld, e, "relativeDomainName"); + if (!names) + continue; + + ttlvals = ldap_get_values(ld, e, "dNSTTL"); + ttl = ttlvals ? ttlvals[0] : defaultttl; + + for (a = ldap_first_attribute(ld, e, &ptr); a != NULL; a = ldap_next_attribute(ld, e, ptr)) { + char *s; + + for (s = a; *s; s++) + *s = toupper(*s); + s = strstr(a, "RECORD"); + if ((s == NULL) || (s == a) || (s - a >= (signed int)sizeof(type))) { + ldap_memfree(a); + continue; + } + + strncpy(type, a, s - a); + type[s - a] = '\0'; + vals = ldap_get_values_len(ld, e, a); + if (vals) { + for (i = 0; vals[i]; i++) + for (j = 0; names[j]; j++) + if (putrr(&zone, names[j], type, ttl, vals[i])) + err(argv[0], "malloc failed"); + ldap_value_free_len(vals); + } + ldap_memfree(a); + } + + if (ptr) + ber_free(ptr, 0); + if (ttlvals) + ldap_value_free(ttlvals); + ldap_value_free_len(names); + /* free this result */ + ldap_msgfree(res); + } + + /* free final result */ + ldap_msgfree(res); + + print_zone(defaultttl, zone); + return 0; +} diff --git a/SOURCES/named-chroot-setup.service b/SOURCES/named-chroot-setup.service new file mode 100644 index 0000000..237a909 --- /dev/null +++ b/SOURCES/named-chroot-setup.service @@ -0,0 +1,12 @@ +[Unit] +Description=Set-up/destroy chroot environment for named (DNS) +BindsTo=named-chroot.service +Wants=named-setup-rndc.service +After=named-setup-rndc.service + + +[Service] +Type=oneshot +RemainAfterExit=yes +ExecStart=/usr/libexec/setup-named-chroot.sh /var/named/chroot on /etc/named-chroot.files +ExecStop=/usr/libexec/setup-named-chroot.sh /var/named/chroot off /etc/named-chroot.files diff --git a/SOURCES/named-chroot.files b/SOURCES/named-chroot.files new file mode 100644 index 0000000..43c559a --- /dev/null +++ b/SOURCES/named-chroot.files @@ -0,0 +1,24 @@ +# Configuration of files used in chroot +# Following files are made available after named-chroot.service start +# if they are missing or empty in target directory. +/etc/localtime +/etc/named.root.key +/etc/named.conf +/etc/named.rfc1912.zones +/etc/rndc.conf +/etc/rndc.key +/etc/named.iscdlv.key +/etc/crypto-policies/back-ends/bind.config +/etc/protocols +/etc/services +/etc/named.dnssec.keys +/etc/pki/dnssec-keys +/etc/named +/usr/lib64/bind +/usr/lib/bind +/usr/share/GeoIP +/run/named +# Warning: the order is important +# If a directory containing $ROOTDIR is listed here, +# it MUST be listed last. (/var/named contains /var/named/chroot) +/var/named diff --git a/SOURCES/named-chroot.service b/SOURCES/named-chroot.service new file mode 100644 index 0000000..a49df15 --- /dev/null +++ b/SOURCES/named-chroot.service @@ -0,0 +1,30 @@ +# Don't forget to add "$AddUnixListenSocket /var/named/chroot/dev/log" +# line to your /etc/rsyslog.conf file. Otherwise your logging becomes +# broken when rsyslogd daemon is restarted (due update, for example). + +[Unit] +Description=Berkeley Internet Name Domain (DNS) +Wants=nss-lookup.target +Requires=named-chroot-setup.service +Before=nss-lookup.target +After=named-chroot-setup.service +After=network.target + +[Service] +Type=forking +Environment=NAMEDCONF=/etc/named.conf +EnvironmentFile=-/etc/sysconfig/named +Environment=KRB5_KTNAME=/etc/named.keytab +PIDFile=/var/named/chroot/run/named/named.pid + +ExecStartPre=/bin/bash -c 'if [ ! "$DISABLE_ZONE_CHECKING" == "yes" ]; then /usr/sbin/named-checkconf -t /var/named/chroot -z "$NAMEDCONF"; else echo "Checking of zone files is disabled"; fi' +ExecStart=/usr/sbin/named -u named -c ${NAMEDCONF} -t /var/named/chroot $OPTIONS + +ExecReload=/bin/sh -c 'if /usr/sbin/rndc null > /dev/null 2>&1; then /usr/sbin/rndc reload; else /bin/kill -HUP $MAINPID; fi' + +ExecStop=/bin/sh -c '/usr/sbin/rndc stop > /dev/null 2>&1 || /bin/kill -TERM $MAINPID' + +PrivateTmp=false + +[Install] +WantedBy=multi-user.target diff --git a/SOURCES/named-pkcs11.service b/SOURCES/named-pkcs11.service new file mode 100644 index 0000000..27e0693 --- /dev/null +++ b/SOURCES/named-pkcs11.service @@ -0,0 +1,26 @@ +[Unit] +Description=Berkeley Internet Name Domain (DNS) with native PKCS#11 +Wants=nss-lookup.target +Wants=named-setup-rndc.service +Before=nss-lookup.target +After=network.target +After=named-setup-rndc.service + +[Service] +Type=forking +Environment=NAMEDCONF=/etc/named.conf +EnvironmentFile=-/etc/sysconfig/named +Environment=KRB5_KTNAME=/etc/named.keytab +PIDFile=/run/named/named.pid + +ExecStartPre=/bin/bash -c 'if [ ! "$DISABLE_ZONE_CHECKING" == "yes" ]; then /usr/sbin/named-checkconf -z "$NAMEDCONF"; else echo "Checking of zone files is disabled"; fi' +ExecStart=/usr/sbin/named-pkcs11 -u named -c ${NAMEDCONF} $OPTIONS + +ExecReload=/bin/sh -c 'if /usr/sbin/rndc null > /dev/null 2>&1; then /usr/sbin/rndc reload; else /bin/kill -HUP $MAINPID; fi' + +ExecStop=/bin/sh -c '/usr/sbin/rndc stop > /dev/null 2>&1 || /bin/kill -TERM $MAINPID' + +PrivateTmp=true + +[Install] +WantedBy=multi-user.target diff --git a/SOURCES/named-sdb-chroot-setup.service b/SOURCES/named-sdb-chroot-setup.service new file mode 100644 index 0000000..5a3e173 --- /dev/null +++ b/SOURCES/named-sdb-chroot-setup.service @@ -0,0 +1,12 @@ +[Unit] +Description=Set-up/destroy chroot environment for named-sdb +BindsTo=named-sdb-chroot.service +Wants=named-setup-rndc.service +After=named-setup-rndc.service + + +[Service] +Type=oneshot +RemainAfterExit=yes +ExecStart=/usr/libexec/setup-named-chroot.sh /var/named/chroot_sdb on /etc/named-chroot.files +ExecStop=/usr/libexec/setup-named-chroot.sh /var/named/chroot_sdb off /etc/named-chroot.files diff --git a/SOURCES/named-sdb-chroot.service b/SOURCES/named-sdb-chroot.service new file mode 100644 index 0000000..acf88ba --- /dev/null +++ b/SOURCES/named-sdb-chroot.service @@ -0,0 +1,30 @@ +# Don't forget to add "$AddUnixListenSocket /var/named/chroot_sdb/dev/log" +# line to your /etc/rsyslog.conf file. Otherwise your logging becomes +# broken when rsyslogd daemon is restarted (due update, for example). + +[Unit] +Description=Berkeley Internet Name Domain (DNS) +Wants=nss-lookup.target +Requires=named-sdb-chroot-setup.service +Before=nss-lookup.target +After=named-sdb-chroot-setup.service +After=network.target + +[Service] +Type=forking +Environment=NAMEDCONF=/etc/named.conf +EnvironmentFile=-/etc/sysconfig/named +Environment=KRB5_KTNAME=/etc/named.keytab +PIDFile=/var/named/chroot_sdb/run/named/named.pid + +ExecStartPre=/bin/bash -c 'if [ ! "$DISABLE_ZONE_CHECKING" == "yes" ]; then /usr/sbin/named-checkconf -t /var/named/chroot_sdb -z "$NAMEDCONF"; else echo "Checking of zone files is disabled"; fi' +ExecStart=/usr/sbin/named-sdb -u named -c ${NAMEDCONF} -t /var/named/chroot_sdb $OPTIONS + +ExecReload=/bin/sh -c 'if /usr/sbin/rndc null > /dev/null 2>&1; then /usr/sbin/rndc reload; else /bin/kill -HUP $MAINPID; fi' + +ExecStop=/bin/sh -c '/usr/sbin/rndc stop > /dev/null 2>&1 || /bin/kill -TERM $MAINPID' + +PrivateTmp=false + +[Install] +WantedBy=multi-user.target diff --git a/SOURCES/named-sdb.8 b/SOURCES/named-sdb.8 new file mode 100644 index 0000000..1e456c3 --- /dev/null +++ b/SOURCES/named-sdb.8 @@ -0,0 +1 @@ +.so man8/named.8.gz \ No newline at end of file diff --git a/SOURCES/named-sdb.service b/SOURCES/named-sdb.service new file mode 100644 index 0000000..cdf3a62 --- /dev/null +++ b/SOURCES/named-sdb.service @@ -0,0 +1,26 @@ +[Unit] +Description=Berkeley Internet Name Domain (DNS) +Wants=nss-lookup.target +Wants=named-setup-rndc.service +Before=nss-lookup.target +After=named-setup-rndc.service +After=network.target + +[Service] +Type=forking +Environment=NAMEDCONF=/etc/named.conf +EnvironmentFile=-/etc/sysconfig/named +Environment=KRB5_KTNAME=/etc/named.keytab +PIDFile=/run/named/named.pid + +ExecStartPre=/bin/bash -c 'if [ ! "$DISABLE_ZONE_CHECKING" == "yes" ]; then /usr/sbin/named-checkconf -z "$NAMEDCONF"; else echo "Checking of zone files is disabled"; fi' +ExecStart=/usr/sbin/named-sdb -u named -c ${NAMEDCONF} $OPTIONS + +ExecReload=/bin/sh -c 'if /usr/sbin/rndc null > /dev/null 2>&1; then /usr/sbin/rndc reload; else /bin/kill -HUP $MAINPID; fi' + +ExecStop=/bin/sh -c '/usr/sbin/rndc stop > /dev/null 2>&1 || /bin/kill -TERM $MAINPID' + +PrivateTmp=true + +[Install] +WantedBy=multi-user.target diff --git a/SOURCES/named-setup-rndc.service b/SOURCES/named-setup-rndc.service new file mode 100644 index 0000000..ff85e3c --- /dev/null +++ b/SOURCES/named-setup-rndc.service @@ -0,0 +1,7 @@ +[Unit] +Description=Generate rndc key for BIND (DNS) + +[Service] +Type=oneshot + +ExecStart=/usr/libexec/generate-rndc-key.sh diff --git a/SOURCES/named.conf b/SOURCES/named.conf new file mode 100644 index 0000000..1dc9d15 --- /dev/null +++ b/SOURCES/named.conf @@ -0,0 +1,59 @@ +// +// named.conf +// +// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS +// server as a caching only nameserver (as a localhost DNS resolver only). +// +// See /usr/share/doc/bind*/sample/ for example named configuration files. +// + +options { + listen-on port 53 { 127.0.0.1; }; + listen-on-v6 port 53 { ::1; }; + directory "/var/named"; + dump-file "/var/named/data/cache_dump.db"; + statistics-file "/var/named/data/named_stats.txt"; + memstatistics-file "/var/named/data/named_mem_stats.txt"; + secroots-file "/var/named/data/named.secroots"; + recursing-file "/var/named/data/named.recursing"; + allow-query { localhost; }; + + /* + - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion. + - If you are building a RECURSIVE (caching) DNS server, you need to enable + recursion. + - If your recursive DNS server has a public IP address, you MUST enable access + control to limit queries to your legitimate users. Failing to do so will + cause your server to become part of large scale DNS amplification + attacks. Implementing BCP38 within your network would greatly + reduce such attack surface + */ + recursion yes; + + dnssec-enable yes; + dnssec-validation yes; + + managed-keys-directory "/var/named/dynamic"; + + pid-file "/run/named/named.pid"; + session-keyfile "/run/named/session.key"; + + /* https://fedoraproject.org/wiki/Changes/CryptoPolicy */ + include "/etc/crypto-policies/back-ends/bind.config"; +}; + +logging { + channel default_debug { + file "data/named.run"; + severity dynamic; + }; +}; + +zone "." IN { + type hint; + file "named.ca"; +}; + +include "/etc/named.rfc1912.zones"; +include "/etc/named.root.key"; + diff --git a/SOURCES/named.conf.sample b/SOURCES/named.conf.sample new file mode 100644 index 0000000..a6cdc5e --- /dev/null +++ b/SOURCES/named.conf.sample @@ -0,0 +1,252 @@ +/* + Sample named.conf BIND DNS server 'named' configuration file + for the Red Hat BIND distribution. + + See the BIND Administrator's Reference Manual (ARM) for details, in: + file:///usr/share/doc/bind-{version}/arm/Bv9ARM.html + Also see the BIND Configuration GUI : /usr/bin/system-config-bind and + its manual. +*/ + +options +{ + // Put files that named is allowed to write in the data/ directory: + directory "/var/named"; // "Working" directory + dump-file "data/cache_dump.db"; + statistics-file "data/named_stats.txt"; + memstatistics-file "data/named_mem_stats.txt"; + secroots-file "data/named.secroots"; + recursing-file "data/named.recursing"; + + + /* + Specify listenning interfaces. You can use list of addresses (';' is + delimiter) or keywords "any"/"none" + */ + //listen-on port 53 { any; }; + listen-on port 53 { 127.0.0.1; }; + + //listen-on-v6 port 53 { any; }; + listen-on-v6 port 53 { ::1; }; + + /* + Access restrictions + + There are two important options: + allow-query { argument; }; + - allow queries for authoritative data + + allow-query-cache { argument; }; + - allow queries for non-authoritative data (mostly cached data) + + You can use address, network address or keywords "any"/"localhost"/"none" as argument + Examples: + allow-query { localhost; 10.0.0.1; 192.168.1.0/8; }; + allow-query-cache { ::1; fe80::5c63:a8ff:fe2f:4526; 10.0.0.1; }; + */ + + allow-query { localhost; }; + allow-query-cache { localhost; }; + + /* Enable/disable recursion - recursion yes/no; + + - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion. + - If you are building a RECURSIVE (caching) DNS server, you need to enable + recursion. + - If your recursive DNS server has a public IP address, you MUST enable access + control to limit queries to your legitimate users. Failing to do so will + cause your server to become part of large scale DNS amplification + attacks. Implementing BCP38 within your network would greatly + reduce such attack surface + */ + recursion yes; + + /* DNSSEC related options. See information about keys ("Trusted keys", bellow) */ + + /* Enable serving of DNSSEC related data - enable on both authoritative + and recursive servers DNSSEC aware servers */ + dnssec-enable yes; + + /* Enable DNSSEC validation on recursive servers */ + dnssec-validation yes; + + /* In Fedora we use /run/named instead of default /var/run/named + so we have to configure paths properly. */ + pid-file "/run/named/named.pid"; + session-keyfile "/run/named/session.key"; + + managed-keys-directory "/var/named/dynamic"; + + /* In Fedora we use system-wide Crypto Policy */ + /* https://fedoraproject.org/wiki/Changes/CryptoPolicy */ + include "/etc/crypto-policies/back-ends/bind.config"; +}; + +logging +{ +/* If you want to enable debugging, eg. using the 'rndc trace' command, + * named will try to write the 'named.run' file in the $directory (/var/named). + * By default, SELinux policy does not allow named to modify the /var/named directory, + * so put the default debug log file in data/ : + */ + channel default_debug { + file "data/named.run"; + severity dynamic; + }; +}; + +/* + Views let a name server answer a DNS query differently depending on who is asking. + + By default, if named.conf contains no "view" clauses, all zones are in the + "default" view, which matches all clients. + + Views are processed sequentially. The first match is used so the last view should + match "any" - it's fallback and the most restricted view. + + If named.conf contains any "view" clause, then all zones MUST be in a view. +*/ + +view "localhost_resolver" +{ +/* This view sets up named to be a localhost resolver ( caching only nameserver ). + * If all you want is a caching-only nameserver, then you need only define this view: + */ + match-clients { localhost; }; + recursion yes; + + # all views must contain the root hints zone: + zone "." IN { + type hint; + file "/var/named/named.ca"; + }; + + /* these are zones that contain definitions for all the localhost + * names and addresses, as recommended in RFC1912 - these names should + * not leak to the other nameservers: + */ + include "/etc/named.rfc1912.zones"; +}; +view "internal" +{ +/* This view will contain zones you want to serve only to "internal" clients + that connect via your directly attached LAN interfaces - "localnets" . + */ + match-clients { localnets; }; + recursion yes; + + zone "." IN { + type hint; + file "/var/named/named.ca"; + }; + + /* these are zones that contain definitions for all the localhost + * names and addresses, as recommended in RFC1912 - these names should + * not leak to the other nameservers: + */ + include "/etc/named.rfc1912.zones"; + + // These are your "authoritative" internal zones, and would probably + // also be included in the "localhost_resolver" view above : + + /* + NOTE for dynamic DNS zones and secondary zones: + + DO NOT USE SAME FILES IN MULTIPLE VIEWS! + + If you are using views and DDNS/secondary zones it is strongly + recommended to read FAQ on ISC site (www.isc.org), section + "Configuration and Setup Questions", questions + "How do I share a dynamic zone between multiple views?" and + "How can I make a server a slave for both an internal and an external + view at the same time?" + */ + + zone "my.internal.zone" { + type master; + file "my.internal.zone.db"; + }; + zone "my.slave.internal.zone" { + type slave; + file "slaves/my.slave.internal.zone.db"; + masters { /* put master nameserver IPs here */ 127.0.0.1; } ; + // put slave zones in the slaves/ directory so named can update them + }; + zone "my.ddns.internal.zone" { + type master; + allow-update { key ddns_key; }; + file "dynamic/my.ddns.internal.zone.db"; + // put dynamically updateable zones in the slaves/ directory so named can update them + }; +}; + +key ddns_key +{ + algorithm hmac-md5; + secret "use /usr/sbin/dnssec-keygen to generate TSIG keys"; +}; + +view "external" +{ +/* This view will contain zones you want to serve only to "external" clients + * that have addresses that are not match any above view: + */ + match-clients { any; }; + + zone "." IN { + type hint; + file "/var/named/named.ca"; + }; + + recursion no; + // you'd probably want to deny recursion to external clients, so you don't + // end up providing free DNS service to all takers + + // These are your "authoritative" external zones, and would probably + // contain entries for just your web and mail servers: + + zone "my.external.zone" { + type master; + file "my.external.zone.db"; + }; +}; + +/* Trusted keys + + This statement contains DNSSEC keys. If you want DNSSEC aware resolver you + have to configure at least one trusted key. + + Note that no key written below is valid. Especially root key because root zone + is not signed yet. +*/ +/* +trusted-keys { +// Root Key +"." 257 3 3 "BNY4wrWM1nCfJ+CXd0rVXyYmobt7sEEfK3clRbGaTwSJxrGkxJWoZu6I7PzJu/ + E9gx4UC1zGAHlXKdE4zYIpRhaBKnvcC2U9mZhkdUpd1Vso/HAdjNe8LmMlnzY3 + zy2Xy4klWOADTPzSv9eamj8V18PHGjBLaVtYvk/ln5ZApjYghf+6fElrmLkdaz + MQ2OCnACR817DF4BBa7UR/beDHyp5iWTXWSi6XmoJLbG9Scqc7l70KDqlvXR3M + /lUUVRbkeg1IPJSidmK3ZyCllh4XSKbje/45SKucHgnwU5jefMtq66gKodQj+M + iA21AfUVe7u99WzTLzY3qlxDhxYQQ20FQ97S+LKUTpQcq27R7AT3/V5hRQxScI + Nqwcz4jYqZD2fQdgxbcDTClU0CRBdiieyLMNzXG3"; + +// Key for forward zone +example.com. 257 3 5 "AwEAAaxPMcR2x0HbQV4WeZB6oEDX+r0QM65KbhTjrW1ZaARmPhEZZe + 3Y9ifgEuq7vZ/zGZUdEGNWy+JZzus0lUptwgjGwhUS1558Hb4JKUbb + OTcM8pwXlj0EiX3oDFVmjHO444gLkBO UKUf/mC7HvfwYH/Be22GnC + lrinKJp1Og4ywzO9WglMk7jbfW33gUKvirTHr25GL7STQUzBb5Usxt + 8lgnyTUHs1t3JwCY5hKZ6CqFxmAVZP20igTixin/1LcrgX/KMEGd/b + iuvF4qJCyduieHukuY3H4XMAcR+xia2 nIUPvm/oyWR8BW/hWdzOvn + SCThlHf3xiYleDbt/o1OTQ09A0="; + +// Key for reverse zone. +2.0.192.IN-ADDRPA.NET. 257 3 5 "AQOnS4xn/IgOUpBPJ3bogzwcxOdNax071L18QqZnQQQA + VVr+iLhGTnNGp3HoWQLUIzKrJVZ3zggy3WwNT6kZo6c0 + tszYqbtvchmgQC8CzKojM/W16i6MG/ea fGU3siaOdS0 + yOI6BgPsw+YZdzlYMaIJGf4M4dyoKIhzdZyQ2bYQrjyQ + 4LB0lC7aOnsMyYKHHYeRv PxjIQXmdqgOJGq+vsevG06 + zW+1xgYJh9rCIfnm1GX/KMgxLPG2vXTD/RnLX+D3T3UL + 7HJYHJhAZD5L59VvjSPsZJHeDCUyWYrvPZesZDIRvhDD + 52SKvbheeTJUm6EhkzytNN2SN96QRk8j/iI8ib"; +}; +*/ diff --git a/SOURCES/named.empty b/SOURCES/named.empty new file mode 100644 index 0000000..8e271e7 --- /dev/null +++ b/SOURCES/named.empty @@ -0,0 +1,10 @@ +$TTL 3H +@ IN SOA @ rname.invalid. ( + 0 ; serial + 1D ; refresh + 1H ; retry + 1W ; expire + 3H ) ; minimum + NS @ + A 127.0.0.1 + AAAA ::1 diff --git a/SOURCES/named.localhost b/SOURCES/named.localhost new file mode 100644 index 0000000..6fe6a52 --- /dev/null +++ b/SOURCES/named.localhost @@ -0,0 +1,10 @@ +$TTL 1D +@ IN SOA @ rname.invalid. ( + 0 ; serial + 1D ; refresh + 1H ; retry + 1W ; expire + 3H ) ; minimum + NS @ + A 127.0.0.1 + AAAA ::1 diff --git a/SOURCES/named.logrotate b/SOURCES/named.logrotate new file mode 100644 index 0000000..5df448f --- /dev/null +++ b/SOURCES/named.logrotate @@ -0,0 +1,12 @@ +/var/named/data/named.run { + missingok + su named named + create 0644 named named + postrotate + /usr/bin/systemctl reload named.service > /dev/null 2>&1 || true + /usr/bin/systemctl reload named-chroot.service > /dev/null 2>&1 || true + /usr/bin/systemctl reload named-sdb.service > /dev/null 2>&1 || true + /usr/bin/systemctl reload named-sdb-chroot.service > /dev/null 2>&1 || true + /usr/bin/systemctl reload named-pkcs11.service > /dev/null 2>&1 || true + endscript +} diff --git a/SOURCES/named.loopback b/SOURCES/named.loopback new file mode 100644 index 0000000..7f3d862 --- /dev/null +++ b/SOURCES/named.loopback @@ -0,0 +1,11 @@ +$TTL 1D +@ IN SOA @ rname.invalid. ( + 0 ; serial + 1D ; refresh + 1H ; retry + 1W ; expire + 3H ) ; minimum + NS @ + A 127.0.0.1 + AAAA ::1 + PTR localhost. diff --git a/SOURCES/named.rfc1912.zones b/SOURCES/named.rfc1912.zones new file mode 100644 index 0000000..fa8caf5 --- /dev/null +++ b/SOURCES/named.rfc1912.zones @@ -0,0 +1,45 @@ +// named.rfc1912.zones: +// +// Provided by Red Hat caching-nameserver package +// +// ISC BIND named zone configuration for zones recommended by +// RFC 1912 section 4.1 : localhost TLDs and address zones +// and https://tools.ietf.org/html/rfc6303 +// (c)2007 R W Franks +// +// See /usr/share/doc/bind*/sample/ for example named configuration files. +// +// Note: empty-zones-enable yes; option is default. +// If private ranges should be forwarded, add +// disable-empty-zone "."; into options +// + +zone "localhost.localdomain" IN { + type master; + file "named.localhost"; + allow-update { none; }; +}; + +zone "localhost" IN { + type master; + file "named.localhost"; + allow-update { none; }; +}; + +zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN { + type master; + file "named.loopback"; + allow-update { none; }; +}; + +zone "1.0.0.127.in-addr.arpa" IN { + type master; + file "named.loopback"; + allow-update { none; }; +}; + +zone "0.in-addr.arpa" IN { + type master; + file "named.empty"; + allow-update { none; }; +}; diff --git a/SOURCES/named.root b/SOURCES/named.root new file mode 100644 index 0000000..532d4ff --- /dev/null +++ b/SOURCES/named.root @@ -0,0 +1,61 @@ + +; <<>> DiG 9.11.3-RedHat-9.11.3-3.fc27 <<>> +bufsize=1200 +norec @a.root-servers.net +; (2 servers found) +;; global options: +cmd +;; Got answer: +;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46900 +;; flags: qr aa; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 27 + +;; OPT PSEUDOSECTION: +; EDNS: version: 0, flags:; udp: 1472 +;; QUESTION SECTION: +;. IN NS + +;; ANSWER SECTION: +. 518400 IN NS a.root-servers.net. +. 518400 IN NS b.root-servers.net. +. 518400 IN NS c.root-servers.net. +. 518400 IN NS d.root-servers.net. +. 518400 IN NS e.root-servers.net. +. 518400 IN NS f.root-servers.net. +. 518400 IN NS g.root-servers.net. +. 518400 IN NS h.root-servers.net. +. 518400 IN NS i.root-servers.net. +. 518400 IN NS j.root-servers.net. +. 518400 IN NS k.root-servers.net. +. 518400 IN NS l.root-servers.net. +. 518400 IN NS m.root-servers.net. + +;; ADDITIONAL SECTION: +a.root-servers.net. 518400 IN A 198.41.0.4 +b.root-servers.net. 518400 IN A 199.9.14.201 +c.root-servers.net. 518400 IN A 192.33.4.12 +d.root-servers.net. 518400 IN A 199.7.91.13 +e.root-servers.net. 518400 IN A 192.203.230.10 +f.root-servers.net. 518400 IN A 192.5.5.241 +g.root-servers.net. 518400 IN A 192.112.36.4 +h.root-servers.net. 518400 IN A 198.97.190.53 +i.root-servers.net. 518400 IN A 192.36.148.17 +j.root-servers.net. 518400 IN A 192.58.128.30 +k.root-servers.net. 518400 IN A 193.0.14.129 +l.root-servers.net. 518400 IN A 199.7.83.42 +m.root-servers.net. 518400 IN A 202.12.27.33 +a.root-servers.net. 518400 IN AAAA 2001:503:ba3e::2:30 +b.root-servers.net. 518400 IN AAAA 2001:500:200::b +c.root-servers.net. 518400 IN AAAA 2001:500:2::c +d.root-servers.net. 518400 IN AAAA 2001:500:2d::d +e.root-servers.net. 518400 IN AAAA 2001:500:a8::e +f.root-servers.net. 518400 IN AAAA 2001:500:2f::f +g.root-servers.net. 518400 IN AAAA 2001:500:12::d0d +h.root-servers.net. 518400 IN AAAA 2001:500:1::53 +i.root-servers.net. 518400 IN AAAA 2001:7fe::53 +j.root-servers.net. 518400 IN AAAA 2001:503:c27::2:30 +k.root-servers.net. 518400 IN AAAA 2001:7fd::1 +l.root-servers.net. 518400 IN AAAA 2001:500:9f::42 +m.root-servers.net. 518400 IN AAAA 2001:dc3::35 + +;; Query time: 24 msec +;; SERVER: 198.41.0.4#53(198.41.0.4) +;; WHEN: Thu Apr 05 15:57:34 CEST 2018 +;; MSG SIZE rcvd: 811 + diff --git a/SOURCES/named.root.key b/SOURCES/named.root.key new file mode 100644 index 0000000..48449a8 --- /dev/null +++ b/SOURCES/named.root.key @@ -0,0 +1,19 @@ +managed-keys { + # ROOT KEYS: See https://data.iana.org/root-anchors/root-anchors.xml + # for current trust anchor information. + # + # This key (20326) was published in the root zone in 2017. + # Servers which were already using the old key (19036) should + # roll seamlessly to this new one via RFC 5011 rollover. Servers + # being set up for the first time can use the contents of this + # file as initializing keys; thereafter, the keys in the + # managed key database will be trusted and maintained + # automatically. + . initial-key 257 3 8 "AwEAAaz/tAm8yTn4Mfeh5eyI96WSVexTBAvkMgJzkKTOiW1vkIbzxeF3 + +/4RgWOq7HrxRixHlFlExOLAJr5emLvN7SWXgnLh4+B5xQlNVz8Og8kv + ArMtNROxVQuCaSnIDdD5LKyWbRd2n9WGe2R8PzgCmr3EgVLrjyBxWezF + 0jLHwVN8efS3rCj/EWgvIWgb9tarpVUDK/b58Da+sqqls3eNbuv7pr+e + oZG+SrDK6nWeL3c6H5Apxz7LjVc1uTIdsIXxuOLYA4/ilBmSVIzuDWfd + RUfhHdY6+cn8HFRm+2hM8AnXGXws9555KrUB5qihylGa8subX2Nn6UwN + R1AkUTV74bU="; +}; diff --git a/SOURCES/named.rwtab b/SOURCES/named.rwtab new file mode 100644 index 0000000..2cb3a41 --- /dev/null +++ b/SOURCES/named.rwtab @@ -0,0 +1,6 @@ +dirs /var/named + +files /var/named/named.ca +files /var/named/named.empty +files /var/named/named.localhost +files /var/named/named.loopback diff --git a/SOURCES/named.service b/SOURCES/named.service new file mode 100644 index 0000000..7cd6d34 --- /dev/null +++ b/SOURCES/named.service @@ -0,0 +1,25 @@ +[Unit] +Description=Berkeley Internet Name Domain (DNS) +Wants=nss-lookup.target +Wants=named-setup-rndc.service +Before=nss-lookup.target +After=named-setup-rndc.service +After=network.target + +[Service] +Type=forking +Environment=NAMEDCONF=/etc/named.conf +EnvironmentFile=-/etc/sysconfig/named +Environment=KRB5_KTNAME=/etc/named.keytab +PIDFile=/run/named/named.pid + +ExecStartPre=/bin/bash -c 'if [ ! "$DISABLE_ZONE_CHECKING" == "yes" ]; then /usr/sbin/named-checkconf -z "$NAMEDCONF"; else echo "Checking of zone files is disabled"; fi' +ExecStart=/usr/sbin/named -u named -c ${NAMEDCONF} $OPTIONS +ExecReload=/bin/sh -c 'if /usr/sbin/rndc null > /dev/null 2>&1; then /usr/sbin/rndc reload; else /bin/kill -HUP $MAINPID; fi' + +ExecStop=/bin/sh -c '/usr/sbin/rndc stop > /dev/null 2>&1 || /bin/kill -TERM $MAINPID' + +PrivateTmp=true + +[Install] +WantedBy=multi-user.target diff --git a/SOURCES/named.sysconfig b/SOURCES/named.sysconfig new file mode 100644 index 0000000..5f6f817 --- /dev/null +++ b/SOURCES/named.sysconfig @@ -0,0 +1,17 @@ +# BIND named process options +# ~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# OPTIONS="whatever" -- These additional options will be passed to named +# at startup. Don't add -t here, enable proper +# -chroot.service unit file. +# +# NAMEDCONF=/etc/named/alternate.conf +# -- Don't use -c to change configuration file. +# Extend systemd named.service instead or use this +# variable. +# +# DISABLE_ZONE_CHECKING -- By default, service file calls named-checkzone +# utility for every zone to ensure all zones are +# valid before named starts. If you set this option +# to 'yes' then service file doesn't perform those +# checks. diff --git a/SOURCES/setup-named-chroot.sh b/SOURCES/setup-named-chroot.sh new file mode 100755 index 0000000..5e68915 --- /dev/null +++ b/SOURCES/setup-named-chroot.sh @@ -0,0 +1,117 @@ +#!/bin/bash + +ROOTDIR="$1" +CONFIG_FILES="${3:-/etc/named-chroot.files}" + +usage() +{ + echo + echo 'This script setups chroot environment for BIND' + echo 'Usage: setup-named-chroot.sh ROOTDIR [chroot.files]' +} + +if ! [ "$#" -ge 2 -a "$#" -le 3 ]; then + echo 'Wrong number of arguments' + usage + exit 1 +fi + +# Exit if ROOTDIR doesn't exist +if ! [ -d "$ROOTDIR" ]; then + echo "Root directory $ROOTDIR doesn't exist" + usage + exit 1 +fi + +if ! [ -r "$CONFIG_FILES" ]; then + echo "Files list $CONFIG_FILES doesn't exist" 2>&1 + usage + exit 1 +fi + +dev_create() +{ + DEVNAME="$ROOTDIR/dev/$1" + shift + if ! [ -e "$DEVNAME" ]; then + /bin/mknod -m 0664 "$DEVNAME" $@ + /bin/chgrp named "$DEVNAME" + if [ -x /usr/sbin/selinuxenabled -a -x /sbin/restorecon ]; then + /usr/sbin/selinuxenabled && /sbin/restorecon "$DEVNAME" > /dev/null || : + fi + fi +} + +dev_chroot_prep() +{ + dev_create random c 1 8 + dev_create urandom c 1 9 + dev_create zero c 1 5 + dev_create null c 1 3 +} + +files_comment_filter() +{ + if [ -d "$1" ]; then + grep -v '^[[:space:]]*#' "$1"/*.files + else + grep -v '^[[:space:]]*#' "$1" + fi +} + +mount_chroot_conf() +{ + if [ -n "$ROOTDIR" ]; then + # Check devices are prepared + dev_chroot_prep + files_comment_filter "$CONFIG_FILES" | while read -r all; do + # Skip nonexistant files + [ -e "$all" ] || continue + + # If mount source is a file + if ! [ -d "$all" ]; then + # mount it only if it is not present in chroot or it is empty + if ! [ -e "$ROOTDIR$all" ] || [ `stat -c'%s' "$ROOTDIR$all"` -eq 0 ]; then + touch "$ROOTDIR$all" + mount --bind "$all" "$ROOTDIR$all" + fi + else + # Mount source is a directory. Mount it only if directory in chroot is + # empty. + if [ -e "$all" ] && [ `ls -1A $ROOTDIR$all | wc -l` -eq 0 ]; then + mount --bind --make-private "$all" "$ROOTDIR$all" + fi + fi + done + fi +} + +umount_chroot_conf() +{ + if [ -n "$ROOTDIR" ]; then + files_comment_filter "$CONFIG_FILES" | while read -r all; do + # Check if file is mount target. Do not use /proc/mounts because detecting + # of modified mounted files can fail. + if mount | grep -q '.* on '"$ROOTDIR$all"' .*'; then + umount "$ROOTDIR$all" + # Remove temporary created files + [ -f "$all" ] && rm -f "$ROOTDIR$all" + fi + done + fi +} + +case "$2" in + on) + mount_chroot_conf + ;; + off) + umount_chroot_conf + ;; + *) + echo 'Second argument has to be "on" or "off"' + usage + exit 1 +esac + +exit 0 diff --git a/SOURCES/setup-named-softhsm.sh b/SOURCES/setup-named-softhsm.sh new file mode 100755 index 0000000..7ae0a6d --- /dev/null +++ b/SOURCES/setup-named-softhsm.sh @@ -0,0 +1,55 @@ +#!/bin/sh +# +# This script will initialise token storage of softhsm PKCS11 provider +# in custom location. Is useful to store tokens in non-standard location. + +SOFTHSM2_CONF="$1" +TOKENPATH="$2" +GROUPNAME="$3" +# Do not use this script for real keys worth protection +# This is intended for crypto accelerators using PKCS11 interface. +# Uninitialized token would fail any crypto operation. +PIN=1234 + +set -e + +if [ -z "$SOFTHSM2_CONF" -o -z "$TOKENPATH" ]; then + echo "Usage: $0 [group]" >&2 + exit 1 +fi + +if ! [ -f "$SOFTHSM2_CONF" ]; then +cat << SED > "$SOFTHSM2_CONF" +# SoftHSM v2 configuration file + +directories.tokendir = ${TOKENPATH} +objectstore.backend = file + +# ERROR, WARNING, INFO, DEBUG +log.level = ERROR + +# If CKF_REMOVABLE_DEVICE flag should be set +slots.removable = false +SED +else + echo "Config file $SOFTHSM2_CONF already exists" >&2 +fi + +[ -d "$TOKENPATH" ] || mkdir -p "$TOKENPATH" + +export SOFTHSM2_CONF + +if softhsm2-util --show-slots | grep 'Initialized:[[:space:]]*yes' > /dev/null +then + echo "Token in ${TOKENPATH} is already initialized" >&2 +else + echo "Initializing tokens to ${TOKENPATH}..." + softhsm2-util --init-token --free --label rpm --pin $PIN --so-pin $PIN + + if [ -n "$GROUPNAME" ]; then + chgrp -R -- "$GROUPNAME" "$TOKENPATH" + chmod -R -- g=rX,o= "$TOKENPATH" + fi +fi + +echo "export SOFTHSM2_CONF=\"$SOFTHSM2_CONF\"" diff --git a/SOURCES/trusted-key.key b/SOURCES/trusted-key.key new file mode 100644 index 0000000..df2fd0d --- /dev/null +++ b/SOURCES/trusted-key.key @@ -0,0 +1,2 @@ +. 3600 IN DNSKEY 257 3 8 AwEAAagAIKlVZrpC6Ia7gEzahOR+9W29euxhJhVVLOyQbSEW0O8gcCjFFVQUTf6v58fLjwBd0YI0EzrAcQqBGCzh/RStIoO8g0NfnfL2MTJRkxoXbfDaUeVPQuYEhg37NZWAJQ9VnMVDxP/VHL496M/QZxkjf5/Efucp2gaDX6RS6CXpoY68LsvPVjR0ZSwzz1apAzvN9dlzEheX7ICJBBtuA6G3LQpzW5hOA2hzCTMjJPJ8LbqF6dsV6DoBQzgul0sGIcGOYl7OyQdXfZ57relSQageu+ipAdTTJ25AsRTAoub8ONGcLmqrAmRLKBP1dfwhYB4N7knNnulqQxA+Uk1ihz0= +. 3600 IN DNSKEY 257 3 8 AwEAAaz/tAm8yTn4Mfeh5eyI96WSVexTBAvkMgJzkKTOiW1vkIbzxeF3+/4RgWOq7HrxRixHlFlExOLAJr5emLvN7SWXgnLh4+B5xQlNVz8Og8kvArMtNROxVQuCaSnIDdD5LKyWbRd2n9WGe2R8PzgCmr3EgVLrjyBxWezF0jLHwVN8efS3rCj/EWgvIWgb9tarpVUDK/b58Da+sqqls3eNbuv7pr+eoZG+SrDK6nWeL3c6H5Apxz7LjVc1uTIdsIXxuOLYA4/ilBmSVIzuDWfdRUfhHdY6+cn8HFRm+2hM8AnXGXws9555KrUB5qihylGa8subX2Nn6UwNR1AkUTV74bU= diff --git a/SOURCES/zone2sqlite.1 b/SOURCES/zone2sqlite.1 new file mode 100644 index 0000000..6897827 --- /dev/null +++ b/SOURCES/zone2sqlite.1 @@ -0,0 +1,53 @@ +.\" Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC") +.\" Copyright (C) 2000, 2001 Internet Software Consortium. +.\" +.\" Permission to use, copy, modify, and/or distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH +.\" REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +.\" AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, +.\" INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +.\" LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +.\" PERFORMANCE OF THIS SOFTWARE. +.\" +.\" Manpage written by Jan Gorig +.TH zone2sqlite 1 "15 March 2010" "BIND9" +.SH NAME +zone2sqlite - Load BIND 9 zone file into SQLite database +.SH SYNOPSIS +.B zone2sqlite zone zonefile dbfile dbtable +.SH DESCRIPTION +zone2sqlite parses DNS zone file and creates database for use with SQLite BIND SDB driver. + +\fBzone\fR +.RS 4 +Zone origin, eg "mydomain.net." +.RE +.PP +\fBzonefile\fR +.RS 4 +Master zone database file, eg. mydomain.net.zone +.RE +.PP +\fBdbfile\fR +.RS 4 +Name of SQLite database file +.RE +.PP +\fBdbtable\fR +.RS 4 +Name of table in database +.RE + +.SH "EXIT STATUS" +Exits with 0 on success or 1 on failure. +.SH "SEE ALSO" +named(8) +.SH "COPYRIGHT" +Copyright \(co 2004, 2005, 2007\-2009 Internet Systems Consortium, Inc. ("ISC") +.br +Copyright \(co 2000, 2001 Internet Software Consortium. +.br diff --git a/SOURCES/zonetodb.1 b/SOURCES/zonetodb.1 new file mode 100644 index 0000000..897e74f --- /dev/null +++ b/SOURCES/zonetodb.1 @@ -0,0 +1,53 @@ +.\" Copyright (C) 2004, 2005, 2007-2009 Internet Systems Consortium, Inc. ("ISC") +.\" Copyright (C) 2000, 2001 Internet Software Consortium. +.\" +.\" Permission to use, copy, modify, and/or distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH +.\" REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +.\" AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, +.\" INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +.\" LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +.\" PERFORMANCE OF THIS SOFTWARE. +.\" +.\" Manpage written by Jan Gorig +.TH zonetodb 1 "15 March 2010" "BIND9" +.SH NAME +zonetodb - Generate a PostgreSQL table from a zone. +.SH SYNOPSIS +.B zonetodb origin file dbname dbtable +.SH DESCRIPTION +zonetodb parses DNS zone file and creates table in selected database for use with PostgreSQL BIND SDB driver. + +\fBzone\fR +.RS 4 +Zone origin, eg "pgdb.net." +.RE +.PP +\fBfile\fR +.RS 4 +Master zone database file, eg. pgdb.net.db +.RE +.PP +\fBdbname\fR +.RS 4 +Name of PostgreSQL database (database must exist) +.RE +.PP +\fBdbtable\fR +.RS 4 +Name of table in database +.RE + +.SH "EXIT STATUS" +Exits with 0 on success or 1 on failure. +.SH "SEE ALSO" +named(8) +.SH "COPYRIGHT" +Copyright \(co 2004, 2005, 2007\-2009 Internet Systems Consortium, Inc. ("ISC") +.br +Copyright \(co 2000, 2001 Internet Software Consortium. +.br diff --git a/SPECS/bind.spec b/SPECS/bind.spec new file mode 100644 index 0000000..3a2b8b4 --- /dev/null +++ b/SPECS/bind.spec @@ -0,0 +1,4098 @@ +# +# Red Hat BIND package .spec file +# +# vim:expandtab ts=2: + +#%%global PATCHVER P1 +#%%global PREVER rc1 +%global BINDVERSION %{version}%{?PREVER}%{?PATCHVER:-%{PATCHVER}} + +# bcond_without is built by default, unless --without X is passed +# bcond_with is built only when --with X is passed to build +%bcond_with SYSTEMTEST +%bcond_without SDB +%bcond_without GSSTSIG +# it is not possible to build the package without PKCS11 sub-package +# due to extensive changes to Makefiles +%bcond_without PKCS11 +%bcond_without DEVEL +%bcond_with LMDB +%bcond_with DLZ +%bcond_without EXPORT_LIBS +# Legacy GeoIP support +%bcond_with GEOIP +%if 0%{?fedora} >= 28 || 0%{?rhel} >= 8 +%bcond_without UNITTEST +%else +%bcond_with UNITTEST +%endif +%if 0%{?fedora} >= 28 || 0%{?rhel} >= 8 +# New MaxMind GeoLite support +%bcond_without GEOIP2 +%else +%bcond_with GEOIP2 +%endif + +%{?!bind_uid: %global bind_uid 25} +%{?!bind_gid: %global bind_gid 25} +%global bind_dir /var/named +%global chroot_prefix %{bind_dir}/chroot +%if %{with SDB} +%global chroot_sdb_prefix %{bind_dir}/chroot_sdb +%endif +%global chroot_create_directories /dev /run/named %{_localstatedir}/{log,named,tmp} \\\ + %{_sysconfdir}/{crypto-policies/back-ends,pki/dnssec-keys,named} \\\ + %{_libdir}/bind %{_datadir}/GeoIP + +## The order of libs is important. See lib/Makefile.in for details +%define bind_export_libs isc dns isccfg irs +%{!?_export_dir:%global _export_dir /bind9-export/} +# libisc-nosym requires to be linked with unresolved symbols +# When libisc-nosym linking is fixed, it can be defined to 1 +# Visit https://bugzilla.redhat.com/show_bug.cgi?id=1540300 +%undefine _strict_symbol_defs_build +# + +# lib*.so.X versions of selected libraries +%global sover_dns 1107 +%global sover_isc 1104 +%global sover_irs 161 +%global sover_isccfg 163 + +Summary: The Berkeley Internet Name Domain (BIND) DNS (Domain Name System) server +Name: bind +License: MPLv2.0 +Version: 9.11.13 +Release: 3%{?PATCHVER:.%{PATCHVER}}%{?PREVER:.%{PREVER}}%{?dist} +Epoch: 32 +Url: http://www.isc.org/products/BIND/ +# +Source: https://ftp.isc.org/isc/bind9/%{BINDVERSION}/bind-%{BINDVERSION}.tar.gz +Source1: named.sysconfig +Source3: named.logrotate +Source7: bind-9.3.1rc1-sdb_tools-Makefile.in +Source8: dnszone.schema +Source12: README.sdb_pgsql +Source16: named.conf +# Refresh by command: dig @a.root-servers.net. +tcp +norec +# or from URL +Source17: https://www.internic.net/domain/named.root +Source18: named.localhost +Source19: named.loopback +Source20: named.empty +Source23: named.rfc1912.zones +Source25: named.conf.sample +Source27: named.root.key +Source30: ldap2zone.c +Source31: ldap2zone.1 +Source32: named-sdb.8 +Source33: zonetodb.1 +Source34: zone2sqlite.1 +Source35: bind.tmpfiles.d +Source36: trusted-key.key +Source37: named.service +Source38: named-chroot.service +Source39: named-sdb.service +Source40: named-sdb-chroot.service +Source41: setup-named-chroot.sh +Source42: generate-rndc-key.sh +Source43: named.rwtab +Source44: named-chroot-setup.service +Source45: named-sdb-chroot-setup.service +Source46: named-setup-rndc.service +Source47: named-pkcs11.service +Source48: setup-named-softhsm.sh +Source49: named-chroot.files +Source50: random.data + +# Common patches +Patch10: bind-9.5-PIE.patch +Patch16: bind-9.3.2-redhat_doc.patch +Patch72: bind-9.5-dlz-64bit.patch +Patch101:bind-96-old-api.patch +Patch102:bind-95-rh452060.patch +Patch106:bind93-rh490837.patch +Patch109:bind97-rh478718.patch +Patch112:bind97-rh645544.patch +Patch130:bind-9.9.1-P2-dlz-libdb.patch +Patch131:bind-9.9.1-P2-multlib-conflict.patch +Patch133:bind99-rh640538.patch +Patch134:bind97-rh669163.patch +# Fedora specific patch to distribute native-pkcs#11 functionality +Patch136:bind-9.10-dist-native-pkcs11.patch + +# [ISC-Bugs #42525] non-portable use of strlcat in contrib/sdb/ldap/zone2ldap.c +# introduced by https://source.isc.org/cgi-bin/gitweb.cgi?p=bind9.git;a=commit;h=fc9f0ac5778f78003a7acc957a23711811fec122 +Patch137:bind-9.10-use-of-strlcat.patch +Patch140:bind-9.11-rh1410433.patch +Patch145:bind-9.11-rh1205168.patch +# [ISC-Bugs #46853] commit cb616c6d5c2ece1fac37fa6e0bca2b53d4043098 ISC 4851 +Patch149:bind-9.11-kyua-pkcs11.patch +# Avoid conflicts with OpenSSL PKCS11 engine +Patch150:bind-9.11-engine-pkcs11.patch +Patch153:bind-9.11-export-suffix.patch +Patch154:bind-9.11-oot-manual.patch +Patch155:bind-9.11-pk11.patch +Patch156:bind-9.11-fips-code.patch +Patch157:bind-9.11-fips-tests.patch +# commit 66ba2fdad583d962a1f4971c85d58381f0849e4d +# commit b105ccee68ccc3c18e6ea530063b3c8e5a42571c +# commit 083461d3329ff6f2410745848a926090586a9846 +Patch158:bind-9.11-rh1624100.patch +Patch159:bind-9.11-host-idn-disable.patch +Patch164:bind-9.11-fips-code-includes.patch +# [RT #31459] commit 06a8051d2476fb526fe6960832209392c763a9af +Patch165:bind-9.11-rt31459.patch +# [RT #46047] commit 24172bd2eeba91441ab1c65d2717b0692309244a ISC 4724 +Patch166:bind-9.11-rt46047.patch +Patch167:bind-9.11-rh1668682.patch +# random_test fails too often by random, disable it +Patch168:bind-9.11-unit-disable-random.patch +Patch174:bind-9.11-fips-disable.patch +# Make sure jsonccp-devel does not interfere +Patch175:bind-9.11-json-c.patch +Patch177:bind-9.11-serve-stale.patch +Patch178:bind-9.11-dhcp-time-monotonic.patch +Patch179:bind-9.11-rh1790879.patch +Patch180:bind-9.11.13-rwlock.patch + +# SDB patches +Patch11: bind-9.3.2b2-sdbsrc.patch +Patch12: bind-9.10-sdb.patch + +# export lib patches +Patch135:bind-9.11-export-isc-config.patch + +# needs inpection +Patch17: bind-9.3.2b1-fix_sdb_ldap.patch +Patch18: bind-9.11-zone2ldap.patch + +Requires(post): systemd +Requires(preun): systemd +Requires(postun): systemd +Requires: coreutils +Requires(pre): shadow-utils +Requires(post): shadow-utils +Requires(post): glibc-common +Requires(post): grep +Requires: bind-libs%{?_isa} = %{epoch}:%{version}-%{release} +Obsoletes: bind-config < 30:9.3.2-34.fc6 +Provides: bind-config = 30:9.3.2-34.fc6 +Obsoletes: caching-nameserver < 31:9.4.1-7.fc8 +Provides: caching-nameserver = 31:9.4.1-7.fc8 +Obsoletes: dnssec-conf < 1.27-2 +Provides: dnssec-conf = 1.27-2 +BuildRequires: gcc, make +BuildRequires: openssl-devel, libtool, autoconf, pkgconfig, libcap-devel +BuildRequires: libidn2-devel, libxml2-devel +BuildRequires: systemd +# needed for %%{__python3} macro +BuildRequires: python3-devel +BuildRequires: python3-ply +BuildRequires: findutils sed +%if %{with SDB} +BuildRequires: openldap-devel, postgresql-devel, sqlite-devel, mariadb-connector-c-devel +BuildRequires: libdb-devel +%endif +%if %{with UNITTEST} +# make unit dependencies +BuildRequires: libcmocka-devel kyua +%endif +%if %{with PKCS11} +BuildRequires: softhsm +%endif +%if %{with SYSTEMTEST} +# bin/tests/system dependencies +BuildRequires: perl(Net::DNS) perl(Net::DNS::Nameserver) perl(Time::HiRes) perl(Getopt::Long) +# manual configuration requires this tool +BuildRequires: iproute +%endif +%if %{with GSSTSIG} +BuildRequires: krb5-devel +%endif +%if %{with LMDB} +BuildRequires: lmdb-devel +%endif +%if %{with GEOIP} +BuildRequires: GeoIP-devel +%endif +%if %{with GEOIP2} +BuildRequires: libmaxminddb-devel +%endif +# Needed to regenerate dig.1 manpage +BuildRequires: docbook-style-xsl, libxslt + +%description +BIND (Berkeley Internet Name Domain) is an implementation of the DNS +(Domain Name System) protocols. BIND includes a DNS server (named), +which resolves host names to IP addresses; a resolver library +(routines for applications to use when interfacing with DNS); and +tools for verifying that the DNS server is operating properly. + +%if %{with PKCS11} +%package pkcs11 +Summary: Bind with native PKCS#11 functionality for crypto +Requires: systemd +Requires: bind%{?_isa} = %{epoch}:%{version}-%{release} +Requires: bind-pkcs11-libs%{?_isa} = %{epoch}:%{version}-%{release} +Recommends: softhsm + +%description pkcs11 +This is a version of BIND server built with native PKCS#11 functionality. +It is important to have SoftHSM v2+ installed and some token initialized. +For other supported HSM modules please check the BIND documentation. + +%package pkcs11-utils +Summary: Bind tools with native PKCS#11 for using DNSSEC +Requires: bind-pkcs11-libs%{?_isa} = %{epoch}:%{version}-%{release} +Obsoletes: bind-pkcs11 < 32:9.9.4-16.P2 + +%description pkcs11-utils +This is a set of PKCS#11 utilities that when used together create rsa +keys in a PKCS11 keystore. Also utilities for working with DNSSEC +compiled with native PKCS#11 functionality are included. + +%package pkcs11-libs +Summary: Bind libraries compiled with native PKCS#11 +Requires: bind-license = %{epoch}:%{version}-%{release} +Requires: bind-libs%{?_isa} = %{epoch}:%{version}-%{release} + +%description pkcs11-libs +This is a set of BIND libraries (dns, isc) compiled with native PKCS#11 +functionality. + +%package pkcs11-devel +Summary: Development files for Bind libraries compiled with native PKCS#11 +Requires: bind-pkcs11-libs%{?_isa} = %{epoch}:%{version}-%{release} +Requires: bind-lite-devel%{?_isa} = %{epoch}:%{version}-%{release} + +%description pkcs11-devel +This a set of development files for BIND libraries (dns, isc) compiled +with native PKCS#11 functionality. +%endif + +%if %{with SDB} +%package sdb +Summary: BIND server with database backends and DLZ support +Requires: systemd +Requires: bind%{?_isa} = %{epoch}:%{version}-%{release} +Requires: bind-libs%{?_isa} = %{epoch}:%{version}-%{release} + +%description sdb +BIND (Berkeley Internet Name Domain) is an implementation of the DNS +(Domain Name System) protocols. BIND includes a DNS server (named-sdb) +which has compiled-in SDB (Simplified Database Backend) which includes +support for using alternative Zone Databases stored in an LDAP server +(ldapdb), a postgreSQL database (pgsqldb), an sqlite database (sqlitedb), +or in the filesystem (dirdb), in addition to the standard in-memory RBT +(Red Black Tree) zone database. It also includes support for DLZ +(Dynamic Loadable Zones) +%endif + +%package libs-lite +Summary: Libraries for working with the DNS protocol +Obsoletes:bind-libbind-devel < 31:9.3.3-4.fc7 +Provides: bind-libbind-devel = 31:9.3.3-4.fc7 +Requires: bind-license = %{epoch}:%{version}-%{release} + +%description libs-lite +Contains lite version of BIND suite libraries which are used by various +programs to work with DNS protocol. + +%package libs +Summary: Libraries used by the BIND DNS packages +Requires: bind-license = %{epoch}:%{version}-%{release} +Requires: bind-libs-lite%{?_isa} = %{epoch}:%{version}-%{release} + +%description libs +Contains heavyweight version of BIND suite libraries used by both named DNS +server and utilities in bind-utils package. + +%package license +Summary: License of the BIND DNS suite +BuildArch:noarch + +%description license +Contains license of the BIND DNS suite. + +%package utils +Summary: Utilities for querying DNS name servers +Requires: bind-libs%{?_isa} = %{epoch}:%{version}-%{release} +Requires: python3-bind = %{epoch}:%{version}-%{release} + +%description utils +Bind-utils contains a collection of utilities for querying DNS (Domain +Name System) name servers to find out information about Internet +hosts. These tools will provide you with the IP addresses for given +host names, as well as other information about registered domains and +network addresses. + +You should install bind-utils if you need to get information from DNS name +servers. + +%if %{with DEVEL} +%package devel +Summary: Header files and libraries needed for BIND DNS development +Obsoletes:bind-libbind-devel < 31:9.3.3-4.fc7 +Provides: bind-libbind-devel = 31:9.3.3-4.fc7 +Requires: bind-libs%{?_isa} = %{epoch}:%{version}-%{release} +Requires: bind-lite-devel%{?_isa} = %{epoch}:%{version}-%{release} + +%description devel +The bind-devel package contains full version of the header files and libraries +required for development with ISC BIND 9 +%endif + +%package lite-devel +Summary: Lite version of header files and libraries needed for BIND DNS development +Requires: bind-libs-lite%{?_isa} = %{epoch}:%{version}-%{release} +Requires: openssl-devel%{?_isa} libxml2-devel%{?_isa} +%if %{with GEOIP} +Requires: GeoIP-devel%{?_isa} +%endif +%if %{with GEOIP2} +Requires: libmaxminddb-devel%{?_isa} +%endif + +%description lite-devel +The bind-lite-devel package contains lite version of the header +files and libraries required for development with ISC BIND 9 + +%package chroot +Summary: A chroot runtime environment for the ISC BIND DNS server, named(8) +Prefix: %{chroot_prefix} +# grep is required due to setup-named-chroot.sh script +Requires: grep +Requires: bind%{?_isa} = %{epoch}:%{version}-%{release} + +%description chroot +This package contains a tree of files which can be used as a +chroot(2) jail for the named(8) program from the BIND package. +Based on the code from Jan "Yenya" Kasprzak + +%if %{with SDB} +%package sdb-chroot +Summary: A chroot runtime environment for the ISC BIND DNS server, named-sdb(8) +Prefix: %{chroot_sdb_prefix} +# grep is required due to setup-named-chroot.sh script +Requires: grep +Requires: bind-sdb%{?_isa} = %{epoch}:%{version}-%{release} + +%description sdb-chroot +This package contains a tree of files which can be used as a +chroot(2) jail for the named-sdb(8) program from the BIND package. +Based on the code from Jan "Yenya" Kasprzak +%endif + + +%if %{with DLZ} +%package dlz-bdb +Summary: BIND server bdb DLZ module +Requires: bind%{?_isa} = %{epoch}:%{version}-%{release} + +%description dlz-bdb +Dynamic Loadable Zones module for BIND server. + +%package dlz-filesystem +Summary: BIND server filesystem DLZ module +Requires: bind%{?_isa} = %{epoch}:%{version}-%{release} + +%description dlz-filesystem +Dynamic Loadable Zones module for BIND server. + +%package dlz-ldap +Summary: BIND server ldap DLZ module +Requires: bind%{?_isa} = %{epoch}:%{version}-%{release} + +%description dlz-ldap +Dynamic Loadable Zones module for BIND server. + +%package dlz-mysql +Summary: BIND server mysql DLZ module +Requires: bind%{?_isa} = %{epoch}:%{version}-%{release} + +%description dlz-mysql +Dynamic Loadable Zones module for BIND server. + +%package dlz-mysqldyn +Summary: BIND server mysqldyn DLZ module +Requires: bind%{?_isa} = %{epoch}:%{version}-%{release} + +%description dlz-mysqldyn +Dynamic Loadable Zones module for BIND server. + +%package dlz-sqlite3 +Summary: BIND server sqlite3 DLZ module +Requires: bind%{?_isa} = %{epoch}:%{version}-%{release} + +%description dlz-sqlite3 +Dynamic Loadable Zones module for BIND server. +%endif + + +%package -n python3-bind +Summary: A module allowing rndc commands to be sent from Python programs +Requires: bind-license = %{epoch}:%{version}-%{release} +Requires: %{?__python3} python3-ply %{py3_dist ply} +BuildArch: noarch +%{?python_provide:%python_provide python3-bind} +%{?python_provide:%python_provide python3-isc} + +%description -n python3-bind +This package provides a module which allows commands to be sent to rndc directly from Python programs. + +%if %{with EXPORT_LIBS} +%package export-libs +Summary: ISC libs for DHCP application +%if 0%{?fedora} >= 1 +Obsoletes: bind99-libs < 9.9.11-4 +Provides: bind99-libs = 9.9.11-4 +# This subpackage will not use shared license, but distribute its own +%endif + +%description export-libs +BIND (Berkeley Internet Name Domain) is an implementation of the DNS +(Domain Name System) protocols. This package set contains only export +version of BIND libraries, that are used for building ISC DHCP. + +%package export-devel +Summary: Header files and libraries needed for BIND export libraries +Requires: %{name}-export-libs%{?_isa} = %{epoch}:%{version}-%{release} +Requires: openssl-devel +Requires: libcap-devel + +%if 0%{?fedora} >= 1 +Obsoletes: bind99-devel < 9.9.11-4 +# To prevent linking against wrong set of libraries, +# do not coexist with bind99-devel +Conflicts: bind99-devel +%endif + +%description export-devel +This package contains export version of the header files and libraries +required for development with ISC BIND. These headers and libraries +are used for building ISC DHCP. +%endif + +%prep +%setup -q -n %{name}-%{BINDVERSION} + +# Common patches +%patch10 -p1 -b .PIE +%patch16 -p1 -b .redhat_doc +%ifnarch alpha ia64 +%patch72 -p1 -b .64bit +%endif +%patch102 -p1 -b .rh452060 +%patch106 -p1 -b .rh490837 +%patch109 -p1 -b .rh478718 +%patch112 -p1 -b .rh645544 +%patch130 -p1 -b .libdb +%patch131 -p1 -b .multlib-conflict +%patch140 -p1 -b .rh1410433 +%patch145 -p1 -b .rh1205168 +%patch153 -p1 -b .export_suffix +%patch154 -p1 -b .oot-man +%patch155 -p1 -b .pk11-internal +%patch156 -p1 -b .fips-code +%patch157 -p1 -b .fips-tests +%patch158 -p1 -b .rh1624100 +%patch159 -p1 -b .host-idn-disable +%patch164 -p1 -b .fips-includes +%patch165 -p1 -b .rt31459 +%patch166 -p1 -b .rt46047 +%patch167 -p1 -b .rh1668682 +%patch168 -p1 -b .random_test-disable +%patch174 -p1 -b .rh1737407 +%patch175 -p1 -b .json-c +%patch177 -p1 -b .serve-stale +%patch178 -p1 -b .time-monotonic +%patch179 -p1 -b .rh1790879 +%patch180 -p1 -b .rwlock + +mkdir lib/dns/tests/testdata/dstrandom +cp -a %{SOURCE50} lib/dns/tests/testdata/dstrandom/random.data + +%if %{with PKCS11} +cp -r bin/named{,-pkcs11} +cp -r bin/dnssec{,-pkcs11} +cp -r lib/isc{,-pkcs11} +cp -r lib/dns{,-pkcs11} +%patch136 -p1 -b .dist_pkcs11 +%patch149 -p1 -b .kyua-pkcs11 +%patch150 -p1 -b .engine-pkcs11 +%endif + +%if %{with SDB} +%patch101 -p1 -b .old-api +mkdir bin/named-sdb +cp -r bin/named/* bin/named-sdb +%patch11 -p1 -b .sdbsrc +# SDB ldap +cp -fp contrib/sdb/ldap/ldapdb.[ch] bin/named-sdb +# SDB postgreSQL +cp -fp contrib/sdb/pgsql/pgsqldb.[ch] bin/named-sdb +# SDB sqlite +cp -fp contrib/sdb/sqlite/sqlitedb.[ch] bin/named-sdb +# SDB Berkeley DB - needs to be ported to DB4! +#cp -fp contrib/sdb/bdb/bdb.[ch] bin/named_sdb +# SDB dir +cp -fp contrib/sdb/dir/dirdb.[ch] bin/named-sdb +# SDB tools +mkdir -p bin/sdb_tools +cp -fp %{SOURCE30} bin/sdb_tools/ldap2zone.c +cp -fp %{SOURCE7} bin/sdb_tools/Makefile.in +#cp -fp contrib/sdb/bdb/zone2bdb.c bin/sdb_tools +cp -fp contrib/sdb/ldap/{zone2ldap.1,zone2ldap.c} bin/sdb_tools +cp -fp contrib/sdb/pgsql/zonetodb.c bin/sdb_tools +cp -fp contrib/sdb/sqlite/zone2sqlite.c bin/sdb_tools +%patch12 -p1 -b .sdb +%patch17 -p1 -b .fix_sdb_ldap +%patch18 -p1 -b .fix_zone2ldap +%patch137 -p1 -b .strlcat_fix +%endif + +%patch133 -p1 -b .rh640538 +%patch134 -p1 -b .rh669163 + +# Sparc and s390 arches need to use -fPIE +%ifarch sparcv9 sparc64 s390 s390x +for i in bin/named{,-sdb}/{,unix}/Makefile.in; do + sed -i 's|fpie|fPIE|g' $i +done +%endif +:; + + +%build +## We use out of tree configure/build for export libs +%define _configure "../configure" + +# normal and pkcs11 unit tests +%define unit_prepare_build() \ + cp -uv Kyuafile "%{1}/" \ + find lib -name 'K*.key' -exec cp -uv '{}' "%{1}/{}" ';' \ + find lib -name 'Kyuafile' -exec cp -uv '{}' "%{1}/{}" ';' \ + find lib -name 'testdata' -type d -exec cp -Tav '{}' "%{1}/{}" ';' \ + find lib -name 'testkeys' -type d -exec cp -Tav '{}' "%{1}/{}" ';' \ + +%define systemtest_prepare_build() \ + cp -Tuav bin/tests "%{1}/bin/tests/" \ + cp -uv version "%{1}" \ + +export CFLAGS="$CFLAGS $RPM_OPT_FLAGS" +export CPPFLAGS="$CPPFLAGS -DDIG_SIGCHASE" +export STD_CDEFINES="$CPPFLAGS" + +sed -i -e \ +'s/RELEASEVER=\(.*\)/RELEASEVER=\1-RedHat-%{version}-%{release}/' \ +version + +libtoolize -c -f; aclocal -I libtool.m4 --force; autoconf -f + +mkdir build +pushd build +LIBDIR_SUFFIX= +export LIBDIR_SUFFIX +%configure \ + --with-python=%{__python3} \ + --with-libtool \ + --localstatedir=/var \ + --enable-threads \ + --enable-ipv6 \ + --enable-filter-aaaa \ + --with-pic \ + --disable-static \ + --includedir=%{_includedir}/bind9 \ + --with-tuning=large \ + --with-libidn2 \ + --enable-openssl-hash \ +%if %{with GEOIP} + --with-geoip \ +%endif +%if %{with GEOIP2} + --with-geoip2 \ +%endif +%if %{with PKCS11} + --enable-native-pkcs11 \ + --with-pkcs11=%{_libdir}/pkcs11/libsofthsm2.so \ +%endif +%if %{with SDB} + --with-dlopen=yes \ + --with-dlz-ldap=yes \ + --with-dlz-postgres=yes \ + --with-dlz-mysql=yes \ + --with-dlz-filesystem=yes \ + --with-dlz-bdb=yes \ +%endif +%if %{with GSSTSIG} + --with-gssapi=yes \ + --disable-isc-spnego \ +%endif +%if %{with LMDB} + --with-lmdb=yes \ +%else + --with-lmdb=no \ +%endif +%if %{with UNITTEST} + --with-cmocka \ +%endif + --enable-fixed-rrset \ + --with-docbook-xsl=%{_datadir}/sgml/docbook/xsl-stylesheets \ + --enable-full-report \ +; +make %{?_smp_mflags} + +### FIXME hack!!! +### xsltproc doesn't find properly configured files +### and use ones from source tree +### copy generated files to the original location +cp -rv doc/* ../doc/ + + +# Regenerate dig.1 manpage +pushd bin/dig +make man +popd +pushd bin/python +make man +popd + +%if %{with DLZ} + pushd contrib/dlz + pushd bin/dlzbdb + make + popd + pushd modules + for DIR in bdbhpt filesystem ldap mysql mysqldyn sqlite3; do + make -C $DIR CFLAGS="-fPIC -I../include $CFLAGS $LDFLAGS" + done + popd + popd +%endif +popd # build + +%unit_prepare_build build +%systemtest_prepare_build build + +%if %{with EXPORT_LIBS} +## Create export libs ## +mkdir -p export-libs +pushd export-libs +LIBDIR_SUFFIX=%{_export_dir} +export LIBDIR_SUFFIX +## minimal subset of options to make clients aka dhcp working +%{configure} \ + --with-libtool \ + --disable-static \ + --disable-epoll \ + --disable-kqueue \ + --libdir=%{_libdir}%{_export_dir} \ + --includedir=%{_includedir}%{_export_dir}/ \ + --disable-threads \ + --enable-openssl-hash \ +%if %{with GSSTSIG} + --with-gssapi=yes \ + --disable-isc-spnego \ +%endif +%if %{with UNITTEST} + --with-cmocka \ +%endif + --enable-fixed-rrset \ + --disable-rpz-nsip \ + --disable-rpz-nsdname \ + --without-lmdb \ + --without-libxml2 \ + --without-libjson \ + --without-zlib \ + --without-dlopen \ + --enable-full-report + +## We don't want to build other libs than -export twice +## FIXME this should be in patch instead of SED'ing +## but do we really like/want to patch generated files? + +sed -i -e \ +'/^SUBDIRS =/s/.*/SUBDIRS = make lib/i' \ +Makefile + +sed -i -e \ +"/^SUBDIRS =/s/.*/SUBDIRS = %{bind_export_libs}/i" \ +lib/Makefile + +for lib in %{bind_export_libs} +do + find . -name Makefile -exec sed "s/lib${lib}\./lib${lib}-export\./g" -i {} \; + sed -e "s/-l${lib}\([^[:alpha:]]\)/-l${lib}-export\1/g" \ + -e "s/lib${lib}\./lib${lib}-export\./g" \ + -i isc-config.sh +done; +%{__patch} -p2 -b --suffix .export-isc-config < %{PATCH135} +make %{?_smp_mflags} +popd + +# export library unit tests +%unit_prepare_build export-libs +# Test just compiled libraries +for lib in %{bind_export_libs} +do + sed -e "s,^\s*include(.*${lib}/.*,-- use &," \ + -i export-libs/lib/Kyuafile +done + +sed -e "/^\s*include(/ d" -e 's/^-- use //' \ + -i export-libs/lib/Kyuafile + +## End of export libs +%endif + +%check +%if %{with PKCS11} + # Tests require initialization of pkcs11 token + export SOFTHSM2_CONF="`pwd`/softhsm2.conf" + sh %{SOURCE48} "${SOFTHSM2_CONF}" "`pwd`/softhsm-tokens" +%endif + +%if %{with UNITTEST} + pushd build + make unit + e=$? + if [ "$e" -ne 0 ]; then + echo "ERROR: this build of BIND failed 'make unit'. Aborting." + exit $e; + fi; + popd + + pushd export-libs + make unit + e=$? + if [ "$e" -ne 0 ]; then + echo "ERROR: this build of BIND export-libs failed 'make unit'. Aborting." + exit $e; + fi; + popd + +%endif + +%if %{with SYSTEMTEST} +# Runs system test if ip addresses are already configured +# or it is able to configure them +if perl bin/tests/system/testsock.pl +then + CONFIGURED=already +else + CONFIGURED= + sh bin/tests/system/ifconfig.sh up + perl bin/tests/system/testsock.pl && CONFIGURED=build +fi +if [ -n "$CONFIGURED" ] +then + set -e + pushd build/bin/tests + chown -R ${USER} . # Can be unknown user + make test %{?_smp_mflags} 2>&1 | tee test.log + e=$? + popd + [ "$CONFIGURED" = build ] && sh bin/tests/system/ifconfig.sh down + if [ "$e" -ne 0 ]; then + echo "ERROR: this build of BIND failed 'make test'. Aborting." + exit $e; + fi; +else + echo 'SKIPPED: tests require root, CAP_NET_ADMIN or already configured test addresses.' +fi +%endif +: + +%install +# Build directory hierarchy +mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/logrotate.d +mkdir -p ${RPM_BUILD_ROOT}%{_libdir}/bind +mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/named/{slaves,data,dynamic} +mkdir -p ${RPM_BUILD_ROOT}%{_mandir}/{man1,man5,man8} +mkdir -p ${RPM_BUILD_ROOT}/run/named +mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/log + +#chroot +for D in %{chroot_create_directories} +do + mkdir -p ${RPM_BUILD_ROOT}/%{chroot_prefix}${D} +done + +# create symlink as it is on real filesystem +pushd ${RPM_BUILD_ROOT}/%{chroot_prefix}/var +ln -s ../run run +popd + +# these are required to prevent them being erased during upgrade of previous +touch ${RPM_BUILD_ROOT}/%{chroot_prefix}%{_sysconfdir}/named.conf +#end chroot + +#sdb-chroot +%if %{with SDB} +for D in %{chroot_create_directories} +do + mkdir -p ${RPM_BUILD_ROOT}/%{chroot_sdb_prefix}${D} +done + +# create symlink as it is on real filesystem +pushd ${RPM_BUILD_ROOT}/%{chroot_sdb_prefix}%{_localstatedir} +ln -s ../run run +popd + +# these are required to prevent them being erased during upgrade of previous +touch ${RPM_BUILD_ROOT}/%{chroot_sdb_prefix}%{_sysconfdir}/named.conf +%endif +#end sdb-chroot + +pushd build +make DESTDIR=${RPM_BUILD_ROOT} install +popd + +%if %{with EXPORT_LIBS} +pushd export-libs +make DESTDIR=${RPM_BUILD_ROOT} install +mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/ld.so.conf.d +echo "%{_libdir}/%{_export_dir}" > %{buildroot}%{_sysconfdir}/ld.so.conf.d/%{name}-export-%{_arch}.conf +cp -fp config.h ${RPM_BUILD_ROOT}/%{_includedir}%{_export_dir} +rm -rf ${RPM_BUILD_ROOT}/%{_includedir}%{_export_dir}/pkcs11/ +rm -f ${RPM_BUILD_ROOT}/%{_includedir}%{_export_dir}/pk11/{constants,internal,pk11,result}.h +popd +%endif + +# Remove unwanted files +rm -f ${RPM_BUILD_ROOT}/etc/bind.keys + +# Systemd unit files +mkdir -p ${RPM_BUILD_ROOT}%{_unitdir} +install -m 644 %{SOURCE37} ${RPM_BUILD_ROOT}%{_unitdir} +install -m 644 %{SOURCE38} ${RPM_BUILD_ROOT}%{_unitdir} +install -m 644 %{SOURCE44} ${RPM_BUILD_ROOT}%{_unitdir} +install -m 644 %{SOURCE46} ${RPM_BUILD_ROOT}%{_unitdir} + +%if %{with SDB} +install -m 644 %{SOURCE39} ${RPM_BUILD_ROOT}%{_unitdir} +install -m 644 %{SOURCE40} ${RPM_BUILD_ROOT}%{_unitdir} +install -m 644 %{SOURCE45} ${RPM_BUILD_ROOT}%{_unitdir} +%endif + +%if %{with PKCS11} +install -m 644 %{SOURCE47} ${RPM_BUILD_ROOT}%{_unitdir} +%endif + +mkdir -p ${RPM_BUILD_ROOT}%{_libexecdir} +install -m 755 %{SOURCE41} ${RPM_BUILD_ROOT}%{_libexecdir}/setup-named-chroot.sh +install -m 755 %{SOURCE42} ${RPM_BUILD_ROOT}%{_libexecdir}/generate-rndc-key.sh + +%if %{with PKCS11} +install -m 755 %{SOURCE48} ${RPM_BUILD_ROOT}%{_libexecdir}/setup-named-softhsm.sh +%endif + +install -m 644 %SOURCE3 ${RPM_BUILD_ROOT}/etc/logrotate.d/named +mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/sysconfig +install -m 644 %{SOURCE1} ${RPM_BUILD_ROOT}%{_sysconfdir}/sysconfig/named +install -m 644 %{SOURCE49} ${RPM_BUILD_ROOT}%{_sysconfdir}/named-chroot.files +%if %{with SDB} +mkdir -p ${RPM_BUILD_ROOT}/etc/openldap/schema +install -m 644 %{SOURCE8} ${RPM_BUILD_ROOT}/etc/openldap/schema/dnszone.schema +install -m 644 %{SOURCE12} contrib/sdb/pgsql/ +%endif + +%if %{with DLZ} + pushd contrib/dlz + pushd bin/dlzbdb + make DESTDIR=${RPM_BUILD_ROOT} install + popd + pushd modules + for DIR in bdbhpt filesystem ldap mysql mysqldyn sqlite3; do + make -C $DIR DESTDIR=${RPM_BUILD_ROOT} libdir=%{_libdir}/bind install + done + mv mysqldyn/testing/README mysqldyn/testing/README.testing + popd + popd +%endif + +# Install isc/errno2result.h header +install -m 644 lib/isc/unix/errno2result.h ${RPM_BUILD_ROOT}%{_includedir}/bind9/isc + +pushd build +# Files required to run test-suite outside of build tree: +cp -fp config.h ${RPM_BUILD_ROOT}/%{_includedir}/bind9 +popd + +# Remove libtool .la files: +find ${RPM_BUILD_ROOT}/%{_libdir} -name '*.la' -exec '/bin/rm' '-f' '{}' ';'; + +# Remove -devel files out of buildroot if not needed +%if !%{with DEVEL} +rm -f ${RPM_BUILD_ROOT}/%{_libdir}/bind9/*so +rm -rf ${RPM_BUILD_ROOT}/%{_includedir}/bind9 +rm -f ${RPM_BUILD_ROOT}/%{_mandir}/man1/isc-config.sh.1* +rm -f ${RPM_BUILD_ROOT}/%{_mandir}/man3/lwres* +rm -f ${RPM_BUILD_ROOT}/%{_bindir}/isc-config.sh +%endif + +# SDB manpages +%if %{with SDB} +install -m 644 %{SOURCE31} ${RPM_BUILD_ROOT}%{_mandir}/man1/ldap2zone.1 +install -m 644 %{SOURCE32} ${RPM_BUILD_ROOT}%{_mandir}/man8/named-sdb.8 +install -m 644 %{SOURCE33} ${RPM_BUILD_ROOT}%{_mandir}/man1/zonetodb.1 +install -m 644 %{SOURCE34} ${RPM_BUILD_ROOT}%{_mandir}/man1/zone2sqlite.1 +%endif + +# PKCS11 versions manpages +%if %{with PKCS11} +pushd ${RPM_BUILD_ROOT}%{_mandir}/man8 +ln -s named.8.gz named-pkcs11.8.gz +ln -s dnssec-checkds.8.gz dnssec-checkds-pkcs11.8.gz +ln -s dnssec-dsfromkey.8.gz dnssec-dsfromkey-pkcs11.8.gz +ln -s dnssec-keyfromlabel.8.gz dnssec-keyfromlabel-pkcs11.8.gz +ln -s dnssec-keygen.8.gz dnssec-keygen-pkcs11.8.gz +ln -s dnssec-revoke.8.gz dnssec-revoke-pkcs11.8.gz +ln -s dnssec-settime.8.gz dnssec-settime-pkcs11.8.gz +ln -s dnssec-signzone.8.gz dnssec-signzone-pkcs11.8.gz +ln -s dnssec-verify.8.gz dnssec-verify-pkcs11.8.gz +popd +%endif + +# Ghost config files: +touch ${RPM_BUILD_ROOT}%{_localstatedir}/log/named.log + +# configuration files: +install -m 640 %{SOURCE16} ${RPM_BUILD_ROOT}%{_sysconfdir}/named.conf +touch ${RPM_BUILD_ROOT}%{_sysconfdir}/rndc.{key,conf} +install -m 644 %{SOURCE27} ${RPM_BUILD_ROOT}%{_sysconfdir}/named.root.key +install -m 644 %{SOURCE36} ${RPM_BUILD_ROOT}%{_sysconfdir}/trusted-key.key +mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/named + +# data files: +mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/named +install -m 640 %{SOURCE17} ${RPM_BUILD_ROOT}%{_localstatedir}/named/named.ca +install -m 640 %{SOURCE18} ${RPM_BUILD_ROOT}%{_localstatedir}/named/named.localhost +install -m 640 %{SOURCE19} ${RPM_BUILD_ROOT}%{_localstatedir}/named/named.loopback +install -m 640 %{SOURCE20} ${RPM_BUILD_ROOT}%{_localstatedir}/named/named.empty +install -m 640 %{SOURCE23} ${RPM_BUILD_ROOT}%{_sysconfdir}/named.rfc1912.zones + +# sample bind configuration files for %%doc: +mkdir -p sample/etc sample/var/named/{data,slaves} +install -m 644 %{SOURCE25} sample/etc/named.conf +# Copy default configuration to %%doc to make it usable from system-config-bind +install -m 644 %{SOURCE16} named.conf.default +install -m 644 %{SOURCE23} sample/etc/named.rfc1912.zones +install -m 644 %{SOURCE18} %{SOURCE19} %{SOURCE20} sample/var/named +install -m 644 %{SOURCE17} sample/var/named/named.ca +for f in my.internal.zone.db slaves/my.slave.internal.zone.db slaves/my.ddns.internal.zone.db my.external.zone.db; do + echo '@ in soa localhost. root 1 3H 15M 1W 1D + ns localhost.' > sample/var/named/$f; +done +:; + +mkdir -p ${RPM_BUILD_ROOT}%{_tmpfilesdir} +install -m 644 %{SOURCE35} ${RPM_BUILD_ROOT}%{_tmpfilesdir}/named.conf + +mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/rwtab.d +install -m 644 %{SOURCE43} ${RPM_BUILD_ROOT}%{_sysconfdir}/rwtab.d/named + +%pre +if [ "$1" -eq 1 ]; then + /usr/sbin/groupadd -g %{bind_gid} -f -r named >/dev/null 2>&1 || :; + /usr/sbin/useradd -u %{bind_uid} -r -N -M -g named -s /bin/false -d /var/named -c Named named >/dev/null 2>&1 || :; +fi; +:; + +%post +%?ldconfig +if [ "$1" -eq 1 ]; then + # Initial installation + [ -x /sbin/restorecon ] && /sbin/restorecon /etc/rndc.* /etc/named.* >/dev/null 2>&1 ; + # rndc.key has to have correct perms and ownership, CVE-2007-6283 + [ -e /etc/rndc.key ] && chown root:named /etc/rndc.key + [ -e /etc/rndc.key ] && chmod 0640 /etc/rndc.key +else + # Upgrade, use invalid shell + if getent passwd named | grep ':/sbin/nologin$' >/dev/null; then + usermod -s /bin/false named + fi + # Checkconf will parse out comments + if /usr/sbin/named-checkconf -p /etc/named.conf 2>/dev/null | grep -q named.iscdlv.key + then + echo "Replacing obsolete named.iscdlv.key with named.root.key..." + sed -e 's|/etc/named\.iscdlv\.key|/etc/named.root.key|' -i.rpmbackup /etc/named.conf + fi +fi +%systemd_post named.service +:; + +%preun +# Package removal, not upgrade +%systemd_preun named.service + +%postun +%?ldconfig +# Package upgrade, not uninstall +%systemd_postun_with_restart named.service + +%if %{with SDB} +%post sdb +# Initial installation +%systemd_post named-sdb.service + +%preun sdb +# Package removal, not upgrade +%systemd_preun named-sdb.service + +%postun sdb +# Package upgrade, not uninstall +%systemd_postun_with_restart named-sdb.service +%endif + +%if %{with PKCS11} +%post pkcs11 +# Initial installation +%systemd_post named-pkcs11.service + +%preun pkcs11 +# Package removal, not upgrade +%systemd_preun named-pkcs11.service + +%postun pkcs11 +# Package upgrade, not uninstall +%systemd_postun_with_restart named-pkcs11.service +%endif + +%triggerin -- selinux-policy < 3.14.1-44 +# Failsafe for upgrades, set to new default +if [ -x "%{_sbindir}/selinuxenabled" -a -x "%{_sbindir}/setsebool" ] && %{_sbindir}/selinuxenabled; then + "%{_sbindir}/setsebool" -P named_write_master_zones=1 +fi +%end + +%triggerpostun -n bind -- bind <= 32:9.5.0-20.b1 +if [ "$1" -gt 0 ]; then + [ -e /etc/rndc.key ] && chown root:named /etc/rndc.key + [ -e /etc/rndc.key ] && chmod 0640 /etc/rndc.key +fi +:; + +%triggerun -- bind < 32:9.9.0-0.6.rc1 +/sbin/chkconfig --del named >/dev/null 2>&1 || : +/bin/systemctl try-restart named.service >/dev/null 2>&1 || : + +%ldconfig_scriptlets libs +%ldconfig_scriptlets libs-lite + +%if %{with PKCS11} +%ldconfig_scriptlets pkcs11-libs +%endif + +%if %{with EXPORT_LIBS} +%post export-libs -p /sbin/ldconfig +%end + +%postun export-libs -p /sbin/ldconfig +%end +%endif + +# Fix permissions on existing device files on upgrade +%define chroot_fix_devices() \ +if [ $1 -gt 1 ]; then \ + for DEV in "%{1}/dev"/{null,random,zero}; do \ + if [ -e "$DEV" ] && [ "$(/bin/stat --printf="%G %a" "$DEV")" = "root 644" ]; \ + then \ + /bin/chmod 0664 "$DEV" \ + /bin/chgrp named "$DEV" \ + fi \ + done \ +fi + +%post chroot +%systemd_post named-chroot.service +%chroot_fix_devices %{chroot_prefix} +:; + +%posttrans chroot +if [ -x /usr/sbin/selinuxenabled ] && /usr/sbin/selinuxenabled; then + [ -x /sbin/restorecon ] && /sbin/restorecon %{chroot_prefix}/dev/* > /dev/null 2>&1; +fi; + +%preun chroot +# wait for stop of both named-chroot and named-chroot-setup services +# on uninstall +%systemd_preun named-chroot.service named-chroot-setup.service +:; + +%postun chroot +# Package upgrade, not uninstall +%systemd_postun_with_restart named-chroot.service + + +%if %{with SDB} + +%post sdb-chroot +%systemd_post named-sdb-chroot.service +%chroot_fix_devices %{chroot_sdb_prefix} +:; + +%posttrans sdb-chroot +if [ -x /usr/sbin/selinuxenabled ] && /usr/sbin/selinuxenabled; then + [ -x /sbin/restorecon ] && /sbin/restorecon %{chroot_sdb_prefix}/dev/* > /dev/null 2>&1; +fi; +:; + +%preun sdb-chroot +%systemd_preun named-sdb-chroot.service +:; + +%postun sdb-chroot +# Package upgrade, not uninstall +%systemd_postun_with_restart named-sdb-chroot.service + +%endif + +%clean +rm -rf ${RPM_BUILD_ROOT} +:; + +%files +%{_libdir}/bind +%config(noreplace) %verify(not md5 size mtime) %{_sysconfdir}/sysconfig/named +%config(noreplace) %attr(0644,root,named) %{_sysconfdir}/named.root.key +%{_tmpfilesdir}/named.conf +%{_sysconfdir}/rwtab.d/named +%{_unitdir}/named.service +%{_unitdir}/named-setup-rndc.service +%{_sbindir}/named-journalprint +%{_sbindir}/named-checkconf +%{_bindir}/named-rrchecker +%{_bindir}/mdig +%{_sbindir}/lwresd +%{_sbindir}/named +%{_sbindir}/rndc* +%{_libexecdir}/generate-rndc-key.sh +%{_mandir}/man1/mdig.1* +%{_mandir}/man1/named-rrchecker.1* +%{_mandir}/man5/named.conf.5* +%{_mandir}/man5/rndc.conf.5* +%{_mandir}/man8/rndc.8* +%{_mandir}/man8/named.8* +%{_mandir}/man8/lwresd.8* +%{_mandir}/man8/named-checkconf.8* +%{_mandir}/man8/rndc-confgen.8* +%{_mandir}/man8/named-journalprint.8* +%doc CHANGES README named.conf.default +%doc doc/arm/*html doc/arm/*pdf +%doc sample/ + +# Hide configuration +%defattr(0640,root,named,0750) +%dir %{_sysconfdir}/named +%config(noreplace) %verify(not link) %{_sysconfdir}/named.conf +%config(noreplace) %verify(not link) %{_sysconfdir}/named.rfc1912.zones +%defattr(0660,root,named,01770) +%dir %{_localstatedir}/named +%defattr(0660,named,named,0770) +%dir %{_localstatedir}/named/slaves +%dir %{_localstatedir}/named/data +%dir %{_localstatedir}/named/dynamic +%ghost %{_localstatedir}/log/named.log +%defattr(0640,root,named,0750) +%config %verify(not link) %{_localstatedir}/named/named.ca +%config %verify(not link) %{_localstatedir}/named/named.localhost +%config %verify(not link) %{_localstatedir}/named/named.loopback +%config %verify(not link) %{_localstatedir}/named/named.empty +%ghost %config(noreplace) %{_sysconfdir}/rndc.key +# ^- rndc.key now created on first install only if it does not exist +%ghost %config(noreplace) %{_sysconfdir}/rndc.conf +# ^- The default rndc.conf which uses rndc.key is in named's default internal config - +# so rndc.conf is not necessary. +%config(noreplace) %{_sysconfdir}/logrotate.d/named +%defattr(-,named,named,-) +%dir /run/named + +%if %{with SDB} +%files sdb +%{_unitdir}/named-sdb.service +%{_mandir}/man1/zone2ldap.1* +%{_mandir}/man1/ldap2zone.1* +%{_mandir}/man1/zonetodb.1* +%{_mandir}/man1/zone2sqlite.1* +%{_mandir}/man8/named-sdb.8* +%doc contrib/sdb/ldap/README.ldap contrib/sdb/ldap/INSTALL.ldap contrib/sdb/pgsql/README.sdb_pgsql +%dir %{_sysconfdir}/openldap/schema +%config(noreplace) %{_sysconfdir}/openldap/schema/dnszone.schema +%{_sbindir}/named-sdb +%{_sbindir}/zone2ldap +%{_sbindir}/ldap2zone +%{_sbindir}/zonetodb +%{_sbindir}/zone2sqlite +%endif + +%files libs +%{_libdir}/libbind9.so.161* +%{_libdir}/libisccc.so.161* +%{_libdir}/liblwres.so.161* + +%files libs-lite +%{_libdir}/libdns.so.%{sover_dns}* +%{_libdir}/libirs.so.%{sover_irs}* +%{_libdir}/libisc.so.%{sover_isc}* +%{_libdir}/libisccfg.so.%{sover_isccfg}* + +%files license +%{!?_licensedir:%global license %%doc} +%license COPYRIGHT + +%files utils +%{_bindir}/dig +%{_bindir}/delv +%{_bindir}/host +%{_bindir}/nslookup +%{_bindir}/nsupdate +%{_bindir}/arpaname +%{_sbindir}/ddns-confgen +%{_sbindir}/tsig-keygen +%{_sbindir}/genrandom +%{_sbindir}/nsec3hash +%{_sbindir}/dnssec* +%if %{with PKCS11} +%exclude %{_sbindir}/dnssec*pkcs11 +%endif +%{_sbindir}/isc-hmac-fixup +%{_sbindir}/named-checkzone +%{_sbindir}/named-compilezone +%if %{with LMDB} +%{_sbindir}/named-nzd2nzf +%endif +%{_mandir}/man1/host.1* +%{_mandir}/man1/nsupdate.1* +%{_mandir}/man1/dig.1* +%{_mandir}/man1/delv.1* +%{_mandir}/man1/nslookup.1* +%{_mandir}/man1/arpaname.1* +%{_mandir}/man8/ddns-confgen.8* +%{_mandir}/man8/tsig-keygen.8* +%{_mandir}/man8/genrandom.8* +%{_mandir}/man8/nsec3hash.8* +%{_mandir}/man8/dnssec*.8* +%if %{with PKCS11} +%exclude %{_mandir}/man8/dnssec*-pkcs11.8* +%endif +%{_mandir}/man8/isc-hmac-fixup.8* +%{_mandir}/man8/named-checkzone.8* +%{_mandir}/man8/named-compilezone.8* +%if %{with LMDB} +%{_mandir}/man8/named-nzd2nzf.8* +%endif +%{_sysconfdir}/trusted-key.key + +%if %{with DEVEL} +%files devel +%{_libdir}/libbind9.so +%{_libdir}/libisccc.so +%{_libdir}/liblwres.so +%{_includedir}/bind9/config.h +%{_includedir}/bind9/bind9 +%{_includedir}/bind9/isccc +%{_includedir}/bind9/lwres +%{_mandir}/man1/isc-config.sh.1* +%{_mandir}/man1/bind9-config.1* +%{_mandir}/man3/lwres* +%{_bindir}/isc-config.sh +%{_bindir}/bind9-config +%endif + +%files lite-devel +%{_libdir}/libdns.so +%{_libdir}/libirs.so +%{_libdir}/libisc.so +%{_libdir}/libisccfg.so +%dir %{_includedir}/bind9 +%{_includedir}/bind9/dns +%{_includedir}/bind9/dst +%{_includedir}/bind9/irs +%{_includedir}/bind9/isc +%dir %{_includedir}/bind9/pk11 +%{_includedir}/bind9/pk11/site.h +%{_includedir}/bind9/isccfg + +%files chroot +%config(noreplace) %{_sysconfdir}/named-chroot.files +%{_unitdir}/named-chroot.service +%{_unitdir}/named-chroot-setup.service +%{_libexecdir}/setup-named-chroot.sh +%defattr(0664,root,named,-) +%ghost %dev(c,1,3) %verify(not mtime) %{chroot_prefix}/dev/null +%ghost %dev(c,1,8) %verify(not mtime) %{chroot_prefix}/dev/random +%ghost %dev(c,1,9) %verify(not mtime) %{chroot_prefix}/dev/urandom +%ghost %dev(c,1,5) %verify(not mtime) %{chroot_prefix}/dev/zero +%defattr(0640,root,named,0750) +%dir %{chroot_prefix} +%dir %{chroot_prefix}/dev +%dir %{chroot_prefix}%{_sysconfdir} +%dir %{chroot_prefix}%{_sysconfdir}/named +%dir %{chroot_prefix}%{_sysconfdir}/pki +%dir %{chroot_prefix}%{_sysconfdir}/pki/dnssec-keys +%dir %{chroot_prefix}%{_sysconfdir}/crypto-policies +%dir %{chroot_prefix}%{_sysconfdir}/crypto-policies/back-ends +%dir %{chroot_prefix}%{_localstatedir} +%dir %{chroot_prefix}/run +%ghost %config(noreplace) %{chroot_prefix}%{_sysconfdir}/named.conf +%defattr(-,root,root,-) +%dir %{chroot_prefix}/usr +%dir %{chroot_prefix}/%{_libdir} +%dir %{chroot_prefix}/%{_libdir}/bind +%dir %{chroot_prefix}/%{_datadir}/GeoIP +%defattr(0660,root,named,01770) +%dir %{chroot_prefix}%{_localstatedir}/named +%defattr(0660,named,named,0770) +%dir %{chroot_prefix}%{_localstatedir}/tmp +%dir %{chroot_prefix}%{_localstatedir}/log +%defattr(-,named,named,-) +%dir %{chroot_prefix}/run/named +%{chroot_prefix}%{_localstatedir}/run + +%if %{with SDB} +%files sdb-chroot +%config(noreplace) %{_sysconfdir}/named-chroot.files +%{_unitdir}/named-sdb-chroot.service +%{_unitdir}/named-sdb-chroot-setup.service +%{_libexecdir}/setup-named-chroot.sh +%defattr(0664,root,named,-) +%ghost %dev(c,1,3) %verify(not mtime) %{chroot_sdb_prefix}/dev/null +%ghost %dev(c,1,8) %verify(not mtime) %{chroot_sdb_prefix}/dev/random +%ghost %dev(c,1,9) %verify(not mtime) %{chroot_sdb_prefix}/dev/urandom +%ghost %dev(c,1,5) %verify(not mtime) %{chroot_sdb_prefix}/dev/zero +%defattr(0640,root,named,0750) +%dir %{chroot_sdb_prefix} +%dir %{chroot_sdb_prefix}/dev +%dir %{chroot_sdb_prefix}%{_sysconfdir} +%dir %{chroot_sdb_prefix}%{_sysconfdir}/named +%dir %{chroot_sdb_prefix}%{_sysconfdir}/pki +%dir %{chroot_sdb_prefix}%{_sysconfdir}/pki/dnssec-keys +%dir %{chroot_sdb_prefix}%{_sysconfdir}/crypto-policies +%dir %{chroot_sdb_prefix}%{_sysconfdir}/crypto-policies/back-ends +%dir %{chroot_sdb_prefix}%{_localstatedir} +%dir %{chroot_sdb_prefix}/run +%ghost %config(noreplace) %{chroot_sdb_prefix}%{_sysconfdir}/named.conf +%defattr(0660,root,named,01770) +%dir %{chroot_sdb_prefix}%{_localstatedir}/named +%defattr(-,root,root,-) +%dir %{chroot_sdb_prefix}/usr +%dir %{chroot_sdb_prefix}/%{_libdir} +%dir %{chroot_sdb_prefix}/%{_libdir}/bind +%dir %{chroot_sdb_prefix}/%{_datadir}/GeoIP +%defattr(0660,named,named,0770) +%dir %{chroot_sdb_prefix}%{_localstatedir}/tmp +%dir %{chroot_sdb_prefix}%{_localstatedir}/log +%defattr(-,named,named,-) +%dir %{chroot_sdb_prefix}/run/named +%{chroot_sdb_prefix}%{_localstatedir}/run +%endif + +%if %{with PKCS11} +%files pkcs11 +%{_sbindir}/named-pkcs11 +%{_unitdir}/named-pkcs11.service +%{_mandir}/man8/named-pkcs11.8* +%{_libexecdir}/setup-named-softhsm.sh + +%files pkcs11-utils +%{_sbindir}/dnssec*pkcs11 +%{_sbindir}/pkcs11-destroy +%{_sbindir}/pkcs11-keygen +%{_sbindir}/pkcs11-list +%{_sbindir}/pkcs11-tokens +%{_mandir}/man8/pkcs11*.8* +%{_mandir}/man8/dnssec*-pkcs11.8* +%{_mandir}/man8/dnssec*.8* +%exclude %{_mandir}/man8/dnssec-coverage.8* +%exclude %{_mandir}/man8/dnssec-keymgr.8* + +%files pkcs11-libs +%{_libdir}/libdns-pkcs11.so.%{sover_dns}* +%{_libdir}/libisc-pkcs11.so.%{sover_isc}* + +%files pkcs11-devel +%{_includedir}/bind9/pk11/*.h +%exclude %{_includedir}/bind9/pk11/site.h +%{_includedir}/bind9/pkcs11 +%{_libdir}/libdns-pkcs11.so +%{_libdir}/libisc-pkcs11.so +%endif + +%if %{with EXPORT_LIBS} +%files export-libs +%dir %{_libdir}/%{_export_dir} +%{_libdir}/%{_export_dir}/libdns-export.so.%{sover_dns}* +%{_libdir}/%{_export_dir}/libirs-export.so.%{sover_irs}* +%{_libdir}/%{_export_dir}/libisc-export.so.%{sover_isc}* +%{_libdir}/%{_export_dir}/libisccfg-export.so.%{sover_isccfg}* +%config(noreplace) %{_sysconfdir}/ld.so.conf.d/%{name}-export-%{_arch}.conf +# This subpackage has to distribute its own license. Do not conflict with +# other subpackages of different version +%license COPYRIGHT + +%files export-devel +%{_libdir}/%{_export_dir}/libdns-export.so +%{_libdir}/%{_export_dir}/libirs-export.so +%{_libdir}/%{_export_dir}/libisc-export.so +%{_libdir}/%{_export_dir}/libisccfg-export.so +%dir %{_includedir}/%{_export_dir} +%{_includedir}/%{_export_dir}/dns +%{_includedir}/%{_export_dir}/dst +%{_includedir}/%{_export_dir}/irs +%{_includedir}/%{_export_dir}/isc +%dir %{_includedir}/%{_export_dir}/pk11 +%{_includedir}/%{_export_dir}/pk11/site.h +%{_includedir}/%{_export_dir}/isccfg +%{_includedir}/%{_export_dir}/config.h +%{_mandir}/man1/isc-export-config.sh.1* +%{_mandir}/man1/bind9-export-config.1* +%attr(0755,root,root) %{_bindir}/isc-export-config.sh +%{_bindir}/bind9-export-config +%endif + +%if %{with DLZ} +%files dlz-bdb +%{_sbindir}/dlzbdb +%{_libdir}/bind/dlz_bdbhpt_dynamic.so +%doc contrib/dlz/modules/bdbhpt/testing/* + +%files dlz-filesystem +%{_libdir}/bind/dlz_filesystem_dynamic.so + +%files dlz-mysql +%{_libdir}/bind/dlz_mysql_dynamic.so +%doc contrib/dlz/modules/mysql/testing/* + +%files dlz-mysqldyn +%{_libdir}/bind/dlz_mysqldyn_mod.so +%doc contrib/dlz/modules/mysqldyn/testing/* +%doc contrib/dlz/modules/mysqldyn/README + +%files dlz-ldap +%{_libdir}/bind/dlz_ldap_dynamic.so +%doc contrib/dlz/modules/ldap/testing/* + +%files dlz-sqlite3 +%{_libdir}/bind/dlz_sqlite3_dynamic.so +%doc contrib/dlz/modules/sqlite3/testing/* + +%endif + +%files -n python3-bind +%{python3_sitelib}/*.egg-info +%{python3_sitelib}/isc/ + + +%changelog +* Thu Feb 27 2020 Miroslav Lichvar - 32:9.11.13-3 +- Fix rwlock to be thread-safe (#1740511) + +* Tue Jan 14 2020 Petr Menšík - 32:9.11.13-2 +- Release GeoIP data on reload (#1790879) + +* Tue Nov 19 2019 Petr Menšík - 32:9.11.13-1 +- Update to 9.11.13 + +* Tue Nov 19 2019 Petr Menšík - 32:9.11.12-5 +- Report failures on systemctl reload (#1739428) + +* Mon Nov 18 2019 Pavel Zhukov - 32:9.11.12-4 +- dhcp: Use monotonic time for detecting time jumps if available (#1729211) + +* Fri Nov 15 2019 Petr Menšík - 32:9.11.12-3 +- Backported serve-stale feature (#1664863) + +* Thu Nov 07 2019 Petr Menšík - 32:9.11.12-2 +- Add GeoLite2 support (#1564443) +- Add GeoIP to bind-chroot (#1497646) +- Fix wrong default GeoIP directory (#1768258) + +* Mon Oct 21 2019 Petr Menšík - 32:9.11.12-1 +- Update to 9.11.12 (#1557762) + +* Wed Sep 25 2019 Petr Menšík - 32:9.11.11-1 +- Update to 9.11.11 + +* Tue Aug 27 2019 Petr Menšík - 32:9.11.10-1 +- Update to 9.11.10 +- Share pkcs11-utils and dnssec-utils manuals instead of recommend + +* Thu Aug 08 2019 Petr Menšík - 32:9.11.7-1 +- Update to 9.11.7 + +* Thu Aug 08 2019 Petr Menšík - 32:9.11.4-26.P2 +- Permit explicit disabling of RSAMD5 in FIPS mode (#1737407) + +* Wed Jul 17 2019 Petr Menšík - 32:9.11.4-25.P2 +- Fix CVE-2018-5745 +- Fix CVE-2019-6465 + +* Wed Jul 17 2019 Petr Menšík - 32:9.11.4-24.P2 +- Do not override random numbers provider in DHCP (#1668682) + +* Wed Jul 17 2019 Petr Menšík - 32:9.11.4-23.P2 +- Report errors on invalid IDN 2008 names (#1679307) + +* Wed Jun 19 2019 Petr Menšík - 32:9.11.4-22.P2 +- Fix CVE-2019-6471 + +* Thu Jun 13 2019 Petr Menšík - 32:9.11.4-21.P2 +- Fix random generator initialization + +* Wed Apr 24 2019 Petr Menšík - 32:9.11.4-20.P2 +- Fix multilib conflict of devel packages (#1666785) + +* Wed Apr 24 2019 Petr Menšík - 32:9.11.4-19.P2 +- Add support for OpenSSL provided random data +- Disable often failing unit test random_test +- Add /dev/urandom to chroot + +* Wed Apr 24 2019 Petr Menšík - 32:9.11.4-18.P2 +- Fix zone2ldap tool memory management (#1602451) +- Add support for OpenSSL provided random data + +* Wed Apr 24 2019 Petr Menšík - 32:9.11.4-17.P2 +- Fix inefective limit of TCP clients (CVE-2018-5743) + +* Thu Feb 21 2019 Petr Menšík - 32:9.11.4-16.P2 +- Fix CVE-2018-5744 + +* Thu Jan 10 2019 Petr Menšík - 32:9.11.4-15.P2 +- Fix error on bind-chroot upgrade before first start (#1634753) + +* Mon Oct 15 2018 Petr Menšík - 32:9.11.4-14.P2 +- Rely on named_write_master_zones being default on (#1588592) + +* Sat Sep 29 2018 Petr Menšík - 32:9.11.4-13.P2 +- Fix export-libs macro & scriptlet + +* Thu Sep 27 2018 Petr Menšík - 32:9.11.4-12.P2 +- Update to bind-9.11.4-P2 (#1631134, #1633665) + + +* Thu Sep 27 2018 Petr Menšík - 32:9.11.4-11.P1 +- Reenable IDN output but allow turning it off (#1632891) + +* Wed Sep 26 2018 Petr Menšík - 32:9.11.4-10.P1 +- Make spec valid when python3-rpm-macros is not installed (#1619153) + +* Wed Sep 19 2018 Tomas Orsava - 32:9.11.4-9.P1 +- Require the Python interpreter directly instead of using the package name +- Related: rhbz#1619153 + +* Mon Sep 17 2018 Petr Menšík - 32:9.11.4-8.P1 +- Fix annocheck failures, replace unoptimized code by OpenSSL counterparts (#1624100) + +* Tue Aug 14 2018 Petr Menšík - 32:9.11.4-7.P1 +- Fix chroot devices upgrade warning (#1592872) +- Automatically replace obsoleted ISC DLV key with root key (#1595782) + +* Fri Aug 10 2018 Petr Menšík - 32:9.11.4-6.P1 +- Fix sdb-chroot devices upgrade (#1592872) + +* Thu Aug 09 2018 Petr Menšík - 32:9.11.4-5.P1 +- Update to 9.11.4-P1 +- Adds root key sentinel support +- Large IXFR zone transfers are rejected to prevent journal corruption +- Fixes CVE-2018-5740 + +* Thu Aug 02 2018 Petr Menšík - 32:9.11.4-4 +- Support unavailable MD5 in FIPS mode + +* Thu Aug 02 2018 Petr Menšík - 32:9.11.4-3 +- Use OpenSSL for digest operations (#1611537) + +* Tue Jul 31 2018 Petr Menšík - 32:9.11.4-2 +- Install generated manual pages +- Remove system-config-bind from manual +- Disable GeoIP support (#1609856) + +* Thu Jul 12 2018 Petr Menšík - 32:9.11.4-1 +- Update to 9.11.4 +- Use kyua instead of kyua-cli for unit tests + +* Thu Jul 12 2018 Petr Menšík - 32:9.11.3-15 +- Use new config file named-chroot.files for chroot setup (#1429656) +- Fix chroot devices file verification (#1592873) +- Prevent errors on bind-chroot uninstall when running (#1600583) + +* Thu Jul 12 2018 Fedora Release Engineering - 32:9.11.3-14 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + +* Mon Jul 02 2018 Miro Hrončok - 32:9.11.3-13 +- Rebuilt for Python 3.7 + +* Wed Jun 27 2018 Petr Menšík - 32:9.11.3-12 +- Require utils instead of library + +* Wed Jun 27 2018 Petr Menšík - 32:9.11.3-11 +- Remove named.iscdlv.key file (#1595782) +- Fix CVE-2018-5738 + +* Tue Jun 19 2018 Miro Hrončok - 32:9.11.3-10 +- Rebuilt for Python 3.7 + +* Fri May 25 2018 Petr Menšík - 32:9.11.3-9 +- Make named home writeable (#1422680) +- Change named shell to /bin/false + +* Fri May 25 2018 Petr Menšík - 32:9.11.3-8 +- Require C++ on build when shipped atf library is used + +* Mon Apr 09 2018 Petr Menšík - 32:9.11.3-7 +- Run tests also without kyua + +* Thu Apr 05 2018 Petr Menšík - 32:9.11.3-6 +- Do not link libidn2 to all libraries (#1098783) +- Update named.ca + +* Tue Apr 03 2018 Petr Menšík - 32:9.11.3-5 +- Enable libidn2 support (#1098783) +- Make +noidnout default +- Compile export libs without GSSAPI + +* Wed Mar 21 2018 Petr Menšík - 32:9.11.3-4 +- Rebase to 9.11.3 +- Add dig support for libidn2 (#1098783) + +* Wed Mar 21 2018 Petr Menšík - 32:9.11.3-3.b1 +- Fix build with disabled unittest +- Recommend softhsm from pkcs11 variant + +* Thu Feb 22 2018 Petr Menšík - 32:9.11.3-2.b1 +- Require openssl-devel and libcap-devel from bind-export-devel +- Conflict with bind99-devel +- Change spec globals to rpmbuild --with feature + +* Thu Feb 15 2018 Petr Menšík - 32:9.11.3-1.b1 +- Rebase to 9.11.3b1 + +* Wed Feb 07 2018 Petr Menšík - 32:9.11.2-11.P1 +- Use versioned provides +- Fix starting of unit tests +- Forward export libs path to isc-config +- Rename export devel subpackage to bind-export-devel + +* Wed Feb 07 2018 Pavel Zhukov - 32:9.11.2-10.P1 +- Add obsoletes/provides tags for smooth update + +* Wed Feb 07 2018 Pavel Zhukov - 32:9.11.2-9.P1 +- Build devel package for export-libs + +* Wed Feb 07 2018 Pavel Zhukov - 32:9.11.2-8.P1 +- Build export libraries with disabled threads and selects + +* Wed Feb 07 2018 Fedora Release Engineering - 32:9.11.2-7.P1 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Tue Jan 30 2018 Petr Menšík - 32:9.11.2-6.P1 +- Remove ldconfig calls where possible +- Note -z defs cannot be enabled until more work + +* Tue Jan 16 2018 Petr Menšík - 32:9.11.2-5.P1 +- Fix CVE-2017-3145, rebase to 9.11.2-P1 + +* Tue Jan 02 2018 Petr Menšík - 32:9.11.2-4 +- Enable unit tests with kyua tool (#1532694) +- Provide internal tool to prepare softhsm token storage +- Proper fix for python3-bind subpackage directory ownership (#1522944) + +* Fri Dec 15 2017 Petr Menšík - 32:9.11.2-3 +- Own python3-bind isc directory (#1522944) +- Make tsstsig system test pass again (#1500017) + +* Mon Oct 23 2017 Petr Menšík - 32:9.11.2-2 +- Build against mariadb-connector-c-devel (#1493615) +- Include DNSKEY 20326 also in trusted-key.key (#1505476) +- Fix dynamic symbols conflict with ldap (#1205168) +- Use hmac-sha256 for new RNDC keys (#1508003) +- Include protocols and services in chroot + +* Wed Aug 02 2017 Petr Menšík - 32:9.11.2-1 +- Update to 9.11.2 +- Add recursing and secroots file into default and sample config +- Fix nsupdate GSSAPI auth against AD server (#1484451) + +* Wed Aug 02 2017 Fedora Release Engineering - 32:9.11.1-6.P3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild + +* Wed Jul 26 2017 Fedora Release Engineering - 32:9.11.1-5.P3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Fri Jul 14 2017 Petr Menšík - 32:9.11.1-4.P3 +- Simplify change of default configuration file path + +* Thu Jul 13 2017 Petr Menšík - 32:9.11.1-3.P3 +- Use mysql_config for SDB variant, build against mariadb-devel + +* Mon Jul 10 2017 Petr Menšík - 32:9.11.1-2.P3 +- Update to 9.11.1-P3 + +* Fri Jun 30 2017 Petr Menšík - 32:9.11.1-2.P2 +- Update to 9.11.1-P2 + +* Thu Jun 29 2017 Petr Menšík - 32:9.11.1-2.P1 +- dnssec-checkds and dnssec-coverage requires python module (#1466183) + +* Thu Jun 15 2017 Petr Menšík - 32:9.11.1-1.P1 +- Update to 9.11.1-P1 + +* Fri Apr 21 2017 Petr Menšík - 32:9.11.0-8.P5 +- Fix queries for TKEY in nsupdate, when using GSSAPI (#1236087) + +* Thu Apr 13 2017 Petr Menšík - 32:9.11.0-7.P5 +- Update to 9.11.0-P5 +- Use BINDVERSION for upstream version + +* Fri Feb 10 2017 Petr Menšík - 32:9.11.0-7.P3 +- Update to 9.11.0-P3 + +* Fri Feb 10 2017 Fedora Release Engineering - 32:9.11.0-7.P2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild + +* Wed Jan 18 2017 Petr Menšík - 32:9.11.0-6.P2 +- RTLD_DEEPBIND conflicts with pkcs11 libraries, skip it for dyndb (#1410433) +- Fix some rpm warnings + +* Mon Jan 16 2017 Petr Menšík - 32:9.11.0-5.P2 +- Fix manual pages generated by recent docbook-style-xsl (#1397186) + +* Thu Jan 12 2017 Petr Menšík - 32:9.11.0-4.P2 +- Update to 9.11.0-P2 + +* Mon Dec 19 2016 Miro Hrončok - 32:9.11.0-4.P1 +- Rebuild for Python 3.6 + +* Tue Nov 22 2016 Petr Menšík - 32:9.11.0-3.P1 +- Split pk11 includes, include real functions only in pkcs11 variant + +* Wed Nov 16 2016 Petr Menšík - 32:9.11.0-2.P1 +- Do not change lib permissions in chroot + +* Wed Nov 16 2016 Michal Ruprich - 32:9.11.0-1.P1 +- Update to 9.11.0-P1 + +* Tue Nov 08 2016 Petr Menšík - 32:9.10.4-3.P4 +- Build with OpenSSL 1.1 + +* Thu Nov 03 2016 Petr Menšík - 32:9.10.4-2.P4 +- Update to 9.10.4-P4 + +* Thu Sep 29 2016 Tomas Hozza - 32:9.10.4-2.P3 +- Update to 9.10.4-P3 + +* Wed Jul 20 2016 Michal Ruprich - 32:9.10.4-1.P2 +- Update to 9.10.4-P2 + +* Thu May 26 2016 Tomas Hozza - 32:9.10.4-1.P1 +- Update to 9.10.4-P1 + +* Fri May 20 2016 Tomas Hozza - 32:9.10.3-14.P4 +- (un)mount /var/named in -chroot packages as the last directory (Related: #1279188) + +* Thu May 12 2016 Tomas Hozza - 32:9.10.3-13.P4 +- Remove NM dispatcher script, since it is not needed any more (#1277257) +- Replaced After=network-online.target with After=network.target in all unit files + +* Fri Mar 11 2016 Tomas Hozza - 32:9.10.3-12.P4 +- Update to 9.10.3-P4 due to CVE-2016-1285 CVE-2016-1286 CVE-2016-2088 + +* Wed Feb 03 2016 Fedora Release Engineering - 32:9.10.3-11.P3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + +* Thu Jan 21 2016 Tomas Hozza - 32:9.10.3-10.P3 +- Update to 9.10.3-P3 due to CVE-2015-8704 and CVE-2015-8705 (#1300051) + +* Wed Jan 06 2016 Tomas Hozza - 32:9.10.3-9.P2 +- Commented out bindkeys-file statement in default configuration (#1223365#c3) +- Removed unrecognized configure option --enable-developer +- Added configure option --enable-full-report to get report on enabled features + +* Sat Dec 26 2015 Robert Scheck - 32:9.10.3-8.P2 +- Remove unrecognized build options for %%configure +- Own %%{_includedir}/bind9 directory in -lite-devel +- Fixed building without (optional) PKCS#11 support + +* Wed Dec 16 2015 Tomas Hozza - 32:9.10.3-7.P2 +- bump release to maintain update path + +* Wed Dec 16 2015 Tomas Hozza - 32:9.10.3-4.P2 +- Update to 9.10.3-P2 + +* Tue Nov 10 2015 Fedora Release Engineering - 32:9.10.3-3 +- Rebuilt for https://fedoraproject.org/wiki/Changes/python3.5 + +* Wed Nov 04 2015 Tomas Hozza - 32:9.10.3-2 +- Fixed named-checkconf call in *-chroot.service files (#1277820) + +* Thu Sep 17 2015 Tomas Hozza - 32:9.10.3-1 +- Update to 9.10.3 stable + +* Thu Sep 03 2015 Tomas Hozza +- Update to 9.10.3rc1 + +* Wed Jul 29 2015 Tomas Hozza - 32:9.10.2-9.P3 +- Update to 9.10.2-P3 to fix CVE-2015-5477 + +* Thu Jul 09 2015 Tomas Hozza - 32:9.10.2-8.P2 +- Update to 9.10.2-P2 + +* Mon Jun 29 2015 Tomas Hozza - 32:9.10.2-7.P1 +- Reintroduce the DISABLE_ZONE_CHECKING into /etc/sysconfig/named + +* Fri Jun 19 2015 Tomas Hozza - 32:9.10.2-6.P1 +- Update to 9.10.2-P1 + +* Wed Jun 17 2015 Fedora Release Engineering - 32:9.10.2-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild + +* Wed May 27 2015 Tomas Hozza - 32:9.10.2-4 +- Don't copy /etc/localtime on -chroot package installation + +* Fri May 22 2015 Tomas Hozza - 32:9.10.2-3 +- Don't use ISC's DLV by default (#1223365) +- Utilize system-wide crypto-policies (#1179925) + +* Thu May 21 2015 Tomas Hozza - 32:9.10.2-2 +- enable tuning for large systems - increases hardcoded internal limits +- enable GeoIP access control feature + +* Thu Feb 26 2015 Tomas Hozza - 32:9.10.2-1 +- update to 9.10.2 stable +- remove parallel-build patch after discussion with upstream [ISC-Bugs #38739] + +* Wed Feb 25 2015 Tomas Hozza - 32:9.10.2-0.3.rc1 +- update to 9.10.2rc2 +- call ldconfig for pkcs11-libs +- Use Python3 by default (#1186791) + +* Sat Feb 21 2015 Till Maas - 32:9.10.2-0.2.rc1 +- Rebuilt for Fedora 23 Change + https://fedoraproject.org/wiki/Changes/Harden_all_packages_with_position-independent_code + +* Mon Feb 02 2015 Tomas Hozza - 32:9.10.2-0.1.rc1 +- update to 9.10.2rc1 +- fix nsupdate server auto-detection (#1184151) +- drop merged patch bind99-rh985918.patch + +* Fri Jan 16 2015 Tomas Hozza - 32:9.10.1-2.P1 +- Install config for tmpfiles under %%{_tmpfilesdir} (#1181020) + +* Tue Jan 13 2015 Tomas Hozza - 32:9.10.1-1.P1 +- Update to 9.10.1-P1 stable + +* Fri Dec 12 2014 Tomas Hozza - 32:9.9.6-6.P1 +- Drop downstream patch for nslookup/host rejected by upstream + +* Tue Dec 09 2014 Tomas Hozza - 32:9.9.6-5.P1 +- Update to 9.9.6-P1 (CVE-2014-8500) + +* Fri Nov 14 2014 Tomas Hozza - 32:9.9.6-4 +- Fixed systemctl path in logrotate configuration (#1148360) +- drop engine_pkcs11 dependency, since we use native PKCS#11 implementation + +* Wed Oct 22 2014 Petr Spacek - 32:9.9.6-3 +- Fix crash during GSS-TSIG processing (#1155334, #1155127) + introduced in 32:9.9.6-2 + +* Tue Oct 14 2014 Tomas Hozza - 32:9.9.6-2 +- Added native PKCS#11 functionality (#1097752) +- bind-sdb now requires bind due to configuration and other utilities +- bind-pkcs11 now requires bind due to configuration and other utilities + +* Thu Oct 02 2014 Tomas Hozza - 32:9.9.6-1 +- Update to 9.9.6 +- drop merged patches and rebase some of existing patches +- Add architecture specific dependencies. +- Fix assert in dig when using +sigchase (#985918) + +* Fri Aug 15 2014 Fedora Release Engineering - 32:9.9.5-9.P1 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild + +* Fri Jul 18 2014 Tomas Hozza 32:9.9.5-8.P1 +- Use network-online.target instead of network.target (#1117086) + +* Fri Jul 11 2014 Tom Callaway 32:9.9.5-7.P1 +- fix license handling + +* Thu Jun 12 2014 Tomas Hozza 32:9.9.5-6.P1 +- Update to 9.9.5-P1 + +* Mon Jun 09 2014 Tomas Hozza 32:9.9.5-5 +- Use /dev/urandom for generation of rndc.key (#1079799) + +* Sat Jun 07 2014 Fedora Release Engineering - 32:9.9.5-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Tue Apr 22 2014 Tomas Hozza 32:9.9.5-3 +- configure bind with --with-dlopen=yes to support dynamically loadable DLZ drivers + +* Wed Mar 05 2014 Tomas Hozza 32:9.9.5-2 +- dlz_dlopen driver could return the wrong error leading to a segfault (#1052781) +- Fix race condition when freeing fetch object (ISC-Bugs #35385) + +* Thu Feb 13 2014 Tomas Hozza 32:9.9.5-1 +- Update to 9.9.5 stable + +* Sun Jan 26 2014 Rex Dieter 32:9.9.5-0.5.rc2 +- -libs, -libs-lite: track sonames, so abi bumps aren't a surprise + +* Fri Jan 24 2014 Tomas Hozza 32:9.9.5-0.4.rc2 +- update to 9.9.5rc2 +- merged patches dropped +- some patches rebased to the new version + +* Wed Jan 15 2014 Tomas Hozza 32:9.9.5-0.3.b1 +- non-existance of resolv.conf should not be fatal (#1052343) + +* Tue Jan 14 2014 Tomas Hozza 32:9.9.5-0.2.b1 +- Fix CVE-2014-0591 + +* Mon Jan 06 2014 Tomas Hozza 32:9.9.5-0.1.b1 +- Update to bind-9.9.5b1 +- Build bind-sdb against libdb instead of libdb4 + +* Wed Dec 18 2013 Tomas Hozza 32:9.9.4-11 +- Fix crash in rbtdb after two sucessive getoriginnode() calls + +* Tue Dec 17 2013 Tomas Hozza 32:9.9.4-10 +- Split chroot package for named and named-sdb +- Extract setting-up/destroying of chroot to a separate systemd service (#997030) + +* Thu Nov 28 2013 Tomas Hozza 32:9.9.4-9 +- Fixed memory leak in nsupdate if 'realm' was used multiple times (#984687) + +* Tue Nov 12 2013 Tomas Hozza 32:9.9.4-8 +- Install configuration for rwtab and fix chroot setup script + +* Thu Oct 31 2013 Tomas Hozza 32:9.9.4-7 +- Correct the upstream patch for #794940 + +* Thu Oct 31 2013 Tomas Hozza 32:9.9.4-6 +- use --enable-filter-aaaa when building bind to enable use of filter-aaaa-on-v4 option + +* Wed Oct 30 2013 Tomas Hozza 32:9.9.4-5 +- Create symlink /var/named/chroot/var/run -> /var/named/chroot/run +- Added session-keyfile statement into default named.conf since we use /run/named + +* Tue Oct 29 2013 Tomas Hozza 32:9.9.4-4 +- Use upstream version of patch for previously fixed #794940 + +* Fri Oct 18 2013 Tomas Hozza 32:9.9.4-3 +- Fix race condition on send buffers in dighost.c (#794940) + +* Tue Oct 08 2013 Tomas Hozza 32:9.9.4-2 +- install isc/errno2result.h header + +* Fri Sep 20 2013 Tomas Hozza 32:9.9.4-1 +- Update to bind-9.9.4 stable + +* Tue Sep 10 2013 Tomas Hozza 32:9.9.4-0.9.rc2 +- Fix [ISC-Bugs #34738] dns_journal_open() returns a pointer to stack + +* Mon Sep 09 2013 Tomas Hozza 32:9.9.4-0.8.rc2 +- update to bind-9.9.4rc2 + +* Tue Aug 20 2013 Tomas Hozza 32:9.9.4-0.7.rc1 +- Move named-checkzone and named-compilezone to bind-utils package + +* Tue Aug 20 2013 Tomas Hozza 32:9.9.4-0.6.rc1 +- Move tools that don't need the server to run, from main package to bind-utils (#964313) + +* Fri Aug 16 2013 Tomas Hozza 32:9.9.4-0.5.rc1 +- Don't generate rndc.key if there exists rndc.conf + +* Fri Aug 16 2013 Tomas Hozza 32:9.9.4-0.4.rc1 +- don't install named-sdb.service if SDB macro is defined to zero + +* Mon Aug 05 2013 Tomas Hozza 32:9.9.4-0.3.rc1 +- Fix setup-named-chroot.sh to mount/umount everything successfully +- update to bind-9.9.4rc1 + +* Sat Aug 03 2013 Fedora Release Engineering - 32:9.9.4-0.2.b1 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild + +* Mon Jul 15 2013 Tomas Hozza 32:9.9.4-0.1.b1 +- update to bind-9.9.4b1 +- drop merged RRL patch +- drop merged stat.h patch + +* Wed Jun 05 2013 Tomas Hozza 32:9.9.3-3.P1 +- update to 9.9.3-P1 (fix for CVE-2013-3919) +- update RRL patch to 9.9.3-P1-rl.156.01 + +* Mon Jun 03 2013 Tomas Hozza 32:9.9.3-2 +- bump release to prevent update path issues + +* Mon Jun 03 2013 Tomas Hozza 32:9.9.3-1 +- update to 9.9.3 +- install dns/update.h header +- update RRL patch to the latest version 9.9.3-rl.150.20 + +* Fri May 17 2013 Tomas Hozza 32:9.9.3-0.7.rc2 +- Fix segfault in host/nslookup (#878139) + +* Mon May 13 2013 Tomas Hozza 32:9.9.3-0.6.rc2 +- update to 9.9.3rc2 +- part of bind97-exportlib.patch not needed any more +- bind-9.9.1-P2-multlib-conflict.patch modified to reflect latest source +- rl-9.9.3rc1.patch -> rl-9.9.3rc2.patch +- bind99-opts.patch merged + +* Fri May 03 2013 Tomas Hozza 32:9.9.3-0.5.rc1 +- Include recursion Warning in named.conf and named.conf.sample (#740894) +- Include managed-keys-directory statement in named.conf.sample (#948026) + +* Thu May 02 2013 Tomas Hozza 32:9.9.3-0.4.rc1 +- Fix zone2sqlite to quote table names when creating/dropping/inserting (#919417) + +* Fri Apr 19 2013 Adam Tkac 32:9.9.3-0.3.rc1 +- fix crash in nsupdate when processing "-r" parameter (#949544) + +* Tue Apr 16 2013 Adam Tkac 32:9.9.3-0.2.rc1 +- ship dns/rrl.h in -devel subpkg + +* Tue Apr 16 2013 Adam Tkac 32:9.9.3-0.1.rc1 +- update to 9.9.3rc1 +- bind-96-libtool2.patch has been merged +- fix bind tmpfiles.d for named.pid /run migration (#920713) + +* Wed Mar 27 2013 Tomas Hozza 32:9.9.2-12.P2 +- New upstream patch version fixing CVE-2013-2266 (#928032) + +* Tue Mar 19 2013 Adam Tkac 32:9.9.2-11.P1 +- move pidfile to /run/named/named.pid + +* Wed Mar 06 2013 Tomas Hozza 32:9.9.2-10.P1 +- Fix Makefile.in to include header added by rate limiting patch (#918330) + +* Tue Mar 05 2013 Adam Tkac 32:9.9.2-9.P1 +- drop some developer-only documentation and move ARM to %%docdir + +* Mon Feb 18 2013 Adam Tkac 32:9.9.2-8.P1 +- include rate limiting patch + +* Tue Jan 29 2013 Tomas Hozza 32:9.9.2-7.P1 +- Corrected IP addresses in named.ca (#901741) +- mount/umount /var/named in setup-named-chroot.sh as the last one (#904666) + +* Thu Dec 20 2012 Adam Tkac 32:9.9.2-6.P1 +- generate /etc/rndc.key during named service startup if doesn't exist +- increase startup timeout in systemd units to 90sec (default) +- fix IDN related statement in dig.1 manpage + +* Wed Dec 05 2012 Tomas Hozza 32:9.9.2-5.P1 +- update to bind-9.9.2-P1 + +* Mon Nov 12 2012 Adam Tkac 32:9.9.2-4 +- document dig exit codes in manpage +- ignore empty "search" options in resolv.conf + +* Mon Nov 12 2012 Adam Tkac 32:9.9.2-3 +- drop PKCS11 support on rhel + +* Thu Oct 11 2012 Adam Tkac 32:9.9.2-2 +- install isc/stat.h + +* Thu Oct 11 2012 Adam Tkac 32:9.9.2-1 +- update to 9.9.2 +- bind97-rh714049.patch has been dropped +- patches merged + - bind98-rh816164.patch + +* Thu Sep 13 2012 Adam Tkac 32:9.9.1-10.P3 +- update to bind-9.9.1-P3 + +* Wed Aug 22 2012 Tomas Hozza 32:9.9.1-9.P2 +- fixed SPEC file so it comply with new systemd-rpm macros guidelines (#850045) +- changed %%define macros to %%global and fixed several rpmlint warnings + +* Wed Aug 08 2012 Tomas Hozza 32:9.9.1-8.P2 +- Changed PrivateTmp to "false" in *-chroot.service unit files (#825869) + +* Wed Aug 01 2012 Tomas Hozza 32:9.9.1-7.P2 +- Fixed bind-devel multilib conflict (#478718) + +* Mon Jul 30 2012 Tomas Hozza 32:9.9.1-6.P2 +- Fixed bad path to systemctl in /etc/NetworkManager/dispatcher.d/13-named (#844047) +- Fixed path to libdb.so in config.dlz.in + +* Thu Jul 26 2012 Adam Tkac 32:9.9.1-5.P2 +- update to 9.9.1-P2 + +* Wed Jul 18 2012 Fedora Release Engineering - 32:9.9.1-4.P1 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + +* Wed Jul 11 2012 Ville Skyttä - 32:9.9.1-3.P1 +- Avoid shell invocation and dep for -libs-lite %%postun. + +* Mon Jun 04 2012 Adam Tkac 32:9.9.1-2.P1 +- update to 9.9.1-P1 (CVE-2012-1667) + +* Thu May 24 2012 Adam Tkac 32:9.9.1-1 +- update to 9.9.1 +- bind99-coverity.patch merged +- bind-9.5-overflow.patch merged + +* Mon May 07 2012 Adam Tkac 32:9.9.0-6 +- nslookup: return non-zero exit code when fail to get answer (#816164) + +* Thu Apr 26 2012 Adam Tkac 32:9.9.0-5 +- initscript: don't umount /var/named when didn't mount it + +* Tue Apr 24 2012 Adam Tkac 32:9.9.0-4 +- apply all non-SDB patches before SDB ones (#804475) +- enable Berkeley DB DLZ backend (#804478) + +* Thu Apr 12 2012 Adam Tkac 32:9.9.0-3 +- bind97-rh699951.patch is no longer needed (different fix is in 9.9.0) + +* Mon Mar 26 2012 Adam Tkac 32:9.9.0-2 +- remove unneeded bind99-v6only.patch + +* Mon Mar 05 2012 Adam Tkac 32:9.9.0-1 +- update to 9.9.0 +- load dynamic DBs later (and update dyndb patch) +- fix memory leak in named during processing of rndc command +- don't call `rndc-confgen -a` in "post" section +- fix some packaging bugs in bind-chroot + +* Wed Feb 15 2012 Adam Tkac 32:9.9.0-0.8.rc2 +- build with "--enable-fixed-rrset" + +* Wed Feb 01 2012 Adam Tkac 32:9.9.0-0.7.rc2 +- update to 9.9.0rc2 +- doc/rfc and doc/draft are no longer shipped in tarball + +* Mon Jan 30 2012 Adam Tkac 32:9.9.0-0.6.rc1 +- retire initscript in favour of systemd unit files (#719419) + +* Thu Jan 12 2012 Adam Tkac 32:9.9.0-0.5.rc1 +- update to 9.9.0rc1 + +* Wed Dec 07 2011 Adam Tkac 32:9.9.0-0.4.b2 +- ship dns/forward.h in -devel subpkg + +* Tue Nov 22 2011 Adam Tkac 32:9.9.0-0.3.b2 +- update to 9.9.0b2 (CVE-2011-4313) +- patches merged + - bind97-rh700097.patch + - bind99-cinfo.patch + +* Mon Nov 14 2011 Adam Tkac 32:9.9.0-0.2.b1 +- ship dns/clientinfo.h in bind-devel + +* Fri Nov 11 2011 Adam Tkac 32:9.9.0-0.1.b1 +- update to 9.9.0b1 +- bind98-dlz_buildfix.patch merged + +* Fri Oct 28 2011 Adam Tkac 32:9.8.1-4 +- nslookup failed to resolve name in certain cases + +* Mon Sep 26 2011 Adam Tkac 32:9.8.1-3 +- remove deps filter, it is no longer needed (#739663) + +* Fri Sep 09 2011 Adam Tkac 32:9.8.1-2 +- fix logrotate config file (#725256) + +* Wed Sep 07 2011 Adam Tkac 32:9.8.1-1 +- update to 9.8.1 +- ship /etc/trusted-key.key (needed by dig) +- use select instead of epoll in export libs (#735103) + +* Wed Aug 31 2011 Adam Tkac 32:9.8.1-0.3.rc1 +- fix DLZ related compilation issues +- make /etc/named.{root,iscdlv}.key world-readable +- add bind-libs versioned requires to bind pkg + +* Wed Aug 31 2011 Adam Tkac 32:9.8.1-0.2.rc1 +- fix rare race condition in request.c +- print "the working directory is not writable" as debug message +- re-add configtest target to initscript +- initscript: sybsys name is always named, not named-sdb +- nsupdate returned zero when target zone didn't exist (#700097) +- nsupdate could have failed if server has multiple IPs and the first + was unreachable (#714049) + +* Wed Aug 31 2011 Adam Tkac 32:9.8.1-0.1.rc1 +- update to 9.8.1rc1 +- patches merged + - bind97-rh674334.patch + - bind97-cleanup.patch + - bind98-includes.patch + +* Wed Aug 03 2011 Adam Tkac 32:9.8.0-9.P4 +- improve patch for #725741 + +* Tue Jul 26 2011 Adam Tkac 32:9.8.0-8.P4 +- named could have crashed during reload when dyndb module is used (#725741) + +* Tue Jul 05 2011 Adam Tkac 32:9.8.0-7.P4 +- update to 9.8.0-P4 + - bind98-libdns-export.patch merged + +* Thu Jun 02 2011 Adam Tkac 32:9.8.0-6.P2 +- update the dyndb patch + +* Fri May 27 2011 Adam Tkac 32:9.8.0-5.P2 +- fix compilation of libdns-export.so + +* Fri May 27 2011 Adam Tkac 32:9.8.0-4.P2 +- update to 9.8.0-P2 (CVE-2011-1910) + +* Fri May 06 2011 Adam Tkac 32:9.8.0-3.P1 +- update to 9.8.0-P1 (CVE-2011-1907) + +* Wed Mar 23 2011 Dan Horák - 32:9.8.0-2 +- rebuilt for mysql 5.5.10 (soname bump in libmysqlclient) + +* Thu Mar 03 2011 Adam Tkac 32:9.8.0-1 +- update to 9.8.0 +- bind97-rh665971.patch merged + +* Thu Mar 03 2011 Adam Tkac 32:9.8.0-0.4.rc1 +- revert previous change (integration with libnmserver) + +* Tue Feb 22 2011 Adam Tkac 32:9.8.0-0.3.rc1 +- integrate named with libnmserver library + +* Tue Feb 22 2011 Adam Tkac 32:9.8.0-0.2.rc1 +- include dns/rpz.h in -devel subpkg + +* Mon Feb 21 2011 Adam Tkac 32:9.8.0-0.1.rc1 +- update to 9.8.0rc1 + +* Fri Feb 18 2011 Adam Tkac 32:9.7.3-1 +- update to 9.7.3 +- fix dig +trace on dualstack systems (#674334) +- fix linkage order when building on system with older BIND (#665971) +- reduce number of gcc warnings + +* Mon Feb 07 2011 Fedora Release Engineering - 32:9.7.3-0.6.rc1 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild + +* Tue Jan 25 2011 Adam Tkac 32:9.7.3-0.5.rc1 +- update to 9.7.3rc1 + - bind97-krb5-self.patch merged + +* Wed Jan 12 2011 Adam Tkac 32:9.7.3-0.4.b1 +- fix typo in initscript + +* Thu Jan 06 2011 Adam Tkac 32:9.7.3-0.3.b1 +- fix "service named status" when used with named-sdb +- don't check MD5, size and mtime of sysconfig/named + +* Wed Jan 05 2011 Adam Tkac 32:9.7.3-0.2.b1 +- add new option DISABLE_ZONE_CHECKING to sysconfig/named + +* Wed Jan 05 2011 Adam Tkac 32:9.7.3-0.1.b1 +- update to 9.7.3b1 + +* Wed Jan 05 2011 Adam Tkac 32:9.7.2-10.P3 +- initscript should terminate only the correct "named" process (#622785) + +* Mon Dec 20 2010 Adam Tkac 32:9.7.2-9.P3 +- fix "krb5-self" update-policy rule processing + +* Thu Dec 02 2010 Adam Tkac 32:9.7.2-8.P3 +- update to 9.7.2-P3 + +* Mon Nov 29 2010 Jan Görig 32:9.7.2-7.P2 +- added tmpfiles.d support (#656550) +- removed old PID checking in initscript + +* Mon Nov 08 2010 Adam Tkac 32:9.7.2-6.P2 +- don't emit various informational messages by default (#645544) + +* Wed Oct 20 2010 Adam Tkac 32:9.7.2-5.P2 +- move BIND9 internal libs back to %%{_libdir} +- add "-export" suffix to public libraries (-lite subpkg) + +* Thu Oct 07 2010 Adam Tkac 32:9.7.2-4.P2 +- ship -devel subpkg for internal libs, dnsperf needs it + +* Thu Oct 07 2010 Adam Tkac 32:9.7.2-3.P2 +- new bind-libs-lite and bind-lite-devel subpkgs which contain + public version of BIND 9 libraries +- don't ship devel files for internal version of BIND 9 libraries + +* Wed Sep 29 2010 Adam Tkac 32:9.7.2-2.P2 +- update to 9.7.2-P2 + +* Thu Sep 16 2010 Adam Tkac 32:9.7.2-1 +- update to 9.7.2 + +* Fri Aug 27 2010 Adam Tkac 32:9.7.2-0.3.rc1 +- update to 9.7.2rc1 + +* Tue Aug 10 2010 Adam Tkac 32:9.7.2-0.2.b1 +- host: handle "debug", "attempts" and "timeout" options in resolv.conf well + +* Tue Aug 03 2010 Adam Tkac 32:9.7.2-0.1.b1 +- update to 9.7.2b1 +- patches merged + - bind97-rh507429.patch + +* Mon Jul 19 2010 Adam Tkac 32:9.7.1-5.P2 +- supply root zone DNSKEY in default configuration + +* Mon Jul 19 2010 Adam Tkac 32:9.7.1-4.P2 +- update to 9.7.1-P2 (CVE-2010-0213) + +* Mon Jul 12 2010 Adam Tkac 32:9.7.1-3.P1 +- remove outdated Copyright.caching-nameserver file +- remove rfc1912.txt, it is already located in %%doc/rfc directory +- move COPYRIGHT to the bind-libs subpkg +- add COPYRIGHT to the -pkcs11 subpkg + +* Fri Jul 09 2010 Adam Tkac 32:9.7.1-2.P1 +- update to 9.7.1-P1 + +* Mon Jun 28 2010 Adam Tkac 32:9.7.1-1 +- update to 9.7.1 +- improve the "dnssec-conf" trigger + +* Wed Jun 09 2010 Adam Tkac 32:9.7.1-0.2.rc1 +- update to 9.7.1rc1 +- patches merged + - bind97-keysdir.patch + +* Mon May 31 2010 Adam Tkac 32:9.7.1-0.1.b1 +- update to 9.7.1b1 +- make /var/named/dynamic as a default directory for managed DNSSEC keys +- add patch to get "managed-keys-directory" option working +- patches merged + - bind97-managed-keyfile.patch + - bind97-rh554316.patch + +* Fri May 21 2010 Adam Tkac 32:9.7.0-11.P2 +- update dnssec-conf Obsoletes/Provides + +* Thu May 20 2010 Adam Tkac 32:9.7.0-10.P2 +- update to 9.7.0-P2 + +* Fri Mar 26 2010 Adam Tkac 32:9.7.0-9.P1 +- added lost patch for #554316 (occasional crash in keytable.c) + +* Fri Mar 26 2010 Adam Tkac 32:9.7.0-8.P1 +- active query might be destroyed in resume_dslookup() which triggered REQUIRE + failure (#507429) + +* Mon Mar 22 2010 Adam Tkac 32:9.7.0-7.P1 +- install SDB related manpages only when build with SDB + +* Fri Mar 19 2010 Adam Tkac 32:9.7.0-6.P1 +- update to 9.7.0-P1 + +* Tue Mar 16 2010 Jan Görig 32:9.7.0-5 +- bind-sdb now requires bind + +* Mon Mar 15 2010 Jan Görig 32:9.7.0-4 +- add man-pages ldap2zone.1 zonetodb.1 zone2sqlite.1 named-sdb.8 (#525655) + +* Mon Mar 01 2010 Adam Tkac 32:9.7.0-3 +- fix multilib issue (#478718) [jgorig] + +* Mon Mar 01 2010 Adam Tkac 32:9.7.0-2 +- improve automatic DNSSEC reconfiguration trigger +- initscript now returns 2 in case that action doesn't exist (#523435) +- enable/disable chroot when bind-chroot is installed/uninstalled + +* Wed Feb 17 2010 Adam Tkac 32:9.7.0-1 +- update to 9.7.0 final + +* Mon Feb 15 2010 Adam Tkac 32:9.7.0-0.14.rc2 +- obsolete dnssec-conf +- automatically update configuration from old dnssec-conf based +- improve default configuration; enable DLV by default +- remove obsolete triggerpostun from bind-libs subpackage + +* Thu Jan 28 2010 Adam Tkac 32:9.7.0-0.13.rc2 +- update to 9.7.0rc2 + +* Wed Jan 27 2010 Adam Tkac 32:9.7.0-0.12.rc1 +- initscript LSB related fixes (#523435) + +* Wed Jan 27 2010 Adam Tkac 32:9.7.0-0.11.rc1 +- revert the "DEBUG" feature (#510283), it causes too many problems (#545128) + +* Tue Dec 15 2009 Adam Tkac 32:9.7.0-0.10.rc1 +- update to 9.7.0rc1 +- bind97-headers.patch merged +- update default configuration + +* Tue Dec 01 2009 Adam Tkac 32:9.7.0-0.9.b3 +- update to 9.7.0b3 + +* Thu Nov 26 2009 Adam Tkac 32:9.7.0-0.8.b2 +- install isc/namespace.h header + +* Fri Nov 06 2009 Adam Tkac 32:9.7.0-0.7.b2 +- update to 9.7.0b2 + +* Tue Nov 03 2009 Adam Tkac 32:9.7.0-0.6.b1 +- update to 9.7.0b1 +- add bind-pkcs11 subpackage to support PKCS11 compatible keystores for DNSSEC + keys + +* Thu Oct 08 2009 Adam Tkac 32:9.7.0-0.5.a3 +- don't package named-bootconf utility, it is very outdated and unneeded + +* Mon Sep 21 2009 Adam Tkac 32:9.7.0-0.4.a3 +- determine file size via `stat` instead of `ls` (#523682) + +* Wed Sep 16 2009 Adam Tkac 32:9.7.0-0.3.a3 +- update to 9.7.0a3 + +* Tue Sep 15 2009 Adam Tkac 32:9.7.0-0.2.a2 +- improve chroot related documentation (#507795) +- add NetworkManager dispatcher script to reload named when network interface is + activated/deactivated (#490275) +- don't set/unset named_write_master_zones SELinux boolean every time in + initscript, modify it only when it's actually needed + +* Tue Sep 15 2009 Adam Tkac 32:9.7.0-0.1.a2 +- update to 9.7.0a2 +- merged patches + - bind-96-db_unregister.patch + - bind96-rh507469.patch + +* Tue Sep 01 2009 Adam Tkac 32:9.6.1-9.P1 +- next attempt to fix the postun trigger (#520385) +- remove obsolete bind-9.3.1rc1-fix_libbind_includedir.patch + +* Fri Aug 21 2009 Tomas Mraz - 32:9.6.1-8.P1 +- rebuilt with new openssl + +* Tue Aug 04 2009 Martin Nagy 32:9.6.1-7.P1 +- update the patch for dynamic loading of database backends + +* Wed Jul 29 2009 Adam Tkac 32:9.6.1-6.P1 +- 9.6.1-P1 release (CVE-2009-0696) +- fix postun trigger (#513016, hopefully) + +* Fri Jul 24 2009 Fedora Release Engineering - 32:9.6.1-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild + +* Mon Jul 20 2009 Adam Tkac 32:9.6.1-4 +- remove useless bind-9.3.3rc2-rndckey.patch + +* Mon Jul 13 2009 Adam Tkac 32:9.6.1-3 +- fix broken symlinks in bind-libs (#509635) +- fix typos in /etc/sysconfig/named (#509650) +- add DEBUG option to /etc/sysconfig/named (#510283) + +* Wed Jun 24 2009 Adam Tkac 32:9.6.1-2 +- improved "chroot automount" patches (#504596) +- host should fail if specified server doesn't respond (#507469) + +* Wed Jun 17 2009 Adam Tkac 32:9.6.1-1 +- 9.6.1 release +- simplify chroot maintenance. Important files and directories are mounted into + chroot (see /etc/sysconfig/named for more info, #504596) +- fix doc/named.conf.default perms + +* Wed May 27 2009 Adam Tkac 32:9.6.1-0.4.rc1 +- 9.6.1rc1 release + +* Wed Apr 29 2009 Martin Nagy 32:9.6.1-0.3.b1 +- update the patch for dynamic loading of database backends +- create %%{_libdir}/bind directory +- copy default named.conf to doc directory, shared with s-c-bind (atkac) + +* Fri Apr 24 2009 Martin Nagy 32:9.6.1-0.2.b1 +- update the patch for dynamic loading of database backends +- fix dns_db_unregister() +- useradd now takes "-N" instead of "-n" (atkac, #495726) +- print nicer error msg when zone file is actually a directory (atkac, #490837) + +* Mon Mar 30 2009 Adam Tkac 32:9.6.1-0.1.b1 +- 9.6.1b1 release +- patches merged + - bind-96-isc_header.patch + - bind-95-rh469440.patch + - bind-96-realloc.patch + - bind9-fedora-0001.diff +- use -version-number instead of -version-info libtool param + +* Mon Mar 23 2009 Adam Tkac 32:9.6.0-11.1.P1 +- logrotate configuration file now points to /var/named/data/named.run by + default (#489986) + +* Tue Mar 17 2009 Adam Tkac 32:9.6.0-11.P1 +- fall back to insecure mode when no supported DNSSEC algorithm is found + instead of SERVFAIL +- don't fall back to non-EDNS0 queries when DO bit is set + +* Tue Mar 10 2009 Adam Tkac 32:9.6.0-10.P1 +- enable DNSSEC only if it is enabled in sysconfig/dnssec + +* Mon Mar 09 2009 Adam Tkac 32:9.6.0-9.P1 +- add DNSSEC support to initscript, enabled it per default +- add requires dnssec-conf + +* Mon Mar 09 2009 Adam Tkac 32:9.6.0-8.P1 +- fire away libbind, it is now separate package + +* Wed Mar 04 2009 Adam Tkac 32:9.6.0-7.P1 +- fixed some read buffer overflows (upstream) + +* Mon Feb 23 2009 Fedora Release Engineering 32:9.6.0-6.P1 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild + +* Thu Feb 12 2009 Martin Nagy 32:9.6.0-5.P1 +- update the patch for dynamic loading of database backends +- include iterated_hash.h + +* Sat Jan 24 2009 Caolán McNamara 32:9.6.0-4.P1 +- rebuild for dependencies + +* Wed Jan 21 2009 Adam Tkac 32:9.6.0-3.P1 +- rebuild against new openssl + +* Thu Jan 08 2009 Adam Tkac 32:9.6.0-2.P1 +- 9.6.0-P1 release (CVE-2009-0025) + +* Mon Jan 05 2009 Adam Tkac 32:9.6.0-1 +- Happy new year +- 9.6.0 release + +* Thu Dec 18 2008 Adam Tkac 32:9.6.0-0.7.rc2 +- 9.6.0rc2 release +- bind-96-rh475120.patch merged + +* Tue Dec 16 2008 Martin Nagy 32:9.6.0-0.6.rc1 +- add patch for dynamic loading of database backends + +* Tue Dec 09 2008 Adam Tkac 32:9.6.0-0.5.1.rc1 +- allow to reuse address for non-random query-source ports (#475120) + +* Wed Dec 03 2008 Adam Tkac 32:9.6.0-0.5.rc1 +- 9.6.0rc1 release +- patches merged + - bind-9.2.0rc3-varrun.patch + - bind-95-sdlz-include.patch + - bind-96-libxml2.patch +- fixed rare use-after-free problem in host utility (#452060) +- enabled chase of DNSSEC signature chains in dig + +* Mon Dec 01 2008 Adam Tkac 32:9.6.0-0.4.1.b1 +- improved sample config file (#473586) + +* Wed Nov 26 2008 Adam Tkac 32:9.6.0-0.4.b1 +- reverted previous change, koji doesn't like it + +* Wed Nov 26 2008 Adam Tkac 32:9.6.0-0.3.b1 +- build bind-chroot as noarch + +* Mon Nov 24 2008 Adam Tkac 32:9.6.0-0.2.1.b1 +- updates due libtool 2.2.6 +- don't pass -DLDAP_DEPRECATED to cpp, handle it directly in sources + +* Tue Nov 11 2008 Adam Tkac 32:9.6.0-0.2.b1 +- make statistics http server working, patch backported from 9.6 HEAD + +* Mon Nov 10 2008 Adam Tkac 32:9.6.0-0.1.b1 +- 9.6.0b1 release +- don't build ODBC and Berkeley DB DLZ drivers +- end of bind-chroot-admin script, copy config files to chroot manually +- /proc doesn't have to be mounted to chroot +- temporary use libbind from 9.5 series, noone has been released for 9.6 yet + +* Mon Nov 03 2008 Adam Tkac 32:9.5.1-0.8.4.b2 +- dig/host: use only IPv4 addresses when -4 option is specified (#469440) + +* Thu Oct 30 2008 Adam Tkac 32:9.5.1-0.8.2.b2 +- removed unneeded bind-9.4.1-ldap-api.patch + +* Thu Oct 30 2008 Adam Tkac 32:9.5.1-0.8.1.b2 +- ship dns/{s,}dlz.h and isc/radix.h in bind-devel + +* Tue Oct 07 2008 Adam Tkac 32:9.5.1-0.8.b2 +- removed bind-9.4.0-dnssec-directory.patch, it is wrong + +* Wed Sep 24 2008 Adam Tkac 32:9.5.1-0.7.b2 +- 9.5.1b2 release +- patches merged + - bind95-rh454783.patch + - bind-9.5-edns.patch + - bind95-rh450995.patch + - bind95-rh457175.patch + +* Wed Sep 17 2008 Adam Tkac 32:9.5.1-0.6.b1 +- IDN output strings didn't honour locale settings (#461409) + +* Tue Aug 05 2008 Adam Tkac 32:9.5.1-0.5.b1 +- disable transfer stats on DLZ zones (#454783) + +* Mon Aug 04 2008 Adam Tkac 32:9.5.1-0.4.b1 +- add forgotten patch for #457175 +- build with -O2 + +* Thu Jul 31 2008 Adam Tkac 32:9.5.1-0.3.b1 +- static libraries are no longer supported +- IP acls weren't merged correctly (#457175) +- use fPIE on sparcv9/sparc64 (Dennis Gilmore) +- add sparc64 to list of 64bit arches in spec (Dennis Gilmore) + +* Mon Jul 21 2008 Adam Tkac 32:9.5.1-0.2.b1 +- updated patches due new rpm (--fuzz=0 patch parameter) + +* Mon Jul 14 2008 Adam Tkac 32:9.5.1-0.1.1.b1 +- use %%patch0 for Patch0 (#455061) +- correct source address (#455118) + +* Tue Jul 08 2008 Adam Tkac 32:9.5.1-0.1.b1 +- 9.5.1b1 release (CVE-2008-1447) +- dropped bind-9.5-recv-race.patch because upstream doesn't want it + +* Mon Jun 30 2008 Adam Tkac 32:9.5.0-37.1 +- update default named.conf statements (#452708) + +* Thu Jun 26 2008 Adam Tkac 32:9.5.0-37 +- some compat changes to fix building on RHEL4 + +* Mon Jun 23 2008 Adam Tkac 32:9.5.0-36.3 +- fixed typo in %%posttrans script + +* Wed Jun 18 2008 Adam Tkac 32:9.5.0-36.2 +- parse inner acls correctly (#450995) + +* Mon Jun 02 2008 Adam Tkac 32:9.5.0-36.1 +- removed dns-keygen utility in favour of rndc-confgen -a (#449287) +- some minor sample fixes (#449274) + +* Thu May 29 2008 Adam Tkac 32:9.5.0-36 +- updated to 9.5.0 final +- use getifaddrs to find available interfaces + +* Mon May 26 2008 Adam Tkac 32:9.5.0-35.rc1 +- make /var/run/named writable by named (#448277) +- fixed one non-utf8 file + +* Thu May 22 2008 Adam Tkac 32:9.5.0-34.rc1 +- fixes needed to pass package review (#225614) + +* Wed May 21 2008 Adam Tkac 32:9.5.0-33.1.rc1 +- bind-chroot now depends on bind (#446477) + +* Wed May 14 2008 Adam Tkac 32:9.5.0-33.rc1 +- updated to 9.5.0rc1 +- merged patches + - bind-9.5-libcap.patch +- make binaries readable by others (#427826) + +* Tue May 13 2008 Adam Tkac 32:9.5.0-32.b3 +- reverted "any" patch, upstream says not needed +- log EDNS failure only when we really switch to plain EDNS (#275091) +- detect configuration file better + +* Tue May 06 2008 Adam Tkac 32:9.5.0-31.1.b3 +- addresses 0.0.0.0 and ::0 really match any (#275091, comment #28) + +* Mon May 05 2008 Adam Tkac 32:9.5.0-31.b3 +- readded bind-9.5-libcap.patch +- added bind-9.5-recv-race.patch from F8 branch (#400461) + +* Wed Apr 23 2008 Adam Tkac 32:9.5.0-30.1.b3 +- build Berkeley DB DLZ backend + +* Mon Apr 21 2008 Adam Tkac 32:9.5.0-30.b3 +- 9.5.0b3 release +- dropped patches (upstream) + - bind-9.5-transfer-segv.patch + - bind-9.5-mudflap.patch + - bind-9.5.0-generate-xml.patch + - bind-9.5-libcap.patch + +* Wed Apr 02 2008 Adam Tkac 32:9.5.0-29.3.b2 +- fixed named.conf.sample file (#437569) + +* Fri Mar 14 2008 Adam Tkac 32:9.5.0-29.2.b2 +- fixed URLs + +* Mon Feb 25 2008 Adam Tkac 32:9.5.0-29.1.b2 +- BuildRequires cleanup + +* Sun Feb 24 2008 Adam Tkac 32:9.5.0-29.b2 +- rebuild without mudflap (#434159) + +* Wed Feb 20 2008 Adam Tkac 32:9.5.0-28.b2 +- port named to use libcap library, enable threads (#433102) +- removed some unneeded Requires + +* Tue Feb 19 2008 Adam Tkac 32:9.5.0-27.b2 +- removed conditional build with libefence (use -fmudflapth instead) +- fixed building of DLZ stuff (#432497) +- do not build Berkeley DB DLZ backend +- temporary build with --disable-linux-caps and without threads (#433102) +- update named.ca file to affect IPv6 changes in root zone + +* Mon Feb 11 2008 Adam Tkac 32:9.5.0-26.b2 +- build with -D_GNU_SOURCE (#431734) +- improved fix for #253537, posttrans script is now used +- improved fix for #400461 +- 9.5.0b2 + - bind-9.3.2b1-PIE.patch replaced by bind-9.5-PIE.patch + - only named, named-sdb and lwresd are PIE + - bind-9.5-sdb.patch has been updated + - bind-9.5-libidn.patch has been updated + - bind-9.4.0-sdb-sqlite-bld.patch replaced by bind-9.5-sdb-sqlite-bld.patch + - removed bind-9.5-gssapi-header.patch (upstream) + - removed bind-9.5-CVE-2008-0122.patch (upstream) +- removed bind-9.2.2-nsl.patch +- improved sdb_tools Makefile.in + +* Mon Feb 04 2008 Adam Tkac 32:9.5.0-25.b1 +- fixed segfault during sending notifies (#400461) +- rebuild with gcc 4.3 series + +* Tue Jan 22 2008 Adam Tkac 32:9.5.0-24.b1 +- removed bind-9.3.2-prctl_set_dumpable.patch (upstream) +- allow parallel building of libdns library +- CVE-2008-0122 + +* Thu Dec 27 2007 Adam Tkac 32:9.5.0-23.b1 +- fixed initscript wait loop (#426382) +- removed dependency on policycoreutils and libselinux (#426515) + +* Thu Dec 20 2007 Adam Tkac 32:9.5.0-22.b1 +- fixed regression caused by libidn2 patch (#426348) + +* Wed Dec 19 2007 Adam Tkac 32:9.5.0-21.b1 +- fixed typo in post section (CVE-2007-6283) + +* Wed Dec 19 2007 Adam Tkac 32:9.5.0-20.b1 +- removed obsoleted triggers +- CVE-2007-6283 + +* Wed Dec 12 2007 Adam Tkac 32:9.5.0-19.2.b1 +- added dst/gssapi.h to -devel subpackage (#419091) +- improved fix for (#417431) + +* Mon Dec 10 2007 Adam Tkac 32:9.5.0-19.1.b1 +- fixed shutdown with initscript when rndc doesn't work (#417431) +- fixed IDN patch (#412241) + +* Thu Dec 06 2007 Adam Tkac 32:9.5.0-19.b1 +- 9.5.0b1 (#405281, #392491) + +* Thu Dec 06 2007 Release Engineering 32:9.5.0-18.6.a7 +- Rebuild for deps + +* Wed Dec 05 2007 Adam Tkac 32:9.5.0-18.5.a7 +- build with -O0 + +* Mon Dec 03 2007 Adam Tkac 32:9.5.0-18.4.a7 +- bind-9.5-random_ports.patch was removed because upstream doesn't + like it. query-source{,v6} options are sufficient (#391931) +- bind-chroot-admin called restorecon on /proc filesystem (#405281) + +* Mon Nov 26 2007 Adam Tkac 32:9.5.0-18.3.a7 +- removed edns patch to keep compatibility with vanilla bind + (#275091, comment #20) + +* Wed Nov 21 2007 Adam Tkac 32:9.5.0-18.2.a7 +- use system port selector instead ISC's (#391931) + +* Mon Nov 19 2007 Adam Tkac 32:9.5.0-18.a7 +- removed statement from initscript which passes -D to named + +* Thu Nov 15 2007 Adam Tkac 32:9.5.0-17.a7 +- 9.5.0a7 +- dropped patches (upstream) + - bind-9.5-update.patch + - bind-9.5-pool_badfree.patch + - bind-9.5-_res_errno.patch + +* Thu Nov 15 2007 Adam Tkac 32:9.5.0-16.5.a6 +- added bind-sdb again, contains SDB modules and DLZ modules +- bind-9.3.1rc1-sdb.patch replaced by bind-9.5-sdb.patch + +* Mon Nov 12 2007 Adam Tkac 32:9.5.0-16.4.a6 +- removed Requires: openldap, postgresql, mysql, db4, unixODBC +- new L.ROOT-SERVERS.NET address + +* Mon Oct 29 2007 Adam Tkac 32:9.5.0-16.3.a6 +- completely disable DBUS + +* Fri Oct 26 2007 Adam Tkac 32:9.5.0-16.2.a6 +- minor cleanup in bind-chroot-admin + +* Thu Oct 25 2007 Adam Tkac 32:9.5.0-16.1.a6 +- fixed typo in initscript + +* Tue Oct 23 2007 Adam Tkac 32:9.5.0-16.a6 +- disabled DBUS (dhcdbd doesn't exist & #339191) + +* Thu Oct 18 2007 Adam Tkac 32:9.5.0-15.1.a6 +- fixed missing va_end () functions (#336601) +- fixed memory leak when dbus initialization fails + +* Tue Oct 16 2007 Adam Tkac 32:9.5.0-15.a6 +- corrected named.5 SDB statement (#326051) + +* Mon Sep 24 2007 Adam Tkac 32:9.5.0-14.a6 +- added edns patch again (#275091) + +* Mon Sep 24 2007 Adam Tkac 32:9.5.0-13.a6 +- removed bind-9.3.3-edns.patch patch (see #275091 for reasons) + +* Thu Sep 20 2007 Adam Tkac 32:9.5.0-12.4.a6 +- build with O2 +- removed "autotools" patch +- bugfixing in bind-chroot-admin (#279901) + +* Thu Sep 06 2007 Adam Tkac 32:9.5.0-12.a6 +- bind-9.5-2119_revert.patch and bind-9.5-fix_h_errno.patch are + obsoleted by upstream bind-9.5-_res_errno.patch + +* Wed Sep 05 2007 Adam Tkac 32:9.5.0-11.9.a6 +- fixed wrong resolver's dispatch pool cleanup (#275011, patch from + tmraz redhat com) + +* Wed Sep 05 2007 Adam Tkac 32:9.5.0-11.3.a6 +- initscript failure message is now printed correctly (#277981, + Quentin Armitage (quentin armitage org uk) ) + +* Mon Sep 03 2007 Adam Tkac 32:9.5.0-11.2.a6 +- temporary revert ISC 2119 change and add "libbind-errno" patch + (#254501) again + +* Thu Aug 23 2007 Adam Tkac 32:9.5.0-11.1.a6 +- removed end dots from Summary sections (skasal@redhat.com) +- fixed wrong file creation by autotools patch (skasal@redhat.com) + +* Thu Aug 23 2007 Adam Tkac 32:9.5.0-11.a6 +- start using --disable-isc-spnego configure option + - remove bind-9.5-spnego-memory_management.patch (source isn't + compiled) + +* Wed Aug 22 2007 Adam Tkac 32:9.5.0-10.2.a6 +- added new initscript option KEYTAB_FILE which specified where + is located kerberos .keytab file for named service +- obsolete temporary bind-9.5-spnego-memory_management.patch by + bind-9.5-gssapictx-free.patch which conforms BIND coding standards + (#251853) + +* Tue Aug 21 2007 Adam Tkac 32:9.5.0-10.a6 +- dropped direct dependency to /etc/openldap/schema directory +- changed hardcoded paths to macros +- fired away code which configure LDAP server + +* Tue Aug 14 2007 Adam Tkac 32:9.5.0-9.1.a6 +- named could crash with SRV record UPDATE (#251336) + +* Mon Aug 13 2007 Adam Tkac 32:9.5.0-9.a6 +- disable 64bit dlz driver patch on alpha and ia64 (#251298) +- remove wrong malloc functions from lib/dns/spnego.c (#251853) + +* Mon Aug 06 2007 Adam Tkac 32:9.5.0-8.2.a6 +- changed licence from BSD-like to ISC + +* Tue Jul 31 2007 Adam Tkac 32:9.5.0-8.1.a6 +- disabled named on all runlevels by default + +* Mon Jul 30 2007 Adam Tkac 32:9.5.0-8.a6 +- minor next improvements on autotools patch +- dig and host utilities now using libidn instead idnkit for + IDN support + +* Wed Jul 25 2007 Warren Togami 32:9.5.0-7.a6 +- binutils/gcc bug rebuild (#249435) + +* Tue Jul 24 2007 Adam Tkac 32:9.5.0-6.a6 +- updated to 9.5.0a6 which contains fixes for CVE-2007-2925 and + CVE-2007-2926 +- fixed building on 64bits + +* Mon Jul 23 2007 Adam Tkac 31:9.5.0a5-5 +- integrated "autotools" patch for testing purposes (upstream will + accept it in future, for easier building) + +* Mon Jul 23 2007 Adam Tkac 31:9.5.0a5-4.1 +- fixed DLZ drivers building on 64bit systems + +* Fri Jul 20 2007 Adam Tkac 31:9.5.0a5-4 +- fixed relation between logrotated and chroot-ed named + +* Wed Jul 18 2007 Adam Tkac 31:9.5.0a5-3.9 +- removed bind-sdb package (default named has compiled SDB backend now) +- integrated DLZ (Dynamically loadable zones) drivers +- integrated GSS-TSIG support (RFC 3645) +- build with -O0 (many new features, potential core dumps will be more useful) + +* Tue Jul 17 2007 Adam Tkac 31:9.5.0a5-3.2 +- initscript should be ready for parallel booting (#246878) + +* Tue Jul 17 2007 Adam Tkac 31:9.5.0a5-3 +- handle integer overflow in isc_time_secondsastimet function gracefully (#247856) + +* Mon Jul 16 2007 Adam Tkac 31:9.5.0a5-2.2 +- moved chroot configfiles into chroot subpackage (#248306) + +* Mon Jul 02 2007 Adam Tkac 31:9.5.0a5-2 +- minor changes in default configuration +- fix h_errno assigment during resolver initialization (unbounded recursion, #245857) +- removed wrong patch to #150288 + +* Tue Jun 19 2007 Adam Tkac 31:9.5.0a5-1 +- updated to latest upstream + +* Wed Jun 13 2007 Adam Tkac 31:9.4.1-7 +- marked caching-nameserver as obsolete (#244604) +- fixed typo in initscript (causes that named doesn't detect NetworkManager + correctly) +- next cleanup in configuration - moved configfiles into config.tar +- removed delay between start & stop in restart function in named.init + +* Tue Jun 12 2007 Adam Tkac 31:9.4.1-6 +- major changes in initscript. Could be LSB compatible now +- removed caching-nameserver subpackage. Move configs from this + package to main bind package as default configuration and major + configuration cleanup + +* Mon Jun 04 2007 Adam Tkac 31:9.4.1-5 +- very minor compatibility change in bind-chroot-admin (line 215) +- enabled IDN support by default and don't distribute IDN libraries +- specfile cleanup +- add dynamic directory to /var/named. This directory will be primarily used for + dynamic DNS zones. ENABLE_ZONE_WRITE and SELinux's named_write_master_zones no longer exist + +* Thu May 24 2007 Adam Tkac 31:9.4.1-4 +- removed ldap-api patch and start using deprecated API +- fixed minor problem in bind-chroot-admin script (#241103) + +* Tue May 22 2007 Adam Tkac 31:9.4.1-3 +- fixed bind-chroot-admin dynamic DNS handling (#239149) +- updated zone-freeze patch to latest upstream +- ldap sdb has been rewriten to latest api (#239802) + +* Mon May 07 2007 Adam Tkac 31:9.4.1-2.fc7 +- test build on new build system + +* Wed May 02 2007 Adam Tkac 31:9.4.1-1.fc7 +- updated to 9.4.1 which contains fix to CVE-2007-2241 + +* Fri Apr 27 2007 Adam Tkac 31:9.4.0-8.fc7 +- improved "zone freeze patch" - if multiple zone with same name exists + no zone is freezed +- minor cleanup in caching-nameserver's config file +- fixed race-condition in dbus code (#235809) +- added forgotten restorecon statement in bind-chroot-admin + +* Tue Apr 17 2007 Adam Tkac 31:9.4.0-7.fc7 +- removed DEBUGINFO option because with this option (default) was bind + builded with -O0 and without this flag no debuginfo package was produced. + (I want faster bind => -O2 + debuginfo) +- fixed zone finding (#236426) + +* Mon Apr 16 2007 Adam Tkac 31:9.4.0-6.fc7 +- added idn support (still under development with upstream, disabled by default) + +* Wed Apr 11 2007 Adam Tkac 31:9.4.0-5.fc7 +- dnssec-signzone utility now doesn't ignore -d parameter + +* Tue Apr 10 2007 Adam Tkac 31:9.4.0-4.fc7 +- removed query-source[-v6] options from caching-nameserver config + (#209954, increase security) +- throw away idn. It won't be ready in fc7 + +* Tue Mar 13 2007 Adam Tkac 31:9.4.0-3.fc7 +- prepared bind to merge review +- added experimental idn support to bind-utils utils (not enabled by default yet) +- change chroot policy in caching-nameserver post section +- fixed bug in bind-chroot-admin - rootdir function is called properly now + +* Mon Mar 12 2007 Adam Tkac 31:9.4.0-2.fc7 +- added experimental SQLite support (written by John Boyd ) +- moved bind-chroot-admin script to chroot package +- bind-9.3.2-redhat_doc.patch is always applied (#231738) + +* Tue Mar 06 2007 Adam Tkac 31:9.4.0-1.fc7 +- updated to 9.4.0 +- bind-chroot-admin now sets EAs correctly (#213926) +- throw away next_server_on_referral and no_servfail_stops patches (fixed in 9.4.0) + +* Thu Feb 15 2007 Adam Tkac 31:9.3.4-7.fc7 +- minor cleanup in bind-chroot-admin script + +* Fri Feb 09 2007 Adam Tkac 31:9.3.4-6.fc7 +- fixed broken bind-chroot-admin script (#227995) + +* Wed Feb 07 2007 Adam Tkac 31:9.3.4-5.fc7 +- bind-chroot-admin now uses correct chroot path (#227600) + +* Mon Feb 05 2007 Adam Tkac 31:9.3.4-4.fc7 +- fixed conflict between bind-sdb and ldap +- removed duplicated bind directory in bind-libs + +* Thu Feb 01 2007 Adam Tkac 31:9.3.4-3.fc7 +- fixed building without libbind +- fixed post section (selinux commands is now in if-endif statement) +- prever macro has been removed from version + +* Mon Jan 29 2007 Adam Tkac 31:9.3.4-2.fc7 +- redirected output from bind-chroot prep and %%preun stages to /dev/null + +* Thu Jan 25 2007 Adam Tkac 31:9.3.4-1.fc7 +- updated to version 9.3.4 which contains security bugfixes + +* Tue Jan 23 2007 Adam Tkac 31:9.3.3-5.fc7 +- package bind-libbind-devel has been marked as obsolete + +* Mon Jan 22 2007 Adam Tkac 31:9.3.3-4.fc7 +- package bind-libbind-devel has beed removed (libs has been moved to bind-devel & bind-libs) +- Resolves: #214208 + +* Tue Jan 16 2007 Martin Stransky - 31:9.3.3-3 +- fixed a multi-lib issue +- Resolves: rhbz#222717 + +* Thu Jan 4 2007 Martin Stransky - 31:9.3.3-2 +- added namedGetForwarders written in shell (#176100), + created by Baris Cicek . + +* Sun Dec 10 2006 Martin Stransky - 31:9.3.3-1 +- update to 9.3.3 final +- fix for #219069: file included twice in src.rpm + +* Wed Dec 6 2006 Martin Stransky - 31:9.3.3-0.1.rc3 +- added back an interval to restart +- renamed package, it should meet the N-V-R criteria +- fix for #216185: bind-chroot-admin able to change root mode 750 +- added fix from #215997: incorrect permissions on dnszone.schema +- added a notice to init script when /etc/named.conf doesn't exist (#216075) + +* Mon Oct 30 2006 Martin Stransky - 30:9.3.3-6 +- fix for #200465: named-checkzone and co. cannot be run as non-root user +- fix for #212348: chroot'd named causes df permission denied error +- fix for #211249, #211083 - problems with stopping named +- fix for #212549: init script does not unmount /proc filesystem +- fix for #211282: EDNS is globally enabled, crashing CheckPoint FW-1, + added edns-enable options to named configuration file which can suppress + EDNS in queries to DNS servers (see /usr/share/doc/bind-9.3.3/misc/options) +- fix for #212961: bind-chroot doesn't clean up its mess on %%preun +- update to 9.3.3rc3, removed already merged patches + +* Fri Oct 13 2006 Martin Stransky - 30:9.3.3-5 +- fix for #209359: bind-libs from compatlayer CD will not + install on ia64 + +* Tue Oct 10 2006 Martin Stransky - 30:9.3.3-4 +- added fix for #210096: warning: group named does not exist - using root + +* Thu Oct 5 2006 Martin Stransky - 30:9.3.3-3 +- added fix from #209400 - Bind Init Script does not create + the PID file always, created by Jeff Means +- added timeout to stop section of init script. + The default is 100 sec. and can be adjusted by NAMED_SHUTDOWN_TIMEOUT + shell variable. + +* Mon Oct 2 2006 Martin Stransky - 30:9.3.3-2 +- removed chcon from %%post script, replaced by restorecon + (Bug 202547, comment no. 37) + +* Fri Sep 15 2006 Martin Stransky - 30:9.3.3-1 +- updated to the latest upstream (9.3.3rc2) + +* Wed Sep 6 2006 Martin Stransky - 30:9.3.2-41 +- added upstream patch for correct SIG handling - CVE-2006-4095 + +* Tue Sep 5 2006 Martin Stransky - 30:9.3.2-40 +- suppressed messages from bind-chroot-admin +- cleared notes about bind-config + +* Tue Aug 22 2006 Martin Stransky - 30:9.3.2-39 +- added fix for #203522 - "bind-chroot-admin -e" command fails + +* Mon Aug 21 2006 Martin Stransky - 30:9.3.2-38 +- fix for #203194 - tmpfile usage + +* Thu Aug 17 2006 Martin Stransky - 30:9.3.2-37 +- fix for #202542 - /usr/sbin/bind-chroot-admin: No such file or directory +- fix for #202547 - file_contexts: invalid context + +* Fri Aug 11 2006 Martin Stransky - 30:9.3.2-36 +- added Provides: bind-config + +* Fri Aug 11 2006 Martin Stransky - 30:9.3.2-35 +- fix bug 197493: renaming subpackage bind-config to caching-nameserver + +* Mon Jul 24 2006 Jason Vas Dias - 30:9.3.2-34 +- fix bug 199876: make '%%exclude libbbind.*' conditional on %%{LIBBIND} + +* Mon Jul 24 2006 Florian La Roche - 30:9.3.2-33 +- fix #195881, perms are not packaged correctly + +* Fri Jul 21 2006 Jason Vas Dias - 30:9.3.2-32 +- fix addenda to bug 189789: + determination of selinux enabled was still not 100% correct in bind-chroot-admin +- fix addenda to bug 196398: + make named.init test for NetworkManager being enabled AFTER testing for -D absence; + named.init now supports a 'DISABLE_NAMED_DBUS' /etc/sysconfig/named setting to disable + auto-enable of named dbus support if NetworkManager enabled. + +* Wed Jul 19 2006 Jason Vas Dias - 30:9.3.2-30 +- fix bug 196398 - Enable -D option automatically in initscript + if NetworkManager enabled in any runlevel. +- fix namedGetForwarders for new dbus +- fix bug 195881 - libbind.so should be owned by bind-libbind-devel + +* Wed Jul 19 2006 Matthias Clasen - 30:9.3.2-28.FC6 +- Rebuild against new dbus + +* Wed Jul 12 2006 Jason Vas Dias - 30:9.3.2-27.FC6 +- rebuild with fixed glibc-kernheaders + +* Wed Jul 12 2006 Jesse Keating - 30:9.3.2-26.FC6.1 +- rebuild + +* Wed Jun 14 2006 Jason Vas Dias - 30:9.3.2-26.FC6 +- fix bugs 191093, 189789 +- backport selected fixes from upstream bind9 'v9_3_3b1' CVS version: + ( see http://www.isc.org/sw/bind9.3.php "Fixes" ): + o change 2024 / bug 16027: + named emitted spurious "zone serial unchanged" messages on reload + o change 2013 / bug 15941: + handle unexpected TSIGs on unsigned AXFR/IXFR responses more gracefully + o change 2009 / bug 15808: coverity fixes + o change 1997 / bug 15818: + named was failing to replace negative cache entries when a positive one + for the type was learnt + o change 1994 / bug 15694: OpenSSL 0.9.8 support + o change 1991 / bug 15813: + The configuration data, once read, should be treated as readonly. + o misc. validator fixes + o misc. resolver fixes + o misc. dns fixes + o misc. isc fixes + o misc. libbind fixes + o misc. isccfg fix + o misc. lwres fix + o misc. named fixes + o misc. dig fixes + o misc. nsupdate fix + o misc. tests fixes + +* Wed Jun 7 2006 Jeremy Katz - 30:9.3.2-24.FC6 +- and actually put the devel symlinks in the right subpackage + +* Thu May 25 2006 Jeremy Katz - 30:9.3.2-23.FC6 +- rebuild for -devel deps + +* Tue Apr 18 2006 Jason Vas Dias - 30:9.3.2-22 +- apply upstream patch for ncache_adderesult segfault bug 173961 addenda +- fix bug 188382: rpm --verify permissions inconsistencies +- fix bug 189186: use /sbin/service instead of initscript +- rebuild for new gcc, glibc-kernheaders + +* Tue Apr 04 2006 Jason Vas Dias - 30:9.3.2-20 +- fix resolver.c ncache_adderesult segfault reported in addenda to bug 173961 + (upstream bugs #15642, #15528 ?) +- allow named ability to generate core dumps after setuid (upstream bug #15753) + +* Mon Apr 03 2006 Jason Vas Dias - 30:9.3.2-18 +- fix bug 187529: make bind-chroot-admin deal with subdirectories properly + +* Thu Mar 30 2006 Jason Vas Dias - 30:9.3.2-16 +- fix bug 187286: + prevent host(1) printing duplicate 'is an alias for' messages + for the default AAAA and MX lookups as well as for the A lookup + (it now uses the CNAME returned for the A lookup for the AAAA and MX lookups). + This is upstream bug #15702 fixed in the unreleased bind-9.3.3 +- fix bug 187333: fix SOURCE24 and SOURCE25 transposition + +* Wed Mar 29 2006 Jason Vas Dias - 30:9.3.2-14 +- fix bug 186577: remove -L/usr/lib from libbind.pc and more .spec file cleanup +- add '%%doc' sample configuration files in /usr/share/doc/bind*/sample +- rebuild with new gcc and glibc + +* Wed Mar 22 2006 Jason Vas Dias - 30:9.3.2-12 +- fix typo in initscript +- fix Requires(post): policycoreutils in sub-packages + +* Mon Mar 20 2006 Jason Vas Dias - 30.9.3.2-10 +- fix bug 185969: more .spec file cleanup + +* Wed Mar 08 2006 Jason Vas Dias - 30.9.3.2-8 +- Do not allow package to be installed if named:25 userid creation fails +- Give libbind a pkg-config file +- remove restorecon from bind-chroot-admin (not required). +- fix named.caching-nameserver.conf (listen-on-v6 port 53 { ::1 };) + +* Tue Mar 07 2006 Jason Vas Dias - 30:9.3.2-7 +- fix issues with bind-chroot-admin + +* Mon Mar 06 2006 Jason Vas Dias - 30:9.3.2-6 +- replace caching-nameserver with bind-config sub-package +- fix bug 177595: handle case where $ROOTDIR is a link in initscript +- fix bug 177001: bind-config creates symlinks OK now +- fix bug 176388: named.conf is now never replaced by any RPM +- fix bug 176248: remove unecessary creation of rpmsave links +- fix bug 174925: no replacement of named.conf +- fix bug 173963: existing named.conf never modified +- major .spec file cleanup + +* Fri Feb 10 2006 Jesse Keating - 30:9.3.2-4.1 +- bump again for double-long bug on ppc(64) + +* Tue Feb 07 2006 Jason Vas Dias - 30:9.3.2-4 +- regenerate redhat_doc patch for non-DBUS builds +- allow dbus builds to work with dbus version < 0.6 (bz #179816) + +* Tue Feb 07 2006 Florian La Roche 30:9.3.2-3 +- try supporting without dbus support + +* Mon Feb 06 2006 Jason Vas Dias - 30:9.3.2-2.1 +- Rebuild for new gcc, glibc, glibc-kernheaders + +* Mon Jan 16 2006 Jason Vas Dias - 30:9.3.2-2 +- fix bug 177854: temporary fix for broken kernel-2.6.15-1854+ + /proc/net/if_inet6 format + +* Wed Dec 21 2005 Jason Vas Dias - 30:9.3.2-1 +- Upgrade to 9.3.2, released today + +* Tue Dec 20 2005 Jason Vas Dias - 28:9.3.2rc1-2 +- fix bug 176100: do not Require: perl just for namedGetForwarders ! + +* Fri Dec 09 2005 Jesse Keating +- rebuilt + +* Fri Dec 02 2005 Jason Vas Dias - 28:9.3.2rc-1 +- Upgrade to upstream version 9.3.2rc1 +- fix namedSetForwarders -> namedGetForwarders SOURCE14 typo + +* Thu Dec 01 2005 Jason Vas Dias - 24:9.3.1-26 +- rebuild for new dbus 0.6 dependency; remove use of + DBUS_NAME_FLAG_PROHIBIT_REPLACEMENT + +* Wed Nov 23 2005 Jason Vas Dias - 24:9.3.1-24 +- allow D-BUS support to work in bind-chroot environment: + workaround latest selinux policy by mounting /var/run/dbus/ + under chroot instead of /var/run/dbus/system-bus-socket + +* Sun Nov 13 2005 Jason Vas Dias - 24:9.3.1-22 +- fix bug 172632 - remove .la files +- ship namedGetForwarders and namedSetForwarders scripts +- fix detection of -D option in chroot + +* Tue Nov 8 2005 Tomas Mraz - 24:9.3.1-21 +- rebuilt with new openssl + +* Wed Oct 19 2005 Jason Vas Dias - 24.9.3.1-20 +- Allow the -D enable D-BUS option to be used within bind-chroot . +- fix bug 171226: supply some documentation for pgsql SDB . + +* Thu Oct 06 2005 Jason Vas Dias - 24:9.3.1-18 +- fix bug 169969: do NOT call dbus_svc_dispatch() in dbus_mgr_init_dbus() - + task->state != task_ready and will cause Abort in task.c if process + is waiting for NameOwnerChanged to do a SetForwarders + +* Wed Oct 05 2005 Jason Vas Dias - 24:9.3.1-16 +- Fix reconnecting to dbus-daemon after it stops & restarts . + +* Tue Sep 27 2005 Jason Vas Dias - 24:9.3.1-14 +- When forwarder nameservers are changed with D-BUS, flush the cache. + +* Mon Sep 26 2005 Jason Vas Dias - 24:9.3.1-12 +- fix bug 168302: use %%{__cc} for compiling dns-keygen +- fix bug 167682: bind-chroot directory permissions +- fix issues with -D dbus option when dbus service not running or disabled + +* Tue Aug 30 2005 Jason Vas Dias - 24:9.3.1-12 +- fix bug 167062: named should be started after syslogd by default + +* Mon Aug 22 2005 Jason Vas Dias - 24:9.3.1-11 +- fix bug 166227: host: don't do default AAAA and MX lookups with '-t a' option + +* Tue Aug 16 2005 Jason Vas Dias - 24:9.3.1-10 +- Build with D-BUS patch by default; D-BUS support enabled with named -D option +- Enable D-BUS for named_sdb also +- fix sdb pgsql's zonetodb.c: must use isc_hash_create() before dns_db_create() +- update fix for bug 160914 : test for RD=1 and ARCOUNT=0 also before trying next server +- fix named.init script to handle named_sdb properly +- fix named.init script checkconfig() to handle named '-c' option + and make configtest, test, check configcheck synonyms + +* Tue Jul 19 2005 Jason Vas Dias - 24:9.3.1-8 +- fix named.init script bugs 163598, 163409, 151852(addendum) + +* Tue Jul 12 2005 Jason Vas Dias - 24:9.3.1-7 +- fix bug 160914: resolver utilities should try next server on empty referral + (now that glibc bug 162625 is fixed) + host and nslookup now by default try next server on SERVFAIL + (host now has '-s' option to disable, and nslookup given + '[no]fail' option similar to dig's [no]fail option). +- rebuild and re-test with new glibc & gcc (all tests passed). + +* Tue May 31 2005 Jason Vas Dias - 24:9.3.1-6 +- fix bug 157950: dig / host / nslookup should reject invalid resolv.conf + files and not use uninitialized garbage nameserver values + (ISC bug 14841 raised). + +* Mon May 23 2005 Jason Vas Dias - 24:9.3.1-4_FC4 +- Fix SDB LDAP + +* Mon May 16 2005 Jason Vas Dias - 24:9.3.1-4 +- Fix bug 157601: give named.init a configtest function +- Fix bug 156797: named.init should check SELinux booleans.local before booleans +- Fix bug 154335: if no controls in named.conf, stop named with -TERM sig, not rndc +- Fix bug 155848: add NOTES section to named.8 man-page with info on all Red Hat + BIND quirks and SELinux DDNS / slave zone file configuration +- D-BUS patches NOT applied until dhcdbd is in FC + +* Sun May 15 2005 Jason Vas Dias - 24:9.3.1-4_dbus +- Enhancement to allow dynamic forwarder table management and +- DHCP forwarder auto-configuration with D-BUS + +* Thu Apr 14 2005 Jason Vas Dias - 24:9.3.1-2_FC4 +- Rebuild for bind-sdb libpq.so.3 dependency +- fix bug 150981: don't install libbind man-pages if no libbind +- fix bug 151852: mount proc on $ROOTDIR/proc to allow sysconf(...) + to work and correct number of CPUs to be determined + +* Fri Mar 11 2005 Jason Vas Dias - 24:9.3.1-1_FC4 +- Upgrade to ISC BIND 9.3.1 (final release) released today. + +* Wed Mar 9 2005 Jason Vas Dias - 22.9.3.1rc1-5 +- fix bug 150288: h_errno not being accessed / set correctly in libbind +- add libbind man-pages from bind-8.4.6 + +* Mon Mar 7 2005 Jason Vas Dias - 22:9.3.1rc1-4 +- Rebuild with gcc4 / glibc-2.3.4-14. + +* Tue Mar 1 2005 Nalin Dahyabhai - 22:9.3.1rc1-3 +- configure with --with-pic to get PIC libraries + +* Sun Feb 20 2005 Jason Vas Dias - 22:9.3.1rc1-2 +- fix bug 149183: don't use getifaddrs() . + +* Wed Feb 16 2005 Jason Vas Dias - 22:9.3.1rc1-1 +- Upgrade to 9.3.1rc1 +- Add Simplified Database Backend (SDB) sub-package ( bind-sdb ) +- add named_sdb - ldap + pgsql + dir database backend support with +- 'ENABLE_SDB' named.sysconfig option +- Add BIND resolver library & includes sub-package ( libbind-devel) +- fix bug 147824 / 147073 / 145664: ENABLE_ZONE_WRITE in named.init +- fix bug 146084 : shutup restorecon + +* Tue Jan 11 2005 Jason Vas Dias - 22:9.3.0-2 +- Fix bug 143438: named.init will now make correct ownership of $ROOTDIR/var/named +- based on 'named_write_master_zones' SELinux boolean. +- Fix bug 143744: dig & nsupdate IPv6 timeout (dup of 140528) + +* Mon Nov 29 2004 Jason Vas Dias - 9.3.0-1 +- Upgrade BIND to 9.3.0 in Rawhide / FC4 (bugs 134529, 133654...) + +* Mon Nov 29 2004 Jason Vas Dias - 20:9.2.4-4 +- Fix bugs 140528 and 141113: +- 2 second timeouts when IPv6 not configured and root nameserver's +- AAAA addresses are queried + +* Mon Oct 18 2004 Jason Vas Dias - 20:9.2.4-2 +- Fix bug 136243: bind-chroot %%post must run restorecon -R %%{prefix} +- Fix bug 135175: named.init must return non-zero if named is not run +- Fix bug 134060: bind-chroot %%post must use mktemp, not /tmp/named +- Fix bug 133423: bind-chroot %%files entries should have been %%dirs + +* Thu Sep 23 2004 Jason Vas Dias - 20:9.2.4-1 +- BIND 9.2.4 (final release) released - source code actually +- identical to 9.2.4rc8, with only version number change. + +* Mon Sep 20 2004 Jason Vas Dias - 10:9.2.4rc8-14 +- Upgrade to upstream bind-9.2.4rc8 . +- Progress: Finally! Hooray! ISC bind now distributes: +- o named.conf(5) and nslookup(8) manpages +- 'bind-manpages.bz2' source can now disappear +- (could this have something to do with ISC bug I raised about this?) +- o 'deprecation_msg' global has vanished +- bind-9.2.3rc3-deprecation_msg_shut_up.diff.bz2 can disappear + +* Mon Sep 20 2004 Jason Vas Dias - 10:9.2.4rc8-14 +- Fix bug 106572/132385: copy /etc/localtime to chroot on start + +* Fri Sep 10 2004 Jason Vas Dias - 10:9.2.4rc7-12_EL3 +- Fix bug 132303: if ROOTDIR line was replaced after upgrade from +- bind-chroot-9.2.2-21, restart named + +* Wed Sep 8 2004 Jason Vas Dias - 10:9.2.4rc7-11_EL3 +- Fix bug 131803: replace ROOTDIR line removed by broken +- bind-chroot 9.2.2-21's '%%postun'; added %%triggerpostun for bind-chroot + +* Tue Sep 7 2004 Jason Vas Dias - 10:9.2.4rc7-10_EL3 +- Fix bugs 130121 & 130981 for RHEL-3 + +* Mon Aug 30 2004 Jason Vas Dias - 10:9.2.4rc7-10 +- Fix bug 130121: add '%%ghost' entries for files included in previous +- bind-chroot & not in current - ie. named.conf, rndc.key, dev/* - +- that RPM removed after upgrade . + +* Thu Aug 26 2004 Jason Vas Dias +- Fix bug 130981: add '-t' option to named-checkconf invocation in +- named.init if chroot installed. + +* Wed Aug 25 2004 Jason Vas Dias +- Remove resolver(5) manpage now in man-pages (bug 130792); +- Don't create /dev/ entries in bind-chroot if already there (bug 127556); +- fix bind-devel Requires (bug 130919) +- Set default location for dumpdb & stats files to /var/named/data + +* Tue Aug 24 2004 Jason Vas Dias +- Fix devel Requires for bug 130738 & fix version + +* Tue Aug 24 2004 Jason Vas Dias +- Fix errors on clean install if named group does not exist +- (bug 130777) + +* Thu Aug 19 2004 Jason Vas Dias +- Upgrade to bind-9.2.4rc7; applied initscript fix +- for bug 102035. + +* Mon Aug 9 2004 Jason Vas Dias +- Fixed bug 129289: bind-chroot install / deinstall +- on install, existing config files 'safe_replace'd +- with links to chroot copies; on uninstall, moved back. + +* Fri Aug 6 2004 Jason Vas Dias +- Fixed bug 129258: "${prefix}/var/tmp" typo in spec + +* Wed Jul 28 2004 Jason Vas Dias +- Fixed bug 127124 : 'Requires: kernel >= 2.4' +- causes problems with Linux VServers + +* Tue Jul 27 2004 Jason Vas Dias +- Fixed bug 127555 : chroot tar missing var/named/slaves + +* Fri Jul 16 2004 Jason Vas Dias +- Upgraded to ISC version 9.2.4rc6 + +* Fri Jul 16 2004 Jason Vas Dias +- Fixed named.init generation of error messages on +- 'service named stop' and 'service named reload' +- as per bug 127775 + +* Wed Jun 23 2004 Daniel Walsh 9.2.3-19 +- Bump for rhel 3.0 U3 + +* Wed Jun 23 2004 Daniel Walsh 9.2.3-18 +- remove disable-linux-caps + +* Wed Jun 16 2004 Daniel Walsh 9.2.3-17 +- Update RHEL3 to latest bind + +* Tue Jun 15 2004 Elliot Lee +- rebuilt + +* Tue Jun 8 2004 Daniel Walsh 9.2.3-15 +- Remove device files from chroot, Named uses the system one + +* Fri Mar 26 2004 Daniel Walsh 9.2.3-14 +- Move RFC to devel package + +* Fri Mar 26 2004 Daniel Walsh 9.2.3-13 +- Fix location of restorecon + +* Thu Mar 25 2004 Daniel Walsh 9.2.3-12 +- Tighten security on config files. Should be owned by root + +* Thu Mar 25 2004 Daniel Walsh 9.2.3-11 +- Update key patch to include conf-keygen + +* Tue Mar 23 2004 Daniel Walsh 9.2.3-10 +- fix chroot to only happen once. +- fix init script to do kill insteall of killall + +* Mon Mar 15 2004 Daniel Walsh 9.2.3-9 +- Add fix for SELinux security context + +* Tue Mar 02 2004 Elliot Lee +- rebuilt + +* Sat Feb 28 2004 Florian La Roche +- run ldconfig for libs subrpm + +* Mon Feb 23 2004 Tim Waugh +- Use ':' instead of '.' as separator for chown. + +* Tue Feb 17 2004 Daniel Walsh 9.2.3-7 +- Add COPYRIGHT + +* Fri Feb 13 2004 Elliot Lee +- rebuilt + +* Tue Dec 30 2003 Daniel Walsh 9.2.3-5 +- Add defattr to libs + +* Mon Dec 29 2003 Daniel Walsh 9.2.3-4 +- Break out library package + +* Mon Dec 22 2003 Daniel Walsh 9.2.3-3 +- Fix condrestart + +* Wed Nov 12 2003 Daniel Walsh 9.2.3-2 +- Move libisc and libdns to bind from bind-util + +* Tue Nov 11 2003 Daniel Walsh 9.2.3-1 +- Move to 9.2.3 + +* Mon Oct 27 2003 Daniel Walsh 9.2.2.P3-10 +- Add PIE support + +* Fri Oct 17 2003 Daniel Walsh 9.2.2.P3-9 +- Add /var/named/slaves directory + +* Sun Oct 12 2003 Florian La Roche +- do not link against libnsl, not needed for Linux + +* Wed Oct 8 2003 Daniel Walsh 9.2.2.P3-6 +- Fix local time in log file + +* Tue Oct 7 2003 Daniel Walsh 9.2.2.P3-5 +- Try again + +* Mon Oct 6 2003 Daniel Walsh 9.2.2.P3-4 +- Fix handling of chroot -/dev/random + +* Thu Oct 2 2003 Daniel Walsh 9.2.2.P3-3 +- Stop hammering stuff on update of chroot environment + +* Mon Sep 29 2003 Daniel Walsh 9.2.2.P3-2 +- Fix chroot directory to grab all subdirectories + +* Wed Sep 24 2003 Daniel Walsh 9.2.2.P3-1 +- New patch to support for "delegation-only" + +* Wed Sep 17 2003 Daniel Walsh 9.2.2-23 +- patch support for "delegation-only" + +* Wed Jul 30 2003 Daniel Walsh 9.2.2-22 +- Update to build on RHL + +* Wed Jul 30 2003 Daniel Walsh 9.2.2-21 +- Install libraries as exec so debug info will be pulled + +* Sat Jul 19 2003 Daniel Walsh 9.2.2-20 +- Remove BSDCOMPAT (BZ 99454) + +* Tue Jul 15 2003 Daniel Walsh 9.2.2-19 +- Update to build on RHL + +* Tue Jul 15 2003 Daniel Walsh 9.2.2-18 +- Change protections on /var/named and /var/chroot/named + +* Tue Jun 17 2003 Daniel Walsh 9.2.2-17 +- Update to build on RHL + +* Tue Jun 17 2003 Daniel Walsh 9.2.2-16 +- Update to build on RHEL + +* Wed Jun 04 2003 Elliot Lee +- rebuilt + +* Tue Apr 22 2003 Daniel Walsh 9.2.2-14 +- Update to build on RHEL + +* Tue Apr 22 2003 Daniel Walsh 9.2.2-13 +- Fix config description of named.conf in chroot +- Change named.init script to check for existence of /etc/sysconfig/network + +* Fri Apr 18 2003 Daniel Walsh 9.2.2-12 +- Update to build on RHEL + +* Fri Apr 18 2003 Daniel Walsh 9.2.2-11 +- Update to build on RHEL + +* Fri Apr 18 2003 Daniel Walsh 9.2.2-10 +- Fix echo OK on starting/stopping service + +* Fri Mar 28 2003 Daniel Walsh 9.2.2-9 +- Update to build on RHEL + +* Fri Mar 28 2003 Daniel Walsh 9.2.2-8 +- Fix echo on startup + +* Tue Mar 25 2003 Daniel Walsh 9.2.2-7 +- Fix problems with chroot environment +- Eliminate posix threads + +* Mon Mar 24 2003 Daniel Walsh 9.2.2-6 +- Fix build problems + +* Fri Mar 14 2003 Daniel Walsh 9.2.2-5 +- Fix build on beehive + +* Thu Mar 13 2003 Daniel Walsh 9.2.2-4 +- build bind-chroot kit + +* Tue Mar 11 2003 Daniel Walsh 9.2.2-3 +- Change configure to use proper threads model + +* Fri Mar 7 2003 Daniel Walsh 9.2.2-2 +- update to 9.2.2 + +* Tue Mar 4 2003 Daniel Walsh 9.2.2-1 +- update to 9.2.2 + +* Fri Jan 24 2003 Daniel Walsh 9.2.1-16 +- Put a sleep in restart to make sure stop completes + +* Wed Jan 22 2003 Tim Powers +- rebuilt + +* Tue Jan 7 2003 Daniel Walsh 9.2.1-14 +- Separate /etc/rndc.key to separate file + +* Tue Jan 7 2003 Nalin Dahyabhai 9.2.1-13 +- Use openssl's pkgconfig data, if available, at build-time. + +* Mon Jan 6 2003 Daniel Walsh 9.2.1-12 +- Fix log rotate to use service named reload +- Change service named reload to give success/failure message [73770] +- Fix File checking [75710] +- Begin change to automatically run in CHROOT environment + +* Tue Dec 24 2002 Daniel Walsh 9.2.1-10 +- Fix startup script to work like all others. + +* Mon Dec 16 2002 Daniel Walsh 9.2.1-9 +- Fix configure to build on x86_64 platforms + +* Wed Aug 07 2002 Karsten Hopp +- fix #70583, doesn't build on IA64 + +* Tue Jul 30 2002 Karsten Hopp 9.2.1-8 +- bind-utils shouldn't require bind + +* Mon Jul 22 2002 Karsten Hopp 9.2.1-7 +- fix name of pidfine in logrotate script (#68842) +- fix owner of logfile in logrotate script (#41391) +- fix nslookup and named.conf man pages (output on stderr) + (#63553, #63560, #63561, #54889, #57457) +- add rfc1912 (#50005) +- gzip all rfc's +- fix typo in keygen.c (#54870) +- added missing manpages (#64065) +- shutdown named properly with rndc stop (#62492) +- /sbin/nologin instead of /bin/false (#68607) +- move nsupdate to bind-utils (where the manpage already was) (#66209, #66381) +- don't kill initscript when rndc fails (reload) (#58750) + + +* Mon Jun 24 2002 Bernhard Rosenkraenzer 9.2.1-5 +- Fix #65975 + +* Fri Jun 21 2002 Tim Powers +- automated rebuild + +* Thu May 23 2002 Tim Powers +- automated rebuild + +* Thu May 9 2002 Bernhard Rosenkraenzer 9.2.1-2 +- Move libisccc, lib isccfg and liblwres from bind-utils to bind, + they're not required if you aren't running a nameserver. + +* Fri May 03 2002 Florian La Roche +- update to 9.2.1 release + +* Thu Mar 14 2002 Bernhard Rosenkraenzer 9.2.0-8 +- Merge 30+ bug fixes from 9.2.1rc1 code + +* Mon Mar 11 2002 Bernhard Rosenkraenzer 9.2.0-7 +- Don't exit if /etc/named.conf doesn't exist if we're running + chroot (#60868) +- Revert Elliot's changes, we do require specific glibc/glibc-kernheaders + versions or bug #58335 will be back. "It compiles, therefore it works" + isn't always true. + +* Thu Feb 28 2002 Elliot Lee 9.2.0-6 +- Fix BuildRequires (we don't need specific glibc/glibc-kernheaders +versions). +- Use _smp_mflags + +* Wed Feb 20 2002 Bernhard Rosenkraenzer 9.2.0-4 +- rebuild, require recent autoconf, automake (#58335) + +* Fri Jan 25 2002 Tim Powers +- rebuild against new libssl + +* Wed Jan 09 2002 Tim Powers +- automated rebuild + +* Tue Nov 27 2001 Bernhard Rosenkraenzer 9.2.0-1 +- 9.2.0 + +* Thu Nov 22 2001 Bernhard Rosenkraenzer 9.2.0-0.rc10.2 +- 9.2.0rc10 + +* Mon Nov 5 2001 Bernhard Rosenkraenzer 9.2.0-0.rc8.2 +- Fix up rndc.conf (#55574) + +* Thu Oct 25 2001 Bernhard Rosenkraenzer 9.2.0-0.rc8.1 +- rc8 +- Enforce --enable-threads + +* Mon Oct 22 2001 Bernhard Rosenkraenzer 9.2.0-0.rc7.1 +- 9.2.0rc7 +- Use rndc status for "service named status", it's supposed to actually + work in 9.2.x. + +* Wed Oct 3 2001 Bernhard Rosenkraenzer 9.2.0-0.rc5.1 +- 9.2.0rc5 +- Fix rpm --rebuild with ancient libtool versions (#53938, #54257) + +* Tue Sep 25 2001 Bernhard Rosenkraenzer 9.2.0-0.rc4.1 +- 9.2.0rc4 + +* Fri Sep 14 2001 Bernhard Rosenkraenzer 9.2.0-0.rc3.1 +- 9.2.0rc3 +- remove ttl patch, I don't think we need this for 8.0. +- remove dig.1.bz2 from the bind8-manpages tar file, 9.2 has a new dig man page +- add lwres* man pages to -devel + +* Mon Sep 3 2001 Bernhard Rosenkraenzer 9.1.3-4 +- Make sure /etc/rndc.conf isn't world-readable even after the + %%post script inserted a random key (#53009) + +* Thu Jul 19 2001 Bernhard Rosenkraenzer 9.1.3-3 +- Add build dependencies (#49368) +- Make sure running service named start several times doesn't create + useless processes (#47596) +- Work around the named parent process returning 0 even if the config + file is broken (it's parsed later by the child processes) (#45484) + +* Mon Jul 16 2001 Bernhard Rosenkraenzer 9.1.3-2 +- Don't use rndc status, it's not yet implemented (#48839) + +* Sun Jul 08 2001 Florian La Roche +- update to 9.1.3 release + +* Tue Jul 3 2001 Bernhard Rosenkraenzer 9.1.3-0.rc3.1 +- Fix up rndc configuration and improve security (#46586) + +* Tue Jun 26 2001 Bernhard Rosenkraenzer 9.1.3-0.rc2.2 +- Sync with caching-nameserver-7.1-6 + +* Mon Jun 25 2001 Bernhard Rosenkraenzer 9.1.3-0.rc2.1 +- Update to rc2 + +* Fri Jun 1 2001 Bernhard Rosenkraenzer 9.1.3-0.rc1.3 +- Remove resolv.conf(5) man page, it's now in man-pages + +* Thu May 31 2001 Bernhard Rosenkraenzer 9.1.3-0.rc1.2 +- Add named.conf man page from bind 8.x (outdated, but better than nothing, + #42732) +- Rename the rndc key (#42895) +- Add dnssec* man pages + +* Mon May 28 2001 Bernhard Rosenkraenzer 9.1.3-0.rc1.1 +- 9.1.3rc1 +- s/Copyright/License/ + +* Mon May 7 2001 Bernhard Rosenkraenzer 9.1.2-1 +- 9.1.2 final. No changes between 9.1.2-0.rc1.1 and this one, except for + the version number, though. + +* Thu May 3 2001 Bernhard Rosenkraenzer 9.1.2-0.rc1.1 +- 9.1.2rc1 + +* Thu Mar 29 2001 Bernhard Rosenkraenzer 9.1.1-1 +- 9.1.1 + +* Thu Mar 15 2001 Bernhard Rosenkraenzer 9.1.0-10 +- Merge fixes from 9.1.1rc5 + +* Sun Mar 11 2001 Bernhard Rosenkraenzer 9.1.0-9 +- Work around bind 8 -> bind 9 migration problem when using buggy zone files: + accept zones without a TTL, but spew out a big fat warning. (#31393) + +* Thu Mar 8 2001 Bernhard Rosenkraenzer +- Add fixes from rc4 + +* Fri Mar 2 2001 Nalin Dahyabhai +- rebuild in new environment + +* Thu Mar 1 2001 Bernhard Rosenkraenzer +- killall -HUP named if rndc reload fails (#30113) + +* Tue Feb 27 2001 Bernhard Rosenkraenzer +- Merge some fixes from 9.1.1rc3 + +* Tue Feb 20 2001 Bernhard Rosenkraenzer +- Don't use the standard rndc key from the documentation, instead, create a random one + at installation time (#26358) +- Make /etc/rndc.conf readable by user named only, it contains secret keys + +* Tue Feb 20 2001 Bernhard Rosenkraenzer +- 9.1.1 probably won't be out in time, revert to 9.1.0 and apply fixes + from 9.1.1rc2 +- bind requires bind-utils (#28317) + +* Tue Feb 13 2001 Bernhard Rosenkraenzer +- Update to rc2, fixes 2 more bugs +- Fix build with glibc >= 2.2.1-7 + +* Thu Feb 8 2001 Bernhard Rosenkraenzer +- Update to 9.1.1rc1; fixes 17 bugs (14 of them affecting us; + 1 was fixed in a Red Hat patch already, 2 others are portability + improvements) + +* Wed Feb 7 2001 Bernhard Rosenkraenzer +- Remove initscripts 5.54 requirement (#26489) + +* Mon Jan 29 2001 Bernhard Rosenkraenzer +- Add named-checkconf, named-checkzone (#25170) + +* Mon Jan 29 2001 Trond Eivind Glomsrod +- use echo, not gprintf + +* Wed Jan 24 2001 Bernhard Rosenkraenzer +- Fix problems with $GENERATE + Patch from Daniel Roesen + Bug #24890 + +* Thu Jan 18 2001 Bernhard Rosenkraenzer +- 9.1.0 final + +* Sat Jan 13 2001 Bernhard Rosenkraenzer +- 9.1.0rc1 +- i18nify init script +- bzip2 source to save space + +* Thu Jan 11 2001 Bernhard Rosenkraenzer +- Fix %%postun script + +* Tue Jan 9 2001 Bernhard Rosenkraenzer +- 9.1.0b3 + +* Mon Jan 8 2001 Bernhard Rosenkraenzer +- Add named.conf man page from bind8 (#23503) + +* Sun Jan 7 2001 Bernhard Rosenkraenzer +- Make /etc/rndc.conf and /etc/sysconfig/named noreplace +- Make devel require bind = %%{version} rather than just bind + +* Sun Jan 7 2001 Bernhard Rosenkraenzer +- Fix init script for real + +* Sat Jan 6 2001 Bernhard Rosenkraenzer +- Fix init script when ROOTDIR is not set + +* Thu Jan 4 2001 Bernhard Rosenkraenzer +- Add hooks for setting up named to run chroot (RFE #23246) +- Fix up requirements + +* Fri Dec 29 2000 Bernhard Rosenkraenzer +- 9.1.0b2 + +* Wed Dec 20 2000 Bernhard Rosenkraenzer +- Move run files to /var/run/named/ - /var/run isn't writable + by the user we're running as. (Bug #20665) + +* Tue Dec 19 2000 Bernhard Rosenkraenzer +- Fix reverse lookups (#22272) +- Run ldconfig in %%post utils + +* Tue Dec 12 2000 Karsten Hopp +- fixed logrotate script (wrong path to kill) +- include header files in -devel package +- bugzilla #22049, #19147, 21606 + +* Fri Dec 8 2000 Bernhard Rosenkraenzer +- 9.1.0b1 (9.1.0 is in our timeframe and less buggy) + +* Mon Nov 13 2000 Bernhard Rosenkraenzer +- 9.0.1 + +* Mon Oct 30 2000 Bernhard Rosenkraenzer +- Fix initscript (Bug #19956) +- Add sample rndc.conf (Bug #19956) +- Fix build with tar 1.13.18 + +* Tue Oct 10 2000 Bernhard Rosenkraenzer +- Add some missing man pages (taken from bind8) (Bug #18794) + +* Sun Sep 17 2000 Bernhard Rosenkraenzer +- 9.0.0 final + +* Wed Aug 30 2000 Bernhard Rosenkraenzer +- rc5 +- fix up nslookup + +* Thu Aug 24 2000 Bernhard Rosenkraenzer +- rc4 + +* Thu Jul 13 2000 Bernhard Rosenkraenzer +- 9.0.0rc1 + +* Wed Jul 12 2000 Prospector +- automatic rebuild + +* Sun Jul 9 2000 Florian La Roche +- add "exit 0" for uninstall case + +* Fri Jul 7 2000 Florian La Roche +- add prereq init.d and cleanup install section + +* Fri Jun 30 2000 Trond Eivind Glomsrod +- fix the init script + +* Wed Jun 28 2000 Nalin Dahyabhai +- make libbind.a and nslookup.help readable again by setting INSTALL_LIB to "" + +* Mon Jun 26 2000 Bernhard Rosenkranzer +- Fix up the initscript (Bug #13033) +- Fix build with current glibc (Bug #12755) +- /etc/rc.d/init.d -> /etc/init.d +- use %%{_mandir} rather than /usr/share/man + +* Mon Jun 19 2000 Bill Nottingham +- fix conflict with man-pages +- remove compatibilty chkconfig links +- initscript munging + +* Wed Jun 14 2000 Nalin Dahyabhai +- modify logrotate setup to use PID file +- temporarily disable optimization by unsetting $RPM_OPT_FLAGS at build-time +- actually bump the release this time + +* Sun Jun 4 2000 Bernhard Rosenkraenzer +- FHS compliance + +* Mon Apr 17 2000 Nalin Dahyabhai +- clean up restart patch + +* Mon Apr 10 2000 Nalin Dahyabhai +- provide /var/named (fix for bugs #9847, #10205) +- preserve args when restarted via ndc(8) (bug #10227) +- make resolv.conf(5) a link to resolver(5) (bug #10245) +- fix SYSTYPE bug in all makefiles +- move creation of named user from %%post into %%pre + +* Mon Feb 28 2000 Bernhard Rosenkranzer +- Fix TTL (patch from ISC, Bug #9820) + +* Wed Feb 16 2000 Bernhard Rosenkranzer +- fix typo in spec (it's %%post, without a leading blank) introduced in -6 +- change SYSTYPE to linux + +* Fri Feb 11 2000 Bill Nottingham +- pick a standard < 100 uid/gid for named + +* Fri Feb 04 2000 Elliot Lee +- Pass named a '-u named' parameter by default, and add/remove user. + +* Thu Feb 3 2000 Bernhard Rosenkraenzer +- fix host mx bug (Bug #9021) + +* Mon Jan 31 2000 Cristian Gafton +- rebuild to fix dependencies +- man pages are compressed + +* Wed Jan 19 2000 Bernhard Rosenkraenzer +- It's /usr/bin/killall, not /usr/sbin/killall (Bug #8063) + +* Mon Jan 17 2000 Bernhard Rosenkraenzer +- Fix up location of named-bootconf.pl and make it executable + (Bug #8028) +- bind-devel requires bind + +* Mon Nov 15 1999 Bernhard Rosenkraenzer +- update to 8.2.2-P5 + +* Wed Nov 10 1999 Bill Nottingham +- update to 8.2.2-P3 + +* Tue Oct 12 1999 Cristian Gafton +- add patch to stop a cache only server from complaining about lame servers + on every request. + +* Fri Sep 24 1999 Preston Brown +- use real stop and start in named.init for restart, not ndc restart, it has + problems when named has changed during a package update... (# 4890) + +* Fri Sep 10 1999 Bill Nottingham +- chkconfig --del in %%preun, not %%postun + +* Mon Aug 16 1999 Bill Nottingham +- initscript munging + +* Mon Jul 26 1999 Bill Nottingham +- fix installed chkconfig links to match init file + +* Sat Jul 3 1999 Jeff Johnson +- conflict with new (in man-1.24) man pages (#3876,#3877). + +* Tue Jun 29 1999 Bill Nottingham +- fix named.logrotate (wrong %%SOURCE) + +* Fri Jun 25 1999 Jeff Johnson +- update to 8.2.1. +- add named.logrotate (#3571). +- hack around egcs-1.1.2 -m486 bug (#3413, #3485). +- vet file list. + +* Fri Jun 18 1999 Bill Nottingham +- don't run by default + +* Sun May 30 1999 Jeff Johnson +- nslookup fixes (#2463). +- missing files (#3152). + +* Sat May 1 1999 Stepan Kasal +- nslookup patched: + to count numRecords properly + to fix subsequent calls to ls -d + to parse "view" and "finger" commands properly + the view hack updated for bind-8 (using sed) + +* Wed Mar 31 1999 Bill Nottingham +- add ISC patch +- add quick hack to make host not crash +- add more docs + +* Fri Mar 26 1999 Cristian Gafton +- add probing information in the init file to keep linuxconf happy +- dont strip libbind + +* Sun Mar 21 1999 Cristian Gafton +- auto rebuild in the new build environment (release 3) + +* Wed Mar 17 1999 Preston Brown +- removed 'done' output at named shutdown. + +* Tue Mar 16 1999 Cristian Gafton +- version 8.2 + +* Wed Dec 30 1998 Cristian Gafton +- patch to use the __FDS_BITS macro +- build for glibc 2.1 + +* Wed Sep 23 1998 Jeff Johnson +- change named.restart to /usr/sbin/ndc restart + +* Sat Sep 19 1998 Jeff Johnson +- install man pages correctly. +- change K10named to K45named. + +* Wed Aug 12 1998 Jeff Johnson +- don't start if /etc/named.conf doesn't exist. + +* Sat Aug 8 1998 Jeff Johnson +- autmagically create /etc/named.conf from /etc/named.boot in %%post +- remove echo in %%post + +* Wed Jun 10 1998 Jeff Johnson +- merge in 5.1 mods + +* Sun Apr 12 1998 Manuel J. Galan +- Several essential modifications to build and install correctly. +- Modified 'ndc' to avoid deprecated use of '-' + +* Mon Dec 22 1997 Scott Lampert +- Used buildroot +- patched bin/named/ns_udp.c to use for include + on Redhat 5.0 instead of