QProcess: Fix crash when calling closeWriteChannel on Windows

We must deleteLater the pipe writer in closeChannel, because if you
call closeWriteChannel() from a slot that is connected to a signal
emitted from QWindowsPipeWriter, we'd operate on a deleted object.

For consistency, we're calling QWindowsPipeWriter::stop before
deleteLater and deduplicate the code.

Fixes: QTBUG-73778
Change-Id: I61d3dedf57e9fd02517a108d13ffc85e006330f6
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
Joerg Bornemann 2019-02-13 10:09:54 +01:00
parent 01f07fd2d1
commit 46a20b9024

View File

@ -362,16 +362,22 @@ void QProcessPrivate::destroyPipe(Q_PIPE pipe[2])
}
}
template <class T>
void deleteWorker(T *&worker)
{
if (!worker)
return;
worker->stop();
worker->deleteLater();
worker = nullptr;
}
void QProcessPrivate::closeChannel(Channel *channel)
{
if (channel == &stdinChannel) {
delete stdinChannel.writer;
stdinChannel.writer = 0;
} else if (channel->reader) {
channel->reader->stop();
channel->reader->deleteLater();
channel->reader = 0;
}
if (channel == &stdinChannel)
deleteWorker(channel->writer);
else
deleteWorker(channel->reader);
destroyPipe(channel->pipe);
}