diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2018-06-20 15:52:13 +0200 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2018-06-22 07:17:56 +0000 |
commit | 1ae6ef5ec55aedacb36060e6f7790c082725a21d (patch) | |
tree | 8db098245b08af0c7a75d22f4a9700f91e53946e | |
parent | 9f8f5ae26508244f4f8e496784ea5d9c9d97927f (diff) |
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 <simon.hausmann@qt.io>
-rw-r--r-- | src/plugins/qmltooling/packetprotocol/qpacketprotocol.cpp | 20 |
1 files changed, 15 insertions, 5 deletions
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 <QtCore/QElapsedTimer> +#include <QtCore/QtEndian> + #include <private/qiodevice_p.h> #include <private/qobject_p.h> @@ -104,7 +106,7 @@ class QPacketProtocolPrivate : public QObjectPrivate public: QPacketProtocolPrivate(QIODevice *dev); - QList<qint64> sendingPackets; + QList<qint32> sendingPackets; QList<QByteArray> 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<qint32>::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) { |