Code

dbi plugin: Fixed error handling in an inner loop.
authorSebastian Harl <sh@tokkee.org>
Sun, 1 Feb 2009 22:24:54 +0000 (23:24 +0100)
committerSebastian Harl <sh@tokkee.org>
Sun, 1 Feb 2009 22:24:54 +0000 (23:24 +0100)
The macro BAIL_OUT_CONTINUE() is used inside the loop iterating over the
result sets to clean up and continue with the next loop iteration. In two
cases this was used in a loop iterating over the instances and values lists
contained within that loop as well though. This would cause the memory that
was currently written to (the two target lists) to be freed and thus cause a
possible segfault. In any case it would leave behind inconsistent and most
probably uninitialized data. The usage of that macro has now been pulled out
of the inner loops.

src/dbi.c

index fc1e6fcb16a3bdc09dae88c24e6d310d1ecf699c..9e4f446fe3b879db4ae30eda492f1c2b021f28e6 100644 (file)
--- a/src/dbi.c
+++ b/src/dbi.c
@@ -938,7 +938,8 @@ static int cdbi_read_database_query (cdbi_database_t *db, /* {{{ */
               "dbi_result_get_string (%s) failed: %s",
               db->name, q->name, r->instances[i],
               cdbi_strerror (db->connection, errbuf, sizeof (errbuf)));
-          BAIL_OUT_CONTINUE;
+          status = -1;
+          break;
         }
 
         sstrncpy (instances[i], (inst == NULL) ? "" : inst, DATA_MAX_NAME_LEN);
@@ -947,13 +948,18 @@ static int cdbi_read_database_query (cdbi_database_t *db, /* {{{ */
             db->name, q->name, i, instances[i]);
       } /* }}} for (i = 0; i < q->instances_num; i++) */
 
+      if (status != 0)
+      {
+        BAIL_OUT_CONTINUE;
+      }
+
       for (i = 0; i < r->values_num; i++) /* {{{ */
       {
         status = cdbi_result_get_field (res, r->values[i], ds->ds[i].type,
             values + i);
         if (status != 0)
         {
-          BAIL_OUT_CONTINUE;
+          break;
         }
 
         if (ds->ds[i].type == DS_TYPE_COUNTER)
@@ -968,6 +974,11 @@ static int cdbi_read_database_query (cdbi_database_t *db, /* {{{ */
         }
       } /* }}} for (i = 0; i < q->values_num; i++) */
 
+      if (status != 0)
+      {
+        BAIL_OUT_CONTINUE;
+      }
+
       /* Dispatch this row to the daemon. */
       cdbi_submit (db, r, instances, values);