src/utils_rrdcreate.c: Fix memory leak.
authorFlorian Forster <octo@collectd.org>
Fri, 19 Jun 2015 08:54:02 +0000 (10:54 +0200)
committerFlorian Forster <octo@collectd.org>
Fri, 19 Jun 2015 08:58:59 +0000 (10:58 +0200)
src/utils_rrdcreate.c

index da4a944..1bd1ad4 100644 (file)
@@ -166,14 +166,10 @@ static int rra_get (char ***ret, const value_list_t *vl, /* {{{ */
 
   int rra_max;
 
-  int span;
-
   int cdp_num;
   int cdp_len;
   int i, j;
 
-  char buffer[128];
-
   /* The stepsize we use here: If it is user-set, use it. If not, use the
    * interval of the value-list. */
   int ss;
@@ -213,16 +209,17 @@ static int rra_get (char ***ret, const value_list_t *vl, /* {{{ */
   }
 
   rra_max = rts_num * rra_types_num;
+  assert (rra_max > 0);
 
-  if ((rra_def = (char **) malloc ((rra_max + 1) * sizeof (char *))) == NULL)
+  if ((rra_def = malloc ((rra_max + 1) * sizeof (*rra_def))) == NULL)
     return (-1);
-  memset (rra_def, '\0', (rra_max + 1) * sizeof (char *));
+  memset (rra_def, 0, (rra_max + 1) * sizeof (*rra_def));
   rra_num = 0;
 
   cdp_len = 0;
   for (i = 0; i < rts_num; i++)
   {
-    span = rts[i];
+    int span = rts[i];
 
     if ((span / ss) < cfg->rrarows)
       span = ss * cfg->rrarows;
@@ -238,6 +235,7 @@ static int rra_get (char ***ret, const value_list_t *vl, /* {{{ */
 
     for (j = 0; j < rra_types_num; j++)
     {
+      char buffer[128];
       int status;
 
       if (rra_num >= rra_max)
@@ -256,6 +254,12 @@ static int rra_get (char ***ret, const value_list_t *vl, /* {{{ */
     }
   }
 
+  if (rra_num <= 0)
+  {
+    sfree (rra_def);
+    return (0);
+  }
+
   *ret = rra_def;
   return (rra_num);
 } /* }}} int rra_get */
@@ -281,7 +285,9 @@ static int ds_get (char ***ret, /* {{{ */
   char max[32];
   char buffer[128];
 
-  ds_def = (char **) malloc (ds->ds_num * sizeof (char *));
+  assert (ds->ds_num > 0);
+
+  ds_def = malloc (ds->ds_num * sizeof (*ds_def));
   if (ds_def == NULL)
   {
     char errbuf[1024];
@@ -289,7 +295,7 @@ static int ds_get (char ***ret, /* {{{ */
         sstrerror (errno, errbuf, sizeof (errbuf)));
     return (-1);
   }
-  memset (ds_def, '\0', ds->ds_num * sizeof (char *));
+  memset (ds_def, 0, ds->ds_num * sizeof (*ds_def));
 
   for (ds_num = 0; ds_num < ds->ds_num; ds_num++)
   {
@@ -347,6 +353,12 @@ static int ds_get (char ***ret, /* {{{ */
     return (-1);
   }
 
+  if (ds_num <= 0)
+  {
+    sfree (ds_def);
+    return (0);
+  }
+
   *ret = ds_def;
   return (ds_num);
 } /* }}} int ds_get */
@@ -646,9 +658,9 @@ int cu_rrd_create_file (const char *filename, /* {{{ */
 {
   char **argv;
   int argc;
-  char **rra_def;
+  char **rra_def = NULL;
   int rra_num;
-  char **ds_def;
+  char **ds_def = NULL;
   int ds_num;
   int status = 0;
   time_t last_up;
@@ -666,6 +678,7 @@ int cu_rrd_create_file (const char *filename, /* {{{ */
   if ((ds_num = ds_get (&ds_def, ds, vl, cfg)) < 1)
   {
     ERROR ("cu_rrd_create_file failed: Could not calculate DSes");
+    rra_free (rra_num, rra_def);
     return (-1);
   }
 
@@ -676,6 +689,8 @@ int cu_rrd_create_file (const char *filename, /* {{{ */
     char errbuf[1024];
     ERROR ("cu_rrd_create_file failed: %s",
         sstrerror (errno, errbuf, sizeof (errbuf)));
+    rra_free (rra_num, rra_def);
+    ds_free (ds_num, ds_def);
     return (-1);
   }