]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
3380. [bug] named could die if a non-existant master list was
authorMark Andrews <marka@isc.org>
Wed, 26 Sep 2012 05:28:46 +0000 (15:28 +1000)
committerMark Andrews <marka@isc.org>
Wed, 26 Sep 2012 05:28:46 +0000 (15:28 +1000)
                        referenced in a also-notify. [RT #31004]

CHANGES
bin/named/config.c

diff --git a/CHANGES b/CHANGES
index ebc5c5d24b4c1c97ac7e7b90da4bafa458c55070..172d805543fc703ce7a8b27077d96fe4b8072367 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+3380.  [bug]           named could die if a non-existant master list was
+                       referenced in a also-notify. [RT #31004]
+
 3379.  [bug]           isc_interval_zero and isc_time_epoch should be
                        "const (type)* const". [RT #31069]
 
index bfd8c1c4e0ccfb6d221895e510a47499da781c0a..eaba42b18aeea456619690a1142f447d95fc6081 100644 (file)
@@ -649,14 +649,13 @@ ns_config_getipandkeylist(const cfg_obj_t *config, const cfg_obj_t *list,
                if (isc_sockaddr_getport(&addrs[i]) == 0)
                        isc_sockaddr_setport(&addrs[i], port);
                keys[i] = NULL;
-               if (!cfg_obj_isstring(key)) {
-                       i++;
+               i++;    /* Increment here so that cleanup on error works. */
+               if (!cfg_obj_isstring(key))
                        continue;
-               }
-               keys[i] = isc_mem_get(mctx, sizeof(dns_name_t));
-               if (keys[i] == NULL)
+               keys[i - 1] = isc_mem_get(mctx, sizeof(dns_name_t));
+               if (keys[i - 1] == NULL)
                        goto cleanup;
-               dns_name_init(keys[i], NULL);
+               dns_name_init(keys[i - 1], NULL);
 
                keystr = cfg_obj_asstring(key);
                isc_buffer_init(&b, keystr, strlen(keystr));
@@ -667,10 +666,9 @@ ns_config_getipandkeylist(const cfg_obj_t *config, const cfg_obj_t *list,
                if (result != ISC_R_SUCCESS)
                        goto cleanup;
                result = dns_name_dup(dns_fixedname_name(&fname), mctx,
-                                     keys[i]);
+                                     keys[i - 1]);
                if (result != ISC_R_SUCCESS)
                        goto cleanup;
-               i++;
        }
        if (pushed != 0) {
                pushed--;
@@ -726,7 +724,7 @@ ns_config_getipandkeylist(const cfg_obj_t *config, const cfg_obj_t *list,
        if (addrs != NULL)
                isc_mem_put(mctx, addrs, addrcount * sizeof(isc_sockaddr_t));
        if (keys != NULL) {
-               for (j = 0; j <= i; j++) {
+               for (j = 0; j < i; j++) {
                        if (keys[j] == NULL)
                                continue;
                        if (dns_name_dynamic(keys[j]))