diff --git a/CHANGES b/CHANGES index 345288bf32..4c63aeda7c 100644 --- 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, diff --git a/bin/named/server.c b/bin/named/server.c index 5864254091..5a04cd7d5f 100644 --- a/bin/named/server.c +++ b/bin/named/server.c @@ -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); } diff --git a/bin/tests/system/inline/clean.sh b/bin/tests/system/inline/clean.sh index 44ee6e8973..b88aaf2022 100644 --- a/bin/tests/system/inline/clean.sh +++ b/bin/tests/system/inline/clean.sh @@ -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* diff --git a/bin/tests/system/inline/tests.sh b/bin/tests/system/inline/tests.sh index 7c349ff7c5..f9928890b4 100755 --- a/bin/tests/system/inline/tests.sh +++ b/bin/tests/system/inline/tests.sh @@ -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