2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-29 13:38:26 +00:00

[master] Revert "[master] tag initializing keys so they can't be used for normal validation"

This reverts commit 560d8b833edceb4b715fe46b45f2009dc09fdb5d.

This change created a potential race between key refresh queries and
root zone priming queries which could leave the root name servers in
the bad-server cache.
This commit is contained in:
Evan Hunt 2017-10-12 10:53:35 -07:00
parent 5daa633313
commit 3abcd7cd8a
22 changed files with 122 additions and 367 deletions

View File

@ -1,14 +1,5 @@
--- 9.12.0b1 released --- --- 9.12.0b1 released ---
4773. [bug] Keys specified in "managed-keys" statements
can now only be used when validating key refresh
queries during initialization of RFC 5011 key
maintenance. If initialization fails, DNSSEC
validation of normal queries will also fail.
Previously, validation of normal queries could
succeed using the initializing key, potentially
masking problems with managed-keys. [RT #46077]
4772. [test] Expanded unit testing framework for libns, using 4772. [test] Expanded unit testing framework for libns, using
hooks to interrupt query flow and inspect state hooks to interrupt query flow and inspect state
at specified locations. [RT #46173] at specified locations. [RT #46173]

View File

@ -844,8 +844,7 @@ load_view_keys(const cfg_obj_t *keys, const cfg_obj_t *vconfig,
continue; continue;
} }
CHECK(dns_keytable_add2(secroots, managed, CHECK(dns_keytable_add(secroots, managed, &dstkey));
managed, &dstkey));
} }
} }
@ -1044,8 +1043,7 @@ configure_view_dnsseckeys(dns_view_t *view, const cfg_obj_t *vconfig,
isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL, isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
NAMED_LOGMODULE_SERVER, ISC_LOG_ERROR, NAMED_LOGMODULE_SERVER, ISC_LOG_ERROR,
"managed-keys-directory '%s' " "managed-keys-directory '%s' "
"must be writable and accessible", "is not writable", directory);
directory);
result = ISC_R_NOPERM; result = ISC_R_NOPERM;
goto cleanup; goto cleanup;
} }
@ -6170,8 +6168,8 @@ directory_callback(const char *clausename, const cfg_obj_t *obj, void *arg) {
if (access(directory, DIR_PERM_OK) != 0) { if (access(directory, DIR_PERM_OK) != 0) {
isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL, isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
NAMED_LOGMODULE_SERVER, ISC_LOG_ERROR, NAMED_LOGMODULE_SERVER, ISC_LOG_ERROR,
"working directory '%s' must be " "directory '%s' is not writable",
"writable and accessible", directory); directory);
return (ISC_R_NOPERM); return (ISC_R_NOPERM);
} }
@ -6436,7 +6434,7 @@ dotat(dns_keytable_t *keytable, dns_keynode_t *keynode, void *arg) {
do { do {
dst_key_t *key = dns_keynode_key(keynode); dst_key_t *key = dns_keynode_key(keynode);
if (key != NULL && !dns_keynode_initial(keynode)) { if (key != NULL) {
name = dst_key_name(key); name = dst_key_name(key);
if (n < (sizeof(ids)/sizeof(ids[0]))) { if (n < (sizeof(ids)/sizeof(ids[0]))) {
ids[n] = dst_key_id(key); ids[n] = dst_key_id(key);
@ -6445,19 +6443,16 @@ dotat(dns_keytable_t *keytable, dns_keynode_t *keynode, void *arg) {
} }
nextnode = NULL; nextnode = NULL;
(void)dns_keytable_nextkeynode(keytable, keynode, &nextnode); (void)dns_keytable_nextkeynode(keytable, keynode, &nextnode);
if (keynode != firstnode) { if (keynode != firstnode)
dns_keytable_detachkeynode(keytable, &keynode); dns_keytable_detachkeynode(keytable, &keynode);
}
keynode = nextnode; keynode = nextnode;
} while (keynode != NULL); } while (keynode != NULL);
if (n == 0) { if (n == 0)
return; return;
}
if (n > 1) { if (n > 1)
qsort(ids, n, sizeof(ids[0]), cid); qsort(ids, n, sizeof(ids[0]), cid);
}
/* /*
* Encoded as "_ta-xxxx\(-xxxx\)*" where xxxx is the hex version of * Encoded as "_ta-xxxx\(-xxxx\)*" where xxxx is the hex version of
@ -6467,23 +6462,20 @@ dotat(dns_keytable_t *keytable, dns_keynode_t *keynode, void *arg) {
r.base = label; r.base = label;
r.length = sizeof(label);; r.length = sizeof(label);;
m = snprintf(r.base, r.length, "_ta"); m = snprintf(r.base, r.length, "_ta");
if (m < 0 || (unsigned)m > r.length) { if (m < 0 || (unsigned)m > r.length)
return; return;
}
isc_textregion_consume(&r, m); isc_textregion_consume(&r, m);
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
m = snprintf(r.base, r.length, "-%04x", ids[i]); m = snprintf(r.base, r.length, "-%04x", ids[i]);
if (m < 0 || (unsigned)m > r.length) { if (m < 0 || (unsigned)m > r.length)
return; return;
}
isc_textregion_consume(&r, m); isc_textregion_consume(&r, m);
} }
dns_fixedname_init(&fixed); dns_fixedname_init(&fixed);
tatname = dns_fixedname_name(&fixed); tatname = dns_fixedname_name(&fixed);
result = dns_name_fromstring2(tatname, label, name, 0, NULL); result = dns_name_fromstring2(tatname, label, name, 0, NULL);
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS)
return; return;
}
dns_name_format(tatname, namebuf, sizeof(namebuf)); dns_name_format(tatname, namebuf, sizeof(namebuf));
isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL, isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
@ -6492,9 +6484,8 @@ dotat(dns_keytable_t *keytable, dns_keynode_t *keynode, void *arg) {
view->name, namebuf); view->name, namebuf);
tat = isc_mem_get(dotat_arg->view->mctx, sizeof(*tat)); tat = isc_mem_get(dotat_arg->view->mctx, sizeof(*tat));
if (tat == NULL) { if (tat == NULL)
return; return;
}
tat->mctx = NULL; tat->mctx = NULL;
tat->task = NULL; tat->task = NULL;
@ -8499,8 +8490,7 @@ load_configuration(const char *filename, named_server_t *server,
if (access(".", DIR_PERM_OK) != 0) { if (access(".", DIR_PERM_OK) != 0) {
isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL, isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
NAMED_LOGMODULE_SERVER, ISC_LOG_ERROR, NAMED_LOGMODULE_SERVER, ISC_LOG_ERROR,
"the working directory must be " "the working directory is not writable");
"writable and accessible");
result = ISC_R_NOPERM; result = ISC_R_NOPERM;
goto cleanup; goto cleanup;
} }

View File

@ -16,8 +16,16 @@ is used so it will send TAT queries once per second.
ns3 is a validator with a broken key in managed-keys. ns3 is a validator with a broken key in managed-keys.
ns4 is a validator with a deliberately broken managed-keys.bind and Tests TODO:
managed-keys.jnl, causing RFC 5011 initialization to fail.
ns5 is a validator which is prevented from getting a response from the - initial working KSK
root server, causing key refresh queries to fail.
TODO: test using delv with new trusted key too
- introduce a REVOKE bit
- later remove a signature
- corrupt a signature
TODO: also same things with dlv auto updates of trust anchor

View File

@ -15,4 +15,3 @@ rm -f */named.memstats */named.run
rm -f dig.out* delv.out* rndc.out* signer.out* rm -f dig.out* delv.out* rndc.out* signer.out*
rm -f ns1/named.secroots ns1/root.db.signed* ns1/root.db.tmp rm -f ns1/named.secroots ns1/root.db.signed* ns1/root.db.tmp
rm -f ns1/named.conf rm -f ns1/named.conf
rm -rf ns4/nope

View File

@ -10,11 +10,6 @@
controls { /* empty */ }; controls { /* empty */ };
acl allowed {
! 10.53.0.5;
any;
};
options { options {
query-source address 10.53.0.1; query-source address 10.53.0.1;
notify-source 10.53.0.1; notify-source 10.53.0.1;
@ -27,7 +22,6 @@ options {
notify no; notify no;
dnssec-enable yes; dnssec-enable yes;
dnssec-validation yes; dnssec-validation yes;
allow-query { allowed; };
}; };
key rndc_key { key rndc_key {

View File

@ -10,11 +10,6 @@
controls { /* empty */ }; controls { /* empty */ };
acl allowed {
! 10.53.0.5;
any;
};
options { options {
query-source address 10.53.0.1; query-source address 10.53.0.1;
notify-source 10.53.0.1; notify-source 10.53.0.1;
@ -27,7 +22,6 @@ options {
notify no; notify no;
dnssec-enable yes; dnssec-enable yes;
dnssec-validation yes; dnssec-validation yes;
allow-query { allowed; };
}; };
key rndc_key { key rndc_key {

View File

@ -28,8 +28,6 @@ managed-keys {
EOF EOF
' > managed.conf ' > managed.conf
cp managed.conf ../ns2/managed.conf cp managed.conf ../ns2/managed.conf
cp managed.conf ../ns4/managed.conf
cp managed.conf ../ns5/managed.conf
# Configure a trusted key statement (used by delve) # Configure a trusted key statement (used by delve)
cat $keyname.key | grep -v '^; ' | $PERL -n -e ' cat $keyname.key | grep -v '^; ' | $PERL -n -e '

View File

@ -1 +1 @@
-m record,size,mctx -T clienttest -c named.conf -d 99 -X named.lock -g -T mkeytimers=2/20/40 -T tat=1 -m record,size,mctx -T clienttest -c named.conf -d 99 -X named.lock -g -T mkeytimers=2/20/40

View File

@ -1,41 +0,0 @@
/*
* Copyright (C) 2017 Internet Systems Consortium, Inc. ("ISC")
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
// NS4
controls { /* empty */ };
options {
query-source address 10.53.0.4;
notify-source 10.53.0.4;
transfer-source 10.53.0.4;
port 5300;
pid-file "named.pid";
listen-on { 10.53.0.4; };
listen-on-v6 { none; };
recursion yes;
notify no;
dnssec-enable yes;
dnssec-validation auto;
bindkeys-file "managed.conf";
managed-keys-directory "nope";
};
key rndc_key {
secret "1234abcd8765";
algorithm hmac-sha256;
};
controls {
inet 10.53.0.4 port 9953 allow { any; } keys { rndc_key; };
};
zone "." {
type hint;
file "../../common/root.hint";
};

View File

@ -1,38 +0,0 @@
/*
* Copyright (C) 2017 Internet Systems Consortium, Inc. ("ISC")
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
// NS5
options {
query-source address 10.53.0.5;
notify-source 10.53.0.5;
transfer-source 10.53.0.5;
port 5300;
pid-file "named.pid";
listen-on { 10.53.0.5; };
listen-on-v6 { none; };
recursion yes;
notify no;
dnssec-enable yes;
dnssec-validation auto;
bindkeys-file "managed.conf";
};
key rndc_key {
secret "1234abcd8765";
algorithm hmac-sha256;
};
controls {
inet 10.53.0.5 port 9953 allow { any; } keys { rndc_key; };
};
zone "." {
type hint;
file "../../common/root.hint";
};

View File

@ -16,9 +16,3 @@ test -r $RANDFILE || $GENRANDOM 800 $RANDFILE
cp ns1/named1.conf ns1/named.conf cp ns1/named1.conf ns1/named.conf
cd ns1 && $SHELL sign.sh cd ns1 && $SHELL sign.sh
cd ../ns4
mkdir nope
touch nope/managed-keys.bind
touch nope/managed.keys.bind.jnl
chmod 444 nope/*

View File

@ -28,7 +28,6 @@ status=`expr $status + $ret`
n=`expr $n + 1` n=`expr $n + 1`
echo "I: check positive validation with valid trust anchor ($n)" echo "I: check positive validation with valid trust anchor ($n)"
ret=0 ret=0
$RNDC -c ../common/rndc.conf -s 10.53.0.2 -p 9953 flush | sed 's/^/I: ns2 /'
$DIG $DIGOPTS +noauth example. @10.53.0.2 txt > dig.out.ns2.test$n || ret=1 $DIG $DIGOPTS +noauth example. @10.53.0.2 txt > dig.out.ns2.test$n || ret=1
grep "flags:.*ad.*QUERY" dig.out.ns2.test$n > /dev/null || ret=1 grep "flags:.*ad.*QUERY" dig.out.ns2.test$n > /dev/null || ret=1
grep "example..*.RRSIG..*TXT" dig.out.ns2.test$n > /dev/null || ret=1 grep "example..*.RRSIG..*TXT" dig.out.ns2.test$n > /dev/null || ret=1
@ -391,7 +390,6 @@ $PERL $SYSTEMTESTTOP/start.pl --noclean --restart . ns2
n=`expr $n + 1` n=`expr $n + 1`
echo "I: check positive validation ($n)" echo "I: check positive validation ($n)"
ret=0 ret=0
$RNDC -c ../common/rndc.conf -s 10.53.0.2 -p 9953 flush | sed 's/^/I: ns2 /'
$DIG $DIGOPTS +noauth example. @10.53.0.2 txt > dig.out.ns2.test$n || ret=1 $DIG $DIGOPTS +noauth example. @10.53.0.2 txt > dig.out.ns2.test$n || ret=1
grep "flags:.*ad.*QUERY" dig.out.ns2.test$n > /dev/null || ret=1 grep "flags:.*ad.*QUERY" dig.out.ns2.test$n > /dev/null || ret=1
grep "example..*.RRSIG..*TXT" dig.out.ns2.test$n > /dev/null || ret=1 grep "example..*.RRSIG..*TXT" dig.out.ns2.test$n > /dev/null || ret=1
@ -448,6 +446,7 @@ rm -f ${revoked}.key ${revoked}.private
$SETTIME -D none -R none -K ns1 `cat ns1/managed.key` > /dev/null $SETTIME -D none -R none -K ns1 `cat ns1/managed.key` > /dev/null
$SETTIME -D now -K ns1 $standby1 > /dev/null $SETTIME -D now -K ns1 $standby1 > /dev/null
$SETTIME -D now -K ns1 $standby2 > /dev/null $SETTIME -D now -K ns1 $standby2 > /dev/null
$RNDC -c ../common/rndc.conf -s 10.53.0.2 -p 9953 flush | sed 's/^/I: ns1 /'
sleep 1 sleep 1
$SIGNER -Sg -K ns1 -N unixtime -r $RANDFILE -o . ns1/root.db > /dev/null 2>&- $SIGNER -Sg -K ns1 -N unixtime -r $RANDFILE -o . ns1/root.db > /dev/null 2>&-
$RNDC -c ../common/rndc.conf -s 10.53.0.1 -p 9953 reload . | sed 's/^/I: ns1 /' $RNDC -c ../common/rndc.conf -s 10.53.0.1 -p 9953 reload . | sed 's/^/I: ns1 /'
@ -455,7 +454,6 @@ sleep 3
$RNDC -c ../common/rndc.conf -s 10.53.0.2 -p 9953 managed-keys refresh | sed 's/^/I: ns2 /' $RNDC -c ../common/rndc.conf -s 10.53.0.2 -p 9953 managed-keys refresh | sed 's/^/I: ns2 /'
sleep 1 sleep 1
$RNDC -c ../common/rndc.conf -s 10.53.0.2 -p 9953 managed-keys status > rndc.out.$n 2>&1 $RNDC -c ../common/rndc.conf -s 10.53.0.2 -p 9953 managed-keys status > rndc.out.$n 2>&1
$RNDC -c ../common/rndc.conf -s 10.53.0.2 -p 9953 flush | sed 's/^/I: ns1 /'
$DIG $DIGOPTS +noauth example. @10.53.0.2 txt > dig.out.ns2.test$n || ret=1 $DIG $DIGOPTS +noauth example. @10.53.0.2 txt > dig.out.ns2.test$n || ret=1
grep "flags:.*ad.*QUERY" dig.out.ns2.test$n > /dev/null || ret=1 grep "flags:.*ad.*QUERY" dig.out.ns2.test$n > /dev/null || ret=1
grep "example..*.RRSIG..*TXT" dig.out.ns2.test$n > /dev/null || ret=1 grep "example..*.RRSIG..*TXT" dig.out.ns2.test$n > /dev/null || ret=1
@ -539,7 +537,7 @@ status=`expr $status + $ret`
n=`expr $n + 1` n=`expr $n + 1`
echo "I: check that trust-anchor-telemetry queries are logged ($n)" echo "I: check that trust-anchor-telemetry queries are logged ($n)"
ret=0 ret=0
grep "sending trust-anchor-telemetry query '_ta-[0-9a-f]*/NULL" ns2/named.run > /dev/null || ret=1 grep "sending trust-anchor-telemetry query '_ta-[0-9a-f]*/NULL" ns3/named.run > /dev/null || ret=1
if [ $ret != 0 ]; then echo "I:failed"; fi if [ $ret != 0 ]; then echo "I:failed"; fi
status=`expr $status + $ret` status=`expr $status + $ret`
@ -564,45 +562,5 @@ grep "name: \." rndc.out.$n > /dev/null || ret=1
if [ $ret != 0 ]; then echo "I:failed"; fi if [ $ret != 0 ]; then echo "I:failed"; fi
status=`expr $status + $ret` status=`expr $status + $ret`
n=`expr $n + 1`
echo "I: check that trust-anchor-telemetry queries contain the correct key ($n)"
ret=0
# convert the hexadecimal key from the TAT query into decimal and
# compare against the known key.
tathex=`grep "query '_ta-[0-9a-f]*/NULL/IN' approved" ns1/named.run | awk '{print $6; exit 0}' | sed -e 's/(_ta-\([a-f0-9][a-f0-d]*\)):/\1/'`
tatkey=`$PERL -e 'printf("%d\n", hex(@ARGV[0]));' $tathex`
realkey=`$RNDC -c ../common/rndc.conf -s 10.53.0.2 -p 9953 secroots - | grep '; managed' | sed 's#.*SHA256/\([0-9][0-9]*\) ; managed.*#\1#'`
[ "$tatkey" -eq "$realkey" ] || ret=1
if [ $ret != 0 ]; then echo "I:failed"; fi
status=`expr $status + $ret`
n=`expr $n + 1`
echo "I: check initialization fails if managed-keys can't be created ($n)"
ret=0
$RNDC -c ../common/rndc.conf -s 10.53.0.4 -p 9953 secroots | sed 's/^/I: ns4 /'
grep '; initializing managed' ns4/named.secroots > /dev/null 2>&1 || ret=1
grep '; managed' ns4/named.secroots > /dev/null 2>&1 && ret=1
grep '; trusted' ns4/named.secroots > /dev/null 2>&1 && ret=1
if [ $ret != 0 ]; then echo "I:failed"; fi
status=`expr $status + $ret`
n=`expr $n + 1`
echo "I: check failure to contact root servers does not prevent key refreshes after restart ($n)"
ret=0
# By the time we get here, ns5 should have attempted refreshing its managed
# keys. These attempts should fail as ns1 is configured to REFUSE all queries
# from ns5. Note we do not configure ns5 with "-T mkeytimers"; this is to
# ensure key refresh retry will be scheduled one hour in the future instead of
# a few seconds in the future, in order to prevent races when ns5 is restarted.
$PERL $SYSTEMTESTTOP/stop.pl --use-rndc . ns5
$PERL $SYSTEMTESTTOP/start.pl --noclean --restart . ns5
sleep 2
# ns5/named.run will contain logs from both the old instance and the new
# instance. In order for the test to pass, both must attempt a fetch.
count=`grep -c "Creating key fetch" ns5/named.run`
[ $count -lt 2 ] && ret=1
if [ $ret != 0 ]; then echo "I:failed"; fi
status=`expr $status + $ret`
echo "I:exit status: $status" echo "I:exit status: $status"
[ $status -eq 0 ] || exit 1 [ $status -eq 0 ] || exit 1

View File

@ -13,7 +13,7 @@ controls { /* empty */ };
options { options {
query-source address 10.53.0.2; query-source address 10.53.0.2;
port 5300; port 5300;
pid-file "named2.pid"; pid-file "named3.pid";
listen-on { 10.53.0.2; 10.53.0.3; }; listen-on { 10.53.0.2; 10.53.0.3; };
listen-on-v6 { fd92:7065:b8e:ffff::2; }; listen-on-v6 { fd92:7065:b8e:ffff::2; };
recursion no; recursion no;

View File

@ -13,7 +13,7 @@ controls { /* empty */ };
options { options {
query-source address 10.53.0.2; query-source address 10.53.0.2;
port 5300; port 5300;
pid-file "named2.pid"; pid-file "named4.pid";
lock-file none; lock-file none;
listen-on { 10.53.0.2; 10.53.0.3; }; listen-on { 10.53.0.2; 10.53.0.3; };
listen-on-v6 { fd92:7065:b8e:ffff::2; }; listen-on-v6 { fd92:7065:b8e:ffff::2; };

View File

@ -37,7 +37,7 @@ ret=0
(cd ns2; $NAMED -c named-alt2.conf -D ns2-extra-2 -X named.lock -m record,size,mctx -d 99 -g -U 4 >> named3.run 2>&1 & ) (cd ns2; $NAMED -c named-alt2.conf -D ns2-extra-2 -X named.lock -m record,size,mctx -d 99 -g -U 4 >> named3.run 2>&1 & )
sleep 2 sleep 2
grep "another named process" ns2/named3.run > /dev/null || ret=1 grep "another named process" ns2/named3.run > /dev/null || ret=1
[ -s ns2/named2.pid ] && $KILL -15 `cat ns2/named2.pid` [ -s ns2/named3.pid ] && $KILL -15 `cat ns2/named3.pid`
if [ $ret != 0 ]; then echo "I:failed"; fi if [ $ret != 0 ]; then echo "I:failed"; fi
status=`expr $status + $ret` status=`expr $status + $ret`
@ -47,11 +47,10 @@ ret=0
(cd ns2; $NAMED -c named-alt3.conf -D ns2-extra-3 -m record,size,mctx -d 99 -g -U 4 >> named4.run 2>&1 & ) (cd ns2; $NAMED -c named-alt3.conf -D ns2-extra-3 -m record,size,mctx -d 99 -g -U 4 >> named4.run 2>&1 & )
sleep 2 sleep 2
grep "another named process" ns2/named4.run > /dev/null && ret=1 grep "another named process" ns2/named4.run > /dev/null && ret=1
[ -s ns2/named2.pid ] && $KILL -15 `cat ns2/named2.pid` [ -s ns2/named4.pid ] && $KILL -15 `cat ns2/named4.pid`
if [ $ret != 0 ]; then echo "I:failed"; fi if [ $ret != 0 ]; then echo "I:failed"; fi
status=`expr $status + $ret` status=`expr $status + $ret`
if [ ! "$CYGWIN" ]; then
n=`expr $n + 1` n=`expr $n + 1`
echo "I: checking that named refuses to reconfigure if working directory is not writable ($n)" echo "I: checking that named refuses to reconfigure if working directory is not writable ($n)"
ret=0 ret=0
@ -59,7 +58,7 @@ if [ ! "$CYGWIN" ]; then
$RNDC -c ../common/rndc.conf -s 10.53.0.2 -p 9953 reconfig > rndc.out.$n 2>&1 $RNDC -c ../common/rndc.conf -s 10.53.0.2 -p 9953 reconfig > rndc.out.$n 2>&1
grep "failed: permission denied" rndc.out.$n > /dev/null 2>&1 || ret=1 grep "failed: permission denied" rndc.out.$n > /dev/null 2>&1 || ret=1
sleep 1 sleep 1
grep "[^-]directory './nope' must be writable" ns2/named.run > /dev/null 2>&1 || ret=1 grep "[^-]directory './nope' is not writable" ns2/named.run > /dev/null 2>&1 || ret=1
if [ $ret != 0 ]; then echo "I:failed"; fi if [ $ret != 0 ]; then echo "I:failed"; fi
status=`expr $status + $ret` status=`expr $status + $ret`
@ -70,13 +69,10 @@ if [ ! "$CYGWIN" ]; then
$RNDC -c ../common/rndc.conf -s 10.53.0.2 -p 9953 reconfig > rndc.out.$n 2>&1 $RNDC -c ../common/rndc.conf -s 10.53.0.2 -p 9953 reconfig > rndc.out.$n 2>&1
grep "failed: permission denied" rndc.out.$n > /dev/null 2>&1 || ret=1 grep "failed: permission denied" rndc.out.$n > /dev/null 2>&1 || ret=1
sleep 1 sleep 1
grep "managed-keys-directory './nope' must be writable" ns2/named.run > /dev/null 2>&1 || ret=1 grep "managed-keys-directory './nope' is not writable" ns2/named.run > /dev/null 2>&1 || ret=1
if [ $ret != 0 ]; then echo "I:failed"; fi if [ $ret != 0 ]; then echo "I:failed"; fi
status=`expr $status + $ret` status=`expr $status + $ret`
echo "I: kill existing named process"
[ -s "ns2/named.pid" ] && kill -15 `cat ns2/named.pid`
n=`expr $n + 1` n=`expr $n + 1`
echo "I: checking that named refuses to start if working directory is not writable ($n)" echo "I: checking that named refuses to start if working directory is not writable ($n)"
ret=0 ret=0
@ -84,8 +80,11 @@ if [ ! "$CYGWIN" ]; then
$NAMED -c named-alt4.conf -d 99 -g > named4.run 2>&1 & $NAMED -c named-alt4.conf -d 99 -g > named4.run 2>&1 &
sleep 2 sleep 2
grep "exiting (due to fatal error)" named4.run > /dev/null || ret=1 grep "exiting (due to fatal error)" named4.run > /dev/null || ret=1
cd .. # pidfile could be in either place depending on whether the directory
# successfully changed.
[ -s named.pid ] && kill -15 `cat named.pid` > /dev/null 2>&1 [ -s named.pid ] && kill -15 `cat named.pid` > /dev/null 2>&1
[ -s ../named.pid ] && kill -15 `cat ../named.pid` > /dev/null 2>&1
cd ..
if [ $ret != 0 ]; then echo "I:failed"; fi if [ $ret != 0 ]; then echo "I:failed"; fi
status=`expr $status + $ret` status=`expr $status + $ret`
@ -96,11 +95,13 @@ if [ ! "$CYGWIN" ]; then
$NAMED -c named-alt5.conf -d 99 -g > named5.run 2>&1 & $NAMED -c named-alt5.conf -d 99 -g > named5.run 2>&1 &
sleep 2 sleep 2
grep "exiting (due to fatal error)" named5.run > /dev/null || ret=1 grep "exiting (due to fatal error)" named5.run > /dev/null || ret=1
cd .. # pidfile could be in either place depending on whether the directory
# successfully changed.
[ -s named.pid ] && kill -15 `cat named.pid` > /dev/null 2>&1 [ -s named.pid ] && kill -15 `cat named.pid` > /dev/null 2>&1
[ -s ../named.pid ] && kill -15 `cat ../named.pid` > /dev/null 2>&1
cd ..
if [ $ret != 0 ]; then echo "I:failed"; fi if [ $ret != 0 ]; then echo "I:failed"; fi
status=`expr $status + $ret` status=`expr $status + $ret`
fi
echo "I:exit status: $status" echo "I:exit status: $status"
[ $status -eq 0 ] || exit 1 [ $status -eq 0 ] || exit 1

View File

@ -492,17 +492,6 @@
are not writable by the effective user ID. [RT #46077] are not writable by the effective user ID. [RT #46077]
</para> </para>
</listitem> </listitem>
<listitem>
<para>
Initializing keys specified in a <command>managed-keys</command>
statement or by <command>dnssec-validation auto;</command> are
no longer treated as valid for any use other than validation of
RFC 5011 initialization queries. The effect of this is that
DNSSEC validation will fail if RFC 5011 key maintenance
cannot be initialized: initialization problems will not be
masked, but will be immediately visible. [RT #46077]
</para>
</listitem>
<listitem> <listitem>
<para> <para>
Previously, <command>update-policy local;</command> accepted Previously, <command>update-policy local;</command> accepted

View File

@ -1546,7 +1546,7 @@ dns_client_addtrustedkey(dns_client_t *client, dns_rdataclass_t rdclass,
if (result != ISC_R_SUCCESS) if (result != ISC_R_SUCCESS)
goto cleanup; goto cleanup;
result = dns_keytable_add2(secroots, ISC_FALSE, ISC_FALSE, &dstkey); result = dns_keytable_add(secroots, ISC_FALSE, &dstkey);
cleanup: cleanup:
if (dstkey != NULL) if (dstkey != NULL)

View File

@ -102,19 +102,10 @@ dns_keytable_detach(dns_keytable_t **keytablep);
isc_result_t isc_result_t
dns_keytable_add(dns_keytable_t *keytable, isc_boolean_t managed, dns_keytable_add(dns_keytable_t *keytable, isc_boolean_t managed,
dst_key_t **keyp) ISC_DEPRECATED; dst_key_t **keyp);
isc_result_t
dns_keytable_add2(dns_keytable_t *keytable, isc_boolean_t managed,
isc_boolean_t initial, dst_key_t **keyp);
/*%< /*%<
* Add '*keyp' to 'keytable' (using the name in '*keyp'). * Add '*keyp' to 'keytable' (using the name in '*keyp').
* The value of keynode->managed is set to 'managed', and the * The value of keynode->managed is set to 'managed'
* value of keynode->initial is set to 'initial'. ('initial' should
* be only used when adding managed-keys from configuration: this
* indicates a secure root which can be *only* used for validating
* RFC 5011 key refresh queries, but not for other DNSSEC validation.
* Once a key refresh query has validated, we update the keynode
* with inital == ISC_FALSE.)
* *
* Notes: * Notes:
* *
@ -411,19 +402,6 @@ dns_keynode_managed(dns_keynode_t *keynode);
* Is this flagged as a managed key? * Is this flagged as a managed key?
*/ */
isc_boolean_t
dns_keynode_initial(dns_keynode_t *keynode);
/*%<
* Is this flagged as an initializing key?
*/
void
dns_keynode_trust(dns_keynode_t *keynode);
/*%<
* Sets keynode->initial to ISC_FALSE in order mark the key as
* trusted: no longer an initializing key.
*/
isc_result_t isc_result_t
dns_keynode_create(isc_mem_t *mctx, dns_keynode_t **target); dns_keynode_create(isc_mem_t *mctx, dns_keynode_t **target);
/*%< /*%<

View File

@ -47,7 +47,6 @@ struct dns_keynode {
isc_refcount_t refcount; isc_refcount_t refcount;
dst_key_t * key; dst_key_t * key;
isc_boolean_t managed; isc_boolean_t managed;
isc_boolean_t initial;
struct dns_keynode * next; struct dns_keynode * next;
}; };
@ -166,7 +165,7 @@ dns_keytable_detach(dns_keytable_t **keytablep) {
} }
static isc_result_t static isc_result_t
insert(dns_keytable_t *keytable, isc_boolean_t managed, isc_boolean_t initial, insert(dns_keytable_t *keytable, isc_boolean_t managed,
const dns_name_t *keyname, dst_key_t **keyp) const dns_name_t *keyname, dst_key_t **keyp)
{ {
isc_result_t result; isc_result_t result;
@ -181,7 +180,6 @@ insert(dns_keytable_t *keytable, isc_boolean_t managed, isc_boolean_t initial,
return (result); return (result);
knode->managed = managed; knode->managed = managed;
knode->initial = initial;
RWLOCK(&keytable->rwlock, isc_rwlocktype_write); RWLOCK(&keytable->rwlock, isc_rwlocktype_write);
@ -235,21 +233,14 @@ insert(dns_keytable_t *keytable, isc_boolean_t managed, isc_boolean_t initial,
isc_result_t isc_result_t
dns_keytable_add(dns_keytable_t *keytable, isc_boolean_t managed, dns_keytable_add(dns_keytable_t *keytable, isc_boolean_t managed,
dst_key_t **keyp) dst_key_t **keyp)
{
return (dns_keytable_add2(keytable, managed, ISC_FALSE, keyp));
}
isc_result_t
dns_keytable_add2(dns_keytable_t *keytable, isc_boolean_t managed,
isc_boolean_t initial, dst_key_t **keyp)
{ {
REQUIRE(keyp != NULL && *keyp != NULL); REQUIRE(keyp != NULL && *keyp != NULL);
return (insert(keytable, managed, initial, dst_key_name(*keyp), keyp)); return (insert(keytable, managed, dst_key_name(*keyp), keyp));
} }
isc_result_t isc_result_t
dns_keytable_marksecure(dns_keytable_t *keytable, const dns_name_t *name) { dns_keytable_marksecure(dns_keytable_t *keytable, const dns_name_t *name) {
return (insert(keytable, ISC_TRUE, ISC_FALSE, name, NULL)); return (insert(keytable, ISC_TRUE, name, NULL));
} }
isc_result_t isc_result_t
@ -653,8 +644,7 @@ dns_keytable_totext(dns_keytable_t *keytable, isc_buffer_t **text) {
if (knode->key == NULL) if (knode->key == NULL)
continue; continue;
dst_key_format(knode->key, pbuf, sizeof(pbuf)); dst_key_format(knode->key, pbuf, sizeof(pbuf));
snprintf(obuf, sizeof(obuf), "%s ; %s%s\n", pbuf, snprintf(obuf, sizeof(obuf), "%s ; %s\n", pbuf,
knode->initial ? "initializing " : "",
knode->managed ? "managed" : "trusted"); knode->managed ? "managed" : "trusted");
result = putstr(text, obuf); result = putstr(text, obuf);
if (result != ISC_R_SUCCESS) if (result != ISC_R_SUCCESS)
@ -733,26 +723,6 @@ dns_keynode_managed(dns_keynode_t *keynode) {
return (keynode->managed); return (keynode->managed);
} }
isc_boolean_t
dns_keynode_initial(dns_keynode_t *keynode) {
/*
* Is this an initailizing key?
*/
REQUIRE(VALID_KEYNODE(keynode));
return (keynode->initial);
}
void
dns_keynode_trust(dns_keynode_t *keynode) {
/*
* This is no longer an initializing key.
*/
REQUIRE(VALID_KEYNODE(keynode));
keynode->initial = ISC_FALSE;
}
isc_result_t isc_result_t
dns_keynode_create(isc_mem_t *mctx, dns_keynode_t **target) { dns_keynode_create(isc_mem_t *mctx, dns_keynode_t **target) {
isc_result_t result; isc_result_t result;
@ -766,7 +736,6 @@ dns_keynode_create(isc_mem_t *mctx, dns_keynode_t **target) {
knode->magic = KEYNODE_MAGIC; knode->magic = KEYNODE_MAGIC;
knode->managed = ISC_FALSE; knode->managed = ISC_FALSE;
knode->initial = ISC_FALSE;
knode->key = NULL; knode->key = NULL;
knode->next = NULL; knode->next = NULL;

View File

@ -126,7 +126,7 @@ create_tables() {
/* Add a normal key */ /* Add a normal key */
create_key(257, 3, 5, "example.com", keystr1, &key); create_key(257, 3, 5, "example.com", keystr1, &key);
ATF_REQUIRE_EQ(dns_keytable_add2(keytable, ISC_FALSE, ISC_FALSE, &key), ATF_REQUIRE_EQ(dns_keytable_add(keytable, ISC_FALSE, &key),
ISC_R_SUCCESS); ISC_R_SUCCESS);
/* Add a null key */ /* Add a null key */
@ -185,7 +185,7 @@ ATF_TC_BODY(add, tc) {
* nextkeynode() should still return NOTFOUND. * nextkeynode() should still return NOTFOUND.
*/ */
create_key(257, 3, 5, "example.com", keystr1, &key); create_key(257, 3, 5, "example.com", keystr1, &key);
ATF_REQUIRE_EQ(dns_keytable_add2(keytable, ISC_FALSE, ISC_FALSE, &key), ATF_REQUIRE_EQ(dns_keytable_add(keytable, ISC_FALSE, &key),
ISC_R_SUCCESS); ISC_R_SUCCESS);
ATF_REQUIRE_EQ(dns_keytable_nextkeynode(keytable, keynode, ATF_REQUIRE_EQ(dns_keytable_nextkeynode(keytable, keynode,
&next_keynode), ISC_R_NOTFOUND); &next_keynode), ISC_R_NOTFOUND);
@ -193,7 +193,7 @@ ATF_TC_BODY(add, tc) {
/* Add another key (different keydata) */ /* Add another key (different keydata) */
dns_keytable_detachkeynode(keytable, &keynode); dns_keytable_detachkeynode(keytable, &keynode);
create_key(257, 3, 5, "example.com", keystr2, &key); create_key(257, 3, 5, "example.com", keystr2, &key);
ATF_REQUIRE_EQ(dns_keytable_add2(keytable, ISC_FALSE, ISC_FALSE, &key), ATF_REQUIRE_EQ(dns_keytable_add(keytable, ISC_FALSE, &key),
ISC_R_SUCCESS); ISC_R_SUCCESS);
ATF_REQUIRE_EQ(dns_keytable_find(keytable, str2name("example.com"), ATF_REQUIRE_EQ(dns_keytable_find(keytable, str2name("example.com"),
&keynode), ISC_R_SUCCESS); &keynode), ISC_R_SUCCESS);
@ -209,7 +209,7 @@ ATF_TC_BODY(add, tc) {
ATF_REQUIRE_EQ(dns_keytable_find(keytable, str2name("null.example"), ATF_REQUIRE_EQ(dns_keytable_find(keytable, str2name("null.example"),
&null_keynode), ISC_R_SUCCESS); &null_keynode), ISC_R_SUCCESS);
create_key(257, 3, 5, "null.example", keystr2, &key); create_key(257, 3, 5, "null.example", keystr2, &key);
ATF_REQUIRE_EQ(dns_keytable_add2(keytable, ISC_FALSE, ISC_FALSE, &key), ATF_REQUIRE_EQ(dns_keytable_add(keytable, ISC_FALSE, &key),
ISC_R_SUCCESS); ISC_R_SUCCESS);
ATF_REQUIRE_EQ(dns_keytable_find(keytable, str2name("null.example"), ATF_REQUIRE_EQ(dns_keytable_find(keytable, str2name("null.example"),
&keynode), ISC_R_SUCCESS); &keynode), ISC_R_SUCCESS);
@ -523,7 +523,7 @@ ATF_TC_BODY(nta, tc) {
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS); ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
create_key(257, 3, 5, "example", keystr1, &key); create_key(257, 3, 5, "example", keystr1, &key);
result = dns_keytable_add2(keytable, ISC_FALSE, ISC_FALSE, &key); result = dns_keytable_add(keytable, ISC_FALSE, &key);
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS); ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
isc_stdtime_get(&now); isc_stdtime_get(&now);

View File

@ -1629,7 +1629,6 @@ validate(dns_validator_t *val, isc_boolean_t resume) {
if (vresult == ISC_R_SUCCESS) if (vresult == ISC_R_SUCCESS)
break; break;
if (val->keynode != NULL) { if (val->keynode != NULL) {
dst_key_t *key = NULL;
dns_keynode_t *nextnode = NULL; dns_keynode_t *nextnode = NULL;
result = dns_keytable_findnextkeynode( result = dns_keytable_findnextkeynode(
val->keytable, val->keytable,
@ -1642,13 +1641,9 @@ validate(dns_validator_t *val, isc_boolean_t resume) {
val->key = NULL; val->key = NULL;
break; break;
} }
key = dns_keynode_key(val->keynode); val->key = dns_keynode_key(val->keynode);
if (key == NULL) if (val->key == NULL)
break; break;
if (dns_keynode_initial(val->keynode)) {
continue;
}
val->key = key;
} else { } else {
if (get_dst_key(val, val->siginfo, val->keyset) if (get_dst_key(val, val->siginfo, val->keyset)
!= ISC_R_SUCCESS) != ISC_R_SUCCESS)
@ -1665,10 +1660,10 @@ validate(dns_validator_t *val, isc_boolean_t resume) {
val->view->acceptexpired); val->view->acceptexpired);
} }
if (val->keynode != NULL) { if (val->keynode != NULL)
dns_keytable_detachkeynode(val->keytable, dns_keytable_detachkeynode(val->keytable,
&val->keynode); &val->keynode);
} else { else {
if (val->key != NULL) if (val->key != NULL)
dst_key_free(&val->key); dst_key_free(&val->key);
if (val->keyset != NULL) { if (val->keyset != NULL) {
@ -2028,16 +2023,14 @@ validatezonekey(dns_validator_t *val) {
&keynode); &keynode);
break; break;
} }
if (! dns_keynode_initial(keynode)) { result = verify(val, dstkey, &sigrdata,
result = verify(val, dstkey, sig.keyid);
&sigrdata, sig.keyid);
if (result == ISC_R_SUCCESS) { if (result == ISC_R_SUCCESS) {
dns_keytable_detachkeynode( dns_keytable_detachkeynode(
val->keytable, val->keytable,
&keynode); &keynode);
break; break;
} }
}
result = dns_keytable_findnextkeynode( result = dns_keytable_findnextkeynode(
val->keytable, val->keytable,
keynode, keynode,

View File

@ -3934,8 +3934,7 @@ compute_tag(dns_name_t *name, dns_rdata_dnskey_t *dnskey, isc_mem_t *mctx,
*/ */
static void static void
trust_key(dns_zone_t *zone, dns_name_t *keyname, trust_key(dns_zone_t *zone, dns_name_t *keyname,
dns_rdata_dnskey_t *dnskey, isc_boolean_t initial, dns_rdata_dnskey_t *dnskey, isc_mem_t *mctx)
isc_mem_t *mctx)
{ {
isc_result_t result; isc_result_t result;
dns_rdata_t rdata = DNS_RDATA_INIT; dns_rdata_t rdata = DNS_RDATA_INIT;
@ -3954,7 +3953,7 @@ trust_key(dns_zone_t *zone, dns_name_t *keyname,
goto failure; goto failure;
CHECK(dns_dnssec_keyfromrdata(keyname, &rdata, mctx, &dstkey)); CHECK(dns_dnssec_keyfromrdata(keyname, &rdata, mctx, &dstkey));
CHECK(dns_keytable_add2(sr, ISC_TRUE, initial, &dstkey)); CHECK(dns_keytable_add(sr, ISC_TRUE, &dstkey));
dns_keytable_detach(&sr); dns_keytable_detach(&sr);
failure: failure:
@ -4040,8 +4039,7 @@ load_secroots(dns_zone_t *zone, dns_name_t *name, dns_rdataset_t *rdataset) {
/* Add to keytables. */ /* Add to keytables. */
trusted++; trusted++;
trust_key(zone, name, &dnskey, trust_key(zone, name, &dnskey, mctx);
ISC_TF(keydata.addhd == 0), mctx);
} }
if (trusted == 0 && pending != 0) { if (trusted == 0 && pending != 0) {
@ -4776,9 +4774,8 @@ zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime,
case dns_zone_key: case dns_zone_key:
result = sync_keyzone(zone, db); result = sync_keyzone(zone, db);
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS)
goto cleanup; goto cleanup;
}
break; break;
default: default:
@ -4928,17 +4925,9 @@ zone_postload(dns_zone_t *zone, dns_db_t *db, isc_time_t loadtime,
return (result); return (result);
cleanup: cleanup:
if (zone->type == dns_zone_key && result != ISC_R_SUCCESS) {
dns_zone_log(zone, ISC_LOG_ERROR,
"failed to initialize managed-keys (%s): "
"DNSSEC validation WILL FAIL",
isc_result_totext(result));
}
for (inc = ISC_LIST_HEAD(zone->newincludes); for (inc = ISC_LIST_HEAD(zone->newincludes);
inc != NULL; inc != NULL;
inc = ISC_LIST_HEAD(zone->newincludes)) inc = ISC_LIST_HEAD(zone->newincludes)) {
{
ISC_LIST_UNLINK(zone->newincludes, inc, link); ISC_LIST_UNLINK(zone->newincludes, inc, link);
isc_mem_free(zone->mctx, inc->name); isc_mem_free(zone->mctx, inc->name);
isc_mem_put(zone->mctx, inc, sizeof(*inc)); isc_mem_put(zone->mctx, inc, sizeof(*inc));
@ -9099,7 +9088,7 @@ keyfetch_done(isc_task_t *task, isc_event_t *event) {
dst_key_t *dstkey; dst_key_t *dstkey;
isc_stdtime_t now; isc_stdtime_t now;
int pending = 0; int pending = 0;
isc_boolean_t secure = ISC_FALSE, initial = ISC_FALSE; isc_boolean_t secure = ISC_FALSE;
isc_boolean_t free_needed; isc_boolean_t free_needed;
UNUSED(task); UNUSED(task);
@ -9176,8 +9165,7 @@ keyfetch_done(isc_task_t *task, isc_event_t *event) {
*/ */
for (result = dns_rdataset_first(&kfetch->dnskeysigset); for (result = dns_rdataset_first(&kfetch->dnskeysigset);
result == ISC_R_SUCCESS; result == ISC_R_SUCCESS;
result = dns_rdataset_next(&kfetch->dnskeysigset)) result = dns_rdataset_next(&kfetch->dnskeysigset)) {
{
dns_keynode_t *keynode = NULL; dns_keynode_t *keynode = NULL;
dns_rdata_reset(&sigrr); dns_rdata_reset(&sigrr);
@ -9196,8 +9184,7 @@ keyfetch_done(isc_task_t *task, isc_event_t *event) {
break; break;
if (dst_key_alg(dstkey) == sig.algorithm && if (dst_key_alg(dstkey) == sig.algorithm &&
dst_key_id(dstkey) == sig.keyid) dst_key_id(dstkey) == sig.keyid) {
{
result = dns_dnssec_verify2(keyname, result = dns_dnssec_verify2(keyname,
&kfetch->dnskeyset, &kfetch->dnskeyset,
dstkey, ISC_FALSE, dstkey, ISC_FALSE,
@ -9215,9 +9202,6 @@ keyfetch_done(isc_task_t *task, isc_event_t *event) {
dns_trust_secure; dns_trust_secure;
kfetch->dnskeysigset.trust = kfetch->dnskeysigset.trust =
dns_trust_secure; dns_trust_secure;
secure = ISC_TRUE;
initial = dns_keynode_initial(keynode);
dns_keynode_trust(keynode);
break; break;
} }
} }
@ -9228,11 +9212,11 @@ keyfetch_done(isc_task_t *task, isc_event_t *event) {
keynode = nextnode; keynode = nextnode;
} }
if (keynode != NULL) { if (keynode != NULL)
dns_keytable_detachkeynode(secroots, &keynode); dns_keytable_detachkeynode(secroots, &keynode);
}
if (secure) { if (kfetch->dnskeyset.trust == dns_trust_secure) {
secure = ISC_TRUE;
break; break;
} }
} }
@ -9241,6 +9225,7 @@ keyfetch_done(isc_task_t *task, isc_event_t *event) {
* If we were not able to verify the answer using the current * If we were not able to verify the answer using the current
* trusted keys then all we can do is look at any revoked keys. * trusted keys then all we can do is look at any revoked keys.
*/ */
if (!secure) { if (!secure) {
dns_zone_log(zone, ISC_LOG_DEBUG(3), dns_zone_log(zone, ISC_LOG_DEBUG(3),
"DNSKEY set for zone '%s' could not be verified " "DNSKEY set for zone '%s' could not be verified "
@ -9480,13 +9465,10 @@ keyfetch_done(isc_task_t *task, isc_event_t *event) {
trustkey = ISC_TRUE; trustkey = ISC_TRUE;
dns_zone_log(zone, ISC_LOG_INFO, dns_zone_log(zone, ISC_LOG_INFO,
"Key %d for zone %s " "Key %d for zone %s "
"%s: key now trusted", "acceptance timer "
keytag, namebuf, "complete: "
initial "key now trusted",
? "initializing key " keytag, namebuf);
"verified"
: "acceptance timer "
"complete");
} }
} else if (keydata.addhd > now) { } else if (keydata.addhd > now) {
/* /*
@ -9585,7 +9567,7 @@ keyfetch_done(isc_task_t *task, isc_event_t *event) {
/* Trust this key. */ /* Trust this key. */
result = dns_rdata_tostruct(&dnskeyrr, &dnskey, NULL); result = dns_rdata_tostruct(&dnskeyrr, &dnskey, NULL);
RUNTIME_CHECK(result == ISC_R_SUCCESS); RUNTIME_CHECK(result == ISC_R_SUCCESS);
trust_key(zone, keyname, &dnskey, ISC_FALSE, mctx); trust_key(zone, keyname, &dnskey, mctx);
} }
if (secure && !deletekey) { if (secure && !deletekey) {
@ -9607,6 +9589,7 @@ keyfetch_done(isc_task_t *task, isc_event_t *event) {
fail_secure(zone, keyname); fail_secure(zone, keyname);
done: done:
if (!ISC_LIST_EMPTY(diff.tuples)) { if (!ISC_LIST_EMPTY(diff.tuples)) {
/* Write changes to journal file. */ /* Write changes to journal file. */
CHECK(update_soa_serial(kfetch->db, ver, &diff, mctx, CHECK(update_soa_serial(kfetch->db, ver, &diff, mctx,
@ -9619,12 +9602,7 @@ keyfetch_done(isc_task_t *task, isc_event_t *event) {
} }
failure: failure:
if (result != ISC_R_SUCCESS) {
dns_zone_log(zone, ISC_LOG_ERROR,
"error during managed-keys processing (%s): "
"DNSSEC validation may be at risk",
isc_result_totext(result));
}
dns_diff_clear(&diff); dns_diff_clear(&diff);
if (ver != NULL) if (ver != NULL)
dns_db_closeversion(kfetch->db, &ver, commit); dns_db_closeversion(kfetch->db, &ver, commit);
@ -9734,7 +9712,7 @@ zone_refreshkeys(dns_zone_t *zone) {
} }
/* Acceptance timer expired? */ /* Acceptance timer expired? */
if (kd.addhd < now) if (kd.addhd != 0 && kd.addhd < now)
timer = kd.addhd; timer = kd.addhd;
/* Or do we just need to refresh the keyset? */ /* Or do we just need to refresh the keyset? */