[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