QWindowsPipeReader: fix occasional "Unknown error 995"

After canceling the asynchronous read operation, the
notified() slot receives ERROR_OPERATION_ABORTED.
We must not handle this situation as an error.

This amends commit 5ce567c5.

Task-number: QTBUG-48336
Change-Id: Iff948ceb3ad1f805a9de8c188fbc39ed4c76ba82
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>
This commit is contained in:
Joerg Bornemann 2015-10-30 15:09:55 +01:00
parent 5a7f69f824
commit dfaffcbf2a
2 changed files with 33 additions and 0 deletions

View File

@ -186,6 +186,10 @@ void QWindowsPipeReader::notified(quint32 numberOfBytesRead, quint32 errorCode,
case ERROR_PIPE_NOT_CONNECTED: case ERROR_PIPE_NOT_CONNECTED:
pipeBroken = true; pipeBroken = true;
break; break;
case ERROR_OPERATION_ABORTED:
if (stopped)
break;
// fall through
default: default:
emit winError(errorCode, QLatin1String("QWindowsPipeReader::notified")); emit winError(errorCode, QLatin1String("QWindowsPipeReader::notified"));
pipeBroken = true; pipeBroken = true;

View File

@ -98,6 +98,7 @@ private slots:
void removeServer(); void removeServer();
void recycleServer(); void recycleServer();
void recycleClientSocket();
void multiConnect(); void multiConnect();
void writeOnlySocket(); void writeOnlySocket();
@ -954,6 +955,34 @@ void tst_QLocalSocket::recycleServer()
QVERIFY(server.nextPendingConnection() != 0); QVERIFY(server.nextPendingConnection() != 0);
} }
void tst_QLocalSocket::recycleClientSocket()
{
const QByteArrayList lines = QByteArrayList() << "Have you heard of that new band"
<< "\"1023 Megabytes\"?"
<< "They haven't made it to a gig yet.";
QLocalServer server;
const QString serverName = QStringLiteral("recycleClientSocket");
QVERIFY(server.listen(serverName));
QLocalSocket client;
QSignalSpy clientReadyReadSpy(&client, SIGNAL(readyRead()));
QSignalSpy clientErrorSpy(&client, SIGNAL(error(QLocalSocket::LocalSocketError)));
for (int i = 0; i < lines.count(); ++i) {
client.abort();
clientReadyReadSpy.clear();
client.connectToServer(serverName);
QVERIFY(client.waitForConnected());
QVERIFY(server.waitForNewConnection());
QLocalSocket *serverSocket = server.nextPendingConnection();
QVERIFY(serverSocket);
connect(serverSocket, &QLocalSocket::disconnected, &QLocalSocket::deleteLater);
serverSocket->write(lines.at(i));
serverSocket->flush();
QVERIFY(clientReadyReadSpy.wait());
QCOMPARE(client.readAll(), lines.at(i));
QVERIFY(clientErrorSpy.isEmpty());
}
}
void tst_QLocalSocket::multiConnect() void tst_QLocalSocket::multiConnect()
{ {
QLocalServer server; QLocalServer server;