From dd00f6dd91a28f3e76bc4c3e894174efffc7f201 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Martins?= Date: Sun, 28 Aug 2016 21:34:32 +0100 Subject: Handle short reads in the local sockets example Protection against short reads was already half implemented, blockSize was being sent by the server but never used by the client. Also, blockSize was bumped to quint32: If you're in a position where short reads can happen then quint16 is probably not enough to hold the size of your data. On Linux I could only reproduce short reads for messages > 500K. Change-Id: I191a3d781da1d8a119debbdafae641c8340a1da2 Reviewed-by: Giuseppe D'Angelo --- examples/corelib/ipc/localfortuneclient/client.cpp | 5 +++-- examples/corelib/ipc/localfortuneclient/client.h | 2 +- examples/corelib/ipc/localfortuneserver/server.cpp | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) (limited to 'examples') diff --git a/examples/corelib/ipc/localfortuneclient/client.cpp b/examples/corelib/ipc/localfortuneclient/client.cpp index 853cb2b087..84c0db9a0e 100644 --- a/examples/corelib/ipc/localfortuneclient/client.cpp +++ b/examples/corelib/ipc/localfortuneclient/client.cpp @@ -100,12 +100,13 @@ void Client::readFortune() in.setVersion(QDataStream::Qt_4_0); if (blockSize == 0) { - if (socket->bytesAvailable() < (int)sizeof(quint16)) + // Relies on the fact that QDataStream format streams a quint32 into sizeof(quint32) bytes + if (socket->bytesAvailable() < (int)sizeof(quint32)) return; in >> blockSize; } - if (in.atEnd()) + if (socket->bytesAvailable() < blockSize || in.atEnd()) return; QString nextFortune; diff --git a/examples/corelib/ipc/localfortuneclient/client.h b/examples/corelib/ipc/localfortuneclient/client.h index f12957fe33..8ba767b4fa 100644 --- a/examples/corelib/ipc/localfortuneclient/client.h +++ b/examples/corelib/ipc/localfortuneclient/client.h @@ -76,7 +76,7 @@ private: QLocalSocket *socket; QString currentFortune; - quint16 blockSize; + quint32 blockSize; }; #endif diff --git a/examples/corelib/ipc/localfortuneserver/server.cpp b/examples/corelib/ipc/localfortuneserver/server.cpp index 5b64e917d9..fa867eb737 100644 --- a/examples/corelib/ipc/localfortuneserver/server.cpp +++ b/examples/corelib/ipc/localfortuneserver/server.cpp @@ -96,10 +96,10 @@ void Server::sendFortune() QByteArray block; QDataStream out(&block, QIODevice::WriteOnly); out.setVersion(QDataStream::Qt_4_0); - out << (quint16)0; + out << (quint32)0; out << fortunes.at(qrand() % fortunes.size()); out.device()->seek(0); - out << (quint16)(block.size() - sizeof(quint16)); + out << (quint32)(block.size() - sizeof(quint32)); QLocalSocket *clientConnection = server->nextPendingConnection(); connect(clientConnection, SIGNAL(disconnected()), -- cgit v1.2.3