From 1ae6ef5ec55aedacb36060e6f7790c082725a21d Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Wed, 20 Jun 2018 15:52:13 +0200 Subject: PacketProtocol: Explicitly transmit packet sizes in little endian So far the protocol would fail if the endpoints have different endianness. Task-number: QTBUG-68721 Change-Id: Ib53894b1e2f3eecf40160bb7bb9cfaa4beb2c045 Reviewed-by: Simon Hausmann --- .../qmltooling/packetprotocol/qpacketprotocol.cpp | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/plugins/qmltooling/packetprotocol/qpacketprotocol.cpp b/src/plugins/qmltooling/packetprotocol/qpacketprotocol.cpp index 1c73b9d7fb..e1d6263e36 100644 --- a/src/plugins/qmltooling/packetprotocol/qpacketprotocol.cpp +++ b/src/plugins/qmltooling/packetprotocol/qpacketprotocol.cpp @@ -40,6 +40,8 @@ #include "qpacketprotocol_p.h" #include +#include + #include #include @@ -104,7 +106,7 @@ class QPacketProtocolPrivate : public QObjectPrivate public: QPacketProtocolPrivate(QIODevice *dev); - QList sendingPackets; + QList sendingPackets; QList packets; QByteArray inProgress; qint32 inProgressSize; @@ -135,14 +137,20 @@ QPacketProtocol::QPacketProtocol(QIODevice *dev, QObject *parent) void QPacketProtocol::send(const QByteArray &data) { Q_D(QPacketProtocol); + static const qint32 maxSize = std::numeric_limits::max() - sizeof(qint32); if (data.isEmpty()) return; // We don't send empty packets - qint64 sendSize = data.size() + sizeof(qint32); + if (data.size() > maxSize) { + emit invalidPacket(); + return; + } + + qint32 sendSize = data.size() + sizeof(qint32); d->sendingPackets.append(sendSize); - qint32 sendSize32 = sendSize; - qint64 writeBytes = d->dev->write((char *)&sendSize32, sizeof(qint32)); + qint32 sendSizeLE = qToLittleEndian(sendSize); + qint64 writeBytes = d->dev->write((char *)&sendSizeLE, sizeof(qint32)); Q_UNUSED(writeBytes); Q_ASSERT(writeBytes == sizeof(qint32)); writeBytes = d->dev->write(data); @@ -236,7 +244,9 @@ void QPacketProtocol::readyToRead() return; // Read size header - const qint64 read = d->dev->read((char *)&d->inProgressSize, sizeof(qint32)); + qint32 inProgressSizeLE; + const qint64 read = d->dev->read((char *)&inProgressSizeLE, sizeof(qint32)); + d->inProgressSize = qFromLittleEndian(inProgressSizeLE); // Check sizing constraints if (read != sizeof(qint32) || d->inProgressSize < read) { -- cgit v1.2.3