[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