2
* Copyright (C) 2004-2011 Internet Systems Consortium, Inc. ("ISC")
2
* Copyright (C) 2004-2012 Internet Systems Consortium, Inc. ("ISC")
3
3
* Copyright (C) 1999-2003 Internet Software Consortium.
5
5
* Permission to use, copy, modify, and/or distribute this software for any
136
137
typedef struct dns_stub dns_stub_t;
137
138
typedef struct dns_load dns_load_t;
138
139
typedef struct dns_forward dns_forward_t;
140
typedef ISC_LIST(dns_forward_t) dns_forwardlist_t;
139
141
typedef struct dns_io dns_io_t;
140
142
typedef ISC_LIST(dns_io_t) dns_iolist_t;
141
143
typedef struct dns_signing dns_signing_t;
659
668
static void zone_maintenance(dns_zone_t *zone);
660
669
static void zone_notify(dns_zone_t *zone, isc_time_t *now);
661
670
static void dump_done(void *arg, isc_result_t result);
662
static isc_boolean_t dns_zonemgr_unreachable(dns_zonemgr_t *zmgr,
663
isc_sockaddr_t *remote,
664
isc_sockaddr_t *local,
666
671
static isc_result_t zone_signwithkey(dns_zone_t *zone, dns_secalg_t algorithm,
667
672
isc_uint16_t keyid, isc_boolean_t delete);
668
673
static isc_result_t delete_nsec(dns_db_t *db, dns_dbversion_t *ver,
1672
1678
LOCK_ZONE(zone);
1673
1679
ZONEDB_LOCK(&zone->dblock, isc_rwlocktype_read);
1674
dns_db_currentversion(zone->db, &version);
1675
result = dns_master_dumpinc2(zone->mctx, zone->db, version,
1676
&dns_master_style_default,
1677
zone->masterfile, zone->task, dump_done,
1678
zone, &zone->dctx, zone->masterformat);
1679
dns_db_closeversion(zone->db, &version, ISC_FALSE);
1680
if (zone->db != NULL) {
1681
dns_db_currentversion(zone->db, &version);
1682
result = dns_master_dumpinc2(zone->mctx, zone->db, version,
1683
&dns_master_style_default,
1684
zone->masterfile, zone->task,
1685
dump_done, zone, &zone->dctx,
1686
zone->masterformat);
1687
dns_db_closeversion(zone->db, &version, ISC_FALSE);
1689
result = ISC_R_CANCELED;
1680
1690
ZONEDB_UNLOCK(&zone->dblock, isc_rwlocktype_read);
1681
1691
UNLOCK_ZONE(zone);
1682
1692
if (result != DNS_R_CONTINUE)
3071
3082
ISC_TRUE, &journal);
3072
3083
if (result != ISC_R_SUCCESS) {
3073
3084
dns_zone_log(zone, ISC_LOG_ERROR,
3074
"%s:dns_journal_open -> %s\n",
3085
"%s:dns_journal_open -> %s",
3075
3086
caller, dns_result_totext(result));
3076
3087
return (result);
3080
3091
dns_journal_destroy(&journal);
3081
3092
if (result != ISC_R_SUCCESS) {
3082
3093
dns_zone_log(zone, ISC_LOG_ERROR,
3083
"%s:dns_journal_write_transaction -> %s\n",
3094
"%s:dns_journal_write_transaction -> %s",
3084
3095
caller, dns_result_totext(result));
3085
3096
return (result);
3105
3116
result = dns_db_newversion(db, &ver);
3106
3117
if (result != ISC_R_SUCCESS) {
3107
3118
dns_zone_log(zone, ISC_LOG_ERROR,
3108
"add_soa:dns_db_newversion -> %s\n",
3119
"add_soa:dns_db_newversion -> %s",
3109
3120
dns_result_totext(result));
3115
3126
0, 0, 0, 0, 0, buf, &rdata);
3116
3127
if (result != ISC_R_SUCCESS) {
3117
3128
dns_zone_log(zone, ISC_LOG_ERROR,
3118
"add_soa:dns_soa_buildrdata -> %s\n",
3129
"add_soa:dns_soa_buildrdata -> %s",
3119
3130
dns_result_totext(result));
3167
3178
result = dns_db_newversion(db, &ver);
3168
3179
if (result != ISC_R_SUCCESS) {
3169
3180
dns_zone_log(zone, ISC_LOG_ERROR,
3170
"sync_keyzone:dns_db_newversion -> %s\n",
3181
"sync_keyzone:dns_db_newversion -> %s",
3171
3182
dns_result_totext(result));
3183
3194
for (result = dns_rriterator_first(&rrit);
3184
3195
result == ISC_R_SUCCESS;
3185
3196
result = dns_rriterator_nextrrset(&rrit)) {
3186
dns_rdataset_t *rdataset;
3197
dns_rdataset_t *rdataset = NULL;
3187
3198
dns_name_t *rrname = NULL;
3188
3199
isc_uint32_t ttl;
3319
3330
zone->masterfile,
3320
3331
dns_result_totext(result));
3322
dns_zone_log(zone, ISC_LOG_ERROR,
3333
int level = ISC_LOG_ERROR;
3334
if (zone->type == dns_zone_key &&
3335
result == ISC_R_FILENOTFOUND)
3336
level = ISC_LOG_DEBUG(1);
3337
dns_zone_log(zone, level,
3323
3338
"loading from master file %s failed: %s",
3324
3339
zone->masterfile,
3325
3340
dns_result_totext(result));
3388
3403
needdump = ISC_TRUE;
3391
zone->loadtime = loadtime;
3393
dns_zone_log(zone, ISC_LOG_DEBUG(1), "loaded");
3406
dns_zone_log(zone, ISC_LOG_DEBUG(1), "loaded; checking validity");
3395
3408
* Obtain ns, soa and cname counts for top of zone.
3635
3648
dns_zone_log(zone, ISC_LOG_INFO, "loaded serial %u%s", serial,
3636
3649
dns_db_issecure(db) ? " (DNSSEC signed)" : "");
3651
zone->loadtime = loadtime;
3638
3652
return (result);
3988
4002
UNLOCK_ZONE(source);
4006
dns_zone_synckeyzone(dns_zone_t *zone) {
4007
isc_result_t result;
4008
dns_db_t *db = NULL;
4010
if (zone->type != dns_zone_key)
4011
return (DNS_R_BADZONE);
4013
CHECK(dns_zone_getdb(zone, &db));
4016
result = sync_keyzone(zone, db);
3992
4026
zone_iattach(dns_zone_t *source, dns_zone_t **target) {
4604
4637
isc_result_t result;
4605
4638
dns_dbnode_t *node = NULL;
4606
4639
dns_rdataset_t rdataset;
4607
dns_rdata_t rdata = DNS_RDATA_INIT;
4608
4640
unsigned int i;
4609
4641
dns_rdata_rrsig_t rrsig;
4610
4642
isc_boolean_t found, changed;
4611
isc_stdtime_t warn = 0, maybe = 0;
4643
isc_int64_t warn = 0, maybe = 0;
4613
4645
dns_rdataset_init(&rdataset);
4637
4669
for (result = dns_rdataset_first(&rdataset);
4638
4670
result == ISC_R_SUCCESS;
4639
4671
result = dns_rdataset_next(&rdataset)) {
4672
dns_rdata_t rdata = DNS_RDATA_INIT;
4640
4674
dns_rdataset_current(&rdataset, &rdata);
4641
4675
result = dns_rdata_tostruct(&rdata, &rrsig, NULL);
4642
4676
RUNTIME_CHECK(result == ISC_R_SUCCESS);
4709
4742
* iff there is a new offline signature.
4711
4744
if (!dst_key_isprivate(keys[i])) {
4713
warn > rrsig.timeexpire)
4714
warn = rrsig.timeexpire;
4745
isc_int64_t timeexpire =
4746
dns_time64_from32(rrsig.timeexpire);
4747
if (warn != 0 && warn > timeexpire)
4715
4749
if (rdata.flags & DNS_RDATA_OFFLINE) {
4716
4750
if (maybe == 0 ||
4717
maybe > rrsig.timeexpire)
4725
warn > rrsig.timeexpire)
4726
warn = rrsig.timeexpire;
4757
if (warn == 0 || warn > timeexpire)
4727
4759
result = offline(db, ver, diff, name,
4728
4760
rdataset.ttl, &rdata);
4744
4776
result = update_one_rr(db, ver, diff,
4745
4777
DNS_DIFFOP_DELRESIGN, name,
4746
4778
rdataset.ttl, &rdata);
4747
dns_rdata_reset(&rdata);
4748
4779
if (result != ISC_R_SUCCESS)
4755
4786
dns_rdataset_disassociate(&rdataset);
4756
4787
if (result == ISC_R_NOMORE)
4757
4788
result = ISC_R_SUCCESS;
4759
set_key_expiry_warning(zone, warn, now);
4790
#if defined(STDTIME_ON_32BITS)
4791
isc_stdtime_t stdwarn = (isc_stdtime_t)warn;
4792
if (warn == stdwarn)
4794
set_key_expiry_warning(zone, (isc_stdtime_t)warn, now);
4795
#if defined(STDTIME_ON_32BITS)
4797
dns_zone_log(zone, ISC_LOG_ERROR,
4798
"key expiry warning time out of range");
4761
4802
if (node != NULL)
4762
4803
dns_db_detachnode(db, &node);
4869
4910
dns_name_t *name;
4870
4911
dns_rdataset_t rdataset;
4871
4912
dns_rdatatype_t covers;
4872
dst_key_t *zone_keys[MAXZONEKEYS];
4913
dst_key_t *zone_keys[DNS_MAXZONEKEYS];
4873
4914
isc_boolean_t check_ksk, keyset_kskonly = ISC_FALSE;
4874
4915
isc_result_t result;
4875
4916
isc_stdtime_t now, inception, soaexpire, expire, stop;
4898
4939
result = dns_db_newversion(db, &version);
4899
4940
if (result != ISC_R_SUCCESS) {
4900
4941
dns_zone_log(zone, ISC_LOG_ERROR,
4901
"zone_resigninc:dns_db_newversion -> %s\n",
4942
"zone_resigninc:dns_db_newversion -> %s",
4902
4943
dns_result_totext(result));
4906
result = find_zone_keys(zone, db, version, zone->mctx, MAXZONEKEYS,
4947
result = find_zone_keys(zone, db, version, zone->mctx, DNS_MAXZONEKEYS,
4907
4948
zone_keys, &nkeys);
4908
4949
if (result != ISC_R_SUCCESS) {
4909
4950
dns_zone_log(zone, ISC_LOG_ERROR,
4910
"zone_resigninc:find_zone_keys -> %s\n",
4951
"zone_resigninc:find_zone_keys -> %s",
4911
4952
dns_result_totext(result));
4931
4972
result = dns_db_getsigningtime(db, &rdataset, name);
4932
4973
if (result != ISC_R_SUCCESS && result != ISC_R_NOTFOUND) {
4933
4974
dns_zone_log(zone, ISC_LOG_ERROR,
4934
"zone_resigninc:dns_db_getsigningtime -> %s\n",
4975
"zone_resigninc:dns_db_getsigningtime -> %s",
4935
4976
dns_result_totext(result));
4955
4996
zone_keys, nkeys, now, ISC_TRUE);
4956
4997
if (result != ISC_R_SUCCESS) {
4957
4998
dns_zone_log(zone, ISC_LOG_ERROR,
4958
"zone_resigninc:del_sigs -> %s\n",
4999
"zone_resigninc:del_sigs -> %s",
4959
5000
dns_result_totext(result));
4965
5006
expire, check_ksk, keyset_kskonly);
4966
5007
if (result != ISC_R_SUCCESS) {
4967
5008
dns_zone_log(zone, ISC_LOG_ERROR,
4968
"zone_resigninc:add_sigs -> %s\n",
5009
"zone_resigninc:add_sigs -> %s",
4969
5010
dns_result_totext(result));
4978
5019
if (result != ISC_R_SUCCESS)
4979
5020
dns_zone_log(zone, ISC_LOG_ERROR,
4980
"zone_resigninc:dns_db_getsigningtime -> %s\n",
5021
"zone_resigninc:dns_db_getsigningtime -> %s",
4981
5022
dns_result_totext(result));
4988
5029
&sig_diff, zone_keys, nkeys, now, ISC_TRUE);
4989
5030
if (result != ISC_R_SUCCESS) {
4990
5031
dns_zone_log(zone, ISC_LOG_ERROR,
4991
"zone_resigninc:del_sigs -> %s\n",
5032
"zone_resigninc:del_sigs -> %s",
4992
5033
dns_result_totext(result));
5003
5044
result = increment_soa_serial(db, version, &sig_diff, zone->mctx);
5004
5045
if (result != ISC_R_SUCCESS) {
5005
5046
dns_zone_log(zone, ISC_LOG_ERROR,
5006
"zone_resigninc:increment_soa_serial -> %s\n",
5047
"zone_resigninc:increment_soa_serial -> %s",
5007
5048
dns_result_totext(result));
5017
5058
soaexpire, check_ksk, keyset_kskonly);
5018
5059
if (result != ISC_R_SUCCESS) {
5019
5060
dns_zone_log(zone, ISC_LOG_ERROR,
5020
"zone_resigninc:add_sigs -> %s\n",
5061
"zone_resigninc:add_sigs -> %s",
5021
5062
dns_result_totext(result));
5712
5753
zone_keys, nkeys, now, ISC_FALSE);
5713
5754
if (result != ISC_R_SUCCESS) {
5714
5755
dns_zone_log(zone, ISC_LOG_ERROR,
5715
"update_sigs:del_sigs -> %s\n",
5756
"update_sigs:del_sigs -> %s",
5716
5757
dns_result_totext(result));
5717
5758
return (result);
5722
5763
expire, check_ksk, keyset_kskonly);
5723
5764
if (result != ISC_R_SUCCESS) {
5724
5765
dns_zone_log(zone, ISC_LOG_ERROR,
5725
"update_sigs:add_sigs -> %s\n",
5766
"update_sigs:add_sigs -> %s",
5726
5767
dns_result_totext(result));
5727
5768
return (result);
5761
5802
dns_rdataset_t rdataset;
5762
5803
dns_nsec3chain_t *nsec3chain = NULL, *nextnsec3chain;
5763
5804
dns_nsec3chainlist_t cleanup;
5764
dst_key_t *zone_keys[MAXZONEKEYS];
5805
dst_key_t *zone_keys[DNS_MAXZONEKEYS];
5765
5806
isc_int32_t signatures;
5766
5807
isc_boolean_t check_ksk, keyset_kskonly;
5767
5808
isc_boolean_t delegation;
5807
5848
result = dns_db_newversion(db, &version);
5808
5849
if (result != ISC_R_SUCCESS) {
5809
5850
dns_zone_log(zone, ISC_LOG_ERROR,
5810
"zone_nsec3chain:dns_db_newversion -> %s\n",
5851
"zone_nsec3chain:dns_db_newversion -> %s",
5811
5852
dns_result_totext(result));
5815
5856
result = find_zone_keys(zone, db, version, zone->mctx,
5816
MAXZONEKEYS, zone_keys, &nkeys);
5857
DNS_MAXZONEKEYS, zone_keys, &nkeys);
5817
5858
if (result != ISC_R_SUCCESS) {
5818
5859
dns_zone_log(zone, ISC_LOG_ERROR,
5819
"zone_nsec3chain:find_zone_keys -> %s\n",
5860
"zone_nsec3chain:find_zone_keys -> %s",
5820
5861
dns_result_totext(result));
5963
6004
if (result != ISC_R_SUCCESS) {
5964
6005
dns_zone_log(zone, ISC_LOG_ERROR, "zone_nsec3chain:"
5965
"dns_nsec3_addnsec3 -> %s\n",
6006
"dns_nsec3_addnsec3 -> %s",
5966
6007
dns_result_totext(result));
6020
6061
} else if (result != ISC_R_SUCCESS) {
6021
6062
dns_zone_log(zone, ISC_LOG_ERROR,
6022
6063
"zone_nsec3chain:"
6023
"dns_dbiterator_next -> %s\n",
6064
"dns_dbiterator_next -> %s",
6024
6065
dns_result_totext(result));
6026
6067
} else if (delegation) {
6078
6119
if (result != ISC_R_SUCCESS) {
6079
6120
dns_zone_log(zone, ISC_LOG_ERROR,
6080
6121
"zone_nsec3chain:"
6081
"need_nsec_chain -> %s\n",
6122
"need_nsec_chain -> %s",
6082
6123
dns_result_totext(result));
6103
6144
if (result != ISC_R_SUCCESS) {
6104
6145
dns_zone_log(zone, ISC_LOG_ERROR,
6105
6146
"zone_nsec3chain:"
6106
"fixup_nsec3param -> %s\n",
6147
"fixup_nsec3param -> %s",
6107
6148
dns_result_totext(result));
6118
6159
if (result != ISC_R_SUCCESS) {
6119
6160
dns_zone_log(zone, ISC_LOG_ERROR,
6120
6161
"zone_nsec3chain:"
6121
"deletematchingnsec3 -> %s\n",
6162
"deletematchingnsec3 -> %s",
6122
6163
dns_result_totext(result));
6219
6260
if (result != ISC_R_SUCCESS) {
6220
6261
dns_zone_log(zone, ISC_LOG_ERROR,
6221
6262
"zone_nsec3chain:"
6222
"fixup_nsec3param -> %s\n",
6263
"fixup_nsec3param -> %s",
6223
6264
dns_result_totext(result));
6227
6268
} else if (result != ISC_R_SUCCESS) {
6228
6269
dns_zone_log(zone, ISC_LOG_ERROR,
6229
6270
"zone_nsec3chain:"
6230
"dns_dbiterator_next -> %s\n",
6271
"dns_dbiterator_next -> %s",
6231
6272
dns_result_totext(result));
6233
6274
} else if (delegation) {
6264
6305
result = dns_db_allrdatasets(db, node, version, 0, &iterator);
6265
6306
if (result != ISC_R_SUCCESS) {
6266
6307
dns_zone_log(zone, ISC_LOG_ERROR, "zone_nsec3chain:"
6267
"dns_db_allrdatasets -> %s\n",
6308
"dns_db_allrdatasets -> %s",
6268
6309
dns_result_totext(result));
6303
6344
if (result != ISC_R_SUCCESS) {
6304
6345
dns_zone_log(zone, ISC_LOG_ERROR,
6305
6346
"zone_nsec3chain:"
6306
"dns_nsec3_addnsec3s -> %s\n",
6347
"dns_nsec3_addnsec3s -> %s",
6307
6348
dns_result_totext(result));
6318
6359
check_ksk, keyset_kskonly, &sig_diff);
6319
6360
if (result != ISC_R_SUCCESS) {
6320
6361
dns_zone_log(zone, ISC_LOG_ERROR, "zone_nsec3chain:"
6321
"update_sigs -> %s\n", dns_result_totext(result));
6362
"update_sigs -> %s", dns_result_totext(result));
6331
6372
check_ksk, keyset_kskonly, &sig_diff);
6332
6373
if (result != ISC_R_SUCCESS) {
6333
6374
dns_zone_log(zone, ISC_LOG_ERROR, "zone_nsec3chain:"
6334
"update_sigs -> %s\n", dns_result_totext(result));
6375
"update_sigs -> %s", dns_result_totext(result));
6342
6383
zone->minimum, ISC_FALSE, &nsec_diff);
6343
6384
if (result != ISC_R_SUCCESS) {
6344
6385
dns_zone_log(zone, ISC_LOG_ERROR, "zone_nsec3chain:"
6345
"updatesecure -> %s\n",
6386
"updatesecure -> %s",
6346
6387
dns_result_totext(result));
6353
6394
check_ksk, keyset_kskonly, &sig_diff);
6354
6395
if (result != ISC_R_SUCCESS) {
6355
6396
dns_zone_log(zone, ISC_LOG_ERROR, "zone_nsec3chain:"
6356
"update_sigs -> %s\n", dns_result_totext(result));
6397
"update_sigs -> %s", dns_result_totext(result));
6368
6409
&sig_diff, zone_keys, nkeys, now, ISC_FALSE);
6369
6410
if (result != ISC_R_SUCCESS) {
6370
6411
dns_zone_log(zone, ISC_LOG_ERROR, "zone_nsec3chain:"
6371
"del_sigs -> %s\n", dns_result_totext(result));
6412
"del_sigs -> %s", dns_result_totext(result));
6375
6416
result = increment_soa_serial(db, version, &sig_diff, zone->mctx);
6376
6417
if (result != ISC_R_SUCCESS) {
6377
6418
dns_zone_log(zone, ISC_LOG_ERROR, "zone_nsec3chain:"
6378
"increment_soa_serial -> %s\n",
6419
"increment_soa_serial -> %s",
6379
6420
dns_result_totext(result));
6385
6426
soaexpire, check_ksk, keyset_kskonly);
6386
6427
if (result != ISC_R_SUCCESS) {
6387
6428
dns_zone_log(zone, ISC_LOG_ERROR, "zone_nsec3chain:"
6388
"add_sigs -> %s\n", dns_result_totext(result));
6429
"add_sigs -> %s", dns_result_totext(result));
6431
6472
if (result != ISC_R_SUCCESS)
6432
dns_zone_log(zone, ISC_LOG_ERROR, "zone_nsec3chain: %s\n",
6473
dns_zone_log(zone, ISC_LOG_ERROR, "zone_nsec3chain: %s",
6433
6474
dns_result_totext(result));
6435
6476
* On error roll back the current nsec3chain.
6592
6633
dns_rdataset_t rdataset;
6593
6634
dns_signing_t *signing, *nextsigning;
6594
6635
dns_signinglist_t cleanup;
6595
dst_key_t *zone_keys[MAXZONEKEYS];
6636
dst_key_t *zone_keys[DNS_MAXZONEKEYS];
6596
6637
isc_int32_t signatures;
6597
6638
isc_boolean_t check_ksk, keyset_kskonly, is_ksk;
6598
6639
isc_boolean_t commit = ISC_FALSE;
6632
6673
result = dns_db_newversion(db, &version);
6633
6674
if (result != ISC_R_SUCCESS) {
6634
6675
dns_zone_log(zone, ISC_LOG_ERROR,
6635
"zone_sign:dns_db_newversion -> %s\n",
6676
"zone_sign:dns_db_newversion -> %s",
6636
6677
dns_result_totext(result));
6640
6681
result = find_zone_keys(zone, db, version, zone->mctx,
6641
MAXZONEKEYS, zone_keys, &nkeys);
6682
DNS_MAXZONEKEYS, zone_keys, &nkeys);
6642
6683
if (result != ISC_R_SUCCESS) {
6643
6684
dns_zone_log(zone, ISC_LOG_ERROR,
6644
"zone_sign:find_zone_keys -> %s\n",
6685
"zone_sign:find_zone_keys -> %s",
6645
6686
dns_result_totext(result));
6875
6916
if (result != ISC_R_SUCCESS) {
6876
6917
dns_zone_log(zone, ISC_LOG_ERROR,
6877
"updatesignwithkey "
6918
"updatesignwithkey -> %s",
6879
6919
dns_result_totext(result));
6883
6923
goto next_signing;
6884
6924
} else if (result != ISC_R_SUCCESS) {
6885
6925
dns_zone_log(zone, ISC_LOG_ERROR,
6886
"zone_sign:dns_dbiterator_next -> %s\n",
6926
"zone_sign:dns_dbiterator_next -> %s",
6887
6927
dns_result_totext(result));
6889
6929
} else if (delegation) {
6909
6949
check_ksk, keyset_kskonly, &sig_diff);
6910
6950
if (result != ISC_R_SUCCESS) {
6911
6951
dns_zone_log(zone, ISC_LOG_ERROR, "zone_sign:"
6912
"update_sigs -> %s\n",
6952
"update_sigs -> %s",
6913
6953
dns_result_totext(result));
6929
6969
&sig_diff, zone_keys, nkeys, now, ISC_FALSE);
6930
6970
if (result != ISC_R_SUCCESS) {
6931
6971
dns_zone_log(zone, ISC_LOG_ERROR,
6932
"zone_sign:del_sigs -> %s\n",
6972
"zone_sign:del_sigs -> %s",
6933
6973
dns_result_totext(result));
6937
6977
result = increment_soa_serial(db, version, &sig_diff, zone->mctx);
6938
6978
if (result != ISC_R_SUCCESS) {
6939
6979
dns_zone_log(zone, ISC_LOG_ERROR,
6940
"zone_sign:increment_soa_serial -> %s\n",
6980
"zone_sign:increment_soa_serial -> %s",
6941
6981
dns_result_totext(result));
6951
6991
soaexpire, check_ksk, keyset_kskonly);
6952
6992
if (result != ISC_R_SUCCESS) {
6953
6993
dns_zone_log(zone, ISC_LOG_ERROR,
6954
"zone_sign:add_sigs -> %s\n",
6994
"zone_sign:add_sigs -> %s",
6955
6995
dns_result_totext(result));
7273
7313
if (dst_key_alg(dstkey) == sig.algorithm &&
7274
7314
(dst_key_id(dstkey) == sig.keyid ||
7275
(sig.algorithm != 1 && sig.keyid ==
7276
((dst_key_id(dstkey) + 128) & 0xffff)))) {
7315
dst_key_rid(dstkey) == sig.keyid)) {
7277
7316
result = dns_dnssec_verify2(keyname,
7278
7317
&kfetch->dnskeyset,
7279
7318
dstkey, ISC_FALSE, mctx, &sigrr,
7799
7839
result == ISC_R_SUCCESS;
7800
7840
result = dns_rriterator_nextrrset(&rrit)) {
7801
7841
isc_stdtime_t timer = 0xffffffff;
7842
dns_name_t *name = NULL, *kname = NULL;
7843
dns_rdataset_t *kdset = NULL;
7802
7844
dns_keyfetch_t *kfetch;
7803
dns_rdataset_t *kdset;
7804
dns_name_t *name = NULL;
7805
7845
isc_uint32_t ttl;
7807
7847
dns_rriterator_current(&rrit, &name, &ttl, &kdset, NULL);
7808
if (!dns_rdataset_isassociated(kdset))
7811
if (kdset->type != dns_rdatatype_keydata)
7848
if (kdset == NULL || kdset->type != dns_rdatatype_keydata ||
7849
!dns_rdataset_isassociated(kdset))
7843
7881
if (timer > now)
7884
kfetch = isc_mem_get(zone->mctx, sizeof(dns_keyfetch_t));
7885
if (kfetch == NULL) {
7886
fetch_err = ISC_TRUE;
7846
7890
zone->refreshkeycount++;
7848
kfetch = isc_mem_get(zone->mctx, sizeof(dns_keyfetch_t));
7849
7891
kfetch->zone = zone;
7851
7893
INSIST(zone->irefs != 0);
7852
7894
dns_fixedname_init(&kfetch->name);
7853
dns_name_dup(name, zone->mctx,
7854
dns_fixedname_name(&kfetch->name));
7895
kname = dns_fixedname_name(&kfetch->name);
7896
dns_name_dup(name, zone->mctx, kname);
7855
7897
dns_rdataset_init(&kfetch->dnskeyset);
7856
7898
dns_rdataset_init(&kfetch->dnskeysigset);
7857
7899
dns_rdataset_init(&kfetch->keydataset);
7860
7902
dns_db_attach(db, &kfetch->db);
7861
7903
kfetch->fetch = NULL;
7863
dns_resolver_createfetch(zone->view->resolver,
7864
dns_fixedname_name(&kfetch->name),
7865
dns_rdatatype_dnskey,
7867
DNS_FETCHOPT_NOVALIDATE,
7868
zone->task, keyfetch_done, kfetch,
7870
&kfetch->dnskeysigset,
7905
result = dns_resolver_createfetch(zone->view->resolver,
7906
kname, dns_rdatatype_dnskey,
7908
DNS_FETCHOPT_NOVALIDATE,
7910
keyfetch_done, kfetch,
7912
&kfetch->dnskeysigset,
7914
if (result == ISC_R_SUCCESS)
7915
fetching = ISC_TRUE;
7917
zone->refreshkeycount--;
7919
dns_db_detach(&kfetch->db);
7920
dns_rdataset_disassociate(&kfetch->keydataset);
7921
dns_name_free(kname, zone->mctx);
7922
isc_mem_put(zone->mctx, kfetch, sizeof(dns_keyfetch_t));
7923
dns_zone_log(zone, ISC_LOG_WARNING,
7924
"Failed to create fetch for "
7926
fetch_err = ISC_TRUE;
7873
7929
if (!ISC_LIST_EMPTY(diff.tuples)) {
7874
7930
CHECK(increment_soa_serial(db, ver, &diff, zone->mctx));
7875
CHECK(zone_journal(zone, &diff, "sync_keyzone"));
7931
CHECK(zone_journal(zone, &diff, "zone_refreshkeys"));
7876
7932
commit = ISC_TRUE;
7877
7933
DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_LOADED);
7878
7934
zone_needdump(zone, 30);
7940
* Error during a key fetch; retry in an hour.
7942
isc_time_t timenow, timethen;
7946
DNS_ZONE_TIME_ADD(&timenow, HOUR, &timethen);
7947
zone->refreshkeytime = timethen;
7948
zone_settimer(zone, &timenow);
7950
isc_time_formattimestamp(&zone->refreshkeytime, timebuf, 80);
7951
dns_zone_log(zone, ISC_LOG_DEBUG(1), "retry key refresh: %s",
7955
DNS_ZONE_CLRFLAG(zone, DNS_ZONEFLG_REFRESHING);
7882
7958
UNLOCK_ZONE(zone);
7884
7960
dns_diff_clear(&diff);
7903
7979
* Configuring the view of this zone may have
7904
7980
* failed, for example because the config file
7905
7981
* had a syntax error. In that case, the view
7906
* adb or resolver, and we had better not try
7982
* db or resolver will be NULL, and we had better not try
7907
7983
* to do maintenance on it.
7909
7985
if (zone->view == NULL || zone->view->adb == NULL)
8515
forward_cancel(dns_zone_t *zone) {
8516
dns_forward_t *forward;
8519
* 'zone' locked by caller.
8522
REQUIRE(LOCKED_ZONE(zone));
8524
for (forward = ISC_LIST_HEAD(zone->forwards);
8526
forward = ISC_LIST_NEXT(forward, link)) {
8527
if (forward->request != NULL)
8528
dns_request_cancel(forward->request);
8438
8533
zone_unload(dns_zone_t *zone) {
8444
8539
REQUIRE(LOCKED_ZONE(zone));
8541
if (!DNS_ZONE_FLAG(zone, DNS_ZONEFLG_FLUSH) ||
8542
!DNS_ZONE_FLAG(zone, DNS_ZONEFLG_DUMPING)) {
8543
if (zone->writeio != NULL)
8544
zonemgr_cancelio(zone->writeio);
8546
if (zone->dctx != NULL)
8547
dns_dumpctx_cancel(zone->dctx);
8446
8549
ZONEDB_LOCK(&zone->dblock, isc_rwlocktype_write);
8447
8550
zone_detachdb(zone);
8448
8551
ZONEDB_UNLOCK(&zone->dblock, isc_rwlocktype_write);
9139
9242
dns_zone_t *zone = NULL;
9140
9243
char master[ISC_SOCKADDR_FORMATSIZE];
9141
9244
char source[ISC_SOCKADDR_FORMATSIZE];
9142
isc_uint32_t nscnt, cnamecnt;
9245
isc_uint32_t nscnt, cnamecnt, refresh, retry, expire;
9143
9246
isc_result_t result;
9144
9247
isc_time_t now;
9145
9248
isc_boolean_t exiting = ISC_FALSE;
9169
9274
if (revent->result != ISC_R_SUCCESS) {
9170
9275
if (revent->result == ISC_R_TIMEDOUT &&
9171
9276
!DNS_ZONE_FLAG(zone, DNS_ZONEFLG_NOEDNS)) {
9173
9277
DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_NOEDNS);
9175
9278
dns_zone_log(zone, ISC_LOG_DEBUG(1),
9176
9279
"refreshing stub: timeout retrying "
9177
9280
" without EDNS master %s (source %s)",
9213
9316
"refreshing stub: rcode (%.*s) retrying "
9214
9317
"without EDNS master %s (source %s)",
9215
9318
(int)rb.used, rcode, master, source);
9217
9319
DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_NOEDNS);
9219
9320
goto same_master;
9291
9390
ZONEDB_LOCK(&zone->dblock, isc_rwlocktype_write);
9292
9391
if (zone->db == NULL)
9293
9392
zone_attachdb(zone, stub->db);
9393
result = zone_get_from_db(zone, zone->db, NULL, NULL, NULL, &refresh,
9394
&retry, &expire, NULL, NULL);
9395
if (result == ISC_R_SUCCESS) {
9396
zone->refresh = RANGE(refresh, zone->minrefresh,
9398
zone->retry = RANGE(retry, zone->minretry, zone->maxretry);
9399
zone->expire = RANGE(expire, zone->refresh + zone->retry,
9401
DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_HAVETIMERS);
9294
9403
ZONEDB_UNLOCK(&zone->dblock, isc_rwlocktype_write);
9295
9404
dns_db_detach(&stub->db);
9297
if (zone->masterfile != NULL) {
9298
dns_zone_dump(zone);
9299
TIME_NOW(&zone->loadtime);
9302
9406
dns_message_destroy(&msg);
9303
9407
isc_event_free(&event);
9305
9408
dns_request_destroy(&zone->request);
9306
9410
DNS_ZONE_CLRFLAG(zone, DNS_ZONEFLG_REFRESH);
9411
DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_LOADED);
9307
9412
DNS_ZONE_JITTER_ADD(&now, zone->refresh, &zone->refreshtime);
9308
9413
isc_interval_set(&i, zone->expire, 0);
9309
9414
DNS_ZONE_TIME_ADD(&now, zone->expire, &zone->expiretime);
9416
if (zone->masterfile != NULL)
9417
zone_needdump(zone, 0);
9310
9419
zone_settimer(zone, &now);
9312
9420
goto free_stub;
9357
9464
DNS_ZONE_CLRFLAG(zone, DNS_ZONEFLG_REFRESH);
9359
9466
zone_settimer(zone, &now);
9361
9467
goto free_stub;
9364
9470
queue_soa_query(zone);
9366
9471
goto free_stub;
9369
9474
if (msg != NULL)
9370
9475
dns_message_destroy(&msg);
9371
9476
isc_event_free(&event);
9373
9477
dns_request_destroy(&zone->request);
9375
9478
ns_query(zone, NULL, stub);
9379
9484
stub->magic = 0;
9380
9485
dns_zone_idetach(&stub->zone);
9381
9486
INSIST(stub->db == NULL);
9404
9509
dns_rdata_t rdata = DNS_RDATA_INIT;
9405
9510
dns_rdata_soa_t soa;
9406
9511
isc_result_t result;
9407
isc_uint32_t serial, oldserial;
9512
isc_uint32_t serial, oldserial = 0;
9408
9513
unsigned int j;
9514
isc_boolean_t do_queue_xfrin = ISC_FALSE;
9410
9516
zone = revent->ev_arg;
9411
9517
INSIST(DNS_ZONE_VALID(zone));
9421
9531
isc_sockaddr_format(&zone->masteraddr, master, sizeof(master));
9422
9532
isc_sockaddr_format(&zone->sourceaddr, source, sizeof(source));
9426
9534
if (revent->result != ISC_R_SUCCESS) {
9427
9535
if (revent->result == ISC_R_TIMEDOUT &&
9428
9536
!DNS_ZONE_FLAG(zone, DNS_ZONEFLG_NOEDNS)) {
9430
9537
DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_NOEDNS);
9432
9538
dns_zone_log(zone, ISC_LOG_DEBUG(1),
9433
9539
"refresh: timeout retrying without EDNS "
9434
9540
"master %s (source %s)", master, source);
9497
9602
"refresh: rcode (%.*s) retrying without "
9498
9603
"EDNS master %s (source %s)",
9499
9604
(int)rb.used, rcode, master, source);
9501
9605
DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_NOEDNS);
9503
9606
goto same_master;
9505
9608
dns_zone_log(zone, ISC_LOG_INFO,
9525
9628
"initiating TCP zone xfer "
9526
9629
"for master %s (source %s)",
9527
9630
master, source);
9529
9631
DNS_ZONE_SETFLAG(zone, DNS_ZONEFLG_SOABEFOREAXFR);
9531
9632
goto tcp_transfer;
9533
9634
INSIST(zone->type == dns_zone_stub);
9629
9729
serial = soa.serial;
9630
9730
if (DNS_ZONE_FLAG(zone, DNS_ZONEFLG_LOADED)) {
9631
result = dns_zone_getserial2(zone, &oldserial);
9731
result = zone_get_from_db(zone, zone->db, NULL, NULL,
9732
&oldserial, NULL, NULL, NULL, NULL,
9632
9734
RUNTIME_CHECK(result == ISC_R_SUCCESS);
9633
9735
zone_debuglog(zone, me, 1, "serial: new %u, old %u",
9634
9736
serial, oldserial);
9640
9742
DNS_ZONE_FLAG(zone, DNS_ZONEFLG_FORCEXFER) ||
9641
9743
isc_serial_gt(serial, oldserial)) {
9642
9744
if (dns_zonemgr_unreachable(zone->zmgr, &zone->masteraddr,
9643
&zone->sourceaddr, &now)) {
9745
&zone->sourceaddr, &now))
9644
9747
dns_zone_log(zone, ISC_LOG_INFO,
9645
9748
"refresh: skipping %s as master %s "
9646
9749
"(source %s) is unreachable (cached)",
9653
9756
isc_event_free(&event);
9655
9757
dns_request_destroy(&zone->request);
9657
9758
if (zone->type == dns_zone_slave) {
9759
do_queue_xfrin = ISC_TRUE;
9660
9761
INSIST(zone->type == dns_zone_stub);
9661
9762
ns_query(zone, rdataset, NULL);
9678
9779
/* Someone removed the file from underneath us! */
9679
9780
if (result == ISC_R_FILENOTFOUND) {
9681
9781
zone_needdump(zone, DNS_DUMP_DELAY);
9683
9782
} else if (result != ISC_R_SUCCESS)
9684
9783
dns_zone_log(zone, ISC_LOG_ERROR,
9685
9784
"refresh: could not set file "
9752
9850
DNS_ZONE_CLRFLAG(zone, DNS_ZONEFLG_USEALTXFRSRC);
9753
9851
zone_settimer(zone, &now);
9759
9856
queue_soa_query(zone);
9764
9860
if (msg != NULL)
9765
9861
dns_message_destroy(&msg);
9766
9862
isc_event_free(&event);
9768
9863
dns_request_destroy(&zone->request);
9769
9864
queue_soa_query(zone);
9773
9870
dns_zone_idetach(&zone);
10127
10224
isc_uint16_t udpsize = SEND_BUFFER_SIZE;
10129
10226
REQUIRE(DNS_ZONE_VALID(zone));
10227
REQUIRE(LOCKED_ZONE(zone));
10130
10228
REQUIRE((soardataset != NULL && stub == NULL) ||
10131
10229
(soardataset == NULL && stub != NULL));
10132
10230
REQUIRE(stub == NULL || DNS_STUB_VALID(stub));
10137
10234
if (stub == NULL) {
10138
10235
stub = isc_mem_get(zone->mctx, sizeof(*stub));
10139
10236
if (stub == NULL)
10344
10440
REQUIRE(DNS_ZONE_VALID(zone));
10345
10441
INSIST(event->ev_type == DNS_EVENT_ZONECONTROL);
10346
10442
INSIST(isc_refcount_current(&zone->erefs) == 0);
10347
10444
zone_debuglog(zone, "zone_shutdown", 3, "shutting down");
10894
10994
return (ISC_R_SUCCESS);
10896
10996
zone->notifyfrom = *from;
10997
local = zone->masteraddr;
10998
remote = zone->sourceaddr;
10897
10999
UNLOCK_ZONE(zone);
11000
dns_zonemgr_unreachabledel(zone->zmgr, &local, &remote);
10898
11001
dns_zone_refresh(zone);
10899
11002
return (ISC_R_SUCCESS);
11916
12019
* This transfer finishing freed up a transfer quota slot.
11917
12020
* Let any other zones waiting for quota have it.
11919
12023
RWLOCK(&zone->zmgr->rwlock, isc_rwlocktype_write);
11920
12024
ISC_LIST_UNLINK(zone->zmgr->xfrin_in_progress, zone, statelink);
11921
12025
zone->statelist = NULL;
11922
12026
zmgr_resume_xfrs(zone->zmgr, ISC_FALSE);
11923
12027
RWUNLOCK(&zone->zmgr->rwlock, isc_rwlocktype_write);
11926
12031
* Retry with a different server if necessary.
12088
12193
isc_sockaddr_format(&zone->masteraddr, master, sizeof(master));
12089
12194
if (dns_zonemgr_unreachable(zone->zmgr, &zone->masteraddr,
12090
&zone->sourceaddr, &now)) {
12195
&zone->sourceaddr, &now))
12091
12197
isc_sockaddr_format(&zone->sourceaddr, source, sizeof(source));
12092
12198
dns_zone_log(zone, ISC_LOG_INFO,
12093
12199
"got_transfer_quota: skipping zone transfer as "
12227
12333
dns_request_destroy(&forward->request);
12228
12334
if (forward->msgbuf != NULL)
12229
12335
isc_buffer_free(&forward->msgbuf);
12230
if (forward->zone != NULL)
12336
if (forward->zone != NULL) {
12337
LOCK(&forward->zone->lock);
12338
if (ISC_LINK_LINKED(forward, link))
12339
ISC_LIST_UNLINK(forward->zone->forwards, forward, link);
12340
UNLOCK(&forward->zone->lock);
12231
12341
dns_zone_idetach(&forward->zone);
12232
12343
isc_mem_putanddetach(&forward->mctx, forward, sizeof(*forward));
12238
12349
isc_sockaddr_t src;
12240
12351
LOCK_ZONE(forward->zone);
12353
if (DNS_ZONE_FLAG(forward->zone, DNS_ZONEFLG_EXITING)) {
12354
UNLOCK_ZONE(forward->zone);
12355
return (ISC_R_CANCELED);
12241
12358
if (forward->which >= forward->zone->masterscnt) {
12242
12359
UNLOCK_ZONE(forward->zone);
12243
12360
return (ISC_R_NOMORE);
12268
12385
forward->zone->task,
12269
12386
forward_callback, forward,
12270
12387
&forward->request);
12388
if (result == ISC_R_SUCCESS) {
12389
if (!ISC_LINK_LINKED(forward, link))
12390
ISC_LIST_APPEND(forward->zone->forwards, forward, link);
12272
12394
UNLOCK_ZONE(forward->zone);
12273
12395
return (result);
12394
12516
forward->mctx = 0;
12395
12517
forward->callback = callback;
12396
12518
forward->callback_arg = callback_arg;
12519
ISC_LINK_INIT(forward, link);
12397
12520
forward->magic = FORWARD_MAGIC;
12399
12522
mr = dns_message_getrawmessage(msg);
12480
12603
zmgr->transfersin = 10;
12481
12604
zmgr->transfersperns = 2;
12606
/* Unreachable lock. */
12607
result = isc_rwlock_init(&zmgr->urlock, 0, 0);
12608
if (result != ISC_R_SUCCESS)
12483
12611
/* Create a single task for queueing of SOA queries. */
12484
12612
result = isc_task_create(taskmgr, 1, &zmgr->task);
12485
12613
if (result != ISC_R_SUCCESS)
12487
12616
isc_task_setname(zmgr->task, "zmgr", zmgr);
12488
12617
result = isc_ratelimiter_create(mctx, timermgr, zmgr->task,
12490
12619
if (result != ISC_R_SUCCESS)
12491
12620
goto free_task;
12492
12622
/* default to 20 refresh queries / notifies per second. */
12493
12623
isc_interval_set(&interval, 0, 1000000000/2);
12494
12624
result = isc_ratelimiter_setinterval(zmgr->rl, &interval);
12684
12818
isc_task_destroy(&zmgr->task);
12685
12819
if (zmgr->zonetasks != NULL)
12686
12820
isc_taskpool_destroy(&zmgr->zonetasks);
12822
RWLOCK(&zmgr->rwlock, isc_rwlocktype_read);
12823
for (zone = ISC_LIST_HEAD(zmgr->zones);
12825
zone = ISC_LIST_NEXT(zone, link))
12828
forward_cancel(zone);
12831
RWUNLOCK(&zmgr->rwlock, isc_rwlocktype_read);
12727
12872
DESTROYLOCK(&zmgr->iolock);
12728
12873
isc_ratelimiter_detach(&zmgr->rl);
12875
isc_rwlock_destroy(&zmgr->urlock);
12730
12876
isc_rwlock_destroy(&zmgr->rwlock);
12731
12877
mctx = zmgr->mctx;
12732
12878
isc_mem_put(zmgr->mctx, zmgr, sizeof(*zmgr));
12827
12973
isc_event_t *e;
12976
* If we are exiting just pretend we got quota so the zone will
12977
* be cleaned up in the zone's task context.
12980
if (DNS_ZONE_FLAG(zone, DNS_ZONEFLG_EXITING)) {
12830
12986
* Find any configured information about the server we'd
12831
12987
* like to transfer this zone from.
12833
12989
isc_netaddr_fromsockaddr(&masterip, &zone->masteraddr);
12834
(void)dns_peerlist_peerbyaddr(zone->view->peers,
12990
(void)dns_peerlist_peerbyaddr(zone->view->peers, &masterip, &peer);
12838
12994
* Determine the total maximum number of simultaneous
12869
13029
if (nxfrsperns >= maxtransfersperns)
12870
13030
return (ISC_R_QUOTA);
12873
13034
* We have sufficient quota. Move the zone to the "xfrin_in_progress"
12874
13035
* list and send it an event to let it start the actual transfer in the
12875
13036
* context of its own task.
12877
e = isc_event_allocate(zmgr->mctx, zmgr,
12878
DNS_EVENT_ZONESTARTXFRIN,
12879
got_transfer_quota, zone,
12880
sizeof(isc_event_t));
13038
e = isc_event_allocate(zmgr->mctx, zmgr, DNS_EVENT_ZONESTARTXFRIN,
13039
got_transfer_quota, zone, sizeof(isc_event_t));
12881
13040
if (e == NULL)
12882
13041
return (ISC_R_NOMEMORY);
13049
13208
if (result != ISC_R_SUCCESS)
13050
13209
goto cleanup;
13052
dns_zone_log(zone, ISC_LOG_WARNING, "saved '%s' as '%s'",
13211
dns_zone_log(zone, ISC_LOG_WARNING, "unable to load from '%s'; "
13212
"renaming file to '%s' for failure analysis and "
13213
"retransferring.", path, buf);
13056
13216
isc_mem_put(zone->mctx, buf, buflen);
13125
13285
REQUIRE(DNS_ZONEMGR_VALID(zmgr));
13127
13287
locktype = isc_rwlocktype_read;
13128
RWLOCK(&zmgr->rwlock, locktype);
13288
RWLOCK(&zmgr->urlock, locktype);
13129
13289
for (i = 0; i < UNREACH_CHACHE_SIZE; i++) {
13130
13290
if (zmgr->unreachable[i].expire >= seconds &&
13131
13291
isc_sockaddr_equal(&zmgr->unreachable[i].remote, remote) &&
13132
13292
isc_sockaddr_equal(&zmgr->unreachable[i].local, local)) {
13133
result = isc_rwlock_tryupgrade(&zmgr->rwlock);
13293
result = isc_rwlock_tryupgrade(&zmgr->urlock);
13134
13294
if (result == ISC_R_SUCCESS) {
13135
13295
locktype = isc_rwlocktype_write;
13136
13296
zmgr->unreachable[i].last = seconds;
13141
RWUNLOCK(&zmgr->rwlock, locktype);
13301
RWUNLOCK(&zmgr->urlock, locktype);
13142
13302
return (ISC_TF(i < UNREACH_CHACHE_SIZE));
13306
dns_zonemgr_unreachabledel(dns_zonemgr_t *zmgr, isc_sockaddr_t *remote,
13307
isc_sockaddr_t *local)
13310
isc_rwlocktype_t locktype;
13311
isc_result_t result;
13313
char master[ISC_SOCKADDR_FORMATSIZE];
13314
char source[ISC_SOCKADDR_FORMATSIZE];
13316
isc_sockaddr_format(remote, master, sizeof(master));
13317
isc_sockaddr_format(local, source, sizeof(source));
13319
REQUIRE(DNS_ZONEMGR_VALID(zmgr));
13321
locktype = isc_rwlocktype_read;
13322
RWLOCK(&zmgr->urlock, locktype);
13323
for (i = 0; i < UNREACH_CHACHE_SIZE; i++) {
13324
if (isc_sockaddr_equal(&zmgr->unreachable[i].remote, remote) &&
13325
isc_sockaddr_equal(&zmgr->unreachable[i].local, local)) {
13326
result = isc_rwlock_tryupgrade(&zmgr->urlock);
13327
if (result == ISC_R_SUCCESS) {
13328
locktype = isc_rwlocktype_write;
13329
zmgr->unreachable[i].expire = 0;
13330
isc_log_write(dns_lctx, DNS_LOGCATEGORY_GENERAL,
13331
DNS_LOGMODULE_ZONE, ISC_LOG_INFO,
13332
"master %s (source %s) deleted "
13333
"from unreachable cache",
13339
RWUNLOCK(&zmgr->urlock, locktype);
13146
13343
dns_zonemgr_unreachableadd(dns_zonemgr_t *zmgr, isc_sockaddr_t *remote,
13147
13344
isc_sockaddr_t *local, isc_time_t *now)
13153
13350
REQUIRE(DNS_ZONEMGR_VALID(zmgr));
13155
RWLOCK(&zmgr->rwlock, isc_rwlocktype_write);
13352
RWLOCK(&zmgr->urlock, isc_rwlocktype_write);
13156
13353
for (i = 0; i < UNREACH_CHACHE_SIZE; i++) {
13157
13354
/* Existing entry? */
13158
13355
if (isc_sockaddr_equal(&zmgr->unreachable[i].remote, remote) &&
13191
13388
zmgr->unreachable[oldest].remote = *remote;
13192
13389
zmgr->unreachable[oldest].local = *local;
13194
RWUNLOCK(&zmgr->rwlock, isc_rwlocktype_write);
13391
RWUNLOCK(&zmgr->urlock, isc_rwlocktype_write);
13802
13999
isc_result_t result;
13803
14000
isc_stdtime_t now, inception, soaexpire;
13804
14001
isc_boolean_t check_ksk, keyset_kskonly;
13805
dst_key_t *zone_keys[MAXZONEKEYS];
14002
dst_key_t *zone_keys[DNS_MAXZONEKEYS];
13806
14003
unsigned int nkeys = 0, i;
13807
14004
dns_difftuple_t *tuple;
13809
result = find_zone_keys(zone, db, ver, zone->mctx, MAXZONEKEYS,
14006
result = find_zone_keys(zone, db, ver, zone->mctx, DNS_MAXZONEKEYS,
13810
14007
zone_keys, &nkeys);
13811
14008
if (result != ISC_R_SUCCESS) {
13812
14009
dns_zone_log(zone, ISC_LOG_ERROR,
13813
"sign_apex:find_zone_keys -> %s\n",
14010
"sign_apex:find_zone_keys -> %s",
13814
14011
dns_result_totext(result));
13815
14012
return (result);
13841
14038
zone_keys, nkeys, now, ISC_FALSE);
13842
14039
if (result != ISC_R_SUCCESS) {
13843
14040
dns_zone_log(zone, ISC_LOG_ERROR,
13844
"sign_apex:del_sigs -> %s\n",
14041
"sign_apex:del_sigs -> %s",
13845
14042
dns_result_totext(result));
13846
14043
goto failure;
13851
14048
keyset_kskonly);
13852
14049
if (result != ISC_R_SUCCESS) {
13853
14050
dns_zone_log(zone, ISC_LOG_ERROR,
13854
"sign_apex:add_sigs -> %s\n",
14051
"sign_apex:add_sigs -> %s",
13855
14052
dns_result_totext(result));
13856
14053
goto failure;
13864
14061
if (result != ISC_R_SUCCESS) {
13865
14062
dns_zone_log(zone, ISC_LOG_ERROR,
13866
"sign_apex:update_sigs -> %s\n",
14063
"sign_apex:update_sigs -> %s",
13867
14064
dns_result_totext(result));
13868
14065
goto failure;
14043
14240
CHECK(dns_db_newversion(db, &ver));
14044
14241
CHECK(dns_db_getoriginnode(db, &node));
14243
TIME_NOW(&timenow);
14244
now = isc_time_seconds(&timenow);
14046
14246
dns_zone_log(zone, ISC_LOG_INFO, "reconfiguring zone keys");
14048
14248
/* Get the SOA record's TTL */
14092
14292
goto trylater;
14095
/* See if any pre-existing keys have newly become active;
14296
* See if any pre-existing keys have newly become active;
14096
14297
* also, see if any new key is for a new algorithm, as in that
14097
14298
* event, we need to sign the zone fully. (If there's a new
14098
14299
* key, but it's for an already-existing algorithm, then
14260
14459
UNLOCK_ZONE(zone);
14264
* If we are doing automatic key maintenance and the key metadata
14265
* indicates there is a key change event scheduled in the future,
14266
* set the key refresh timer.
14268
isc_stdtime_get(&now);
14269
TIME_NOW(&timenow);
14270
14462
isc_time_settoepoch(&zone->refreshkeytime);