diff --git a/bumble/sdp.py b/bumble/sdp.py index a7f83286..969c867c 100644 --- a/bumble/sdp.py +++ b/bumble/sdp.py @@ -594,7 +594,10 @@ class SDP_PDU: @classmethod def from_bytes(cls, pdu: bytes) -> SDP_PDU: - pdu_id, transaction_id, _parameters_length = struct.unpack_from('>BHH', pdu, 0) + pdu_id, transaction_id, parameters_length = struct.unpack_from('>BHH', pdu, 0) + + if len(pdu) != 5 + parameters_length: + logger.warning("Expect %d bytes, got %d", 5 + parameters_length, len(pdu)) subclass = cls.subclasses.get(pdu_id) if not (subclass := cls.subclasses.get(pdu_id)): @@ -616,9 +619,11 @@ def subclass(cls, subclass: type[_PDU]) -> type[_PDU]: def __bytes__(self): if self._payload is None: - self._payload = struct.pack( - '>BHH', self.pdu_id, self.transaction_id, 0 - ) + hci.HCI_Object.dict_to_bytes(self.__dict__, self.fields) + parameters = hci.HCI_Object.dict_to_bytes(self.__dict__, self.fields) + self._payload = ( + struct.pack('>BHH', self.pdu_id, self.transaction_id, len(parameters)) + + parameters + ) return self._payload @property diff --git a/tests/sdp_test.py b/tests/sdp_test.py index 8fa58f32..31c569a1 100644 --- a/tests/sdp_test.py +++ b/tests/sdp_test.py @@ -18,9 +18,11 @@ import asyncio import logging import os +import re import pytest +from bumble import sdp from bumble.core import BT_L2CAP_PROTOCOL_ID, UUID from bumble.sdp import ( SDP_BROWSE_GROUP_LIST_ATTRIBUTE_ID, @@ -206,6 +208,16 @@ def sdp_records(record_count=1): } +# ----------------------------------------------------------------------------- +def test_pdu_parameter_length(caplog) -> None: + caplog.set_level(logging.WARNING) + pdu = sdp.SDP_ErrorResponse( + transaction_id=0, error_code=sdp.ErrorCode.INVALID_SDP_VERSION + ) + assert sdp.SDP_PDU.from_bytes(bytes(pdu)) == pdu + assert not re.search("Expect \d+ bytes, got \d+", caplog.text) + + # ----------------------------------------------------------------------------- @pytest.mark.asyncio async def test_service_search():