Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions can/interfaces/gs_usb.py
Original file line number Diff line number Diff line change
Expand Up @@ -142,14 +142,14 @@ def send(self, msg: can.Message, timeout: float | None = None) -> None:
if msg.is_error_frame:
can_id = can_id | CAN_ERR_FLAG

# Pad message data
msg.data.extend([0x00] * (CAN_MAX_DLC - len(msg.data)))
# Copy and pad message data without mutating msg.data
msg_data = msg.data + bytearray([0x00] * (CAN_MAX_DLC - len(msg.data)))

frame = GsUsbFrame()
frame.can_id = can_id
frame.can_dlc = msg.dlc
frame.timestamp_us = 0 # timestamp frame field is only useful on receive
frame.data = list(msg.data)
frame.data = list(msg_data)

try:
self.gs_usb.send(frame)
Expand Down
1 change: 1 addition & 0 deletions doc/changelog.d/2085.fixed.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fixed gs_usb.py modyfying the data member of the can.Message msg passed to GsUsbBus send method.
20 changes: 20 additions & 0 deletions test/test_interface_gs_usb.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

from unittest.mock import MagicMock, patch

import can
import pytest

from can.interfaces.gs_usb import (
Expand Down Expand Up @@ -65,3 +66,22 @@ def test_find_devices_returns_empty_list_when_no_devices(mock_find):
devices = _find_gs_usb_devices()

assert devices == []


@patch("can.interfaces.gs_usb.GsUsb")
@patch("can.interfaces.gs_usb._find_gs_usb_devices")
def test_send_dlc_zero_does_not_modify_message_data(mock_find_devices, mock_gs_usb_cls):
"""Verify that send() does not mutate msg.data when DLC < CAN_MAX_DLC."""
mock_find_devices.return_value = [MagicMock()]
mock_gs_usb = MagicMock()
mock_gs_usb_cls.return_value = mock_gs_usb
mock_gs_usb.device_capability.fclk_can = 48_000_000

bus = GsUsbBus(channel=0, bitrate=500_000)
msg = can.Message(arbitration_id=0x123, data=bytearray(), dlc=0)
msg_data_copy = msg.data.copy()

bus.send(msg)

assert msg.data == msg_data_copy
mock_gs_usb.send.assert_called_once()