Skip to content

Commit 6bdf926

Browse files
allow only valid fd message lengths
1 parent e750caa commit 6bdf926

File tree

1 file changed

+10
-7
lines changed

1 file changed

+10
-7
lines changed

can/interfaces/socketcan/socketcan.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,8 @@ def build_can_frame(msg: Message) -> bytes:
238238

239239
data = bytes(msg.data).ljust(max_len, b"\x00")
240240

241-
return CAN_FRAME_HEADER_STRUCT.pack(can_id, len(msg.data), flags, msg.dlc) + data
241+
data_len = min(i for i in can.util.CAN_FD_DLC if i >= len(msg.data))
242+
return CAN_FRAME_HEADER_STRUCT.pack(can_id, data_len, flags, msg.dlc) + data
242243

243244

244245
def build_bcm_header(
@@ -321,17 +322,20 @@ def dissect_can_frame(frame: bytes) -> Tuple[int, int, int, bytes]:
321322
# Flags not valid in non-FD frames
322323
flags = 0
323324

325+
if data_len not in can.util.CAN_FD_DLC:
326+
data_len = min(i for i in can.util.CAN_FD_DLC if i >= data_len)
327+
324328
# Allow deprecated can frames with old struct
325329
if (
326-
data_len == constants.CAN_MAX_DLEN and
327-
len8_dlc > constants.CAN_MAX_DLEN and
328-
len8_dlc <= constants.CAN_MAX_RAW_DLC
330+
data_len == constants.CAN_MAX_DLEN
331+
and len8_dlc > constants.CAN_MAX_DLEN
332+
and len8_dlc <= constants.CAN_MAX_RAW_DLC
329333
):
330334
can_dlc = len8_dlc
331335
else:
332336
can_dlc = data_len
333337

334-
return can_id, can_dlc, flags, frame[8: 8 + data_len]
338+
return can_id, can_dlc, flags, frame[8 : 8 + data_len]
335339

336340

337341
def create_bcm_socket(channel: str) -> socket.socket:
@@ -359,8 +363,7 @@ def send_bcm(bcm_socket: socket.socket, data: bytes) -> int:
359363
else:
360364
specific_message = ""
361365

362-
raise can.CanOperationError(
363-
base + specific_message, error.errno) from error
366+
raise can.CanOperationError(base + specific_message, error.errno) from error
364367

365368

366369
def _compose_arbitration_id(message: Message) -> int:

0 commit comments

Comments
 (0)