]> 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:54:15 +0000 (12:54 +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]

(cherry picked from commit 38cc2d14e218e536e0102fa70deef99461354232)

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

diff --git a/CHANGES b/CHANGES
index b0fde1dad6726c778881b38fb4e6a65b7d37499a..ae1c5d86cb8056e52ba243f656a3299ceaa1dc93 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 584ab25b10e273a288cbfface34df67f741cbc0d..37211eb55e40192eaa4e5da2e92a958e8ae3a9d9 100644 (file)
@@ -403,14 +403,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 ad9b551addab1806d02badbd3bf754c746893647..a7db129a8d7b02a8347b3402036eae127ce184c6 100644 (file)
@@ -769,6 +769,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);