From: Mark Andrews Date: Sat, 2 Aug 2014 04:43:26 +0000 (+1000) Subject: 3908. [bug] rndc now differentiates between a zone in multiple X-Git-Tag: v9.8.8b2~18 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bbca0d1e81550a778e811cb7da985e31c7846564;p=thirdparty%2Fbind9.git 3908. [bug] rndc now differentiates between a zone in multiple views and a zone that doesn't exist at all. [RT #36691] (cherry picked from commit c38341ec435fb78de6d12c1001201f9ac7487b68) (cherry picked from commit 13ffd78910e81a666723a25341b1636b625abfbd) --- diff --git a/CHANGES b/CHANGES index acc877f60fa..2ce93c8139d 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 721aac57251..74d04f0afc6 100644 --- a/bin/named/server.c +++ b/bin/named/server.c @@ -6273,6 +6273,10 @@ zone_from_args(ns_server_t *server, char *args, dns_zone_t **zonep, 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 new file mode 100644 index 00000000000..a0393ce8bdd --- /dev/null +++ b/bin/tests/system/zonechecks/ns1/named.conf @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2012, 2013 Internet Systems Consortium, Inc. ("ISC") + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, + * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +// NS1 + +controls { /* empty */ }; + +options { + query-source address 10.53.0.1; + notify-source 10.53.0.1; + transfer-source 10.53.0.1; + port 5300; + pid-file "named.pid"; + listen-on { 10.53.0.1; }; + listen-on-v6 { none; }; + recursion no; + notify yes; + dnssec-enable yes; + dnssec-validation yes; +}; + +key rndc_key { + secret "1234abcd8765"; + algorithm hmac-sha256; +}; + +controls { + inet 10.53.0.1 port 9953 allow { any; } keys { rndc_key; }; +}; + +view unused { + match-clients { none; }; + + zone "duplicate.example" { + type master; + file "duplicate.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 new file mode 100644 index 00000000000..0a6c0f6ac2c --- /dev/null +++ b/bin/tests/system/zonechecks/setup.sh @@ -0,0 +1,34 @@ +#!/bin/sh +# +# Copyright (C) 2012-2014 Internet Systems Consortium, Inc. ("ISC") +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH +# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +# AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, +# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. + +SYSTEMTESTTOP=.. +. $SYSTEMTESTTOP/conf.sh + +$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 +$KEYGEN -r $RANDFILE -3q master.example > /dev/null 2>&1 +$KEYGEN -r $RANDFILE -3qfk master.example > /dev/null 2>&1 +$SIGNER -SD -o master.example master.db > /dev/null 2>&1 +echo '$INCLUDE "soa.db"' > reload.db +echo '@ 0 NS .' >> reload.db +echo '@ 0 SOA . . 1 0 0 0 0' > soa.db diff --git a/bin/tests/system/zonechecks/tests.sh b/bin/tests/system/zonechecks/tests.sh index d3c88232b22..e49db56b56a 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$ - SYSTEMTESTTOP=.. . $SYSTEMTESTTOP/conf.sh @@ -160,5 +158,17 @@ then else echo "I:failed (status)"; status=1 fi + +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 ccb99fedf85..5417987c0f0 100644 --- a/lib/dns/include/dns/view.h +++ b/lib/dns/include/dns/view.h @@ -707,6 +707,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 7899a3f27ff..4bfe203ccbd 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 dcd457b3d1b..3a768fd0809 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 a9405fddf05..e4f0ced99b4 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