From: Mark Andrews Date: Fri, 19 May 2023 02:22:51 +0000 (+1000) Subject: In rctx_answer return DNS_R_DELEGATION on NOFOLLOW X-Git-Tag: v9.19.15~14^2~2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ea116503761bf46b1de809681fbd6924fc6cfa86;p=thirdparty%2Fbind9.git In rctx_answer return DNS_R_DELEGATION on NOFOLLOW When DNS_FETCHOPT_NOFOLLOW is set DNS_R_DELEGATION needs to be returned to restart the resolution process rather than converting it to ISC_R_SUCCESS. --- diff --git a/lib/dns/resolver.c b/lib/dns/resolver.c index d2981413001..afad02d0058 100644 --- a/lib/dns/resolver.c +++ b/lib/dns/resolver.c @@ -7615,7 +7615,8 @@ resquery_response(isc_result_t eresult, isc_region_t *region, void *arg) { break; case DNS_R_DELEGATION: /* - * With NOFOLLOW we want to pass the result code. + * With NOFOLLOW we want to pass return + * DNS_R_DELEGATION to resume_qmin. */ if ((fctx->options & DNS_FETCHOPT_NOFOLLOW) == 0) { result = ISC_R_SUCCESS; @@ -8156,6 +8157,14 @@ rctx_answer(respctx_t *rctx) { } if (result == DNS_R_DELEGATION) { + /* + * With NOFOLLOW we want to return DNS_R_DELEGATION to + * resume_qmin. + */ + if ((rctx->fctx->options & DNS_FETCHOPT_NOFOLLOW) != 0) + { + return (result); + } result = ISC_R_SUCCESS; } else { /* @@ -8197,7 +8206,7 @@ rctx_answer_positive(respctx_t *rctx) { isc_result_t result; fetchctx_t *fctx = rctx->fctx; - FCTXTRACE("rctx_answer"); + FCTXTRACE("rctx_answer_positive"); rctx_answer_init(rctx); rctx_answer_scan(rctx);