diff --git a/build_num b/build_num index 3afd0b076..ffdb129d4 100644 --- a/build_num +++ b/build_num @@ -1 +1 @@ -#define BUILD_NUM 2852 +#define BUILD_NUM 2853 diff --git a/doc/ChangeLog b/doc/ChangeLog index cfc33c1b1..fa7e5b82a 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -1,4 +1,13 @@ -2010-04-27 Vadim Kurland +2010-04-27 vadim + + * SSHSession.cpp (SSHSession::terminate): see #1426, #1428 use + QProcess::waitForFinished() instead of just sleep() after we send + TERM signal to the background process. Also let Qt process events + to update the GUI while waiting. + + * instDialog_installer.cpp (instDialog::stopInstall): fixed #1428 + button "Stop" in the installer dialog does not stop installer + process * SSHSession.cpp (terminate): fixes #1426 "segfault when cancel while installing" (SF bug 2990333). No need to process events in diff --git a/src/gui/SSHSession.cpp b/src/gui/SSHSession.cpp index 980a1f8d1..5020a39c4 100644 --- a/src/gui/SSHSession.cpp +++ b/src/gui/SSHSession.cpp @@ -296,13 +296,6 @@ void SSHSession::terminate() return; } - disconnect(proc, SIGNAL(readyReadStandardOutput()), - this, SLOT(readFromStdout() ) ); - disconnect(proc, SIGNAL(readyReadStandardError()), - this, SLOT(readFromStderr() ) ); - disconnect(proc, SIGNAL(finished(int, QProcess::ExitStatus)), - this, SLOT(finished(int) ) ); - #ifdef _WIN32 if (proc->pid() != NULL) #else @@ -315,7 +308,7 @@ void SSHSession::terminate() if (fwbdebug) qDebug() << "SSHSession::terminate terminating child process pid=" << pid; - emit printStdout_sign(QString("Stopping background process")); + emit printStdout_sign(QString("Stopping background process %1").arg(pid)); /* * on windows proc->terminate() posts a WM_CLOSE @@ -337,7 +330,7 @@ void SSHSession::terminate() int time_to_wait = 20; for (int timeout = 0; timeout < time_to_wait; timeout++) { - if (proc->state() != QProcess::Running) break; + if (proc==NULL || proc->state() != QProcess::Running) break; // print countdown only if we've been waiting more than 3 sec if (timeout > 3) emit printStdout_sign( @@ -351,12 +344,17 @@ void SSHSession::terminate() s.replace('\r',""); emit printStdout_sign(s); } - QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents); -#ifdef _WIN32 - Sleep(1000); -#else - sleep(1); -#endif + + QApplication::processEvents(QEventLoop::ExcludeUserInputEvents,1); + proc->waitForFinished(1000); + } + + // proc can be NULL at this point if it had sent signal finished() + // which we processed in the call to waitForFinished() above + if (proc == NULL) + { + if (fwbdebug) qDebug("SSHSession::terminate proc==NULL"); + return; } if (fwbdebug) @@ -370,10 +368,15 @@ void SSHSession::terminate() } if (fwbdebug) - qDebug() << "SSHSession::terminate done reading I/O buffers"; + qDebug() << "SSHSession::terminate done reading I/O buffers. Disconnecting signals"; + + disconnect(proc, SIGNAL(readyReadStandardOutput()), + this, SLOT(readFromStdout() ) ); + disconnect(proc, SIGNAL(readyReadStandardError()), + this, SLOT(readFromStderr() ) ); + disconnect(proc, SIGNAL(finished(int, QProcess::ExitStatus)), + this, SLOT(finished(int) ) ); - // Looks like sometimes the process may still be running - // after 20 sec. Ticket #1426, SF bug 2990333 if (proc->state() == QProcess::Running) { if (fwbdebug) diff --git a/src/gui/instDialog_installer.cpp b/src/gui/instDialog_installer.cpp index 9e65a196e..f5978dd81 100644 --- a/src/gui/instDialog_installer.cpp +++ b/src/gui/instDialog_installer.cpp @@ -146,13 +146,21 @@ bool instDialog::runInstaller(Firewall *fw) void instDialog::stopInstall() { currentStopButton->setEnabled(false); - stopProcessFlag=true; - disconnect(currentStopButton, SIGNAL(clicked()) ); - currentStopButton->setEnabled(false); + disconnect(currentStopButton, SIGNAL(clicked())); - proc.terminate(); //try to close proc. - QTimer::singleShot( 1000, &proc, SLOT( kill() ) ); //if it doesn't respond, kill it + stopProcessFlag = true; // likely unused + proc.terminate(); // try to close proc. + QTimer::singleShot(1000, &proc, SLOT(kill())); //if it doesn't respond, kill it + + if (installer != NULL) + { + if (fwbdebug) + qDebug() << "instDialog::stopInstall killing installer"; + installer->terminate(); + delete installer; + installer = NULL; + } // to terminate whole install sequence rather than just current // process, clear the list. diff --git a/src/gui/instDialog_ui_ops.cpp b/src/gui/instDialog_ui_ops.cpp index 8bddca7d9..1fa5af37b 100644 --- a/src/gui/instDialog_ui_ops.cpp +++ b/src/gui/instDialog_ui_ops.cpp @@ -670,7 +670,8 @@ void instDialog::saveLog() void instDialog::addToLog(const QString &buf) { if (fwbdebug) - qDebug() << "instDialog::addToLog" << QTime::currentTime().toString(); + qDebug() << "instDialog::addToLog" << QTime::currentTime().toString() + << "buf.size()=" << buf.size(); if (buf.isEmpty()) return; diff --git a/test/ipt/objects-for-regression-tests.fwb b/test/ipt/objects-for-regression-tests.fwb index c63a3df24..e64a155ee 100644 --- a/test/ipt/objects-for-regression-tests.fwb +++ b/test/ipt/objects-for-regression-tests.fwb @@ -4694,7 +4694,7 @@ - + @@ -6639,7 +6639,7 @@ - + @@ -8102,7 +8102,7 @@ - + @@ -9985,7 +9985,7 @@ - + @@ -10646,7 +10646,7 @@ - + @@ -11442,7 +11442,7 @@ - + @@ -11945,7 +11945,7 @@ - + @@ -12218,7 +12218,7 @@ - + @@ -12633,7 +12633,7 @@ - + @@ -13052,7 +13052,7 @@ - + @@ -13143,7 +13143,7 @@ - + @@ -13705,7 +13705,7 @@ - + @@ -14023,7 +14023,7 @@ - + @@ -15158,7 +15158,7 @@ - + @@ -15338,7 +15338,7 @@ - + @@ -15572,7 +15572,7 @@ - + @@ -15696,7 +15696,7 @@ - + @@ -16130,7 +16130,7 @@ - + @@ -16446,7 +16446,7 @@ - + @@ -16786,7 +16786,7 @@ - + @@ -17171,7 +17171,7 @@ - + @@ -17807,7 +17807,7 @@ - + @@ -18125,7 +18125,7 @@ - + @@ -18327,7 +18327,7 @@ - + @@ -18752,7 +18752,7 @@ - + @@ -19231,7 +19231,7 @@ - + @@ -19450,7 +19450,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -20321,7 +20321,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -20865,7 +20865,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -21602,7 +21602,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -21887,7 +21887,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -22041,7 +22041,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -22273,7 +22273,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -22987,7 +22987,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -23522,7 +23522,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -23927,7 +23927,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -26386,7 +26386,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -26958,7 +26958,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -27607,7 +27607,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -28726,7 +28726,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -29306,7 +29306,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -29617,7 +29617,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -29868,7 +29868,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -31097,7 +31097,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -31301,7 +31301,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -31546,7 +31546,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -32365,7 +32365,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -32570,7 +32570,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -32767,7 +32767,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -33098,7 +33098,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -33482,7 +33482,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -33995,7 +33995,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -34160,7 +34160,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -38361,7 +38361,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -39964,7 +39964,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -40277,7 +40277,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -40469,7 +40469,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -40641,7 +40641,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -41475,7 +41475,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -41869,7 +41869,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -42027,7 +42027,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -42421,7 +42421,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -42620,7 +42620,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -42819,7 +42819,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -43018,7 +43018,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -43217,7 +43217,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -43416,7 +43416,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -43615,7 +43615,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -43732,7 +43732,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -43849,7 +43849,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -44093,7 +44093,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -44352,7 +44352,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -44976,7 +44976,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -45400,7 +45400,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -45794,7 +45794,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -46345,7 +46345,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -46896,7 +46896,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -47421,7 +47421,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -47556,7 +47556,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -47787,7 +47787,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -47946,7 +47946,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -48204,7 +48204,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -48683,7 +48683,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -49059,7 +49059,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - + @@ -49959,7 +49959,7 @@ echo '%FWBPROMPT%'; sh /tmp/%FWSCRIPT% - +