puresnmp icon indicating copy to clipboard operation
puresnmp copied to clipboard

IndexError: list index out of range

Open ishanasse opened this issue 3 years ago • 0 comments

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

ishanasse avatar Dec 09 '21 15:12 ishanasse