[kgraphviewer-devel] [kgraphviewer/libkgraphviz] src/kgraphviz: Fix crash with invalid node ids, cleanup
Kevin Funk
krf at electrostorm.net
Thu Jan 27 16:16:21 CET 2011
Git commit 59163ccc13dddec66ab2da7f2012dd5fb7e0a021 by Kevin Funk.
Pushed by kfunk into branch 'libkgraphviz'.
Fix crash with invalid node ids, cleanup
M +19 -28 src/kgraphviz/dotgraph.cpp
M +4 -5 src/kgraphviz/graphelement.cpp
http://commits.kde.org/9c7b74a4/59163ccc13dddec66ab2da7f2012dd5fb7e0a021
diff --git a/src/kgraphviz/dotgraph.cpp b/src/kgraphviz/dotgraph.cpp
index 36fbe29..bf07cef 100644
--- a/src/kgraphviz/dotgraph.cpp
+++ b/src/kgraphviz/dotgraph.cpp
@@ -445,8 +445,13 @@ void DotGraph::saveTo(const QString& fileName)
void DotGraph::updateWithGraph(graph_t* newGraph)
{
Q_D(DotGraph);
+ kDebug();
+
+ if (!newGraph) {
+ kWarning() << "Invalid graph passed";
+ return;
+ }
- kDebug() << newGraph;
QList<QString> drawingAttributes;
drawingAttributes << "_draw_" << "_ldraw_";
importFromGraphviz(newGraph, drawingAttributes);
@@ -459,24 +464,15 @@ void DotGraph::updateWithGraph(graph_t* newGraph)
kDebug() << "subgraph:" << sg->name;
if (subgraphs().contains(sg->name))
{
- kDebug() << "known";
- // ???
- // nodes()[ngn->name]->setZ(ngn->z());
+ kDebug() << " known subgraph";
subgraphs()[sg->name]->updateWithSubgraph(sg);
- if (subgraphs()[sg->name]->canvasElement()!=0)
- {
- // nodes()[ngn->id()]->canvasElement()->setGh(m_height);
- }
}
else
{
- kDebug() << "new";
+ kDebug() << " new subgraph";
GraphSubgraph* newsg = new GraphSubgraph(sg);
- // kDebug() << "new created";
subgraphs().insert(sg->name, newsg);
- // kDebug() << "new inserted";
}
-
}
// copy nodes
@@ -486,33 +482,27 @@ void DotGraph::updateWithGraph(graph_t* newGraph)
kDebug() << "node " << ngn->name;
if (nodes().contains(ngn->name))
{
- kDebug() << "known";
-// ???
-// nodes()[ngn->name]->setZ(ngn->z());
+ kDebug() << " node known";
nodes()[ngn->name]->updateWithNode(ngn);
- if (nodes()[ngn->name]->canvasElement()!=0)
- {
- // nodes()[ngn->id()]->canvasElement()->setGh(m_height);
- }
}
else
{
- kDebug() << "new";
+ kDebug() << " new node";
GraphNode* newgn = new GraphNode(ngn);
- // kDebug() << "new created";
nodes().insert(ngn->name, newgn);
- // kDebug() << "new inserted";
}
// copy node edges
edge_t* nge = agfstout(newGraph, ngn);
while (nge != NULL)
{
+ Q_ASSERT(nge->head->name != 0);
+ Q_ASSERT(nge->tail->name != 0);
kDebug() << "edge" << nge->id;
const QString edgeName = QString::number(nge->id);
if (edges().contains(edgeName))
{
- kDebug() << "edge known" << nge->id;
+ kDebug() << " edge known" << nge->id;
// edges()[nge->name]->setZ(nge->z());
edges()[edgeName]->updateWithEdge(nge);
if (edges()[edgeName]->canvasElement()!=0)
@@ -522,26 +512,27 @@ void DotGraph::updateWithGraph(graph_t* newGraph)
}
else
{
- kDebug() << "new edge" << edgeName;
+ kDebug() << " new edge" << edgeName;
{
GraphEdge* newEdge = new GraphEdge();
newEdge->setId(edgeName);
newEdge->updateWithEdge(nge);
- if (elementNamed(nge->tail->name) == 0)
+ if (nodeNamed(nge->tail->name) == 0)
{
GraphNode* newgn = new GraphNode();
- // kDebug() << "new created";
nodes().insert(nge->tail->name, newgn);
}
newEdge->setFromNode(nodeNamed(nge->tail->name));
- if (elementNamed(nge->head->name) == 0)
+ if (nodeNamed(nge->head->name) == 0)
{
GraphNode* newgn = new GraphNode();
- // kDebug() << "new created";
nodes().insert(nge->head->name, newgn);
}
newEdge->setToNode(nodeNamed(nge->head->name));
edges().insert(edgeName, newEdge);
+
+ Q_ASSERT(newEdge->toNode());
+ Q_ASSERT(newEdge->fromNode());
}
}
nge = agnxtedge(newGraph, nge, ngn);
diff --git a/src/kgraphviz/graphelement.cpp b/src/kgraphviz/graphelement.cpp
index b7cdba6..ffe69f2 100644
--- a/src/kgraphviz/graphelement.cpp
+++ b/src/kgraphviz/graphelement.cpp
@@ -212,7 +212,7 @@ void GraphElement::exportToGraphviz(void* element) const
if (label != "label")
{
label.replace(QRegExp("\n"),"\\n");
- kDebug() << id() << it.key() << label;
+// kDebug() << id() << it.key() << label;
agsafeset(element, it.key().toUtf8().data(), label.toUtf8().data(), QString().toUtf8().data());
}
}
@@ -226,8 +226,7 @@ void GraphElement::exportToGraphviz(void* element) const
}
else if (originalAttributes().isEmpty() || originalAttributes().contains(it.key()))
{
- kDebug() << id() << it.key() << it.value();
-
+// kDebug() << id() << it.key() << it.value();
agsafeset(element, it.key().toUtf8().data(), it.value().toUtf8().data(), it.value().toUtf8().data());
}
}
@@ -248,12 +247,12 @@ void GraphElement::importFromGraphviz(void* element, QList<QString> drawingAttri
continue;
parse_renderop(value, renderOperations());
- kDebug() << attribute << "element renderOperations size is now" << renderOperations().size();
+// kDebug() << attribute << "element renderOperations size is now" << renderOperations().size();
}
Agsym_t *attr = agfstattr(element);
while(attr) {
- kDebug() << id() << attr->name << agxget(element, attr->index);
+// kDebug() << id() << attr->name << agxget(element, attr->index);
m_attributes[attr->name] = agxget(element,attr->index);
attr = agnxtattr(element,attr);
}
More information about the kgraphviewer-devel
mailing list