CmdBridge: Fix handle partial package marker

Change-Id: Ifbae08fdd04a292735b0bf515d7c9b43f75cc7d9
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Marcus Tillmanns
2024-10-11 08:36:32 +02:00
parent e2547608c0
commit ae6a0bb706

View File

@@ -320,54 +320,64 @@ expected_str<QFuture<Environment>> Client::start()
QThread::currentThread()->quit(); QThread::currentThread()->quit();
}); });
auto stateMachine = [state = int(0), packetSize(0), packetData = QByteArray(), this]( auto stateMachine =
QByteArray &buffer) mutable { [markerOffset = 0, state = int(0), packetSize(0), packetData = QByteArray(), this](
static const QByteArray MagicCode{GOBRIDGE_MAGIC_PACKET_MARKER}; QByteArray &buffer) mutable {
static const QByteArrayView MagicCode{GOBRIDGE_MAGIC_PACKET_MARKER};
if (state == 0) { if (state == 0) {
int start = buffer.indexOf(MagicCode); const auto offsetMagicCode = MagicCode.mid(markerOffset);
if (start == -1) { int start = buffer.indexOf(offsetMagicCode);
// Broken package, search for next magic marker if (start == -1) {
qCWarning(clientLog) << "Magic marker was not found"; if (buffer.size() < offsetMagicCode.size()
// If we don't find a magic marker, the rest of the buffer is trash. && offsetMagicCode.startsWith(buffer)) {
buffer.clear(); // Partial magic marker?
} else { markerOffset += buffer.size();
buffer.remove(0, start + MagicCode.size()); buffer.clear();
state = 1; return;
}
// Broken package, search for next magic marker
qCWarning(clientLog) << "Magic marker was not found";
// If we don't find a magic marker, the rest of the buffer is trash.
buffer.clear();
} else {
buffer.remove(0, start + offsetMagicCode.size());
state = 1;
}
markerOffset = 0;
} }
}
if (state == 1) { if (state == 1) {
QDataStream ds(buffer); QDataStream ds(buffer);
ds >> packetSize; ds >> packetSize;
// TODO: Enforce max size in bridge. // TODO: Enforce max size in bridge.
if (packetSize > 0 && packetSize < 16384) { if (packetSize > 0 && packetSize < 16384) {
state = 2; state = 2;
buffer.remove(0, sizeof(packetSize)); buffer.remove(0, sizeof(packetSize));
} else { } else {
// Broken package, search for next magic marker // Broken package, search for next magic marker
qCWarning(clientLog) << "Invalid packet size" << packetSize; qCWarning(clientLog) << "Invalid packet size" << packetSize;
state = 0; state = 0;
}
} }
}
if (state == 2) { if (state == 2) {
auto packetDataRemaining = packetSize - packetData.size(); auto packetDataRemaining = packetSize - packetData.size();
auto dataAvailable = buffer.size(); auto dataAvailable = buffer.size();
auto availablePacketData = qMin(packetDataRemaining, dataAvailable); auto availablePacketData = qMin(packetDataRemaining, dataAvailable);
packetData.append(buffer.left(availablePacketData)); packetData.append(buffer.left(availablePacketData));
buffer.remove(0, availablePacketData); buffer.remove(0, availablePacketData);
if (packetData.size() == packetSize) { if (packetData.size() == packetSize) {
QCborStreamReader reader; QCborStreamReader reader;
reader.addData(packetData); reader.addData(packetData);
packetData.clear(); packetData.clear();
state = 0; state = 0;
auto result = d->readPacket(reader); auto result = d->readPacket(reader);
QTC_CHECK_EXPECTED(result); QTC_CHECK_EXPECTED(result);
}
} }
} };
};
connect( connect(
d->process, d->process,