From 56cd8ac47208f0b649dcf4f24387e193861b6ed0 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Fonseca?= Date: Thu, 24 Nov 2011 16:30:49 +0000 Subject: [PATCH] Prevent segfault on glretrace crash (fixes issue #52). On glretrace crash, both error and finished QProcess events are emitted, by this order. Members were reset on error, causing null pointer dereference on replayFinished. Fix this by handling abnormal termination on replayFinished too. replayError should probably removed/merged into replayFinished. --- gui/retracer.cpp | 32 +++++++++++++++++++++++--------- gui/retracer.h | 2 +- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/gui/retracer.cpp b/gui/retracer.cpp index eaa86e3..0733617 100644 --- a/gui/retracer.cpp +++ b/gui/retracer.cpp @@ -141,7 +141,7 @@ void RetraceProcess::start() } -void RetraceProcess::replayFinished() +void RetraceProcess::replayFinished(int exitCode, QProcess::ExitStatus exitStatus) { QByteArray output = m_process->readAllStandardOutput(); QString msg; @@ -152,14 +152,21 @@ void RetraceProcess::replayFinished() qDebug()<<"\terr = "<parse(output, &ok).toMap(); + ApiTraceState *state = new ApiTraceState(parsedJson); + emit foundState(state); + msg = tr("State fetched."); + } else { + msg = QString::fromUtf8(output); + } } QStringList errorLines = errStr.split('\n'); @@ -182,9 +189,16 @@ void RetraceProcess::replayFinished() void RetraceProcess::replayError(QProcess::ProcessError err) { + /* + * XXX: this function is likely unnecessary and should be eliminated given + * that replayFinished is always called, even on errors. + */ + +#if 0 qDebug()<<"Process error = "< >(); connect(m_process, SIGNAL(finished(int, QProcess::ExitStatus)), - this, SLOT(replayFinished())); + this, SLOT(replayFinished(int, QProcess::ExitStatus))); connect(m_process, SIGNAL(error(QProcess::ProcessError)), this, SLOT(replayError(QProcess::ProcessError))); } diff --git a/gui/retracer.h b/gui/retracer.h index 4a43c26..127c9ab 100644 --- a/gui/retracer.h +++ b/gui/retracer.h @@ -48,7 +48,7 @@ signals: void retraceErrors(const QList &errors); private slots: - void replayFinished(); + void replayFinished(int exitCode, QProcess::ExitStatus exitStatus); void replayError(QProcess::ProcessError err); private: -- 2.43.0