Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package pdns for openSUSE:Factory checked in 
at 2023-10-25 18:04:23
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/pdns (Old)
 and      /work/SRC/openSUSE:Factory/.pdns.new.24901 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "pdns"

Wed Oct 25 18:04:23 2023 rev:90 rq:1118580 version:4.8.3

Changes:
--------
--- /work/SRC/openSUSE:Factory/pdns/pdns.changes        2023-06-01 
17:21:23.194824128 +0200
+++ /work/SRC/openSUSE:Factory/.pdns.new.24901/pdns.changes     2023-10-25 
18:05:03.822965173 +0200
@@ -1,0 +2,11 @@
+Wed Oct 18 10:59:55 UTC 2023 - Dominique Leuenberger <dims...@opensuse.org>
+
+- Update to version 4.8.3:
+  * New Feature: add default-catalog-zone setting.
+  + Improvements: smysql: stop explicitly setting
+    MYSQL_OPT_RECONNECT to .
+  + Bug Fix: ixfrdist: set AA=1 on SOA responses.
+For details, see
+https://doc.powerdns.com/authoritative/changelog/4.8.html#change-4.8.3
+
+-------------------------------------------------------------------

Old:
----
  pdns-4.8.0.tar.bz2
  pdns-4.8.0.tar.bz2.sig

New:
----
  pdns-4.8.3.tar.bz2
  pdns-4.8.3.tar.bz2.sig

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ pdns.spec ++++++
--- /var/tmp/diff_new_pack.PaAb9l/_old  2023-10-25 18:05:05.763030421 +0200
+++ /var/tmp/diff_new_pack.PaAb9l/_new  2023-10-25 18:05:05.763030421 +0200
@@ -57,7 +57,7 @@
 %endif
 
 Name:           pdns
-Version:        4.8.0
+Version:        4.8.3
 Release:        0
 Summary:        Authoritative-only nameserver
 License:        GPL-2.0-only

++++++ pdns-4.8.0.tar.bz2 -> pdns-4.8.3.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/configure new/pdns-4.8.3/configure
--- old/pdns-4.8.0/configure    2023-06-01 08:55:24.000000000 +0200
+++ new/pdns-4.8.3/configure    2023-10-05 11:22:42.000000000 +0200
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for pdns 4.8.0.
+# Generated by GNU Autoconf 2.69 for pdns 4.8.3.
 #
 #
 # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
@@ -587,8 +587,8 @@
 # Identity of this package.
 PACKAGE_NAME='pdns'
 PACKAGE_TARNAME='pdns'
-PACKAGE_VERSION='4.8.0'
-PACKAGE_STRING='pdns 4.8.0'
+PACKAGE_VERSION='4.8.3'
+PACKAGE_STRING='pdns 4.8.3'
 PACKAGE_BUGREPORT=''
 PACKAGE_URL=''
 
@@ -1666,7 +1666,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures pdns 4.8.0 to adapt to many kinds of systems.
+\`configure' configures pdns 4.8.3 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1737,7 +1737,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of pdns 4.8.0:";;
+     short | recursive ) echo "Configuration of pdns 4.8.3:";;
    esac
   cat <<\_ACEOF
 
@@ -2000,7 +2000,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-pdns configure 4.8.0
+pdns configure 4.8.3
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2759,7 +2759,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by pdns $as_me 4.8.0, which was
+It was created by pdns $as_me 4.8.3, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -3629,7 +3629,7 @@
 
 # Define the identity of the package.
  PACKAGE='pdns'
- VERSION='4.8.0'
+ VERSION='4.8.3'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -21755,11 +21755,11 @@
     CPPFLAGS="$LIBCRYPTO_INCLUDES $CPPFLAGS"
     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-#include <openssl/crypto.h>
+#include <openssl/bn.h>
 int
 main ()
 {
-ERR_load_CRYPTO_strings()
+BN_new()
   ;
   return 0;
 }
@@ -21780,7 +21780,12 @@
 fi
 done
 
-            ac_fn_cxx_check_decl "$LINENO" "EVP_PKEY_CTX_set1_scrypt_salt" 
"ac_cv_have_decl_EVP_PKEY_CTX_set1_scrypt_salt" "#include <openssl/kdf.h>
+            # you might be wondering why the stdarg.h and stddef.h includes,
+            # in which case please have a look at 
https://github.com/PowerDNS/pdns/issues/12926
+            # and weep, yelling at Red Hat
+            ac_fn_cxx_check_decl "$LINENO" "EVP_PKEY_CTX_set1_scrypt_salt" 
"ac_cv_have_decl_EVP_PKEY_CTX_set1_scrypt_salt" "#include <stdarg.h>
+                           #include <stddef.h>
+                           #include <openssl/kdf.h>
 "
 if test "x$ac_cv_have_decl_EVP_PKEY_CTX_set1_scrypt_salt" = xyes; then :
 
@@ -30146,7 +30151,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by pdns $as_me 4.8.0, which was
+This file was extended by pdns $as_me 4.8.3, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -30212,7 +30217,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; 
s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-pdns config.status 4.8.0
+pdns config.status 4.8.3
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/configure.ac new/pdns-4.8.3/configure.ac
--- old/pdns-4.8.0/configure.ac 2023-06-01 08:55:11.000000000 +0200
+++ new/pdns-4.8.3/configure.ac 2023-10-05 11:22:29.000000000 +0200
@@ -1,6 +1,6 @@
 AC_PREREQ([2.69])
 
-AC_INIT([pdns], [4.8.0])
+AC_INIT([pdns], [4.8.3])
 AC_CONFIG_AUX_DIR([build-aux])
 AM_INIT_AUTOMAKE([foreign dist-bzip2 no-dist-gzip tar-ustar -Wno-portability 
subdir-objects parallel-tests 1.11])
 AM_SILENT_RULES([yes])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/docs/calidns.1 
new/pdns-4.8.3/docs/calidns.1
--- old/pdns-4.8.0/docs/calidns.1       2023-06-01 08:56:59.000000000 +0200
+++ new/pdns-4.8.3/docs/calidns.1       2023-10-05 11:24:10.000000000 +0200
@@ -27,7 +27,7 @@
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "CALIDNS" "1" "Jun 01, 2023" "" "PowerDNS Authoritative Server"
+.TH "CALIDNS" "1" "Oct 05, 2023" "" "PowerDNS Authoritative Server"
 .SH NAME
 calidns \- A DNS recursor testing tool
 .SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/docs/dnsbulktest.1 
new/pdns-4.8.3/docs/dnsbulktest.1
--- old/pdns-4.8.0/docs/dnsbulktest.1   2023-06-01 08:57:00.000000000 +0200
+++ new/pdns-4.8.3/docs/dnsbulktest.1   2023-10-05 11:24:10.000000000 +0200
@@ -27,7 +27,7 @@
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "DNSBULKTEST" "1" "Jun 01, 2023" "" "PowerDNS Authoritative Server"
+.TH "DNSBULKTEST" "1" "Oct 05, 2023" "" "PowerDNS Authoritative Server"
 .SH NAME
 dnsbulktest \- A debugging tool for intermittent resolver failures
 .SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/docs/dnsgram.1 
new/pdns-4.8.3/docs/dnsgram.1
--- old/pdns-4.8.0/docs/dnsgram.1       2023-06-01 08:56:59.000000000 +0200
+++ new/pdns-4.8.3/docs/dnsgram.1       2023-10-05 11:24:10.000000000 +0200
@@ -27,7 +27,7 @@
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "DNSGRAM" "1" "Jun 01, 2023" "" "PowerDNS Authoritative Server"
+.TH "DNSGRAM" "1" "Oct 05, 2023" "" "PowerDNS Authoritative Server"
 .SH NAME
 dnsgram \- A debugging tool for intermittent resolver failures
 .SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/docs/dnspcap2calidns.1 
new/pdns-4.8.3/docs/dnspcap2calidns.1
--- old/pdns-4.8.0/docs/dnspcap2calidns.1       2023-06-01 08:56:59.000000000 
+0200
+++ new/pdns-4.8.3/docs/dnspcap2calidns.1       2023-10-05 11:24:10.000000000 
+0200
@@ -27,7 +27,7 @@
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "DNSPCAP2CALIDNS" "1" "Jun 01, 2023" "" "PowerDNS Authoritative Server"
+.TH "DNSPCAP2CALIDNS" "1" "Oct 05, 2023" "" "PowerDNS Authoritative Server"
 .SH NAME
 dnspcap2calidns \- A tool to convert PCAPs of DNS traffic to calidns input
 .SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/docs/dnspcap2protobuf.1 
new/pdns-4.8.3/docs/dnspcap2protobuf.1
--- old/pdns-4.8.0/docs/dnspcap2protobuf.1      2023-06-01 08:56:59.000000000 
+0200
+++ new/pdns-4.8.3/docs/dnspcap2protobuf.1      2023-10-05 11:24:10.000000000 
+0200
@@ -27,7 +27,7 @@
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "DNSPCAP2PROTOBUF" "1" "Jun 01, 2023" "" "PowerDNS Authoritative Server"
+.TH "DNSPCAP2PROTOBUF" "1" "Oct 05, 2023" "" "PowerDNS Authoritative Server"
 .SH NAME
 dnspcap2protobuf \- A tool to convert PCAPs of DNS traffic to PowerDNS Protobuf
 .SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/docs/dnsreplay.1 
new/pdns-4.8.3/docs/dnsreplay.1
--- old/pdns-4.8.0/docs/dnsreplay.1     2023-06-01 08:56:59.000000000 +0200
+++ new/pdns-4.8.3/docs/dnsreplay.1     2023-10-05 11:24:10.000000000 +0200
@@ -27,7 +27,7 @@
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "DNSREPLAY" "1" "Jun 01, 2023" "" "PowerDNS Authoritative Server"
+.TH "DNSREPLAY" "1" "Oct 05, 2023" "" "PowerDNS Authoritative Server"
 .SH NAME
 dnsreplay \- A PowerDNS nameserver debugging tool
 .SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/docs/dnsscan.1 
new/pdns-4.8.3/docs/dnsscan.1
--- old/pdns-4.8.0/docs/dnsscan.1       2023-06-01 08:56:59.000000000 +0200
+++ new/pdns-4.8.3/docs/dnsscan.1       2023-10-05 11:24:10.000000000 +0200
@@ -27,7 +27,7 @@
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "DNSSCAN" "1" "Jun 01, 2023" "" "PowerDNS Authoritative Server"
+.TH "DNSSCAN" "1" "Oct 05, 2023" "" "PowerDNS Authoritative Server"
 .SH NAME
 dnsscan \- List the amount of queries per qtype in a pcap
 .SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/docs/dnsscope.1 
new/pdns-4.8.3/docs/dnsscope.1
--- old/pdns-4.8.0/docs/dnsscope.1      2023-06-01 08:57:00.000000000 +0200
+++ new/pdns-4.8.3/docs/dnsscope.1      2023-10-05 11:24:10.000000000 +0200
@@ -27,7 +27,7 @@
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "DNSSCOPE" "1" "Jun 01, 2023" "" "PowerDNS Authoritative Server"
+.TH "DNSSCOPE" "1" "Oct 05, 2023" "" "PowerDNS Authoritative Server"
 .SH NAME
 dnsscope \- A PowerDNS nameserver debugging tool
 .SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/docs/dnstcpbench.1 
new/pdns-4.8.3/docs/dnstcpbench.1
--- old/pdns-4.8.0/docs/dnstcpbench.1   2023-06-01 08:56:59.000000000 +0200
+++ new/pdns-4.8.3/docs/dnstcpbench.1   2023-10-05 11:24:10.000000000 +0200
@@ -27,7 +27,7 @@
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "DNSTCPBENCH" "1" "Jun 01, 2023" "" "PowerDNS Authoritative Server"
+.TH "DNSTCPBENCH" "1" "Oct 05, 2023" "" "PowerDNS Authoritative Server"
 .SH NAME
 dnstcpbench \- tool to perform TCP benchmarking of nameservers
 .SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/docs/dnswasher.1 
new/pdns-4.8.3/docs/dnswasher.1
--- old/pdns-4.8.0/docs/dnswasher.1     2023-06-01 08:56:59.000000000 +0200
+++ new/pdns-4.8.3/docs/dnswasher.1     2023-10-05 11:24:10.000000000 +0200
@@ -27,7 +27,7 @@
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "DNSWASHER" "1" "Jun 01, 2023" "" "PowerDNS Authoritative Server"
+.TH "DNSWASHER" "1" "Oct 05, 2023" "" "PowerDNS Authoritative Server"
 .SH NAME
 dnswasher \- A PowerDNS nameserver debugging tool
 .SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/docs/dumresp.1 
new/pdns-4.8.3/docs/dumresp.1
--- old/pdns-4.8.0/docs/dumresp.1       2023-06-01 08:56:59.000000000 +0200
+++ new/pdns-4.8.3/docs/dumresp.1       2023-10-05 11:24:10.000000000 +0200
@@ -27,7 +27,7 @@
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "DUMRESP" "1" "Jun 01, 2023" "" "PowerDNS Authoritative Server"
+.TH "DUMRESP" "1" "Oct 05, 2023" "" "PowerDNS Authoritative Server"
 .SH NAME
 dumresp \- A dumb DNS responder
 .SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/docs/ixfrdist.1 
new/pdns-4.8.3/docs/ixfrdist.1
--- old/pdns-4.8.0/docs/ixfrdist.1      2023-06-01 08:57:00.000000000 +0200
+++ new/pdns-4.8.3/docs/ixfrdist.1      2023-10-05 11:24:10.000000000 +0200
@@ -27,7 +27,7 @@
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "IXFRDIST" "1" "Jun 01, 2023" "" "PowerDNS Authoritative Server"
+.TH "IXFRDIST" "1" "Oct 05, 2023" "" "PowerDNS Authoritative Server"
 .SH NAME
 ixfrdist \- An IXFR/AXFR-only server that re-distributes zones
 .SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/docs/ixfrdist.yml.5 
new/pdns-4.8.3/docs/ixfrdist.yml.5
--- old/pdns-4.8.0/docs/ixfrdist.yml.5  2023-06-01 08:57:00.000000000 +0200
+++ new/pdns-4.8.3/docs/ixfrdist.yml.5  2023-10-05 11:24:10.000000000 +0200
@@ -27,7 +27,7 @@
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "IXFRDIST.YML" "5" "Jun 01, 2023" "" "PowerDNS Authoritative Server"
+.TH "IXFRDIST.YML" "5" "Oct 05, 2023" "" "PowerDNS Authoritative Server"
 .SH NAME
 ixfrdist.yml \- The ixfrdist configuration file
 .SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/docs/ixplore.1 
new/pdns-4.8.3/docs/ixplore.1
--- old/pdns-4.8.0/docs/ixplore.1       2023-06-01 08:56:59.000000000 +0200
+++ new/pdns-4.8.3/docs/ixplore.1       2023-10-05 11:24:10.000000000 +0200
@@ -27,7 +27,7 @@
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "IXPLORE" "1" "Jun 01, 2023" "" "PowerDNS Authoritative Server"
+.TH "IXPLORE" "1" "Oct 05, 2023" "" "PowerDNS Authoritative Server"
 .SH NAME
 ixplore \- A tool that provides insights into IXFRs
 .SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/docs/nproxy.1 new/pdns-4.8.3/docs/nproxy.1
--- old/pdns-4.8.0/docs/nproxy.1        2023-06-01 08:56:59.000000000 +0200
+++ new/pdns-4.8.3/docs/nproxy.1        2023-10-05 11:24:10.000000000 +0200
@@ -27,7 +27,7 @@
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "NPROXY" "1" "Jun 01, 2023" "" "PowerDNS Authoritative Server"
+.TH "NPROXY" "1" "Oct 05, 2023" "" "PowerDNS Authoritative Server"
 .SH NAME
 nproxy \- DNS notification proxy
 .SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/docs/nsec3dig.1 
new/pdns-4.8.3/docs/nsec3dig.1
--- old/pdns-4.8.0/docs/nsec3dig.1      2023-06-01 08:56:59.000000000 +0200
+++ new/pdns-4.8.3/docs/nsec3dig.1      2023-10-05 11:24:10.000000000 +0200
@@ -27,7 +27,7 @@
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "NSEC3DIG" "1" "Jun 01, 2023" "" "PowerDNS Authoritative Server"
+.TH "NSEC3DIG" "1" "Oct 05, 2023" "" "PowerDNS Authoritative Server"
 .SH NAME
 nsec3dig \- Show and validate NSEC3 proofs
 .SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/docs/pdns_control.1 
new/pdns-4.8.3/docs/pdns_control.1
--- old/pdns-4.8.0/docs/pdns_control.1  2023-06-01 08:56:59.000000000 +0200
+++ new/pdns-4.8.3/docs/pdns_control.1  2023-10-05 11:24:10.000000000 +0200
@@ -27,7 +27,7 @@
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "PDNS_CONTROL" "1" "Jun 01, 2023" "" "PowerDNS Authoritative Server"
+.TH "PDNS_CONTROL" "1" "Oct 05, 2023" "" "PowerDNS Authoritative Server"
 .SH NAME
 pdns_control \- Control the PowerDNS nameserver
 .SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/docs/pdns_notify.1 
new/pdns-4.8.3/docs/pdns_notify.1
--- old/pdns-4.8.0/docs/pdns_notify.1   2023-06-01 08:56:59.000000000 +0200
+++ new/pdns-4.8.3/docs/pdns_notify.1   2023-10-05 11:24:10.000000000 +0200
@@ -27,7 +27,7 @@
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "PDNS_NOTIFY" "1" "Jun 01, 2023" "" "PowerDNS Authoritative Server"
+.TH "PDNS_NOTIFY" "1" "Oct 05, 2023" "" "PowerDNS Authoritative Server"
 .SH NAME
 pdns_notify \- A simple DNS NOTIFY sender
 .SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/docs/pdns_server.1 
new/pdns-4.8.3/docs/pdns_server.1
--- old/pdns-4.8.0/docs/pdns_server.1   2023-06-01 08:56:59.000000000 +0200
+++ new/pdns-4.8.3/docs/pdns_server.1   2023-10-05 11:24:10.000000000 +0200
@@ -27,7 +27,7 @@
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "PDNS_SERVER" "1" "Jun 01, 2023" "" "PowerDNS Authoritative Server"
+.TH "PDNS_SERVER" "1" "Oct 05, 2023" "" "PowerDNS Authoritative Server"
 .SH NAME
 pdns_server \- The PowerDNS Authoritative Nameserver
 .SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/docs/pdnsutil.1 
new/pdns-4.8.3/docs/pdnsutil.1
--- old/pdns-4.8.0/docs/pdnsutil.1      2023-06-01 08:56:59.000000000 +0200
+++ new/pdns-4.8.3/docs/pdnsutil.1      2023-10-05 11:24:10.000000000 +0200
@@ -27,7 +27,7 @@
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "PDNSUTIL" "1" "Jun 01, 2023" "" "PowerDNS Authoritative Server"
+.TH "PDNSUTIL" "1" "Oct 05, 2023" "" "PowerDNS Authoritative Server"
 .SH NAME
 pdnsutil \- PowerDNS record and DNSSEC command and control
 .SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/docs/saxfr.1 new/pdns-4.8.3/docs/saxfr.1
--- old/pdns-4.8.0/docs/saxfr.1 2023-06-01 08:56:59.000000000 +0200
+++ new/pdns-4.8.3/docs/saxfr.1 2023-10-05 11:24:10.000000000 +0200
@@ -27,7 +27,7 @@
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "SAXFR" "1" "Jun 01, 2023" "" "PowerDNS Authoritative Server"
+.TH "SAXFR" "1" "Oct 05, 2023" "" "PowerDNS Authoritative Server"
 .SH NAME
 saxfr \- Perform AXFRs and show information about it
 .SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/docs/sdig.1 new/pdns-4.8.3/docs/sdig.1
--- old/pdns-4.8.0/docs/sdig.1  2023-06-01 08:56:59.000000000 +0200
+++ new/pdns-4.8.3/docs/sdig.1  2023-10-05 11:24:10.000000000 +0200
@@ -27,7 +27,7 @@
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "SDIG" "1" "Jun 01, 2023" "" "PowerDNS Authoritative Server"
+.TH "SDIG" "1" "Oct 05, 2023" "" "PowerDNS Authoritative Server"
 .SH NAME
 sdig \- Perform a DNS query and show the results
 .SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/docs/zone2json.1 
new/pdns-4.8.3/docs/zone2json.1
--- old/pdns-4.8.0/docs/zone2json.1     2023-06-01 08:56:59.000000000 +0200
+++ new/pdns-4.8.3/docs/zone2json.1     2023-10-05 11:24:10.000000000 +0200
@@ -27,7 +27,7 @@
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "ZONE2JSON" "1" "Jun 01, 2023" "" "PowerDNS Authoritative Server"
+.TH "ZONE2JSON" "1" "Oct 05, 2023" "" "PowerDNS Authoritative Server"
 .SH NAME
 zone2json \- convert BIND zones to JSON
 .SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/docs/zone2ldap.1 
new/pdns-4.8.3/docs/zone2ldap.1
--- old/pdns-4.8.0/docs/zone2ldap.1     2023-06-01 08:56:59.000000000 +0200
+++ new/pdns-4.8.3/docs/zone2ldap.1     2023-10-05 11:24:10.000000000 +0200
@@ -27,7 +27,7 @@
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "ZONE2LDAP" "1" "Jun 01, 2023" "" "PowerDNS Authoritative Server"
+.TH "ZONE2LDAP" "1" "Oct 05, 2023" "" "PowerDNS Authoritative Server"
 .SH NAME
 zone2ldap \- convert zonefiles to ldif
 .SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/docs/zone2sql.1 
new/pdns-4.8.3/docs/zone2sql.1
--- old/pdns-4.8.0/docs/zone2sql.1      2023-06-01 08:56:59.000000000 +0200
+++ new/pdns-4.8.3/docs/zone2sql.1      2023-10-05 11:24:10.000000000 +0200
@@ -27,7 +27,7 @@
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "ZONE2SQL" "1" "Jun 01, 2023" "" "PowerDNS Authoritative Server"
+.TH "ZONE2SQL" "1" "Oct 05, 2023" "" "PowerDNS Authoritative Server"
 .SH NAME
 zone2sql \- convert BIND zones to SQL
 .SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/ext/json11/json11.cpp 
new/pdns-4.8.3/ext/json11/json11.cpp
--- old/pdns-4.8.0/ext/json11/json11.cpp        2023-06-01 08:54:16.000000000 
+0200
+++ new/pdns-4.8.3/ext/json11/json11.cpp        2023-10-05 11:22:14.000000000 
+0200
@@ -93,10 +93,18 @@
             out += "\\r";
         } else if (ch == '\t') {
             out += "\\t";
-        } else if (static_cast<uint8_t>(ch) <= 0x1f || 
static_cast<uint8_t>(ch) >= 0x7f) {
+        } else if (static_cast<uint8_t>(ch) <= 0x1f) {
             char buf[8];
             snprintf(buf, sizeof buf, "\\u%04x", ch);
             out += buf;
+        } else if (static_cast<uint8_t>(ch) == 0xe2 && 
static_cast<uint8_t>(value[i+1]) == 0x80
+                   && static_cast<uint8_t>(value[i+2]) == 0xa8) {
+            out += "\\u2028";
+            i += 2;
+        } else if (static_cast<uint8_t>(ch) == 0xe2 && 
static_cast<uint8_t>(value[i+1]) == 0x80
+                   && static_cast<uint8_t>(value[i+2]) == 0xa9) {
+            out += "\\u2029";
+            i += 2;
         } else {
             out += ch;
         }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/ext/lmdb-safe/lmdb-typed.hh 
new/pdns-4.8.3/ext/lmdb-safe/lmdb-typed.hh
--- old/pdns-4.8.0/ext/lmdb-safe/lmdb-typed.hh  2023-06-01 08:54:16.000000000 
+0200
+++ new/pdns-4.8.3/ext/lmdb-safe/lmdb-typed.hh  2023-10-05 11:22:14.000000000 
+0200
@@ -164,10 +164,8 @@
 
     MDBOutVal currentvalue;
 
-    // check if the entry already exists, so we don't uselessly bump the 
timestamp
-    if (txn->get(d_idx, combined, currentvalue) == MDB_NOTFOUND) {
-      txn->put(d_idx, combined, empty, flags);
-    }
+    // if the entry existed already, this will just update the timestamp/txid 
in the LS header. This is intentional, so objects and their indexes always get 
synced together.
+    txn->put(d_idx, combined, empty, flags);
   }
 
   void del(MDBRWTransaction& txn, const Class& t, uint32_t id)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/ext/yahttp/yahttp/reqresp.cpp 
new/pdns-4.8.3/ext/yahttp/yahttp/reqresp.cpp
--- old/pdns-4.8.0/ext/yahttp/yahttp/reqresp.cpp        2023-06-01 
08:54:16.000000000 +0200
+++ new/pdns-4.8.3/ext/yahttp/yahttp/reqresp.cpp        2023-10-05 
11:22:14.000000000 +0200
@@ -1,5 +1,7 @@
 #include "yahttp.hpp"
 
+#include <limits>
+
 namespace YaHTTP {
 
   template class AsyncLoader<Request>;
@@ -177,6 +179,9 @@
             throw ParseError("Unable to parse chunk size");
           }
           if (chunk_size == 0) { state = 3; break; } // last chunk
+          if (chunk_size > (std::numeric_limits<decltype(chunk_size)>::max() - 
2)) {
+            throw ParseError("Chunk is too large");
+          }
         } else {
           int crlf=1;
           if (buffer.size() < static_cast<size_t>(chunk_size+1)) return false; 
// expect newline
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/m4/pdns_check_libcrypto.m4 
new/pdns-4.8.3/m4/pdns_check_libcrypto.m4
--- old/pdns-4.8.0/m4/pdns_check_libcrypto.m4   2023-06-01 08:54:16.000000000 
+0200
+++ new/pdns-4.8.3/m4/pdns_check_libcrypto.m4   2023-10-05 11:22:14.000000000 
+0200
@@ -108,11 +108,19 @@
     LIBS="$LIBCRYPTO_LIBS $LIBS"
     CPPFLAGS="$LIBCRYPTO_INCLUDES $CPPFLAGS"
     AC_LINK_IFELSE(
-        [AC_LANG_PROGRAM([#include <openssl/crypto.h>], 
[ERR_load_CRYPTO_strings()])],
+        [AC_LANG_PROGRAM([#include <openssl/bn.h>], [BN_new()])],
         [
             AC_MSG_RESULT([yes])
             AC_CHECK_FUNCS([RAND_bytes RAND_pseudo_bytes CRYPTO_memcmp 
OPENSSL_init_crypto EVP_MD_CTX_new EVP_MD_CTX_free RSA_get0_key])
-            AC_CHECK_DECL(EVP_PKEY_CTX_set1_scrypt_salt, 
[AC_DEFINE([HAVE_EVP_PKEY_CTX_SET1_SCRYPT_SALT], [1], [Define to 1 if you have 
EVP_PKEY_CTX_set1_scrypt_salt])], [], [#include <openssl/kdf.h>])
+            # you might be wondering why the stdarg.h and stddef.h includes,
+            # in which case please have a look at 
https://github.com/PowerDNS/pdns/issues/12926
+            # and weep, yelling at Red Hat
+            AC_CHECK_DECL(EVP_PKEY_CTX_set1_scrypt_salt,
+                          [AC_DEFINE([HAVE_EVP_PKEY_CTX_SET1_SCRYPT_SALT], 
[1], [Define to 1 if you have EVP_PKEY_CTX_set1_scrypt_salt])],
+                          [],
+                          [#include <stdarg.h>
+                           #include <stddef.h>
+                           #include <openssl/kdf.h>])
             $1
         ], [
             AC_MSG_RESULT([no])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/modules/gmysqlbackend/smysql.cc 
new/pdns-4.8.3/modules/gmysqlbackend/smysql.cc
--- old/pdns-4.8.0/modules/gmysqlbackend/smysql.cc      2023-06-01 
08:54:16.000000000 +0200
+++ new/pdns-4.8.3/modules/gmysqlbackend/smysql.cc      2023-10-05 
11:22:14.000000000 +0200
@@ -489,11 +489,6 @@
 
   do {
 
-#if MYSQL_VERSION_ID >= 50013
-    my_bool set_reconnect = 0;
-    mysql_options(&d_db, MYSQL_OPT_RECONNECT, &set_reconnect);
-#endif
-
 #if MYSQL_VERSION_ID >= 50100
     if (d_timeout) {
       mysql_options(&d_db, MYSQL_OPT_READ_TIMEOUT, &d_timeout);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/modules/lmdbbackend/lmdbbackend.cc 
new/pdns-4.8.3/modules/lmdbbackend/lmdbbackend.cc
--- old/pdns-4.8.0/modules/lmdbbackend/lmdbbackend.cc   2023-06-01 
08:54:16.000000000 +0200
+++ new/pdns-4.8.3/modules/lmdbbackend/lmdbbackend.cc   2023-10-05 
11:22:14.000000000 +0200
@@ -1321,7 +1321,11 @@
     idvec.push_back(txn.get<0>(domain, di));
   }
   else {
-    auto txn = d_tdomains->getROTransaction();
+    // this transaction used to be RO.
+    // it is now RW to narrow a race window between PowerDNS and Lightning 
Stream
+    // FIXME: turn the entire delete, including this ID scan, into one RW 
transaction
+    // when doing that, first do a short RO check to see if we actually have 
anything to delete
+    auto txn = d_tdomains->getRWTransaction();
 
     txn.get_multi<0>(domain, idvec);
   }
@@ -2620,17 +2624,133 @@
 
 string LMDBBackend::directBackendCmd(const string& query)
 {
-  if (query == "info") {
-    ostringstream ret;
+  ostringstream ret, usage;
+
+  usage << "info                               show some information about the 
database" << endl;
+  usage << "index check domains                check zone<>ID indexes" << endl;
+  usage << "index refresh domains <ID>         refresh index for zone with 
this ID" << endl;
+  usage << "index refresh-all domains          refresh index for all zones 
with disconnected indexes" << endl;
+  vector<string> argv;
+  stringtok(argv, query);
+
+  if (argv.empty()) {
+    return usage.str();
+  }
+
+  string& cmd = argv[0];
 
+  if (cmd == "help") {
+    return usage.str();
+  }
+
+  if (cmd == "info") {
     ret << "shards: " << s_shards << endl;
     ret << "schemaversion: " << SCHEMAVERSION << endl;
 
     return ret.str();
   }
-  else {
-    return "unknown lmdbbackend command\n";
+
+  if (cmd == "index") {
+    if (argv.size() < 2) {
+      return "need an index subcommand\n";
+    }
+
+    string& subcmd = argv[1];
+
+    if (subcmd == "check" || subcmd == "refresh-all") {
+      bool refresh = false;
+
+      if (subcmd == "refresh-all") {
+        refresh = true;
+      }
+
+      if (argv.size() < 3) {
+        return "need an index name\n";
+      }
+
+      if (argv[2] != "domains") {
+        return "can only check the domains index\n";
+      }
+
+      vector<uint32_t> refreshQueue;
+
+      {
+        auto txn = d_tdomains->getROTransaction();
+
+        for (auto iter = txn.begin(); iter != txn.end(); ++iter) {
+          DomainInfo di = *iter;
+
+          auto id = iter.getID();
+
+          LMDBIDvec ids;
+          txn.get_multi<0>(di.zone, ids);
+
+          if (ids.size() != 1) {
+            ret << "ID->zone index has " << id << "->" << di.zone << ", ";
+
+            if (ids.empty()) {
+              ret << "zone->ID index has no entry for " << di.zone << endl;
+              if (refresh) {
+                refreshQueue.push_back(id);
+              }
+              else {
+                ret << "  suggested remedy: index refresh domains " << id << 
endl;
+              }
+            }
+            else {
+              // ids.size() > 1
+              ret << "zone->ID index has multiple entries for " << di.zone << 
": ";
+              for (auto id_ : ids) {
+                ret << id_ << " ";
+              }
+              ret << endl;
+            }
+          }
+        }
+      }
+
+      if (refresh) {
+        for (const auto& id : refreshQueue) {
+          if (genChangeDomain(id, [](DomainInfo& /* di */) {})) {
+            ret << "refreshed " << id << endl;
+          }
+          else {
+            ret << "failed to refresh " << id << endl;
+          }
+        }
+      }
+      return ret.str();
+    }
+    if (subcmd == "refresh") {
+      // index refresh domains 12345
+      if (argv.size() < 4) {
+        return "usage: index refresh domains <ID>\n";
+      }
+
+      if (argv[2] != "domains") {
+        return "can only refresh in the domains index\n";
+      }
+
+      uint32_t id = 0;
+
+      try {
+        id = pdns::checked_stoi<uint32_t>(argv[3]);
+      }
+      catch (const std::out_of_range& e) {
+        return "ID out of range\n";
+      }
+
+      if (genChangeDomain(id, [](DomainInfo& /* di */) {})) {
+        ret << "refreshed" << endl;
+      }
+      else {
+        ret << "failed" << endl;
+      }
+      return ret.str();
+    }
   }
+
+  return "unknown lmdbbackend command\n";
 }
 
 class LMDBFactory : public BackendFactory
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/pdns/Makefile.am 
new/pdns-4.8.3/pdns/Makefile.am
--- old/pdns-4.8.0/pdns/Makefile.am     2023-06-01 08:54:16.000000000 +0200
+++ new/pdns-4.8.3/pdns/Makefile.am     2023-10-05 11:22:14.000000000 +0200
@@ -1417,6 +1417,7 @@
        test-trusted-notification-proxy_cc.cc \
        test-tsig.cc \
        test-ueberbackend_cc.cc \
+       test-webserver_cc.cc \
        test-zonemd_cc.cc \
        test-zoneparser_tng_cc.cc \
        testrunner.cc \
@@ -1425,7 +1426,9 @@
        tsigverifier.cc tsigverifier.hh \
        ueberbackend.cc ueberbackend.hh \
        unix_utility.cc \
+       uuid-utils.cc \
        validate.hh \
+       webserver.cc \
        zonemd.cc zonemd.hh \
        zoneparser-tng.cc zoneparser-tng.hh
 
@@ -1440,7 +1443,9 @@
        $(RT_LIBS) \
        $(LUA_LIBS) \
        $(LIBDL) \
-       $(IPCRYPT_LIBS)
+       $(IPCRYPT_LIBS) \
+       $(YAHTTP_LIBS) \
+       $(JSON11_LIBS)
 
 if GSS_TSIG
 testrunner_LDADD += $(GSS_LIBS)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/pdns/Makefile.in 
new/pdns-4.8.3/pdns/Makefile.in
--- old/pdns-4.8.0/pdns/Makefile.in     2023-06-01 08:55:28.000000000 +0200
+++ new/pdns-4.8.3/pdns/Makefile.in     2023-10-05 11:22:47.000000000 +0200
@@ -1044,15 +1044,15 @@
        test-rcpgenerator_cc.cc test-sha_hh.cc test-signers.cc \
        test-statbag_cc.cc test-svc_records_cc.cc \
        test-trusted-notification-proxy_cc.cc test-tsig.cc \
-       test-ueberbackend_cc.cc test-zonemd_cc.cc \
+       test-ueberbackend_cc.cc test-webserver_cc.cc test-zonemd_cc.cc \
        test-zoneparser_tng_cc.cc testrunner.cc threadname.hh \
        threadname.cc trusted-notification-proxy.cc tsigverifier.cc \
        tsigverifier.hh ueberbackend.cc ueberbackend.hh \
-       unix_utility.cc validate.hh zonemd.cc zonemd.hh \
-       zoneparser-tng.cc zoneparser-tng.hh pkcs11signers.cc \
-       pkcs11signers.hh sodiumsigners.cc decafsigners.cc \
-       kqueuemplexer.cc epollmplexer.cc devpollmplexer.cc \
-       portsmplexer.cc
+       unix_utility.cc uuid-utils.cc validate.hh webserver.cc \
+       zonemd.cc zonemd.hh zoneparser-tng.cc zoneparser-tng.hh \
+       pkcs11signers.cc pkcs11signers.hh sodiumsigners.cc \
+       decafsigners.cc kqueuemplexer.cc epollmplexer.cc \
+       devpollmplexer.cc portsmplexer.cc
 am_testrunner_OBJECTS = arguments.$(OBJEXT) auth-caches.$(OBJEXT) \
        auth-packetcache.$(OBJEXT) auth-querycache.$(OBJEXT) \
        auth-zonecache.$(OBJEXT) base32.$(OBJEXT) base64.$(OBJEXT) \
@@ -1092,19 +1092,22 @@
        test-svc_records_cc.$(OBJEXT) \
        test-trusted-notification-proxy_cc.$(OBJEXT) \
        test-tsig.$(OBJEXT) test-ueberbackend_cc.$(OBJEXT) \
-       test-zonemd_cc.$(OBJEXT) test-zoneparser_tng_cc.$(OBJEXT) \
-       testrunner.$(OBJEXT) threadname.$(OBJEXT) \
-       trusted-notification-proxy.$(OBJEXT) tsigverifier.$(OBJEXT) \
-       ueberbackend.$(OBJEXT) unix_utility.$(OBJEXT) zonemd.$(OBJEXT) \
-       zoneparser-tng.$(OBJEXT) $(am__objects_1) $(am__objects_7) \
-       $(am__objects_8) $(am__objects_2) $(am__objects_3) \
-       $(am__objects_4) $(am__objects_5)
+       test-webserver_cc.$(OBJEXT) test-zonemd_cc.$(OBJEXT) \
+       test-zoneparser_tng_cc.$(OBJEXT) testrunner.$(OBJEXT) \
+       threadname.$(OBJEXT) trusted-notification-proxy.$(OBJEXT) \
+       tsigverifier.$(OBJEXT) ueberbackend.$(OBJEXT) \
+       unix_utility.$(OBJEXT) uuid-utils.$(OBJEXT) \
+       webserver.$(OBJEXT) zonemd.$(OBJEXT) zoneparser-tng.$(OBJEXT) \
+       $(am__objects_1) $(am__objects_7) $(am__objects_8) \
+       $(am__objects_2) $(am__objects_3) $(am__objects_4) \
+       $(am__objects_5)
 testrunner_OBJECTS = $(am_testrunner_OBJECTS)
 testrunner_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
        $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
        $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-       $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_4) \
-       $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_7)
+       $(am__DEPENDENCIES_1) $(JSON11_LIBS) $(am__DEPENDENCIES_5) \
+       $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_2) \
+       $(am__DEPENDENCIES_7)
 testrunner_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
        $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
        $(CXXFLAGS) $(testrunner_LDFLAGS) $(LDFLAGS) -o $@
@@ -1296,7 +1299,7 @@
        ./$(DEPDIR)/test-svc_records_cc.Po \
        ./$(DEPDIR)/test-trusted-notification-proxy_cc.Po \
        ./$(DEPDIR)/test-tsig.Po ./$(DEPDIR)/test-ueberbackend_cc.Po \
-       ./$(DEPDIR)/test-zonemd_cc.Po \
+       ./$(DEPDIR)/test-webserver_cc.Po ./$(DEPDIR)/test-zonemd_cc.Po \
        ./$(DEPDIR)/test-zoneparser_tng_cc.Po \
        ./$(DEPDIR)/testrunner.Po ./$(DEPDIR)/threadname.Po \
        ./$(DEPDIR)/tkey.Po ./$(DEPDIR)/trusted-notification-proxy.Po \
@@ -2685,23 +2688,24 @@
        test-rcpgenerator_cc.cc test-sha_hh.cc test-signers.cc \
        test-statbag_cc.cc test-svc_records_cc.cc \
        test-trusted-notification-proxy_cc.cc test-tsig.cc \
-       test-ueberbackend_cc.cc test-zonemd_cc.cc \
+       test-ueberbackend_cc.cc test-webserver_cc.cc test-zonemd_cc.cc \
        test-zoneparser_tng_cc.cc testrunner.cc threadname.hh \
        threadname.cc trusted-notification-proxy.cc tsigverifier.cc \
        tsigverifier.hh ueberbackend.cc ueberbackend.hh \
-       unix_utility.cc validate.hh zonemd.cc zonemd.hh \
-       zoneparser-tng.cc zoneparser-tng.hh $(am__append_62) \
-       $(am__append_66) $(am__append_69) $(am__append_72) \
-       $(am__append_74) $(am__append_76) $(am__append_78)
+       unix_utility.cc uuid-utils.cc validate.hh webserver.cc \
+       zonemd.cc zonemd.hh zoneparser-tng.cc zoneparser-tng.hh \
+       $(am__append_62) $(am__append_66) $(am__append_69) \
+       $(am__append_72) $(am__append_74) $(am__append_76) \
+       $(am__append_78)
 testrunner_LDFLAGS = \
        $(AM_LDFLAGS) \
        $(LIBCRYPTO_LDFLAGS) \
        $(BOOST_UNIT_TEST_FRAMEWORK_LDFLAGS)
 
 testrunner_LDADD = $(LIBCRYPTO_LIBS) $(BOOST_UNIT_TEST_FRAMEWORK_LIBS) \
-       $(RT_LIBS) $(LUA_LIBS) $(LIBDL) $(IPCRYPT_LIBS) \
-       $(am__append_61) $(am__append_63) $(am__append_67) \
-       $(am__append_70)
+       $(RT_LIBS) $(LUA_LIBS) $(LIBDL) $(IPCRYPT_LIBS) $(YAHTTP_LIBS) \
+       $(JSON11_LIBS) $(am__append_61) $(am__append_63) \
+       $(am__append_67) $(am__append_70)
 pdns_control_SOURCES = \
        arguments.cc \
        dnslabeltext.cc \
@@ -3347,6 +3351,7 @@
 @AMDEP_TRUE@@am__include@ 
@am__quote@./$(DEPDIR)/test-trusted-notification-proxy_cc.Po@am__quote@ # 
am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-tsig.Po@am__quote@ # 
am--include-marker
 @AMDEP_TRUE@@am__include@ 
@am__quote@./$(DEPDIR)/test-ueberbackend_cc.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ 
@am__quote@./$(DEPDIR)/test-webserver_cc.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-zonemd_cc.Po@am__quote@ 
# am--include-marker
 @AMDEP_TRUE@@am__include@ 
@am__quote@./$(DEPDIR)/test-zoneparser_tng_cc.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testrunner.Po@am__quote@ # 
am--include-marker
@@ -4301,6 +4306,7 @@
        -rm -f ./$(DEPDIR)/test-trusted-notification-proxy_cc.Po
        -rm -f ./$(DEPDIR)/test-tsig.Po
        -rm -f ./$(DEPDIR)/test-ueberbackend_cc.Po
+       -rm -f ./$(DEPDIR)/test-webserver_cc.Po
        -rm -f ./$(DEPDIR)/test-zonemd_cc.Po
        -rm -f ./$(DEPDIR)/test-zoneparser_tng_cc.Po
        -rm -f ./$(DEPDIR)/testrunner.Po
@@ -4551,6 +4557,7 @@
        -rm -f ./$(DEPDIR)/test-trusted-notification-proxy_cc.Po
        -rm -f ./$(DEPDIR)/test-tsig.Po
        -rm -f ./$(DEPDIR)/test-ueberbackend_cc.Po
+       -rm -f ./$(DEPDIR)/test-webserver_cc.Po
        -rm -f ./$(DEPDIR)/test-zonemd_cc.Po
        -rm -f ./$(DEPDIR)/test-zoneparser_tng_cc.Po
        -rm -f ./$(DEPDIR)/testrunner.Po
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/pdns/auth-main.cc 
new/pdns-4.8.3/pdns/auth-main.cc
--- old/pdns-4.8.0/pdns/auth-main.cc    2023-06-01 08:54:16.000000000 +0200
+++ new/pdns-4.8.3/pdns/auth-main.cc    2023-10-05 11:22:14.000000000 +0200
@@ -328,6 +328,8 @@
   ::arg().setSwitch("consistent-backends", "Assume individual zones are not 
divided over backends. Send only ANY lookup operations to the backend to reduce 
the number of lookups") = "yes";
 
   ::arg().set("rng", "Specify the random number generator to use. Valid values 
are auto,sodium,openssl,getrandom,arc4random,urandom.") = "auto";
+
+  ::arg().set("default-catalog-zone", "Catalog zone to assign newly created 
primary zones (via the API) to") = "";
 #ifdef ENABLE_GSS_TSIG
   ::arg().setSwitch("enable-gss-tsig", "Enable GSS TSIG processing") = "no";
 #endif
@@ -1479,6 +1481,17 @@
     g_log << Logger::Error << "Exiting because: " << PE.reason << endl;
     exit(1);
   }
+
+  try {
+    auto defaultCatalog = ::arg()["default-catalog-zone"];
+    if (!defaultCatalog.empty()) {
+      auto defCatalog = DNSName(defaultCatalog);
+    }
+  }
+  catch (const std::exception& e) {
+    g_log << Logger::Error << "Invalid value '" << 
::arg()["default-catalog-zone"] << "' for default-catalog-zone: " << e.what() 
<< endl;
+    exit(1);
+  }
   S.blacklist("special-memory-usage");
 
   DLOG(g_log << Logger::Warning << "Verbose logging in effect" << endl);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/pdns/calidns.cc 
new/pdns-4.8.3/pdns/calidns.cc
--- old/pdns-4.8.0/pdns/calidns.cc      2023-06-01 08:54:16.000000000 +0200
+++ new/pdns-4.8.3/pdns/calidns.cc      2023-10-05 11:22:14.000000000 +0200
@@ -121,7 +121,7 @@
 {
   ComboAddress result = ecsRange.getMaskedNetwork();
   uint8_t bits = ecsRange.getBits();
-  uint32_t mod = 1 << (32 - bits);
+  uint32_t mod = (bits > 0) ? (1 << (32 - bits)) : 
std::numeric_limits<uint32_t>::max();
   result.sin4.sin_addr.s_addr = result.sin4.sin_addr.s_addr + 
ntohl(dns_random(mod));
   return result;
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/pdns/dnspacket.cc 
new/pdns-4.8.3/pdns/dnspacket.cc
--- old/pdns-4.8.0/pdns/dnspacket.cc    2023-06-01 08:54:16.000000000 +0200
+++ new/pdns-4.8.3/pdns/dnspacket.cc    2023-10-05 11:22:14.000000000 +0200
@@ -333,7 +333,7 @@
 
   if (d_haveednscookie) {
     if (d_eco.isWellFormed()) {
-        optsize += EDNSCookiesOpt::EDNSCookieOptSize;
+        optsize += EDNS_OPTION_CODE_SIZE + EDNS_OPTION_LENGTH_SIZE + 
EDNSCookiesOpt::EDNSCookieOptSize;
     }
   }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/pdns/ixfr.cc new/pdns-4.8.3/pdns/ixfr.cc
--- old/pdns-4.8.0/pdns/ixfr.cc 2023-06-01 08:54:16.000000000 +0200
+++ new/pdns-4.8.3/pdns/ixfr.cc 2023-10-05 11:22:14.000000000 +0200
@@ -123,6 +123,7 @@
 }
 
 // Returns pairs of "remove & add" vectors. If you get an empty remove, it 
means you got an AXFR!
+ // NOLINTNEXTLINE(readability-function-cognitive-complexity): 
https://github.com/PowerDNS/pdns/issues/12791
 vector<pair<vector<DNSRecord>, vector<DNSRecord>>> getIXFRDeltas(const 
ComboAddress& primary, const DNSName& zone, const DNSRecord& oursr,
                                                                  uint16_t 
xfrTimeout, bool totalTimeout,
                                                                  const 
TSIGTriplet& tt, const ComboAddress* laddr, size_t maxReceivedBytes)
@@ -203,24 +204,35 @@
   const unsigned int expectedSOAForIXFR = 3;
   unsigned int primarySOACount = 0;
 
+  std::string state;
   for (;;) {
     // IXFR or AXFR style end reached? We don't want to process trailing data 
after the closing SOA
     if (style == AXFR && primarySOACount == expectedSOAForAXFR) {
+      state = "AXFRdone";
       break;
     }
-    else if (style == IXFR && primarySOACount == expectedSOAForIXFR) {
+    if (style == IXFR && primarySOACount == expectedSOAForIXFR) {
+      state = "IXFRdone";
       break;
     }
 
     elapsed = timeoutChecker();
-    if (s.readWithTimeout(reinterpret_cast<char*>(&len), sizeof(len), 
static_cast<int>(xfrTimeout - elapsed)) != sizeof(len)) {
+    try {
+      const struct timeval remainingTime = { .tv_sec = xfrTimeout - elapsed, 
.tv_usec = 0 };
+      const struct timeval idleTime = remainingTime;
+      readn2WithTimeout(s.getHandle(), &len, sizeof(len), idleTime, 
remainingTime, false);
+    }
+    catch (const runtime_error& ex) {
+      state = ex.what();
       break;
     }
 
     len = ntohs(len);
     if (len == 0) {
+      state = "zeroLen";
       break;
     }
+    // Currently no more break statements after this
 
     if (maxReceivedBytes > 0 && (maxReceivedBytes - receivedBytes) < (size_t) 
len) {
       throw std::runtime_error("Reached the maximum number of received bytes 
in an IXFR delta for zone '"+zone.toLogString()+"' from primary 
"+primary.toStringWithPort());
@@ -229,9 +241,9 @@
     reply.resize(len);
 
     elapsed = timeoutChecker();
-    const struct timeval remainingTime =  { .tv_sec = xfrTimeout - elapsed, 
.tv_usec = 0 };
+    const struct timeval remainingTime = { .tv_sec = xfrTimeout - elapsed, 
.tv_usec = 0 };
     const struct timeval idleTime = remainingTime;
-    readn2WithTimeout(s.getHandle(), &reply.at(0), len, idleTime, 
remainingTime, false);
+    readn2WithTimeout(s.getHandle(), reply.data(), len, idleTime, 
remainingTime, false);
     receivedBytes += len;
 
     MOADNSParser mdp(false, reply);
@@ -295,7 +307,7 @@
         if(r.first.d_type == QType::OPT)
           continue;
 
-        throw std::runtime_error("Unexpected record (" 
+QType(r.first.d_type).toString()+") in non-answer section 
("+std::to_string(r.first.d_place)+")in IXFR response for zone 
'"+zone.toLogString()+"' from primary '"+primary.toStringWithPort());
+        throw std::runtime_error("Unexpected record (" 
+QType(r.first.d_type).toString()+") in non-answer section 
("+std::to_string(r.first.d_place)+") in IXFR response for zone 
'"+zone.toLogString()+"' from primary '"+primary.toStringWithPort());
       }
 
       r.first.d_name.makeUsRelative(zone);
@@ -306,16 +318,16 @@
   switch (style) {
   case IXFR:
     if (primarySOACount != expectedSOAForIXFR) {
-      throw std::runtime_error("Incomplete IXFR transfer for '" + 
zone.toLogString() + "' from primary '" + primary.toStringWithPort());
+      throw std::runtime_error("Incomplete IXFR transfer (primarySOACount=" + 
std::to_string(primarySOACount) + ") for '" + zone.toLogString() + "' from 
primary '" + primary.toStringWithPort() + " state=" + state);
     }
     break;
   case AXFR:
     if (primarySOACount != expectedSOAForAXFR){
-      throw std::runtime_error("Incomplete AXFR style transfer for '" + 
zone.toLogString() + "' from primary '" + primary.toStringWithPort());
+      throw std::runtime_error("Incomplete AXFR style transfer 
(primarySOACount=" + std::to_string(primarySOACount) + ")  for '" + 
zone.toLogString() + "' from primary '" + primary.toStringWithPort() + " 
state=" + state);
     }
     break;
   case Unknown:
-    throw std::runtime_error("Incomplete XFR for '" + zone.toLogString() + "' 
from primary '" + primary.toStringWithPort());
+    throw std::runtime_error("Incomplete XFR (primarySOACount=" + 
std::to_string(primarySOACount) + ") for '" + zone.toLogString() + "' from 
primary '" + primary.toStringWithPort() + " state=" + state);
     break;
   }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/pdns/ixfrdist.cc 
new/pdns-4.8.3/pdns/ixfrdist.cc
--- old/pdns-4.8.0/pdns/ixfrdist.cc     2023-06-01 08:54:16.000000000 +0200
+++ new/pdns-4.8.3/pdns/ixfrdist.cc     2023-10-05 11:22:14.000000000 +0200
@@ -532,6 +532,7 @@
   pw.getHeader()->id = mdp.d_header.id;
   pw.getHeader()->rd = mdp.d_header.rd;
   pw.getHeader()->qr = 1;
+  pw.getHeader()->aa = 1;
 
   pw.startRecord(mdp.d_qname, QType::SOA, zoneInfo->soaTTL);
   zoneInfo->soa->toPacket(pw);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/pdns/test-webserver_cc.cc 
new/pdns-4.8.3/pdns/test-webserver_cc.cc
--- old/pdns-4.8.0/pdns/test-webserver_cc.cc    1970-01-01 01:00:00.000000000 
+0100
+++ new/pdns-4.8.3/pdns/test-webserver_cc.cc    2023-10-05 11:22:14.000000000 
+0200
@@ -0,0 +1,35 @@
+#define BOOST_TEST_DYN_LINK
+#define BOOST_TEST_NO_MAIN
+
+#include <boost/test/unit_test.hpp>
+#include "webserver.hh"
+
+BOOST_AUTO_TEST_SUITE(test_webserver_cc)
+
+BOOST_AUTO_TEST_CASE(test_validURL)
+{
+  // We cannot test\x00 as embedded NULs are not handled by YaHTTP other than 
stopping the parsing
+  const std::vector<std::pair<string, bool>> urls = {
+    {"http://www.powerdns.com/?foo=123";, true},
+    {"http://ww.powerdns.com/?foo=%ff";, true},
+    {"http://\x01ww.powerdns.com/?foo=123";, false},
+    {"http://\xffwww.powerdns.com/?foo=123";, false},
+    {"http://www.powerdns.com/?foo=123\x01";, false},
+    {"http://www.powerdns.com/\x7f?foo=123";, false},
+    {"http://www.powerdns.com/\x80?foo=123";, false},
+    {"http://www.powerdns.com/?\xff";, false},
+    {"/?foo=123&bar", true},
+    {"/?foo=%ff&bar", true},
+    {"/?\x01foo=123", false},
+    {"/?foo=123\x01", false},
+    {"/\x7f?foo=123", false},
+    {"/\x80?foo=123", false},
+    {"/?\xff", false},
+  };
+
+  for (const auto& testcase : urls) {
+    BOOST_CHECK_EQUAL(WebServer::validURL(testcase.first), testcase.second);
+  }
+}
+
+BOOST_AUTO_TEST_SUITE_END();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/pdns/webserver.cc 
new/pdns-4.8.3/pdns/webserver.cc
--- old/pdns-4.8.0/pdns/webserver.cc    2023-06-01 08:54:16.000000000 +0200
+++ new/pdns-4.8.3/pdns/webserver.cc    2023-10-05 11:22:14.000000000 +0200
@@ -36,6 +36,8 @@
 #include "json.hh"
 #include "uuid-utils.hh"
 #include <yahttp/router.hpp>
+#include <algorithm>
+#include <unordered_set>
 
 json11::Json HttpRequest::json()
 {
@@ -461,6 +463,53 @@
   }
 }
 
+
+struct ValidChars {
+  ValidChars()
+  {
+    // letter may be signed, but we only pass positive values
+    for (auto letter : 
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~:/?#[]@!$&'()*+,;=")
 {
+      set.set(letter);
+    }
+  }
+  std::bitset<127> set;
+};
+
+static const ValidChars validChars;
+
+static bool validURLChars(const string& str)
+{
+  for (auto iter = str.begin(); iter != str.end(); ++iter) {
+    if (*iter == '%') {
+      ++iter;
+      if (iter == str.end() || isxdigit(static_cast<unsigned char>(*iter)) == 
0) {
+        return false;
+      }
+      ++iter;
+      if (iter == str.end() || isxdigit(static_cast<unsigned char>(*iter)) == 
0) {
+        return false;
+      }
+    }
+    else if (static_cast<size_t>(*iter) >= validChars.set.size() || 
!validChars.set[*iter]) {
+      return false;
+    }
+  }
+  return true;
+}
+
+bool WebServer::validURL(const YaHTTP::URL& url)
+{
+  bool isOK = true;
+  isOK = isOK && validURLChars(url.protocol);
+  isOK = isOK && validURLChars(url.host);
+  isOK = isOK && validURLChars(url.username);
+  isOK = isOK && validURLChars(url.password);
+  isOK = isOK && validURLChars(url.path);
+  isOK = isOK && validURLChars(url.parameters);
+  isOK = isOK && validURLChars(url.anchor);
+  return isOK;
+}
+
 void WebServer::serveConnection(const std::shared_ptr<Socket>& client) const {
   const auto unique = getUniqueID();
   const string logprefix = d_logprefix + to_string(unique) + " ";
@@ -504,6 +553,9 @@
            d_slog->error(Logr::Warning, e.what(), "Unable to parse request"));
     }
 
+    if (!validURL(req.url)) {
+      throw PDNSException("Received request with invalid URL");
+    }
     // Uses of `remote` below guarded by d_loglevel
     if (d_loglevel > WebServer::LogLevel::None) {
       client->getRemote(remote);
@@ -535,7 +587,7 @@
   }
 
   if (d_loglevel >= WebServer::LogLevel::Normal) {
-    SLOG(g_log<<Logger::Notice<<logprefix<<remote<<" \""<<req.method<<" 
"<<YaHTTP::Utility::encodeURL(req.url.path)<<" 
HTTP/"<<req.versionStr(req.version)<<"\" "<<resp.status<<" 
"<<reply.size()<<endl,
+    SLOG(g_log<<Logger::Notice<<logprefix<<remote<<" \""<<req.method<<" 
"<<req.url.path<<" HTTP/"<<req.versionStr(req.version)<<"\" "<<resp.status<<" 
"<<reply.size()<<endl,
          d_slog->info(Logr::Info, "Request", "remote", 
Logging::Loggable(remote), "method", Logging::Loggable(req.method),
                       "urlpath", Logging::Loggable(req.url.path), 
"HTTPVersion", Logging::Loggable(req.versionStr(req.version)),
                       "status", Logging::Loggable(resp.status), "respsize",  
Logging::Loggable(reply.size())));
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/pdns/webserver.hh 
new/pdns-4.8.3/pdns/webserver.hh
--- old/pdns-4.8.0/pdns/webserver.hh    2023-06-01 08:54:16.000000000 +0200
+++ new/pdns-4.8.3/pdns/webserver.hh    2023-10-05 11:22:14.000000000 +0200
@@ -213,6 +213,8 @@
     d_acl = nmg;
   }
 
+  static bool validURL(const YaHTTP::URL& url);
+
   void bind();
   void go();
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pdns-4.8.0/pdns/ws-auth.cc 
new/pdns-4.8.3/pdns/ws-auth.cc
--- old/pdns-4.8.0/pdns/ws-auth.cc      2023-06-01 08:54:16.000000000 +0200
+++ new/pdns-4.8.3/pdns/ws-auth.cc      2023-10-05 11:22:14.000000000 +0200
@@ -1836,6 +1836,13 @@
 
     updateDomainSettingsFromDocument(B, di, zonename, document, 
!new_records.empty());
 
+    if (!catalog && kind == DomainInfo::Master) {
+      auto defaultCatalog = ::arg()["default-catalog-zone"];
+      if (!defaultCatalog.empty()) {
+        di.backend->setCatalog(zonename, DNSName(defaultCatalog));
+      }
+    }
+
     di.backend->commitTransaction();
 
     g_zoneCache.add(zonename, di.id); // make new zone visible

Reply via email to