From d9c0af92bd893e1f6a0b4c627300ea96a73aba55 Mon Sep 17 00:00:00 2001 From: Alex Trotsenko Date: Wed, 14 Jul 2021 19:58:48 +0300 Subject: [PATCH] QLocalSocket/Unix: fix aborting the socket According to the documentation, calling abort() should immediately reset the socket to its initial state. This includes: - closing the file descriptor; - closing the QLocalSocket as an I/O device; - canceling a pending outgoing connection, if it exist; - reseting 'serverName' string. So, adding a call to close() resets the state entirely. Pick-to: 6.1 6.2 Change-Id: I9c604b5187c6300b437d7aa4c2d06db03edacf21 Reviewed-by: Oswald Buddenhagen Reviewed-by: Edward Welbourne Reviewed-by: Timur Pocheptsov --- src/network/socket/qlocalsocket_tcp.cpp | 1 + src/network/socket/qlocalsocket_unix.cpp | 1 + tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp | 6 ++++++ 3 files changed, 8 insertions(+) diff --git a/src/network/socket/qlocalsocket_tcp.cpp b/src/network/socket/qlocalsocket_tcp.cpp index 1b6aa16c9b..a0f511b208 100644 --- a/src/network/socket/qlocalsocket_tcp.cpp +++ b/src/network/socket/qlocalsocket_tcp.cpp @@ -326,6 +326,7 @@ void QLocalSocket::abort() { Q_D(QLocalSocket); d->tcpSocket->abort(); + close(); } qint64 QLocalSocket::bytesAvailable() const diff --git a/src/network/socket/qlocalsocket_unix.cpp b/src/network/socket/qlocalsocket_unix.cpp index 4dc542f2e3..2156644255 100644 --- a/src/network/socket/qlocalsocket_unix.cpp +++ b/src/network/socket/qlocalsocket_unix.cpp @@ -508,6 +508,7 @@ void QLocalSocket::abort() { Q_D(QLocalSocket); d->unixSocket.abort(); + close(); } qint64 QLocalSocket::bytesAvailable() const diff --git a/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp b/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp index 8c5fff8aad..165221bd42 100644 --- a/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp +++ b/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp @@ -969,6 +969,7 @@ void tst_QLocalSocket::simpleCommandProtocol2() server.listen(QStringLiteral("simpleProtocol")); QLocalSocket localSocketWrite; + QSignalSpy spyDisconnected(&localSocketWrite, SIGNAL(disconnected())); localSocketWrite.connectToServer(server.serverName()); QVERIFY(server.waitForNewConnection()); QLocalSocket* localSocketRead = server.nextPendingConnection(); @@ -1010,6 +1011,11 @@ void tst_QLocalSocket::simpleCommandProtocol2() } localSocketWrite.abort(); + QCOMPARE(localSocketWrite.state(), QLocalSocket::UnconnectedState); + QCOMPARE(spyDisconnected.count(), 1); + QCOMPARE(localSocketWrite.bytesToWrite(), 0); + QVERIFY(!localSocketWrite.isOpen()); + QVERIFY(localSocketRead->waitForDisconnected(1000)); }