memset(&vctx->rrs_counters, 0, sizeof(vctx->rrs_counters));
for (unsigned i = 0; i < vctx->keys->rrs.count; ++i) {
int ret = kr_rrset_validate_with_key(vctx, covered, i, NULL);
- if (ret == 0) {
+ if (ret == 0 || ret == kr_error(E2BIG)) {
return ret;
}
}
}
for (ssize_t i = 0; i < ctx->keys.len; ++i) {
kr_svldr_rrset_with_key(rrs, rrsigs, &ctx->vctx, &ctx->keys.at[i]);
- if (ctx->vctx.result == 0)
+ if (ctx->vctx.result == 0 || ctx->vctx.result == kr_error(E2BIG))
break;
}
return ctx->vctx.result;
}
}
if (!check_crypto_limit(vctx)) {
+ vctx->result = kr_error(E2BIG);
goto finish;
}
if (kr_check_signature(rdata_j, key, covered, trim_labels) != 0) {
if (ret == 0)
ret = kr_svldr_rrset_with_key(keys, sigs, vctx, &key);
svldr_key_del(&key);
- if (ret == 0) {
+ if (ret == 0 || ret == kr_error(E2BIG)) {
kr_assert(vctx->result == 0);
return vctx->result;
}
ret = validate_records(req, pkt, req->rplan.pool, has_nsec3);
if (ret == KNOT_EDOWNGRADED) {
return KR_STATE_DONE;
+ } else if (ret == kr_error(E2BIG)) {
+ qry->flags.DNSSEC_BOGUS = true;
+ return KR_STATE_FAIL;
+
} else if (ret != 0) {
/* something exceptional - no DNS key, empty pointers etc
* normally it shouldn't happen */
/* Do not finish with bogus answer. */
if (qry->flags.DNSSEC_BOGUS) {
- if (qry->flags.FORWARD || qry->flags.STUB) {
+ if (qry->flags.FORWARD || qry->flags.STUB
+ /* Probably CPU exhaustion attempt, so do not retry. */
+ || qry->vld_limit_crypto_remains <= 0) {
return KR_STATE_FAIL;
}
/* Other servers might not have broken DNSSEC. */