dns_validator_t *val = arg;
dns_rdataset_t *rdataset = &val->frdataset;
- (void)validate_async_run(val, resume_answer_with_key_done);
- return;
+ if (CANCELED(val) || CANCELING(val)) {
+ val->result = ISC_R_CANCELED;
++ return validate_async_run(val, resume_answer_with_key_done);
+ }
+
isc_result_t result = select_signing_key(val, rdataset);
if (result == ISC_R_SUCCESS) {
val->keyset = &val->frdataset;
? "dsset"
: "ds non-existence",
dns_trust_totext(val->frdataset.trust));
- have_dsset = (val->frdataset.type == dns_rdatatype_ds);
- name = dns_fixedname_name(&val->fname);
+ bool have_dsset = (val->frdataset.type == dns_rdatatype_ds);
+ dns_name_t *name = dns_fixedname_name(&val->fname);
- if ((val->attributes & VALATTR_INSECURITY) != 0 &&
- val->frdataset.covers == dns_rdatatype_ds &&
- NEGATIVE(&val->frdataset) &&
- is_insecure_referral(val, name, &val->frdataset,
- DNS_R_NCACHENXRRSET,
- "validator_callback_ds"))
- {
- result = markanswer(val, "validator_callback_ds");
- } else if ((val->attributes & VALATTR_INSECURITY) != 0) {
- result = proveunsecure(val, have_dsset, false, true);
+ if ((val->attributes & VALATTR_INSECURITY) != 0) {
+ bool crossed = false;
+ bool insecure = false;
+
+ if (val->frdataset.covers == dns_rdatatype_ds &&
+ NEGATIVE(&val->frdataset))
+ {
+ insecure = is_insecure_referral(
+ val, name, &val->frdataset,
+ DNS_R_NCACHENXRRSET,
+ "validator_callback_ds", &crossed);
+ }
+
+ if (insecure) {
+ result = markanswer(val,
+ "validator_callback_ds");
+ } else if (crossed) {
+ /*
+ * The NSEC/NSEC3 signer sits above a known
+ * secure delegation, so this proof is forged.
+ * Stop instead of descending further.
+ */
+ result = DNS_R_NOTINSECURE;
+ } else {
+ result = proveunsecure(val, have_dsset, false,
+ true);
+ }
} else {
result = validate_async_run(val, validate_dnskey);
}
}
static isc_result_t
-validate_work_enqueue(dns_validator_t *val, isc_job_cb cb) {
+validate_work_enqueue(dns_validator_t *val, isc_work_cb cb) {
val->attributes |= VALATTR_OFFLOADED;
- isc_work_enqueue(val->loop, ISC_WORKLANE_FAST, cb, null_done, val);
+ val->offloaded_cb = cb;
+ val->offloaded_work = isc_work_enqueue(val->loop, ISC_WORKLANE_FAST, cb,
+ helper_done, val);
return DNS_R_WAIT;
}
#endif /* DNS_BENCHMARK_TESTS */
ISC_TEST_LIST_START
-ISC_TEST_ENTRY(fullcompare)
-ISC_TEST_ENTRY(compression)
+ISC_TEST_ENTRY(buffer)
ISC_TEST_ENTRY(collision)
+ISC_TEST_ENTRY(compression)
+ISC_TEST_ENTRY(countlabels)
ISC_TEST_ENTRY(fromregion)
-ISC_TEST_ENTRY(istat)
+ ISC_TEST_ENTRY(fromwire)
+ISC_TEST_ENTRY(fullcompare)
+ISC_TEST_ENTRY(getlabel)
+ISC_TEST_ENTRY(getlabelsequence)
+ISC_TEST_ENTRY(hash)
ISC_TEST_ENTRY(init)
ISC_TEST_ENTRY(invalidate)
-ISC_TEST_ENTRY(buffer)
ISC_TEST_ENTRY(isabsolute)
-ISC_TEST_ENTRY(hash)
ISC_TEST_ENTRY(issubdomain)
-ISC_TEST_ENTRY(countlabels)
-ISC_TEST_ENTRY(getlabel)
-ISC_TEST_ENTRY(getlabelsequence)
+ISC_TEST_ENTRY(istat)
ISC_TEST_ENTRY(maxlabels)
+ISC_TEST_ENTRY(totext)
#ifdef DNS_BENCHMARK_TESTS
ISC_TEST_ENTRY(benchmark)
#endif /* DNS_BENCHMARK_TESTS */