diff --git a/src/corelib/io/qwindowspipereader.cpp b/src/corelib/io/qwindowspipereader.cpp index 5415ad7830e..4435a47cab0 100644 --- a/src/corelib/io/qwindowspipereader.cpp +++ b/src/corelib/io/qwindowspipereader.cpp @@ -104,6 +104,7 @@ void QWindowsPipeReader::setHandle(HANDLE hPipeReadEnd) void QWindowsPipeReader::stop() { cancelAsyncRead(Stopped); + pipeBroken = true; } /*! @@ -113,6 +114,22 @@ void QWindowsPipeReader::stop() void QWindowsPipeReader::drainAndStop() { cancelAsyncRead(Draining); + pipeBroken = true; +} + +/*! + Stops the asynchronous read sequence. + Clears the internal buffer and discards any pending data. + */ +void QWindowsPipeReader::stopAndClear() +{ + cancelAsyncRead(Stopped); + readBuffer.clear(); + actualReadBufferSize = 0; + // QLocalSocket is supposed to write data in the 'Closing' + // state, so we don't set 'pipeBroken' flag here. Also, avoid + // setting this flag in checkForReadyRead(). + lastError = ERROR_SUCCESS; } /*! @@ -120,7 +137,6 @@ void QWindowsPipeReader::drainAndStop() */ void QWindowsPipeReader::cancelAsyncRead(State newState) { - pipeBroken = true; if (state != Running) return; @@ -147,9 +163,9 @@ void QWindowsPipeReader::cancelAsyncRead(State newState) } mutex.unlock(); - // Because pipeBroken was set earlier, finish reading to keep the class - // state consistent. Note that signals are not emitted in the call - // below, as the caller is expected to do that synchronously. + // Finish reading to keep the class state consistent. Note that + // signals are not emitted in the call below, as the caller is + // expected to do that synchronously. consumePending(); } diff --git a/src/corelib/io/qwindowspipereader_p.h b/src/corelib/io/qwindowspipereader_p.h index 5eb62cb393d..22a4365f020 100644 --- a/src/corelib/io/qwindowspipereader_p.h +++ b/src/corelib/io/qwindowspipereader_p.h @@ -71,6 +71,7 @@ public: void startAsyncRead(); void stop(); void drainAndStop(); + void stopAndClear(); void setMaxReadBufferSize(qint64 size); qint64 maxReadBufferSize() const { return readBufferMaxSize; } diff --git a/src/network/socket/qlocalsocket_win.cpp b/src/network/socket/qlocalsocket_win.cpp index b98dcb0dbcd..f7e72c055bb 100644 --- a/src/network/socket/qlocalsocket_win.cpp +++ b/src/network/socket/qlocalsocket_win.cpp @@ -396,6 +396,7 @@ void QLocalSocket::close() Q_D(QLocalSocket); QIODevice::close(); + d->pipeReader->stopAndClear(); d->serverName = QString(); d->fullServerName = QString(); disconnectFromServer(); diff --git a/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp b/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp index 5de1fa2b583..ed665253da1 100644 --- a/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp +++ b/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp @@ -1372,7 +1372,7 @@ void tst_QLocalSocket::delayedDisconnect() QVERIFY(serverSocket); connect(serverSocket, &QLocalSocket::aboutToClose, [serverSocket]() { QVERIFY(serverSocket->isOpen()); - QVERIFY(serverSocket->getChar(nullptr)); + QCOMPARE(serverSocket->bytesAvailable(), qint64(1)); }); QVERIFY(socket.putChar(0)); @@ -1386,6 +1386,7 @@ void tst_QLocalSocket::delayedDisconnect() serverSocket->close(); QCOMPARE(serverSocket->state(), QLocalSocket::UnconnectedState); QVERIFY(!serverSocket->isOpen()); + QCOMPARE(serverSocket->bytesAvailable(), qint64(0)); } void tst_QLocalSocket::removeServer()