From 18c8faae6c67f734583c5c881d0d083d3253b49e Mon Sep 17 00:00:00 2001 From: Remi Gacogne Date: Thu, 2 Jan 2020 11:52:14 +0100 Subject: [PATCH] rec: An Opt-Out NSEC3 RR only proves that there is no secure delegation --- pdns/syncres.cc | 24 ++++++++++++++++++++---- pdns/validate.cc | 2 +- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/pdns/syncres.cc b/pdns/syncres.cc index 4e031a002a..e4a3b962ee 100644 --- a/pdns/syncres.cc +++ b/pdns/syncres.cc @@ -1417,7 +1417,7 @@ void SyncRes::computeNegCacheValidationStatus(const NegCache::NegCacheEntry* ne, vState neValidationState = ne->d_validationState; dState expectedState = res == RCode::NXDomain ? NXDOMAIN : NXQTYPE; dState denialState = getDenialValidationState(*ne, state, expectedState, false); - updateDenialValidationState(neValidationState, ne->d_name, state, denialState, expectedState, qtype == QType::DS); + updateDenialValidationState(neValidationState, ne->d_name, state, denialState, expectedState, qtype == QType::DS || expectedState == NXDOMAIN); } if (state != Indeterminate) { /* validation succeeded, let's update the cache entry so we don't have to validate again */ @@ -2826,8 +2826,21 @@ void SyncRes::updateDenialValidationState(vState& neValidationState, const DNSNa else { if (denialState == OPTOUT && allowOptOut) { LOG(d_prefix<<"OPT-out denial found for "<d_flags & 1) { + if ((qtype == QType::DS || qtype == 0) && nsec3->d_flags & 1) { LOG(" but is opt-out!"); isOptOut = true; } -- 2.47.2