aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2018-06-20 15:52:13 +0200
committerUlf Hermann <ulf.hermann@qt.io>2018-06-22 07:17:56 +0000
commit1ae6ef5ec55aedacb36060e6f7790c082725a21d (patch)
tree8db098245b08af0c7a75d22f4a9700f91e53946e /src
parent9f8f5ae26508244f4f8e496784ea5d9c9d97927f (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>
Diffstat (limited to 'src')
-rw-r--r--src/plugins/qmltooling/packetprotocol/qpacketprotocol.cpp20
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) {