summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMurray Read <ext-murray.2.read@nokia.com>2012-03-07 11:47:41 +0000
committerQt by Nokia <qt-info@nokia.com>2012-03-08 00:40:03 +0100
commit0ef9762bbb176c842a90bc5aaad49a7f2b054ad6 (patch)
tree0ba00744201912aa509c2afa166a9efe916d40d9
parent3a57243fbffb771c0991c99d93ac9b9fcf4fc4ee (diff)
Don't allow app panic on QProcess destruction, kill or terminate
QProcess destruction will call kill() if the process is still running. PRocess::Kill() and Terminate() both require the PowerMgmt capability to operate on Symbian, otherwise a KERN-EXEC 46 panic happens. An app should be able to use QProcess safely if it doesn't have PowerMgmt capability, it should just be prevented from trying to kill the created process. Now a debug message is issued on ~QProcess(), kill() or terminate() if the capability is not present, rather than actually trying to kill/terminate the process. Task-number: ou1cimx1#985227 Change-Id: I3242ca2c39528c70c2c79e39f6a6384dd72f6ae6 Reviewed-by: Shane Kearns <shane.kearns@accenture.com>
-rw-r--r--src/corelib/io/qprocess_symbian.cpp16
1 files changed, 12 insertions, 4 deletions
diff --git a/src/corelib/io/qprocess_symbian.cpp b/src/corelib/io/qprocess_symbian.cpp
index 2ed7fe6886..c483b76283 100644
--- a/src/corelib/io/qprocess_symbian.cpp
+++ b/src/corelib/io/qprocess_symbian.cpp
@@ -890,10 +890,14 @@ qint64 QProcessPrivate::writeToStdin(const char *data, qint64 maxlen)
void QProcessPrivate::terminateProcess()
{
- // Needs PowerMgmt capability if process has been started; will panic kern-exec 46 otherwise.
+ // Needs PowerMgmt capability if process has been started; will issue a debug message otherwise.
// Always works if process is not yet started.
if (qt_rprocess_running(symbianProcess)) {
- symbianProcess->Terminate(0);
+ if (RProcess().HasCapability(ECapabilityPowerMgmt)) {
+ symbianProcess->Terminate(0);
+ } else {
+ qWarning("QProcessPrivate::terminateProcess(), can't terminate process without PowerMgmt capability");
+ }
} else {
QPROCESS_DEBUG_PRINT("QProcessPrivate::terminateProcess(), Process not running");
}
@@ -901,10 +905,14 @@ void QProcessPrivate::terminateProcess()
void QProcessPrivate::killProcess()
{
- // Needs PowerMgmt capability if process has been started; will panic kern-exec 46 otherwise.
+ // Needs PowerMgmt capability if process has been started; will issue a debug message otherwise.
// Always works if process is not yet started.
if (qt_rprocess_running(symbianProcess)) {
- symbianProcess->Kill(0);
+ if (RProcess().HasCapability(ECapabilityPowerMgmt)) {
+ symbianProcess->Kill(0);
+ } else {
+ qWarning("QProcessPrivate::killProcess(), can't kill process without PowerMgmt capability");
+ }
} else {
QPROCESS_DEBUG_PRINT("QProcessPrivate::killProcess(), Process not running");
}