]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
3233. [bug] 'rndc freeze/thaw' didn't work for inline zones.
authorMark Andrews <marka@isc.org>
Fri, 2 Dec 2011 02:44:01 +0000 (02:44 +0000)
committerMark Andrews <marka@isc.org>
Fri, 2 Dec 2011 02:44:01 +0000 (02:44 +0000)
                        [RT #26632]

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

diff --git a/CHANGES b/CHANGES
index c85dfdc551c77d03b9c12345f97bf6d7e2bd3f37..149ab0f1e840b3d1b7496ad669b3705a17200300 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+3233.  [bug]           'rndc freeze/thaw' didn't work for inline zones.
+                       [RT #26632]
+
 3232.  [bug]           Zero zone->curmaster before return in
                        dns_zone_setmasterswithkeys(). [RT #26732]
 
index 83a0c118cd5e05e1caf1a2c94d33f63025ad846e..f8cdc99f84ce20f2408a05365fd13eb304b7316d 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: server.c,v 1.631 2011/11/29 00:49:25 marka Exp $ */
+/* $Id: server.c,v 1.632 2011/12/02 02:44:01 marka Exp $ */
 
 /*! \file */
 
@@ -7383,7 +7383,7 @@ ns_server_freeze(ns_server_t *server, isc_boolean_t freeze, char *args,
                 isc_buffer_t *text)
 {
        isc_result_t result, tresult;
-       dns_zone_t *zone = NULL;
+       dns_zone_t *zone = NULL, *raw = NULL;
        dns_zonetype_t type;
        char classstr[DNS_RDATACLASS_FORMATSIZE];
        char zonename[DNS_NAME_FORMATSIZE];
@@ -7415,6 +7415,12 @@ ns_server_freeze(ns_server_t *server, isc_boolean_t freeze, char *args,
                              isc_result_totext(tresult));
                return (tresult);
        }
+       dns_zone_getraw(zone, &raw);
+       if (raw != NULL) {
+               dns_zone_detach(&zone);
+               dns_zone_attach(raw, &zone);
+               dns_zone_detach(&raw);
+       }
        type = dns_zone_gettype(zone);
        if (type != dns_zone_master) {
                dns_zone_detach(&zone);
index 8f2078132067cbbaf4b46fabf8fcefb29d41ae9c..12ccefcea86633bae4ef1dbd2e603e7d6d9fb7c0 100644 (file)
@@ -12,7 +12,7 @@
 # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 # PERFORMANCE OF THIS SOFTWARE.
 
-# $Id: clean.sh,v 1.6 2011/10/30 22:59:45 each Exp $
+# $Id: clean.sh,v 1.7 2011/12/02 02:44:01 marka Exp $
 
 rm -f */named.memstats
 rm -f */named.run
@@ -53,3 +53,5 @@ rm -f */*.jbk
 rm -f random.data
 rm -f dig.out.ns*.test*
 rm -f signing.out*
+rm -f freeze.test*
+rm -f thaw.test*
index bb93632b519d2a6dcfb723888cb5a3b9fd69b326..fbcd96f9172ef0aa819000e0a3aaf963869731e0 100644 (file)
@@ -14,7 +14,7 @@
 # OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 # PERFORMANCE OF THIS SOFTWARE.
 
-# $Id: tests.sh,v 1.6 2011/10/28 06:20:05 each Exp $
+# $Id: tests.sh,v 1.7 2011/12/02 02:44:01 marka Exp $
 
 SYSTEMTESTTOP=..
 . $SYSTEMTESTTOP/conf.sh
@@ -548,5 +548,61 @@ done
 if [ $ret != 0 ]; then echo "I:failed"; fi
 status=`expr $status + $ret`
 
+n=`expr $n + 1`
+echo "I:checking rndc freeze/thaw of dynamic inline zone ($n)"
+ret=0
+$RNDC -c ../common/rndc.conf -s 10.53.0.3 -p 9953 freeze dynamic > freeze.test$n 2>&1 || ret=1 
+sleep 1
+awk '$2 == ";" && $3 == "serial" { print $1 + 1, $2, $3; next; }
+     { print; }
+     END { print "freeze1.dynamic. 0 TXT freeze1"; } ' ns3/dynamic.db > ns3/dynamic.db.new
+mv ns3/dynamic.db.new ns3/dynamic.db
+$RNDC -c ../common/rndc.conf -s 10.53.0.3 -p 9953 thaw dynamic > thaw.test$n 2>&1 || ret=1
+if [ $ret != 0 ]; then echo "I:failed"; fi
+status=`expr $status + $ret`
+
+n=`expr $n + 1`
+echo "I:check added record freeze1.dynamic ($n)"
+for i in 1 2 3 4 5 6 7 8 9
+do
+    ret=0
+    $DIG $DIGOPTS @10.53.0.3 -p 5300 freeze1.dynamic TXT > dig.out.ns3.test$n
+    grep "status: NOERROR" dig.out.ns3.test$n > /dev/null || ret=1
+    grep "ANSWER: 2," dig.out.ns3.test$n > /dev/null || ret=1
+    test $ret = 0 && break
+    sleep 1
+done
+if [ $ret != 0 ]; then echo "I:failed"; fi
 status=`expr $status + $ret`
+
+# allow 1 second so that file time stamps change
+sleep 1
+
+n=`expr $n + 1`
+echo "I:checking rndc freeze/thaw of server ($n)"
+ret=0
+$RNDC -c ../common/rndc.conf -s 10.53.0.3 -p 9953 freeze > freeze.test$n 2>&1 || ret=1
+sleep 1
+awk '$2 == ";" && $3 == "serial" { print $1 + 1, $2, $3; next; }
+     { print; }
+     END { print "freeze2.dynamic. 0 TXT freeze2"; } ' ns3/dynamic.db > ns3/dynamic.db.new
+mv ns3/dynamic.db.new ns3/dynamic.db
+$RNDC -c ../common/rndc.conf -s 10.53.0.3 -p 9953 thaw > thaw.test$n 2>&1 || ret=1
+if [ $ret != 0 ]; then echo "I:failed"; fi
+status=`expr $status + $ret`
+
+n=`expr $n + 1`
+echo "I:check added record freeze2.dynamic ($n)"
+for i in 1 2 3 4 5 6 7 8 9
+do
+    ret=0
+    $DIG $DIGOPTS @10.53.0.3 -p 5300 freeze2.dynamic TXT > dig.out.ns3.test$n
+    grep "status: NOERROR" dig.out.ns3.test$n > /dev/null || ret=1
+    grep "ANSWER: 2," dig.out.ns3.test$n > /dev/null || ret=1
+    test $ret = 0 && break
+    sleep 1
+done
+if [ $ret != 0 ]; then echo "I:failed"; fi
+status=`expr $status + $ret`
+
 exit $status
index 551310139839e5858846fced8b54ab3268209c30..56fbec53a0b44b376191521e80102110017df3cf 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: zt.c,v 1.56 2011/09/07 00:50:06 marka Exp $ */
+/* $Id: zt.c,v 1.57 2011/12/02 02:44:01 marka Exp $ */
 
 /*! \file */
 
@@ -357,15 +357,25 @@ freezezones(dns_zone_t *zone, void *uap) {
        isc_result_t result = ISC_R_SUCCESS;
        char classstr[DNS_RDATACLASS_FORMATSIZE];
        char zonename[DNS_NAME_FORMATSIZE];
+       dns_zone_t *raw = NULL;
        dns_view_t *view;
        const char *vname;
        const char *sep;
        int level;
 
-       if (dns_zone_gettype(zone) != dns_zone_master)
+       dns_zone_getraw(zone, &raw);
+       if (raw != NULL)
+               zone = raw;
+       if (dns_zone_gettype(zone) != dns_zone_master) {
+               if (raw != NULL)
+                       dns_zone_detach(&raw);
                return (ISC_R_SUCCESS);
-       if (!dns_zone_isdynamic(zone, ISC_TRUE))
+       }
+       if (!dns_zone_isdynamic(zone, ISC_TRUE)) {
+               if (raw != NULL)
+                       dns_zone_detach(&raw);
                return (ISC_R_SUCCESS);
+       }
 
        frozen = dns_zone_getupdatedisabled(zone);
        if (freeze) {
@@ -402,6 +412,8 @@ freezezones(dns_zone_t *zone, void *uap) {
                      freeze ? "freezing" : "thawing",
                      zonename, classstr, sep, vname,
                      isc_result_totext(result));
+       if (raw != NULL)
+               dns_zone_detach(&raw);
        return (result);
 }