]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Add failure handling when iterators don't end with ISC_R_NOMORE
authorOndřej Surý <ondrej@isc.org>
Wed, 18 Dec 2019 09:54:01 +0000 (10:54 +0100)
committerMark Andrews <marka@isc.org>
Fri, 20 Dec 2019 10:31:23 +0000 (21:31 +1100)
lib/dns/zone.c

index 7bd85fba4547e4727bce9cec0ae9f9564dccacae..f8b93d406a168034bfbd5f7c31a3eabe101b056f 100644 (file)
@@ -15501,6 +15501,7 @@ restore_nsec3param(dns_zone_t *zone, dns_db_t *db, dns_dbversion_t *version,
 static void
 receive_secure_db(isc_task_t *task, isc_event_t *event) {
        isc_result_t result;
+       isc_result_t iter_result;
        dns_zone_t *zone;
        dns_db_t *rawdb, *db = NULL;
        dns_fixedname_t fname;
@@ -15577,6 +15578,7 @@ receive_secure_db(isc_task_t *task, isc_event_t *event) {
        {
                dns_dbnode_t *rawnode = NULL, *node = NULL;
                dns_rdatasetiter_t *rdsit = NULL;
+               isc_result_t rdsit_result;
 
                result = dns_dbiterator_current(dbiterator, &rawnode, name);
                if (result != ISC_R_SUCCESS) {
@@ -15593,7 +15595,7 @@ receive_secure_db(isc_task_t *task, isc_event_t *event) {
                        goto iter_cleanup;
                }
 
-               for (isc_result_t rdsit_result = dns_rdatasetiter_first(rdsit);
+               for (rdsit_result = dns_rdatasetiter_first(rdsit);
                     rdsit_result == ISC_R_SUCCESS;
                     rdsit_result = dns_rdatasetiter_next(rdsit))
                {
@@ -15626,6 +15628,11 @@ receive_secure_db(isc_task_t *task, isc_event_t *event) {
                                break;
                        }
                }
+               if (rdsit_result != ISC_R_SUCCESS &&
+                   rdsit_result != ISC_R_NOMORE)
+               {
+                       result = rdsit_result;
+               }
                dns_rdatasetiter_destroy(&rdsit);
 iter_cleanup:
                if (rawnode) {
@@ -15638,6 +15645,10 @@ iter_cleanup:
                        break;
                }
        }
+       if (iter_result != ISC_R_SUCCESS &&
+           iter_result != ISC_R_NOMORE) {
+               result = iter_result;
+       }
        dns_dbiterator_destroy(&dbiterator);
 
        if (result != ISC_R_SUCCESS) {