From 23e67332a07774a5c94aea2f8770c139c50cd92b Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Wed, 29 Jan 2025 18:12:04 -0800 Subject: [PATCH] QProcess/Win: Properly report the reason of a fail-to-start We were losing the GetLastError() by calling CloseHandle(), QProcess::tr() or just not adding it. Change-Id: Ic16faa6d68a32d42d620fffd1a8e72be718bf19d Reviewed-by: Thiago Macieira Reviewed-by: Oswald Buddenhagen --- src/corelib/io/qprocess_win.cpp | 15 ++++++++++++--- tests/auto/corelib/io/qprocess/tst_qprocess.cpp | 16 ++++++++++++++-- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/corelib/io/qprocess_win.cpp b/src/corelib/io/qprocess_win.cpp index 7d577a4ba49..1222322c16e 100644 --- a/src/corelib/io/qprocess_win.cpp +++ b/src/corelib/io/qprocess_win.cpp @@ -513,6 +513,12 @@ bool QProcessPrivate::callCreateProcess(QProcess::CreateProcessArguments *cpargs cpargs->inheritHandles, cpargs->flags, cpargs->environment, cpargs->currentDirectory, cpargs->startupInfo, cpargs->processInformation); + if (!success) { + // don't CloseHandle here (we'll do that in cleanup()) so GetLastError() + // remains unmodified + return false; + } + if (stdinChannel.pipe[0] != INVALID_Q_PIPE) { CloseHandle(stdinChannel.pipe[0]); stdinChannel.pipe[0] = INVALID_Q_PIPE; @@ -576,9 +582,10 @@ void QProcessPrivate::startProcess() if (!callCreateProcess(&cpargs)) { // Capture the error string before we do CloseHandle below - QString errorString = QProcess::tr("Process failed to start: %1").arg(qt_error_string()); + QString errorString = qt_error_string(); cleanup(); - setErrorAndEmit(QProcess::FailedToStart, errorString); + setErrorAndEmit(QProcess::FailedToStart, + QProcess::tr("Process failed to start: %1").arg(errorString)); return; } @@ -946,7 +953,9 @@ bool QProcessPrivate::startDetached(qint64 *pid) if (!success) { if (pid) *pid = -1; - setErrorAndEmit(QProcess::FailedToStart); + QString errorString = qt_error_string(); + setErrorAndEmit(QProcess::FailedToStart, + QProcess::tr("Process failed to start: %1").arg(errorString)); } closeChannels(); diff --git a/tests/auto/corelib/io/qprocess/tst_qprocess.cpp b/tests/auto/corelib/io/qprocess/tst_qprocess.cpp index 5352c625146..8a36c9929a3 100644 --- a/tests/auto/corelib/io/qprocess/tst_qprocess.cpp +++ b/tests/auto/corelib/io/qprocess/tst_qprocess.cpp @@ -25,6 +25,9 @@ # include # include #endif +#ifdef Q_OS_WIN +# include +#endif #include @@ -424,8 +427,13 @@ void tst_QProcess::simpleStartFail() #ifdef Q_OS_UNIX QVERIFY2(process.errorString().contains(": execve: "), process.errorString().toLocal8Bit()); - QVERIFY2(process.errorString().contains(qt_error_string(ENOENT)), process.errorString().toLocal8Bit()); + int errorcode = ENOENT; +#else + // value happens to match ENOENT, but that's a coincidence + int errorcode = ERROR_FILE_NOT_FOUND; #endif + QVERIFY2(process.errorString().contains(qt_error_string(errorcode)), + process.errorString().toLocal8Bit()); } void tst_QProcess::readFromProcess() @@ -2940,8 +2948,12 @@ void tst_QProcess::setNonExistentWorkingDirectory() #ifdef Q_OS_UNIX QVERIFY2(process.errorString().contains(": chdir: "), process.errorString().toLocal8Bit()); - QVERIFY2(process.errorString().contains(qt_error_string(ENOENT)), process.errorString().toLocal8Bit()); + int errorcode = ENOENT; +#else + int errorcode = ERROR_DIRECTORY; #endif + QVERIFY2(process.errorString().contains(qt_error_string(errorcode)), + process.errorString().toLocal8Bit()); } void tst_QProcess::startFinishStartFinish()