]> granicus.if.org Git - graphviz/commitdiff
fix: anticipate no non-normal edges when computing direction with concentrate
authorMatthew Fernandez <matthew.fernandez@gmail.com>
Sun, 8 Nov 2020 22:56:27 +0000 (14:56 -0800)
committerMatthew Fernandez <matthew.fernandez@gmail.com>
Sun, 15 Nov 2020 00:35:41 +0000 (16:35 -0800)
With concentrate enabled (`concentrate=true`), the direction of edges is
analyzed in lib/dotgen/conc.c. The loops in `samedir()` did not anticipate that
they may not find a single non-normal edge before hitting the end of an edge
chain. This change removes this assumption.

Fixes #167, #1771.

CHANGELOG.md
lib/dotgen/conc.c
rtest/167.dot [new file with mode: 0644]
rtest/test_regression.py

index ca70fc6e9ef1abf6c8636401460c3ec8dc922cd6..db845ee95a522480dd32d772a2374a0c9280d50a 100644 (file)
@@ -67,6 +67,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 - sfdp craches #236
 - fdp segmentation fault with GK=0 #1290
 - fdp crash #1865
+- Graphviz always crash with this simple dot file #167
+- Seg fault in dot #1771
 
 ## [2.44.1] - 2020-06-29
 
index 136a15744e17606967fa96ab142844be6ee180b3..e2be813b1e52b234b8693e7ebecdd8f4e4ef9581 100644 (file)
@@ -28,8 +28,12 @@ static boolean samedir(edge_t * e, edge_t * f)
 {
     edge_t *e0, *f0;
 
-    for (e0 = e; ED_edge_type(e0) != NORMAL; e0 = ED_to_orig(e0));
-    for (f0 = f; ED_edge_type(f0) != NORMAL; f0 = ED_to_orig(f0));
+    for (e0 = e; e0 != NULL && ED_edge_type(e0) != NORMAL; e0 = ED_to_orig(e0));
+    if (e0 == NULL)
+       return FALSE;
+    for (f0 = f; f0 != NULL && ED_edge_type(f0) != NORMAL; f0 = ED_to_orig(f0));
+    if (f0 == NULL)
+       return FALSE;
     if (ED_conc_opp_flag(e0))
        return FALSE;
     if (ED_conc_opp_flag(f0))
diff --git a/rtest/167.dot b/rtest/167.dot
new file mode 100644 (file)
index 0000000..46a5d8f
--- /dev/null
@@ -0,0 +1,8 @@
+digraph G {
+ concentrate=true;
+  a -> 4 -> b
+  a -> b
+  a -> b
+  b -> a
+}
+
index 1daf11944234fb1c680b461e23c0bd802e590e7f..62c9f211f18d72af9e2b03958ea61a20b8f1e7eb 100644 (file)
@@ -103,6 +103,22 @@ def test_165_3():
     assert any(r'hello \\\" world' in l for l in ldraw), \
       'unexpected ldraw contents'
 
+def test_167():
+    '''
+    using concentrate=true should not result in a segfault
+    https://gitlab.com/graphviz/graphviz/-/issues/167
+    '''
+
+    # locate our associated test case in this directory
+    input = os.path.join(os.path.dirname(__file__), '167.dot')
+    assert os.path.exists(input), 'unexpectedly missing test case'
+
+    # process this with dot
+    ret = subprocess.call(['dot', '-Tpdf', '-o', os.devnull, input])
+
+    # Graphviz should not have caused a segfault
+    assert ret != -signal.SIGSEGV, 'Graphviz segfaulted'
+
 def test_793():
     '''
     Graphviz should not crash when using VRML output with a non-writable current