From b2c3b3e8fe0d8bdc88051d0120aaa8d5cf8acce0 Mon Sep 17 00:00:00 2001 From: Alex Trotsenko Date: Sat, 11 Sep 2021 17:32:09 +0300 Subject: Q{LocalSocket|Process}/Win: handle write errors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit To match the Unix behavior, we should emit errorOccurred() signal and close the channel if the write operation fails. Change-Id: Iac3acb18dbbfe6e7e8afb2555d9adaff1fe98d0f Reviewed-by: Oswald Buddenhagen Reviewed-by: MÃ¥rten Nordheim --- src/network/socket/qlocalsocket_p.h | 1 + src/network/socket/qlocalsocket_win.cpp | 12 ++++++++++++ 2 files changed, 13 insertions(+) (limited to 'src/network/socket') diff --git a/src/network/socket/qlocalsocket_p.h b/src/network/socket/qlocalsocket_p.h index 036ce48885..bb1a808911 100644 --- a/src/network/socket/qlocalsocket_p.h +++ b/src/network/socket/qlocalsocket_p.h @@ -137,6 +137,7 @@ public: void _q_bytesWritten(qint64 bytes); void _q_pipeClosed(); void _q_winError(ulong windowsError, const QString &function); + void _q_writeFailed(); HANDLE handle; QWindowsPipeWriter *pipeWriter; QWindowsPipeReader *pipeReader; diff --git a/src/network/socket/qlocalsocket_win.cpp b/src/network/socket/qlocalsocket_win.cpp index c4da59c278..019829cc9c 100644 --- a/src/network/socket/qlocalsocket_win.cpp +++ b/src/network/socket/qlocalsocket_win.cpp @@ -310,6 +310,8 @@ qint64 QLocalSocket::writeData(const char *data, qint64 len) d->pipeWriter = new QWindowsPipeWriter(d->handle, this); QObjectPrivate::connect(d->pipeWriter, &QWindowsPipeWriter::bytesWritten, d, &QLocalSocketPrivate::_q_bytesWritten); + QObjectPrivate::connect(d->pipeWriter, &QWindowsPipeWriter::writeFailed, + d, &QLocalSocketPrivate::_q_writeFailed); } if (d->isWriteChunkCached(data, len)) @@ -455,6 +457,16 @@ void QLocalSocketPrivate::_q_bytesWritten(qint64 bytes) q->disconnectFromServer(); } +void QLocalSocketPrivate::_q_writeFailed() +{ + Q_Q(QLocalSocket); + error = QLocalSocket::PeerClosedError; + errorString = QLocalSocket::tr("Remote closed"); + emit q->errorOccurred(error); + + _q_pipeClosed(); +} + qintptr QLocalSocket::socketDescriptor() const { Q_D(const QLocalSocket); -- cgit v1.2.3