]> granicus.if.org Git - graphviz/commitdiff
Fixed 3 potential memory leaks in QuadTree.c
authorErwin Janssen <erwinjanssen@outlook.com>
Wed, 7 Dec 2016 13:56:39 +0000 (14:56 +0100)
committerErwin Janssen <erwinjanssen@outlook.com>
Wed, 7 Dec 2016 13:56:39 +0000 (14:56 +0100)
In the function `QuadTree_new_from_point_list` in lib/sparse/QuadTree.c,
memory is allocated for tree variables. The check that follows returns
NULL if one of the pointers is NULL (indicating memory allocation
failure). However, it is possible that memory allocation succeeds for one
or two variables, but fails for the third. If this happens, the functions
returns NULL, but the allocated memory isn't freed.
The fix is to free all three pointers in case of a failure. If memory is
allocated it is freed. If the pointer is NULL, free can still safely be
called.

lib/sparse/QuadTree.c

index aeb14254d81b9a3984ad347cdbacc36a16856a00..424f4dc410e97569e95c47c5e4d415c25fa55c18 100644 (file)
@@ -356,7 +356,12 @@ QuadTree QuadTree_new_from_point_list(int dim, int n, int max_level, real *coord
   xmin = MALLOC(sizeof(real)*dim);
   xmax = MALLOC(sizeof(real)*dim);
   center = MALLOC(sizeof(real)*dim);
-  if (!xmin || !xmax || !center) return NULL;
+  if (!xmin || !xmax || !center) {
+      FREE(xmin);
+      FREE(xmax);
+      FREE(center);
+      return NULL;
+  }
 
   for (i = 0; i < dim; i++) xmin[i] = coord[i];
   for (i = 0; i < dim; i++) xmax[i] = coord[i];