forked from qt-creator/qt-creator
CmdBridge: Fix handle partial package marker
Change-Id: Ifbae08fdd04a292735b0bf515d7c9b43f75cc7d9 Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
@@ -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,
|
||||||
|
Reference in New Issue
Block a user