From 2d7f89b9c76646baca3d65a938844f1f90157d83 Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Wed, 20 Dec 2017 17:13:58 +1100 Subject: [PATCH] 4849. [bug] Duplicate zones could appear in the .nzf file if addzone failed. [RT #46435] --- CHANGES | 3 +++ bin/named/server.c | 12 ++++++++++-- bin/tests/system/addzone/ns3/e.db | 3 +++ bin/tests/system/addzone/tests.sh | 14 ++++++++++++++ bin/tests/system/feature-test.c | 9 +++++++++ 5 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 bin/tests/system/addzone/ns3/e.db diff --git a/CHANGES b/CHANGES index 5301833ce7..19fcd83c63 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +4849. [bug] Duplicate zones could appear in the .nzf file if + addzone failed. [RT #46435] + 4848. [func] Zone types "primary" and "secondary" can now be used as synonyms for "master" and "slave" in named.conf. [RT #46713] diff --git a/bin/named/server.c b/bin/named/server.c index c2f2f484da..034246b6dd 100644 --- a/bin/named/server.c +++ b/bin/named/server.c @@ -12609,6 +12609,7 @@ do_addzone(named_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; @@ -12701,14 +12702,15 @@ do_addzone(named_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 */ /* @@ -12754,6 +12756,12 @@ do_addzone(named_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 index 0000000000..620f4cd947 --- /dev/null +++ b/bin/tests/system/addzone/ns3/e.db @@ -0,0 +1,3 @@ +@ SOA ns3 hostmaster 0 0 0 0 0 +@ NS ns3 +ns3 A 10.53.0.3 diff --git a/bin/tests/system/addzone/tests.sh b/bin/tests/system/addzone/tests.sh index fe14f9e3b3..77f12a3326 100755 --- a/bin/tests/system/addzone/tests.sh +++ b/bin/tests/system/addzone/tests.sh @@ -672,5 +672,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 diff --git a/bin/tests/system/feature-test.c b/bin/tests/system/feature-test.c index 155ea7615e..6ef94b2165 100644 --- a/bin/tests/system/feature-test.c +++ b/bin/tests/system/feature-test.c @@ -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);