summaryrefslogtreecommitdiffstats
path: root/src/corelib/io
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2024-03-11 09:55:10 -0700
committerThiago Macieira <thiago.macieira@intel.com>2024-03-12 22:21:13 -0700
commit0f56502fb6f062c6d2308198c93412c34525125b (patch)
treec29dc2281aed912d3e796ff25797091757190592 /src/corelib/io
parent7d4d6e88bc01affa9774cc304123ca0369c77800 (diff)
QProcess/Unix: fix close() on invalid file descriptor
Commit 90bc0ad41f9937f9cba801b3166635f6f55e0678 ("QProcess/Unix: add failChildProcessModifier()") added this line that set childStartedPipe so that the failChildProcess() callback had something to write to. But we left it set on exit from QProcessPrivate::startDetached(), which caused the QProcess destructor to try and close it. Noticed when debugging the issue for QTBUG-123083. Pick-to: 6.7 6.7.0 Task-number: QTBUG-123083 Change-Id: I6818d78a57394e37857bfffd17bbc41c8400270f Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/corelib/io')
-rw-r--r--src/corelib/io/qprocess_unix.cpp3
1 files changed, 2 insertions, 1 deletions
diff --git a/src/corelib/io/qprocess_unix.cpp b/src/corelib/io/qprocess_unix.cpp
index ca65a3c776..fcbce92ade 100644
--- a/src/corelib/io/qprocess_unix.cpp
+++ b/src/corelib/io/qprocess_unix.cpp
@@ -1290,7 +1290,6 @@ void QProcessPrivate::waitForDeadChild()
bool QProcessPrivate::startDetached(qint64 *pid)
{
AutoPipe startedPipe, pidPipe;
- childStartedPipe[1] = startedPipe[1];
if (!startedPipe || !pidPipe) {
setErrorAndEmit(QProcess::FailedToStart, "pipe: "_L1 + qt_error_string(errno));
return false;
@@ -1309,6 +1308,7 @@ bool QProcessPrivate::startDetached(qint64 *pid)
return false;
}
+ childStartedPipe[1] = startedPipe[1]; // for failChildProcess()
pid_t childPid = childProcess.doFork([&] {
::setsid();
@@ -1323,6 +1323,7 @@ bool QProcessPrivate::startDetached(qint64 *pid)
qt_safe_write(pidPipe[1], &doubleForkPid, sizeof(pid_t));
return 0;
});
+ childStartedPipe[1] = -1;
int savedErrno = errno;
closeChannels();