]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
4849. [bug] Duplicate zones could appear in the .nzf file if
authorMark Andrews <marka@isc.org>
Wed, 20 Dec 2017 06:13:58 +0000 (17:13 +1100)
committerMark Andrews <marka@isc.org>
Wed, 20 Dec 2017 06:16:49 +0000 (17:16 +1100)
                        addzone failed. [RT #46435]

(cherry picked from commit 2d7f89b9c76646baca3d65a938844f1f90157d83)
(cherry picked from commit 22a32060c14d8b791e1fcffcf3a282150052c375)

CHANGES
bin/named/server.c
bin/tests/system/addzone/ns3/e.db [new file with mode: 0644]
bin/tests/system/addzone/tests.sh
bin/tests/system/feature-test.c

diff --git a/CHANGES b/CHANGES
index 5d881ae5d64c3aeffc9806588e20a4258545ef24..93d0876938226974d37048f28db75d117e9dd1f1 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+4849.  [bug]           Duplicate zones could appear in the .nzf file if
+                       addzone failed. [RT #46435]
+
 4846.  [test]          Adjust timing values in runtime system test. Address
                        named.pid removal races in runtime system test.
                        [RT #46800]
index 05a69f6074fd995b4bbb615c0028ecbf24ad118d..0f086c2bb63094ec18223864ac1568fdfd2d561c 100644 (file)
@@ -11999,6 +11999,7 @@ do_addzone(ns_server_t *server, ns_cfgctx_t *cfg, dns_view_t *view,
        dns_zone_t *zone = NULL;
 #ifndef HAVE_LMDB
        FILE *fp = NULL;
+       isc_boolean_t cleanup_config = ISC_FALSE;
 #else /* HAVE_LMDB */
        MDB_txn *txn = NULL;
        MDB_dbi dbi;
@@ -12081,14 +12082,15 @@ do_addzone(ns_server_t *server, ns_cfgctx_t *cfg, dns_view_t *view,
         * we've created. If there was a previous one, merge the new
         * zone into it.
         */
-       if (cfg->nzf_config == NULL)
+       if (cfg->nzf_config == NULL) {
                cfg_obj_attach(zoneconf, &cfg->nzf_config);
-       else {
+       else {
                cfg_obj_t *z;
                DE_CONST(zoneobj, z);
                CHECK(cfg_parser_mapadd(cfg->add_parser,
                                        cfg->nzf_config, z, "zone"));
        }
+       cleanup_config = ISC_TRUE;
 #endif /* HAVE_LMDB */
 
        /*
@@ -12134,6 +12136,12 @@ do_addzone(ns_server_t *server, ns_cfgctx_t *cfg, dns_view_t *view,
 #ifndef HAVE_LMDB
        if (fp != NULL)
                (void)isc_stdio_close(fp);
+       if (result != ISC_R_SUCCESS && cleanup_config) {
+               tresult = delete_zoneconf(view, cfg->add_parser,
+                                        cfg->nzf_config, name,
+                                        NULL);
+               RUNTIME_CHECK(tresult == ISC_R_SUCCESS);
+       }
 #else /* HAVE_LMDB */
        if (txn != NULL)
                (void) nzd_close(&txn, ISC_FALSE);
diff --git a/bin/tests/system/addzone/ns3/e.db b/bin/tests/system/addzone/ns3/e.db
new file mode 100644 (file)
index 0000000..620f4cd
--- /dev/null
@@ -0,0 +1,3 @@
+@      SOA     ns3 hostmaster 0 0 0 0 0
+@      NS      ns3
+ns3    A       10.53.0.3
index 60e68cd21bef91070e84d6378d81f4aa8f1d782f..bd3bc75a96fd4fd9d28ae726b3931be2a3337fd2 100755 (executable)
@@ -504,5 +504,19 @@ n=`expr $n + 1`
 if [ $ret != 0 ]; then echo "I:failed"; fi
 status=`expr $status + $ret`
 
+if ! $FEATURETEST --with-lmdb
+then
+    echo "I:check that addzone is fully reversed on failure (--with-lmdb=no) ($n)"
+    ret=0
+    $RNDC -c ../common/rndc.conf -s 10.53.0.3 -p 9953 addzone "test1.baz" '{ type master; file "e.db"; };' > /dev/null 2>&1 || ret=1
+    $RNDC -c ../common/rndc.conf -s 10.53.0.3 -p 9953 addzone "test2.baz" '{ type master; file "dne.db"; };' > /dev/null 2>&1 && ret=1
+    $RNDC -c ../common/rndc.conf -s 10.53.0.3 -p 9953 addzone "test3.baz" '{ type master; file "e.db"; };' > /dev/null 2>&1 || ret=1
+    $RNDC -c ../common/rndc.conf -s 10.53.0.3 -p 9953 delzone "test3.baz" > /dev/null 2>&1 || ret=1
+    grep test2.baz ns3/_default.nzf > /dev/null && ret=1
+    n=`expr $n + 1`
+    if [ $ret != 0 ]; then echo "I:failed"; fi
+    status=`expr $status + $ret`
+fi
+
 echo "I:exit status: $status"
 [ $status -eq 0 ] || exit 1
index 3f7c7cb7f95d57b2188b4ea128b9e9f13f514dcd..1f0baa79f462e53b1c0c2d2dce2fc4080707374a 100644 (file)
@@ -45,6 +45,7 @@ usage() {
        fprintf(stderr, "       --rpz-nsdname\n");
        fprintf(stderr, "       --rpz-nsip\n");
        fprintf(stderr, "       --with-idn\n");
+       fprintf(stderr, "       --with-lmdb\n");
 }
 
 int
@@ -156,6 +157,14 @@ main(int argc, char **argv) {
 #endif
        }
 
+       if (strcmp(argv[1], "--with-lmdb") == 0) {
+#ifdef HAVE_LMDB
+               return (0);
+#else
+               return (1);
+#endif
+       }
+
        if (strcmp(argv[1], "--ipv6only=no") == 0) {
 #ifdef WIN32
                return (0);