Skip to content

Commit cb1622a

Browse files
authored
pdo: Fix wrongfully returned object for missing index (#636)
The fallback behavior in PdoMaps.__getitem__() tried looking up by parameter record index even when no com_offset or map_offset was defined. This caused a possibly wrong PdoMap object to be returned. For example with 0x15FF, the lookup for 0x1600 would succeed. Add a test to make sure that an nonexistant parameter record index for 0x15FF actually does raise a KeyError. Skip the fallback lookup by parameter index if no record offsets are defined.
1 parent 9685880 commit cb1622a

2 files changed

Lines changed: 7 additions & 4 deletions

File tree

canopen/pdo/base.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -175,10 +175,12 @@ def __getitem__(self, key: int) -> PdoMap:
175175
try:
176176
return self.maps[key]
177177
except KeyError:
178-
with contextlib.suppress(KeyError):
179-
return self.maps[key + 1 - self.map_offset]
180-
with contextlib.suppress(KeyError):
181-
return self.maps[key + 1 - self.com_offset]
178+
if self.map_offset:
179+
with contextlib.suppress(KeyError):
180+
return self.maps[key + 1 - self.map_offset]
181+
if self.com_offset:
182+
with contextlib.suppress(KeyError):
183+
return self.maps[key + 1 - self.com_offset]
182184
raise
183185

184186
def __iter__(self) -> Iterator[int]:

test/test_pdo.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ def test_pdo_getitem(self):
8080
self.assertRaises(KeyError, lambda: node.pdo['DOES NOT EXIST'])
8181
self.assertRaises(KeyError, lambda: node.pdo[0x1BFF])
8282
self.assertRaises(KeyError, lambda: node.tpdo[0x1BFF])
83+
self.assertRaises(KeyError, lambda: node.pdo[0x15FF])
8384

8485
def test_pdo_iterate(self):
8586
node = self.node

0 commit comments

Comments
 (0)