]> granicus.if.org Git - graphviz/commitdiff
twopigen: layout: fix heap-buffer-overflow by storing dimension in root graph
authorMagnus Jacobsson <Magnus.Jacobsson@berotec.se>
Mon, 18 Jul 2022 13:02:59 +0000 (15:02 +0200)
committerMagnus Jacobsson <Magnus.Jacobsson@berotec.se>
Mon, 25 Jul 2022 18:24:49 +0000 (20:24 +0200)
The layout allocates memory based on the dimension of the root graph,
but since the dimension was stored in the subgraph and the dimension
in the root graph defaulted to zero, too little memory was allocated.

An alternative solution would have been to use the dimension of the
subgraph, but this had other implications and the chosen solution is
the same as what the other two layout engines supporting the dim
attribute (neato and sfdp) use. Twopi always uses two dimensions.

This fixes the last memory issue detected by ASan in the
test_subgraph_layout test, which now runs without failures.

CHANGELOG.md
lib/twopigen/twopiinit.c
tests/CMakeLists.txt

index 98f76116f3c3b8825752503a251b8ef0e91155b4..134809f6781a107254d57ab3c7be65f159e2693d 100644 (file)
@@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 - Segmentation fault when running test example neatopack.c #1800
 - Memory leak in dot when using clusters
 - Memory leak in patchwork when using clusters
+- Subgraph layout and rendering
 
 ## [5.0.0] – 2022-07-07
 
index 16eecda3b22ce13578e7a11dc209b359241eb361..705ca4834cf54fc7f24f06d4f648285ab0485223 100644 (file)
@@ -53,7 +53,7 @@ void twopi_init_graph(graph_t * g)
 {
     setEdgeType (g, EDGETYPE_LINE);
     /* GD_ndim(g) = late_int(g,agfindgraphattr(g,"dim"),2,2); */
-       Ndim = GD_ndim(g)=2;    /* The algorithm only makes sense in 2D */
+       Ndim = GD_ndim(agroot(g)) = 2;  /* The algorithm only makes sense in 2D */
     twopi_init_node_edge(g);
 }
 
index 3aa2d52fa49711cd42d11dd35a7932c7d95ab6de..2ac89859c532f3149f1933db9a9e611dc0f1d18c 100644 (file)
@@ -76,5 +76,4 @@ CREATE_TEST(GVLayout_render)
 CREATE_TEST(neatopack)
 CREATE_TEST(simple)
 CREATE_TEST(subgraph_layout)
-set_tests_properties(test_subgraph_layout PROPERTIES WILL_FAIL true)
 CREATE_TEST(subgraphs)