diff src/hgrunner.cpp @ 385:5cc0d897eb26

Avoid crash when one of the data output callbacks is called after m_proc has already been reset (fixing #132)
author Chris Cannam <chris.cannam@eecs.qmul.ac.uk>
date Tue, 24 May 2011 13:29:27 +0100
parents b9c153e00e84
children c567fed39559
line wrap: on
line diff
--- a/src/hgrunner.cpp	Thu May 19 09:45:54 2011 +0100
+++ b/src/hgrunner.cpp	Tue May 24 13:29:27 2011 +0100
@@ -279,6 +279,7 @@
 void HgRunner::dataReadyStdout()
 {
     DEBUG << "dataReadyStdout" << endl;
+	if (!m_proc) return;
     QString chunk = QString::fromUtf8(m_proc->readAllStandardOutput());
     if (!checkPrompts(chunk)) {
         m_stdout += chunk;
@@ -288,6 +289,7 @@
 void HgRunner::dataReadyStderr()
 {
     DEBUG << "dataReadyStderr" << endl;
+	if (!m_proc) return;
     QString chunk = QString::fromUtf8(m_proc->readAllStandardError());
     DEBUG << chunk;
     if (!checkPrompts(chunk)) {
@@ -312,7 +314,9 @@
 
 void HgRunner::finished(int procExitCode, QProcess::ExitStatus procExitStatus)
 {
-    // Save the current action and reset m_currentAction before we
+	if (!m_proc) return;
+
+	// Save the current action and reset m_currentAction before we
     // emit a signal to mark the completion; otherwise we may be
     // resetting the action after a slot has already tried to set it
     // to something else to start a new action
@@ -356,7 +360,7 @@
 {
     if (m_isRunning) {
         m_currentAction.action = ACT_NONE; // so that we don't bother to notify
-        m_proc->kill();
+        if (m_proc) m_proc->kill();
     }
 }
 
@@ -483,7 +487,7 @@
 {
     DEBUG << "closeProcInput" << endl;
 
-    m_proc->closeWriteChannel();
+    if (m_proc) m_proc->closeWriteChannel();
 }
 
 void HgRunner::openTerminal()