From 1b26e9f17cb0179b88a83310fae889d5232dcd47 Mon Sep 17 00:00:00 2001 From: Alex Trotsenko Date: Thu, 15 Oct 2020 19:13:25 +0300 Subject: QLocalSocket/Win: prevent writing to broken pipe When a peer closes the connection, the device remains opened for reading purposes. However, we should disable writing on disconnected socket. Otherwise, if the user issues a write() call, a new pipe writer object will be created and the write call occurs with invalid handle value. Change-Id: Id136798c7663df1fce7ed0aa4e3c6f5c65218a11 Reviewed-by: Timur Pocheptsov Reviewed-by: Oswald Buddenhagen (cherry picked from commit 53b4556332e95820622742e9be16281a77f9d337) Reviewed-by: Qt Cherry-pick Bot --- src/network/socket/qlocalsocket_win.cpp | 6 ++++++ tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp | 1 + 2 files changed, 7 insertions(+) diff --git a/src/network/socket/qlocalsocket_win.cpp b/src/network/socket/qlocalsocket_win.cpp index 48ffd87beb..6d82656583 100644 --- a/src/network/socket/qlocalsocket_win.cpp +++ b/src/network/socket/qlocalsocket_win.cpp @@ -207,6 +207,12 @@ qint64 QLocalSocket::readData(char *data, qint64 maxSize) qint64 QLocalSocket::writeData(const char *data, qint64 len) { Q_D(QLocalSocket); + if (!isValid()) { + d->error = OperationError; + d->errorString = tr("Socket is not connected"); + return -1; + } + if (len == 0) return 0; d->writeBuffer.append(data, len); diff --git a/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp b/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp index e172c255a7..a4685b59c7 100644 --- a/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp +++ b/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp @@ -1267,6 +1267,7 @@ void tst_QLocalSocket::syncDisconnectNotify() QVERIFY(serverSocket); delete serverSocket; QCOMPARE(client.waitForReadyRead(), false); + QVERIFY(!client.putChar(0)); } void tst_QLocalSocket::asyncDisconnectNotify() -- cgit v1.2.3