Check that packet length is good
This commit is contained in:
parent
eb0098552a
commit
084f512d34
|
@ -492,14 +492,21 @@ class Packet:
|
||||||
pkt.magic = data[0]
|
pkt.magic = data[0]
|
||||||
pkt.version = data[1]
|
pkt.version = data[1]
|
||||||
pkt.body_length = socket.ntohs(int.from_bytes(data[2:4], sys.byteorder))
|
pkt.body_length = socket.ntohs(int.from_bytes(data[2:4], sys.byteorder))
|
||||||
|
if len(data) != 4 + pkt.body_length:
|
||||||
|
raise ValueError(f"Invalid packet length: "
|
||||||
|
f"declared body length is {pkt.body_length} while {len(data) - 4} bytes are avalaible")
|
||||||
pkt.body = []
|
pkt.body = []
|
||||||
read_bytes = 0
|
read_bytes = 0
|
||||||
while read_bytes < min(len(data) - 4, pkt.body_length):
|
while read_bytes < min(len(data) - 4, pkt.body_length):
|
||||||
tlv_type = data[4 + read_bytes]
|
tlv_type = data[4 + read_bytes]
|
||||||
if not (0 <= tlv_type < len(TLV.tlv_classes())):
|
if not (0 <= tlv_type < len(TLV.tlv_classes())):
|
||||||
raise ValueError(f"TLV type is not supported: {tlv_type}")
|
raise ValueError(f"TLV type is not supported: {tlv_type}")
|
||||||
|
tlv_length = data[4 + read_bytes + 1] if tlv_type > 0 else -1
|
||||||
|
if 2 + tlv_length > pkt.body_length - read_bytes:
|
||||||
|
raise ValueError(f"TLV length is too long: requesting {tlv_length} bytes, "
|
||||||
|
f"remaining {pkt.body_length - read_bytes}")
|
||||||
tlv = TLV.tlv_classes()[tlv_type]()
|
tlv = TLV.tlv_classes()[tlv_type]()
|
||||||
tlv.unmarshal(data[4 + read_bytes:4 + read_bytes + pkt.body_length])
|
tlv.unmarshal(data[4 + read_bytes:4 + read_bytes + 2 + tlv_length])
|
||||||
pkt.body.append(tlv)
|
pkt.body.append(tlv)
|
||||||
read_bytes += len(tlv)
|
read_bytes += len(tlv)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue