]> git.ipfire.org Git - thirdparty/collectd.git/commitdiff
fix possible memory leaks in build_distribution_from_bucket_array
authorSvetlana Shmidt <sshmidt@google.com>
Mon, 27 Jul 2020 10:50:21 +0000 (15:50 +0500)
committerSvetlana Shmidt <sshmidt@google.com>
Mon, 27 Jul 2020 10:50:21 +0000 (15:50 +0500)
src/daemon/distribution.c
src/daemon/distribution.h

index 69faf1c09a8f9fc72558946e7dce0592f7537c2f..28342976113002768d64bd84e0b684970c26126a 100644 (file)
@@ -51,17 +51,17 @@ void build_tree(distribution_t *d, bucket_t *buckets, size_t node_index, size_t
 
 distribution_t* build_distribution_from_bucket_array(size_t num_buckets, bucket_t *bucket_array) {
   distribution_t *new_distribution = calloc(1, sizeof(distribution_t));
-  if (new_distribution == NULL)
+  if (new_distribution == NULL) {
     return NULL;
+  }
   new_distribution->tree = calloc(2 * num_buckets - 1, sizeof(bucket_t));
   if (new_distribution->tree == NULL) {
-    free (new_distribution);
+    free(new_distribution);
     return NULL;
   }
 
   new_distribution->num_buckets = num_buckets;
   build_tree(new_distribution, bucket_array, 0, 0, num_buckets - 1);
-  free(bucket_array);
   return new_distribution;
 }
 
@@ -82,7 +82,10 @@ distribution_t* distribution_new_linear(size_t num_buckets, double size) {
     else
       bucket_array[i].maximum = (i + 1) * size;
   }
-  return build_distribution_from_bucket_array(num_buckets, bucket_array);
+
+  distribution_t *new_distribution = build_distribution_from_bucket_array(num_buckets, bucket_array);
+  free(bucket_array);
+  return new_distribution;
 }
 
 distribution_t* distribution_new_exponential(size_t num_buckets, double initial_size, double factor) {
@@ -105,9 +108,21 @@ distribution_t* distribution_new_exponential(size_t num_buckets, double initial_
     else
       bucket_array[i].maximum = bucket_array[i].minimum * factor;
   }
-  return build_distribution_from_bucket_array(num_buckets, bucket_array);
+
+  distribution_t *new_distribution = build_distribution_from_bucket_array(num_buckets, bucket_array);
+  free(bucket_array);
+  return new_distribution;
 }
 
+/*distribution_t* distribution_new_custom(size_t num_buckets, double *custom_buckets_sizes) {
+  if (num_buckets == 0) {
+    errno = EINVAL;
+    return NULL;
+  }
+  for (size_t i = 0; i < num_buckets; i++)
+    if (custom_buckets)
+}*/
+
 void distribution_destroy(distribution_t *d) {
   if (d == NULL)
     return;
index fd1872e3035fbf33ae2cc2720ee08e2e5a1dd2bc..0dac5cf4b1f73aa5e5b505d295b98a0d0c322b89 100644 (file)
@@ -13,7 +13,7 @@ typedef struct distribution_s distribution_t;
 //constructor functions:
 distribution_t* distribution_new_linear(size_t num_buckets, double size);
 distribution_t* distribution_new_exponential(size_t num_buckets, double initial_size, double factor);
-distribution_t* distribution_new_custom(size_t num_buckets, double  *custom_buckets_sizes);
+distribution_t* distribution_new_custom(size_t num_buckets, double *custom_buckets_sizes);
 
 void distribution_update(distribution_t *dist, double gauge);
 double distribution_percentile(distribution_t *dist, double percent);