[kgraphviewer-devel] [kgraphviewer/libkgraphviz] src/kgraphviz: Fix crash when loading non-existent files

Kevin Funk krf at electrostorm.net
Fri Jan 28 18:55:25 CET 2011


Git commit e070b6a16dc834aa6bb40bf88d3659f75d12a12f by Kevin Funk.
Pushed by kfunk into branch 'libkgraphviz'.

Fix crash when loading non-existent files

M  +10   -4    src/kgraphviz/dotgraphview.cpp     
M  +7    -6    src/kgraphviz/support/layoutagraphthread.cpp     
M  +2    -5    src/kgraphviz/support/layoutagraphthread.h     
M  +10   -1    src/kgraphviz/support/loadagraphthread.cpp     
M  +1    -1    src/kgraphviz/support/loadagraphthread.h     

http://commits.kde.org/9c7b74a4/e070b6a16dc834aa6bb40bf88d3659f75d12a12f

diff --git a/src/kgraphviz/dotgraphview.cpp b/src/kgraphviz/dotgraphview.cpp
index 61f7d8f..e68bb31 100644
--- a/src/kgraphviz/dotgraphview.cpp
+++ b/src/kgraphviz/dotgraphview.cpp
@@ -1679,20 +1679,26 @@ void DotGraphView::slotAGraphReadFinished()
   if (layoutCommand.isEmpty()) {
       layoutCommand = GraphIO::internalLayoutCommandForFile(d->m_loadThread.dotFileName());
   }
-  d->m_layoutThread.layoutGraph(d->m_loadThread.g(), layoutCommand);
+
+  Agraph_t* graph = d->m_loadThread.g();
+  if (graph)
+    d->m_layoutThread.layoutGraph(graph, layoutCommand);
+  else
+    kWarning() << "Graph loading failed";
 }
 
 void DotGraphView::slotAGraphLayoutFinished()
 {
   Q_D(DotGraphView);
-  if (!d->m_layoutThread.success()) {
+  Agraph_t* graph = d->m_layoutThread.g();
+  if (!graph) {
     kWarning() << "Thread failed to layout graph properly, not doing anything.";
     return;
   }
   
-  loadLibrary(d->m_layoutThread.g(), d->m_layoutThread.layoutCommand());
+  loadLibrary(graph, d->m_layoutThread.layoutCommand());
 
-  gvFreeLayout(d->m_layoutThread.gvc(), d->m_layoutThread.g());
+  gvFreeLayout(d->m_layoutThread.gvc(), graph);
   agclose(d->m_layoutThread.g());
 }
 
diff --git a/src/kgraphviz/support/layoutagraphthread.cpp b/src/kgraphviz/support/layoutagraphthread.cpp
index 74e8162..0a0838d 100644
--- a/src/kgraphviz/support/layoutagraphthread.cpp
+++ b/src/kgraphviz/support/layoutagraphthread.cpp
@@ -24,17 +24,16 @@
 void LayoutAGraphThread::run()
 {
   kDebug();
-  m_gvc = gvContext();
+  GVC_t* gvc = gvContext();
 
-  int rc = gvLayout(m_gvc, m_g, m_layoutCommand.toUtf8().data());
+  int rc = gvLayout(gvc, m_g, m_layoutCommand.toUtf8().data());
   if (rc != 0) {
     kWarning() << "gvLayout failed with returncode:" << rc;
-    m_success = false;
     return;
   }
 
-  gvRender (m_gvc, m_g, "xdot", NULL);
-  m_success = true;
+  gvRender (gvc, m_g, "xdot", NULL);
+  m_gvc = gvc;
 }
 
 void LayoutAGraphThread::layoutGraph(graph_t* graph, const QString& layoutCommand)
@@ -42,9 +41,11 @@ void LayoutAGraphThread::layoutGraph(graph_t* graph, const QString& layoutComman
   kDebug();
   if (isRunning())
     return;
+
   m_g = graph;
-  m_success = false;
+  m_gvc = 0;
   m_layoutCommand = layoutCommand;
+
   start();
 }
 
diff --git a/src/kgraphviz/support/layoutagraphthread.h b/src/kgraphviz/support/layoutagraphthread.h
index 20199f6..630f782 100644
--- a/src/kgraphviz/support/layoutagraphthread.h
+++ b/src/kgraphviz/support/layoutagraphthread.h
@@ -28,10 +28,9 @@ class LayoutAGraphThread : public QThread
 {
 public:
   void layoutGraph(graph_t* graph, const QString& layoutCommand);
-  inline graph_t* g() {return m_g;}
-  inline GVC_t* gvc() {return m_gvc;}
+  inline graph_t* g() const {return m_g;}
+  inline GVC_t* gvc() const {return m_gvc;}
   inline const QString& layoutCommand() const {return m_layoutCommand;}
-  inline bool success() {return m_success;}
   
 protected:
   virtual void run();
@@ -40,8 +39,6 @@ private:
   QString m_layoutCommand;
   graph_t* m_g;
   GVC_t *m_gvc;
-
-  bool m_success;
 };
 
 #endif // LAYOUTAGRAPHTHREAD_H
diff --git a/src/kgraphviz/support/loadagraphthread.cpp b/src/kgraphviz/support/loadagraphthread.cpp
index 93262ae..4a892e9 100644
--- a/src/kgraphviz/support/loadagraphthread.cpp
+++ b/src/kgraphviz/support/loadagraphthread.cpp
@@ -22,6 +22,8 @@
 #include <kdebug.h>
 #include <kurl.h>
 
+#include <QFile>
+
 void LoadAGraphThread::run()
 {
   kDebug() << m_dotFileName;
@@ -33,8 +35,13 @@ void LoadAGraphThread::run()
     return;
   }
 
+  if (!QFile(url.toLocalFile()).exists()) {
+    kWarning() << "File does not exist:" << url.toLocalFile();
+    return;
+  }
+
   const QString sanitizedFilename = url.path();
-  GVC_t *gvc = gvContext();
+  m_gvc = gvContext();
   FILE* fp = fopen(sanitizedFilename.toUtf8().data(), "r");
   m_g = agread(fp);
 }
@@ -45,6 +52,8 @@ void LoadAGraphThread::loadFile(const QString& dotFileName)
   if (isRunning())
     return;
 
+  m_g = 0;
+  m_gvc = 0;
   m_dotFileName = dotFileName;
   start();
 }
diff --git a/src/kgraphviz/support/loadagraphthread.h b/src/kgraphviz/support/loadagraphthread.h
index 08eb78a..86a4c44 100644
--- a/src/kgraphviz/support/loadagraphthread.h
+++ b/src/kgraphviz/support/loadagraphthread.h
@@ -29,8 +29,8 @@ class LoadAGraphThread : public QThread
 public:
   void loadFile(const QString& dotFileName);
   inline graph_t* g() {return m_g;}
+  inline GVC_t* gvc() const {return m_gvc;}
   inline const QString& dotFileName() {return m_dotFileName;}
-  inline GVC_t* gvc() {return m_gvc;}
   
 protected:
   virtual void run();



More information about the kgraphviewer-devel mailing list