]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
4406. [bug] getrrsetbyname with a non absolute name could
authorMark Andrews <marka@isc.org>
Thu, 7 Jul 2016 02:52:47 +0000 (12:52 +1000)
committerMark Andrews <marka@isc.org>
Thu, 7 Jul 2016 02:52:47 +0000 (12:52 +1000)
                        trigger a infinite recursion bug in lwresd
                        and named with lwres configured if when combined
                        with a search list entry the resulting name is
                        too long. [RT #42694]

CHANGES
bin/named/lwdgrbn.c
bin/tests/system/lwresd/lwtest.c

diff --git a/CHANGES b/CHANGES
index 47b2208adcf902f731bbe84d0a398a97929cc123..00bf3997894187d382a9ac1edd182705a21d2c06 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,9 @@
+4406.  [bug]           getrrsetbyname with a non absolute name could
+                       trigger a infinite recursion bug in lwresd
+                       and named with lwres configured if when combined
+                       with a search list entry the resulting name is
+                       too long. [RT #42694]
+
 4405.  [bug]           Change 4342 introduced a regression where you could
                        not remove a delegation in a NSEC3 signed zone using
                        OPTOUT via nsupdate. [RT #42702]
index 9f8d6a0c182fcc15f4b7aed7eb631e0fdb905945..d0d8ec70d7a45047890dbca8dc4a92ac6d5e3d68 100644 (file)
@@ -394,14 +394,18 @@ start_lookup(ns_lwdclient_t *client) {
        INSIST(client->lookup == NULL);
 
        dns_fixedname_init(&absname);
-       result = ns_lwsearchctx_current(&client->searchctx,
-                                       dns_fixedname_name(&absname));
+
        /*
-        * This will return failure if relative name + suffix is too long.
-        * In this case, just go on to the next entry in the search path.
+        * Perform search across all search domains until success
+        * is returned. Return in case of failure.
         */
-       if (result != ISC_R_SUCCESS)
-               start_lookup(client);
+       while (ns_lwsearchctx_current(&client->searchctx,
+                       dns_fixedname_name(&absname)) != ISC_R_SUCCESS) {
+               if (ns_lwsearchctx_next(&client->searchctx) != ISC_R_SUCCESS) {
+                       ns_lwdclient_errorpktsend(client, LWRES_R_FAILURE);
+                       return;
+               }
+       }
 
        result = dns_lookup_create(cm->mctx,
                                   dns_fixedname_name(&absname),
index 1737eacc17279e12bd65aada215a7304f75b9fde..1d65841bde97fc57448127c796023cab4d1e3e33 100644 (file)
@@ -760,6 +760,14 @@ main(void) {
        test_getrrsetbyname("e.example1.", 1, 46, 2, 0, 1);
        test_getrrsetbyname("", 1, 1, 0, 0, 0);
 
+       test_getrrsetbyname("123456789.123456789.123456789.123456789."
+                           "123456789.123456789.123456789.123456789."
+                           "123456789.123456789.123456789.123456789."
+                           "123456789.123456789.123456789.123456789."
+                           "123456789.123456789.123456789.123456789."
+                           "123456789.123456789.123456789.123456789."
+                           "123456789", 1, 1, 0, 0, 0);
+
        if (fails == 0)
                printf("I:ok\n");
        return (fails);