diff --git a/CHANGES b/CHANGES index b8a602cff3..ac25049330 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +3908. [bug] rndc now differentiates between a zone in multiple + views and a zone that doesn't exist at all. [RT #36691] + 3907. [cleanup] Alphabetise rndc help. [RT#36683] 3906. [protocol] Update URI record format to comply with diff --git a/bin/named/server.c b/bin/named/server.c index 7f4aab62bd..24989cfb52 100644 --- a/bin/named/server.c +++ b/bin/named/server.c @@ -7149,6 +7149,10 @@ zone_from_args(ns_server_t *server, char *args, const char *zonetxt, snprintf(problem, sizeof(problem), "no matching zone '%s' in any view", zonetxt); + else if (result == ISC_R_MULTIPLE) + snprintf(problem, sizeof(problem), + "zone '%s' was found in multiple views", + zonetxt); } else { result = dns_viewlist_find(&server->viewlist, viewtxt, rdclass, &view); diff --git a/bin/tests/system/zonechecks/ns1/named.conf b/bin/tests/system/zonechecks/ns1/named.conf index 6caed2ff79..a0393ce8bd 100644 --- a/bin/tests/system/zonechecks/ns1/named.conf +++ b/bin/tests/system/zonechecks/ns1/named.conf @@ -14,8 +14,6 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: named.conf,v 1.3 2012/01/31 23:47:32 tbox Exp $ */ - // NS1 controls { /* empty */ }; @@ -43,15 +41,33 @@ controls { inet 10.53.0.1 port 9953 allow { any; } keys { rndc_key; }; }; -zone "master.example" { - type master; - file "master.db"; - allow-update { any; }; - allow-transfer { any; }; - auto-dnssec maintain; +view unused { + match-clients { none; }; + + zone "duplicate.example" { + type master; + file "duplicate.db"; + }; }; -zone "reload.example" { - type master; - file "reload.db"; +view primary { + match-clients { any; }; + + zone "master.example" { + type master; + file "master.db"; + allow-update { any; }; + allow-transfer { any; }; + auto-dnssec maintain; + }; + + zone "reload.example" { + type master; + file "reload.db"; + }; + + zone "duplicate.example" { + type master; + file "duplicate.db"; + }; }; diff --git a/bin/tests/system/zonechecks/setup.sh b/bin/tests/system/zonechecks/setup.sh index 3ee7aca474..0a6c0f6ac2 100644 --- a/bin/tests/system/zonechecks/setup.sh +++ b/bin/tests/system/zonechecks/setup.sh @@ -22,6 +22,7 @@ $SHELL clean.sh test -r $RANDFILE || $GENRANDOM 400 $RANDFILE $SHELL ../genzone.sh 1 > ns1/master.db +$SHELL ../genzone.sh 1 > ns1/duplicate.db cd ns1 touch master.db.signed echo '$INCLUDE "master.db.signed"' >> master.db diff --git a/bin/tests/system/zonechecks/tests.sh b/bin/tests/system/zonechecks/tests.sh index 62f293ae05..579db14859 100644 --- a/bin/tests/system/zonechecks/tests.sh +++ b/bin/tests/system/zonechecks/tests.sh @@ -14,8 +14,6 @@ # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR # PERFORMANCE OF THIS SOFTWARE. -# $Id: tests.sh,v 1.10 2012/02/02 03:26:55 marka Exp $ - SYSTEMTESTTOP=.. . $SYSTEMTESTTOP/conf.sh @@ -237,5 +235,16 @@ checkfor "files: reload.db$" rndc.out.removeinclude if [ $ret != 0 ]; then echo "I:failed"; fi status=`expr $status + $ret` +echo "I: checking 'rdnc zonestatus' with duplicated zone name" +ret=0 +$RNDC -c ../common/rndc.conf -s 10.53.0.1 -p 9953 zonestatus duplicate.example > rndc.out.duplicate 2>&1 +checkfor "zone 'duplicate.example' was found in multiple views" rndc.out.duplicate +$RNDC -c ../common/rndc.conf -s 10.53.0.1 -p 9953 zonestatus duplicate.example in primary > rndc.out.duplicate 2>&1 +checkfor "name: duplicate.example" rndc.out.duplicate +$RNDC -c ../common/rndc.conf -s 10.53.0.1 -p 9953 zonestatus nosuchzone.example > rndc.out.duplicate 2>&1 +checkfor "no matching zone 'nosuchzone.example' in any view" rndc.out.duplicate +if [ $ret != 0 ]; then echo "I:failed"; fi +status=`expr $status + $ret` + echo "I:exit status: $status" exit $status diff --git a/lib/dns/include/dns/view.h b/lib/dns/include/dns/view.h index 0e7808db60..98ae8d5f72 100644 --- a/lib/dns/include/dns/view.h +++ b/lib/dns/include/dns/view.h @@ -743,6 +743,7 @@ dns_viewlist_findzone(dns_viewlist_t *list, dns_name_t *name, isc_boolean_t allc * Returns: *\li #ISC_R_SUCCESS A matching zone was found. *\li #ISC_R_NOTFOUND No matching zone was found. + *\li #ISC_R_MULTIPLE Multiple zones with the same name were found. */ isc_result_t diff --git a/lib/dns/view.c b/lib/dns/view.c index 4a45f1912b..fe43e94ef5 100644 --- a/lib/dns/view.c +++ b/lib/dns/view.c @@ -1441,7 +1441,7 @@ dns_viewlist_findzone(dns_viewlist_t *list, dns_name_t *name, if (zone2 != NULL) { dns_zone_detach(&zone1); dns_zone_detach(&zone2); - return (ISC_R_NOTFOUND); + return (ISC_R_MULTIPLE); } } diff --git a/lib/isc/include/isc/result.h b/lib/isc/include/isc/result.h index dcd457b3d1..3a768fd080 100644 --- a/lib/isc/include/isc/result.h +++ b/lib/isc/include/isc/result.h @@ -88,9 +88,10 @@ #define ISC_R_BADADDRESSFORM 59 /*%< invalid address format */ #define ISC_R_BADBASE32 60 /*%< bad base32 encoding */ #define ISC_R_UNSET 61 /*%< unset */ +#define ISC_R_MULTIPLE 62 /*%< multiple */ /*% Not a result code: the number of results. */ -#define ISC_R_NRESULTS 62 +#define ISC_R_NRESULTS 63 ISC_LANG_BEGINDECLS diff --git a/lib/isc/result.c b/lib/isc/result.c index a9405fddf0..e4f0ced99b 100644 --- a/lib/isc/result.c +++ b/lib/isc/result.c @@ -103,6 +103,7 @@ static const char *text[ISC_R_NRESULTS] = { "invalid address format", /*%< 59 */ "bad base32 encoding", /*%< 60 */ "unset", /*%< 61 */ + "multiple", /*%< 62 */ }; #define ISC_RESULT_RESULTSET 2