From: José Fonseca Date: Thu, 24 Nov 2011 16:30:49 +0000 (+0000) Subject: Prevent segfault on glretrace crash (fixes issue #52). X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=56cd8ac47208f0b649dcf4f24387e193861b6ed0;p=apitrace 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. --- 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: