Skip to content

Commit 67324f1

Browse files
authored
Fix decoding error in Kvaser constructor for non-ASCII product name (hardbyte#1613)
* Implement test to trigger ASCII decoding error in Kvaser bus constructor * Change handling of invalid chars in Kvaser device name Previously, illegal characters triggered an exception. With the new behavior, illegal characters will be replaced with a placeholder value. * Rename variables in test
1 parent 1df6604 commit 67324f1

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed

can/interfaces/kvaser/canlib.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -727,7 +727,8 @@ def get_channel_info(channel):
727727
ctypes.sizeof(number),
728728
)
729729

730-
return f"{name.value.decode('ascii')}, S/N {serial.value} (#{number.value + 1})"
730+
name_decoded = name.value.decode("ascii", errors="replace")
731+
return f"{name_decoded}, S/N {serial.value} (#{number.value + 1})"
731732

732733

733734
init_kvaser_library()

test/test_kvaser.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"""
44
"""
55

6+
import ctypes
67
import time
78
import unittest
89
from unittest.mock import Mock
@@ -49,6 +50,26 @@ def test_bus_creation(self):
4950
self.assertTrue(canlib.canOpenChannel.called)
5051
self.assertTrue(canlib.canBusOn.called)
5152

53+
def test_bus_creation_illegal_channel_name(self):
54+
# Test if the bus constructor is able to deal with non-ASCII characters
55+
def canGetChannelDataMock(
56+
channel: ctypes.c_int,
57+
param: ctypes.c_int,
58+
buf: ctypes.c_void_p,
59+
bufsize: ctypes.c_size_t,
60+
):
61+
if param == constants.canCHANNELDATA_DEVDESCR_ASCII:
62+
buf_char_ptr = ctypes.cast(buf, ctypes.POINTER(ctypes.c_char))
63+
for i, char in enumerate(b"hello\x7a\xcb"):
64+
buf_char_ptr[i] = char
65+
66+
canlib.canGetChannelData = canGetChannelDataMock
67+
bus = can.Bus(channel=0, interface="kvaser")
68+
69+
self.assertTrue(bus.channel_info.startswith("hello"))
70+
71+
bus.shutdown()
72+
5273
def test_bus_shutdown(self):
5374
self.bus.shutdown()
5475
self.assertTrue(canlib.canBusOff.called)

0 commit comments

Comments
 (0)