Number: 248
Title: bugs in tcldot.c related to subgraph
Submitter: HIRAKI Hideaki
Date: Thu Jan 23 22:51:46 2003
Subsys: Tcl/Tk utilities
Version: 1.8.10
System: *-*-
Severity: major
Problem:

$ tclsh
% package require Tcldot
1.8.10
% dotstring "digraph g0 { subgraph g1 { } subgraph g2 { } }"
graph0
% graph0 listsubgraphs
graph0 graph1 graph2
% graph1 listsubgraphs
graph0 graph1 graph2
% graph1 addnode
node0
% graph1 addnode
node1
% graph1 addedge node0 node1 attr 1
Segmentation fault (core dumped)
"graph0 listsubgraphs" should be "graph1 graph2" and "graph1 listsubgraphs" should be null. Adding an edge with attributes to a subgraph should not cause segmentation fault.
Fix:

--- graphviz-1.8.10/tcldot/tcldot.c~	Thu Aug  1 09:19:11 2002
+++ graphviz-1.8.10/tcldot/tcldot.c	Fri Jan 24 12:11:55 2003
@@ -596,6 +596,7 @@
 		Tcl_CreateObjCommand(interp, interp->result,
 			edgecmd, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); #endif /* TCLOBJ */
+		g = g->root;
 		for (i = 4; i < argc; i++) {
 			if (!(a = agfindattr(g->proto->e, argv[i])))
 				a = agedgeattr(g, argv[i], "");
@@ -782,8 +783,8 @@

} else if ((c == 'l') && (strncmp(argv[1], "listsubgraphs", length) == 0)) { if (g->meta_node) { - for (n = agfstnode(g->meta_node->graph); n; n = agnxtnode(g->meta_node->graph, n)) { - sg = agusergraph(n); + for (e = agfstout(g->meta_node->graph, g->meta_node); e; e = agnxtout(g->meta_node->graph, e)) { + sg = agusergraph(e->head); tclhandleString(graphTblPtr, buf, sg->handle); Tcl_AppendElement(interp, buf); } @@ -956,7 +957,6 @@ return TCL_OK;

} else if ((c == 's') && (strncmp(argv[1], "setattributes", length) == 0)) { - g = g->root; if (argc == 3) { if (Tcl_SplitList(interp, argv[2], &argc2, (CONST84 char***) &argv2) != TCL_OK) return TCL_ERROR; @@ -968,8 +968,8 @@ return TCL_ERROR; } for (i = 0; i < argc2; i++) { - if (!(a = agfindattr(g, argv2[i]))) - a = agraphattr(g, argv2[i], ""); + if (!(a = agfindattr(g->root, argv2[i]))) + a = agraphattr(g->root, argv2[i], ""); agxset(g, a->index, argv2[++i]); } Tcl_Free((char *)argv2); @@ -982,12 +982,12 @@ return TCL_ERROR; } for (i = 2; i < argc; i++) { - if (!(a = agfindattr(g, argv[i]))) - a = agraphattr(g, argv[i], ""); + if (!(a = agfindattr(g->root, argv[i]))) + a = agraphattr(g->root, argv[i], ""); agxset(g, a->index, argv[++i]); } } - reset_layout(g); + reset_layout(g->root); return TCL_OK;

} else if ((c == 's') && (strncmp(argv[1], "setedgeattributes", length) == 0)) {


Owner: ellson
Status: Fixed (23 January 2003)