]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
4856. [bug] 'rndc zonestatus' reported the wrong underlying type
authorMark Andrews <marka@isc.org>
Wed, 3 Jan 2018 23:10:05 +0000 (10:10 +1100)
committerMark Andrews <marka@isc.org>
Wed, 3 Jan 2018 23:12:15 +0000 (10:12 +1100)
                        for a inline slave zone. [RT #46875]

(cherry picked from commit 0b27aa071284d184c7413929378fd2c03f2c7ead)

CHANGES
bin/named/server.c
bin/tests/system/inline/clean.sh
bin/tests/system/inline/tests.sh

diff --git a/CHANGES b/CHANGES
index 345288bf32ebead5199479adb9d15e66c4b54d6d..4c63aeda7c4c52dfe48355c966ef50f00306c436 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+4856.  [bug]           'rndc zonestatus' reported the wrong underlying type
+                       for a inline slave zone. [RT #46875]
+
 4852.  [bug]           Handle strftime() failing in isc_time_formatISO8601ms.
                        Add REQUIRE's and INSIST's to isc_time_formattimestamp,
                        isc_time_formathttptimestamp, isc_time_formatISO8601,
index 586425409127a00d62672c81dd30af5af0014754..5a04cd7d5ffadd3580c95065a63c4dff0fc7a6b5 100644 (file)
@@ -13186,7 +13186,7 @@ ns_server_zonestatus(ns_server_t *server, isc_lex_t *lex,
                     isc_buffer_t **text)
 {
        isc_result_t result = ISC_R_SUCCESS;
-       dns_zone_t *zone = NULL, *raw = NULL;
+       dns_zone_t *zone = NULL, *raw = NULL, *mayberaw = NULL;
        const char *type, *file;
        char zonename[DNS_NAME_FORMATSIZE];
        isc_uint32_t serial, signed_serial, nodes;
@@ -13219,7 +13219,19 @@ ns_server_zonestatus(ns_server_t *server, isc_lex_t *lex,
                goto cleanup;
        }
 
-       zonetype = dns_zone_gettype(zone);
+       /* Inline signing? */
+       CHECK(dns_zone_getdb(zone, &db));
+       dns_zone_getraw(zone, &raw);
+       hasraw = ISC_TF(raw != NULL);
+       if (hasraw) {
+               mayberaw = raw;
+               zonetype = dns_zone_gettype(raw);
+               CHECK(dns_zone_getdb(raw, &rawdb));
+       } else {
+               mayberaw = zone;
+               zonetype = dns_zone_gettype(zone);
+       }
+
        switch (zonetype) {
        case dns_zone_master:
                type = "master";
@@ -13246,15 +13258,8 @@ ns_server_zonestatus(ns_server_t *server, isc_lex_t *lex,
                type = "unknown";
        }
 
-       /* Inline signing? */
-       CHECK(dns_zone_getdb(zone, &db));
-       dns_zone_getraw(zone, &raw);
-       hasraw = ISC_TF(raw != NULL);
-       if (hasraw)
-               CHECK(dns_zone_getdb(raw, &rawdb));
-
        /* Serial number */
-       serial = dns_zone_getserial(hasraw ? raw : zone);
+       serial = dns_zone_getserial(mayberaw);
        snprintf(serbuf, sizeof(serbuf), "%u", serial);
        if (hasraw) {
                signed_serial = dns_zone_getserial(zone);
@@ -13272,8 +13277,8 @@ ns_server_zonestatus(ns_server_t *server, isc_lex_t *lex,
                           DNS_ZONEKEY_MAINTAIN) != 0);
 
        /* Master files */
-       file = dns_zone_getfile(hasraw ? raw : zone);
-       nfiles = dns_zone_getincludes(hasraw ? raw : zone, &incfiles);
+       file = dns_zone_getfile(mayberaw);
+       nfiles = dns_zone_getincludes(mayberaw, &incfiles);
 
        /* Load time */
        dns_zone_getloadtime(zone, &loadtime);
@@ -13284,9 +13289,9 @@ ns_server_zonestatus(ns_server_t *server, isc_lex_t *lex,
            zonetype == dns_zone_stub ||
            zonetype == dns_zone_redirect)
        {
-               dns_zone_getexpiretime(zone, &expiretime);
+               dns_zone_getexpiretime(mayberaw, &expiretime);
                isc_time_formathttptimestamp(&expiretime, xbuf, sizeof(xbuf));
-               dns_zone_getrefreshtime(zone, &refreshtime);
+               dns_zone_getrefreshtime(mayberaw, &refreshtime);
                isc_time_formathttptimestamp(&refreshtime, rbuf, sizeof(rbuf));
        }
 
@@ -13301,9 +13306,8 @@ ns_server_zonestatus(ns_server_t *server, isc_lex_t *lex,
 
        /* Dynamic? */
        if (zonetype == dns_zone_master) {
-               dynamic = dns_zone_isdynamic(hasraw ? raw : zone, ISC_TRUE);
-               frozen = dynamic && !dns_zone_isdynamic(hasraw ? raw : zone,
-                                                       ISC_FALSE);
+               dynamic = dns_zone_isdynamic(mayberaw, ISC_TRUE);
+               frozen = dynamic && !dns_zone_isdynamic(mayberaw, ISC_FALSE);
        }
 
        /* Next resign event */
@@ -13352,8 +13356,9 @@ ns_server_zonestatus(ns_server_t *server, isc_lex_t *lex,
                CHECK(putstr(text, file));
                for (i = 0; i < nfiles; i++) {
                        CHECK(putstr(text, ", "));
-                       if (incfiles[i] != NULL)
+                       if (incfiles[i] != NULL) {
                                CHECK(putstr(text, incfiles[i]));
+                       }
                }
        }
 
@@ -13384,12 +13389,14 @@ ns_server_zonestatus(ns_server_t *server, isc_lex_t *lex,
 
        if (secure) {
                CHECK(putstr(text, "\nsecure: yes"));
-               if (hasraw)
+               if (hasraw) {
                        CHECK(putstr(text, "\ninline signing: yes"));
-               else
+               } else {
                        CHECK(putstr(text, "\ninline signing: no"));
-       } else
+               }
+       } else {
                CHECK(putstr(text, "\nsecure: no"));
+       }
 
        if (maintain) {
                CHECK(putstr(text, "\nkey maintenance: automatic"));
@@ -13397,10 +13404,11 @@ ns_server_zonestatus(ns_server_t *server, isc_lex_t *lex,
                        CHECK(putstr(text, "\nnext key event: "));
                        CHECK(putstr(text, kbuf));
                }
-       } else if (allow)
+       } else if (allow) {
                CHECK(putstr(text, "\nkey maintenance: on command"));
-       else if (secure || hasraw)
+       } else if (secure || hasraw) {
                CHECK(putstr(text, "\nkey maintenance: none"));
+       }
 
        if (!isc_time_isepoch(&resigntime)) {
                CHECK(putstr(text, "\nnext resign node: "));
@@ -13411,40 +13419,50 @@ ns_server_zonestatus(ns_server_t *server, isc_lex_t *lex,
 
        if (dynamic) {
                CHECK(putstr(text, "\ndynamic: yes"));
-               if (frozen)
+               if (frozen) {
                        CHECK(putstr(text, "\nfrozen: yes"));
-               else
+               } else {
                        CHECK(putstr(text, "\nfrozen: no"));
-       } else
+               }
+       } else {
                CHECK(putstr(text, "\ndynamic: no"));
+       }
 
        CHECK(putstr(text, "\nreconfigurable via modzone: "));
        CHECK(putstr(text, dns_zone_getadded(zone) ? "yes" : "no"));
 
  cleanup:
        /* Indicate truncated output if possible. */
-       if (result == ISC_R_NOSPACE)
+       if (result == ISC_R_NOSPACE) {
                (void) putstr(text, "\n...");
-       if ((result == ISC_R_SUCCESS || result == ISC_R_NOSPACE))
+       }
+       if ((result == ISC_R_SUCCESS || result == ISC_R_NOSPACE)) {
                (void) putnull(text);
+       }
 
-       if (db != NULL)
+       if (db != NULL) {
                dns_db_detach(&db);
-       if (rawdb != NULL)
+       }
+       if (rawdb != NULL) {
                dns_db_detach(&rawdb);
-       if (incfiles != NULL) {
+       }
+       if (incfiles != NULL && mayberaw != NULL) {
                int i;
-               isc_mem_t *mctx = dns_zone_getmctx(hasraw ? raw : zone);
+               isc_mem_t *mctx = dns_zone_getmctx(mayberaw);
 
-               for (i = 0; i < nfiles; i++)
-                       if (incfiles[i] != NULL)
+               for (i = 0; i < nfiles; i++) {
+                       if (incfiles[i] != NULL) {
                                isc_mem_free(mctx, incfiles[i]);
+                       }
+               }
                isc_mem_free(mctx, incfiles);
        }
-       if (raw != NULL)
+       if (raw != NULL) {
                dns_zone_detach(&raw);
-       if (zone != NULL)
+       }
+       if (zone != NULL) {
                dns_zone_detach(&zone);
+       }
        return (result);
 }
 
index 44ee6e8973bccf06dc23d39b61548575cd729bae..b88aaf20226249aea6e21c4335c8f5677330b64c 100644 (file)
@@ -99,3 +99,4 @@ rm -f ns3/a-file
 rm -f ns*/named.lock
 rm -f dig.out.*
 rm -f ns3/nzf-*
+rm -f rndc.out.ns*
index 7c349ff7c5329cc83de7daa17e6c40aaff203e5e..f9928890b4fc741a0a25d5235474a60f3c33f9b3 100755 (executable)
@@ -1084,5 +1084,21 @@ grep "DNSKEY 8 1 [0-9]* [0-9]* [0-9]* ${kskid} " dig.out.ns3.test$n > /dev/null
 if [ $ret != 0 ]; then echo "I:failed"; fi
 status=`expr $status + $ret`
 
+n=`expr $n + 1`
+echo "I:check that zonestatus reports 'type: master' for a inline master zone ($n)"
+ret=0
+$RNDC -c ../common/rndc.conf -s 10.53.0.3 -p 9953 zonestatus master > rndc.out.ns3.test$n
+grep "type: master" rndc.out.ns3.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 that zonestatus reports 'type: slave' for a inline slave zone ($n)"
+ret=0
+$RNDC -c ../common/rndc.conf -s 10.53.0.3 -p 9953 zonestatus bits > rndc.out.ns3.test$n
+grep "type: slave" rndc.out.ns3.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