Check that packet length is good
This commit is contained in:
		@@ -492,14 +492,21 @@ class Packet:
 | 
			
		||||
        pkt.magic = data[0]
 | 
			
		||||
        pkt.version = data[1]
 | 
			
		||||
        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 = []
 | 
			
		||||
        read_bytes = 0
 | 
			
		||||
        while read_bytes < min(len(data) - 4, pkt.body_length):
 | 
			
		||||
            tlv_type = data[4 + read_bytes]
 | 
			
		||||
            if not (0 <= tlv_type < len(TLV.tlv_classes())):
 | 
			
		||||
                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.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)
 | 
			
		||||
            read_bytes += len(tlv)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user