diff --git a/pymodbus/framer/tls.py b/pymodbus/framer/tls.py index 3f77c3fdb..dc0271f0b 100644 --- a/pymodbus/framer/tls.py +++ b/pymodbus/framer/tls.py @@ -20,9 +20,11 @@ class FramerTLS(FramerBase): def decode(self, data: bytes) -> tuple[int, int, int, bytes]: """Decode MDAP+payload.""" + if (data_len := len(data)) < self.MIN_SIZE: + return data_len, 0, 0, self.EMPTY tid = int.from_bytes(data[0:2], 'big') dev_id = int(data[6]) - return len(data), dev_id, tid, data[7:] + return data_len, dev_id, tid, data[7:] def encode(self, payload: bytes, device_id: int, tid: int) -> bytes: """Encode MDAP+payload.""" diff --git a/test/framer/test_framer.py b/test/framer/test_framer.py index 4303df01b..ab6154521 100644 --- a/test/framer/test_framer.py +++ b/test/framer/test_framer.py @@ -489,6 +489,16 @@ def test_invalid_protocol_id_for_framer_socket(self): assert tid == 0 assert pdu == framer.EMPTY + def test_short_packet_for_framer_tls(self): + """Test that FramerTLS handles short packets without raising.""" + framer = FramerTLS(DecodePDU(False)) + data = b"\x00\x01\x00\x00\x00" + data_len, dev_id, tid, pdu = framer.decode(data) + assert data_len == len(data) + assert dev_id == 0 + assert tid == 0 + assert pdu == framer.EMPTY + @pytest.mark.parametrize(("entry"), [FramerType.ASCII]) @pytest.mark.parametrize(("is_server"), [False, True]) @pytest.mark.parametrize(("msg"), [