Add bounded X4 Bluetooth wake and record Android recovery proof
This commit is contained in:
@@ -83,6 +83,7 @@ class PacketReader:
|
||||
|
||||
def __init__(self):
|
||||
self.buffer = bytearray()
|
||||
self.heartbeats = 0
|
||||
|
||||
def feed(self, chunk):
|
||||
if not chunk or len(self.buffer) + len(chunk) > MAX_PACKET * 2:
|
||||
@@ -91,12 +92,21 @@ class PacketReader:
|
||||
result = []
|
||||
while len(self.buffer) >= 4:
|
||||
size = struct.unpack_from("<I", self.buffer)[0]
|
||||
if not 16 <= size <= MAX_PACKET:
|
||||
if size != 7 and not 16 <= size <= MAX_PACKET:
|
||||
raise ValueError("Unknown packet framing")
|
||||
if len(self.buffer) < size:
|
||||
break
|
||||
raw = bytes(self.buffer[:size])
|
||||
del self.buffer[:size]
|
||||
if size == 7:
|
||||
# X4 BLE04 capture; SDK CameraSession::Start registers type5
|
||||
# with OnHeartbeatHandler. This is not an Options response.
|
||||
if raw != b"\x07\x00\x00\x00\x05\x00\x00":
|
||||
raise ValueError("Unsupported short control packet")
|
||||
self.heartbeats += 1
|
||||
if self.heartbeats > 64:
|
||||
raise ValueError("Heartbeat bound exceeded")
|
||||
continue
|
||||
_, kind, reserved, code, content, ident, tail = struct.unpack("<IBHHBIH", raw[:16])
|
||||
if kind != 4 or reserved or tail or content != 2 or ident & 0xC0000000 != 0xC0000000:
|
||||
raise ValueError("Unsupported message header/direction/fragmentation")
|
||||
|
||||
Reference in New Issue
Block a user