]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
In rctx_answer return DNS_R_DELEGATION on NOFOLLOW
authorMark Andrews <marka@isc.org>
Fri, 19 May 2023 02:22:51 +0000 (12:22 +1000)
committerOndřej Surý <ondrej@isc.org>
Wed, 28 Jun 2023 10:32:26 +0000 (12:32 +0200)
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.

(cherry picked from commit ea116503761bf46b1de809681fbd6924fc6cfa86)

lib/dns/resolver.c

index a1cf3c7fbf2ac4f5c0c884bdca348f7977a4d694..25e402408e44414fb736bf294c1b1d1467261f5f 100644 (file)
@@ -8005,7 +8005,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;
@@ -8549,6 +8550,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 {
                        /*
@@ -8590,7 +8599,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);