diff options
author | Thiago Macieira <thiago.macieira@intel.com> | 2024-03-11 09:55:10 -0700 |
---|---|---|
committer | Thiago Macieira <thiago.macieira@intel.com> | 2024-03-12 22:21:13 -0700 |
commit | 0f56502fb6f062c6d2308198c93412c34525125b (patch) | |
tree | c29dc2281aed912d3e796ff25797091757190592 /src/corelib/io | |
parent | 7d4d6e88bc01affa9774cc304123ca0369c77800 (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.cpp | 3 |
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(); |