puresnmp
puresnmp copied to clipboard
IndexError: list index out of range
Issue Description:
Execution is hitting a Python exception when corrupt SNMP data is received. Is it possible to make it defensive here? This isn't happening frequently so I am unable to regenerate it.
Trace:
Dec 08 19:20:34 preseem-5000-ks preseem-network-poller[878059]: Traceback (most recent call last): Dec 08 19:20:34 preseem-5000-ks preseem-network-poller[878059]: File "/usr/lib/preseem/netpoll/snmp_client.py", line 241, in snmp_walk2 Dec 08 19:20:34 preseem-5000-ks preseem-network-poller[878059]: async for x in rows: Dec 08 19:20:34 preseem-5000-ks preseem-network-poller[878059]: File "/usr/local/lib/python3.9/site-packages/puresnmp/aio/api/raw.py", line 216, in walk Dec 08 19:20:34 preseem-5000-ks preseem-network-poller[878059]: async for varbind in gen: Dec 08 19:20:34 preseem-5000-ks preseem-network-poller[878059]: File "/usr/local/lib/python3.9/site-packages/puresnmp/aio/api/raw.py", line 265, in multiwalk Dec 08 19:20:34 preseem-5000-ks preseem-network-poller[878059]: varbinds = await fetcher( Dec 08 19:20:34 preseem-5000-ks preseem-network-poller[878059]: File "/usr/local/lib/python3.9/site-packages/puresnmp/aio/api/raw.py", line 164, in multigetnext Dec 08 19:20:34 preseem-5000-ks preseem-network-poller[878059]: Sequence.from_bytes(response) Dec 08 19:20:34 preseem-5000-ks preseem-network-poller[878059]: File "/usr/local/lib/python3.9/site-packages/puresnmp/x690/types.py", line 169, in from_bytes Dec 08 19:20:34 preseem-5000-ks preseem-network-poller[878059]: return cls.decode(data) Dec 08 19:20:34 preseem-5000-ks preseem-network-poller[878059]: File "/usr/local/lib/python3.9/site-packages/puresnmp/x690/types.py", line 382, in decode Dec 08 19:20:34 preseem-5000-ks preseem-network-poller[878059]: value, data = pop_tlv(data) Dec 08 19:20:34 preseem-5000-ks preseem-network-poller[878059]: File "/usr/local/lib/python3.9/site-packages/puresnmp/x690/types.py", line 117, in pop_tlv Dec 08 19:20:34 preseem-5000-ks preseem-network-poller[878059]: value = cls.from_bytes(chunk) Dec 08 19:20:34 preseem-5000-ks preseem-network-poller[878059]: File "/usr/local/lib/python3.9/site-packages/puresnmp/x690/types.py", line 169, in from_bytes Dec 08 19:20:34 preseem-5000-ks preseem-network-poller[878059]: return cls.decode(data) Dec 08 19:20:34 preseem-5000-ks preseem-network-poller[878059]: File "/usr/local/lib/python3.9/site-packages/puresnmp/pdu.py", line 222, in decode Dec 08 19:20:34 preseem-5000-ks preseem-network-poller[878059]: return super(GetResponse, cls).decode(data) Dec 08 19:20:34 preseem-5000-ks preseem-network-poller[878059]: File "/usr/local/lib/python3.9/site-packages/puresnmp/pdu.py", line 74, in decode Dec 08 19:20:34 preseem-5000-ks preseem-network-poller[878059]: offending_oid = varbinds[error_index.value-1].oid Dec 08 19:20:34 preseem-5000-ks preseem-network-poller[878059]: IndexError: list index out of range
Code Snippet: /puresnmp/pdu.py
63 if error_status.value:
64 error_detail, data = cast(
65 Tuple[Iterable[Tuple[ObjectIdentifier, int]], bytes],
66 pop_tlv(data)
67 )
68 if not isinstance(error_detail, Sequence):
69 raise TypeError(
70 'error-detail should be a sequence but got %r' %
71 type(error_detail))
72 varbinds = [VarBind(*raw_varbind) for raw_varbind in error_detail]
73 if error_index.value != 0:
74 offending_oid = varbinds[error_index.value-1].oid
75 else:
76 # Offending OID is unknown
77 offending_oid = None
78 assert data == b''
79 exception = ErrorResponse.construct(
80 error_status.value, offending_oid)
81 raise exception