kbandla / dpkt

fast, simple packet creation / parsing, with definitions for the basic TCP/IP protocols
Other
1.09k stars 270 forks source link

fix #477 catch IndexError and raise NeedData; minor pep8 fixes #489

Closed obormot closed 4 years ago

obormot commented 4 years ago

See #477 for Traceback before the fix. Testing the same packet buffer after this fix makes dpkt to partially parse the packet (Ethernet - IP6 - ICMP6 - raw data), and not crash.

>>> Ethernet(pk)
Ethernet(dst=b'RT\x00\xf3\x83o', src=b'RT\x00\x863\xd9', type=34525, 
data=IP6(plen=1288, nxt=58, hlim=255, src=b'\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02', dst=b'\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01', extension_hdrs={}, all_extension_headers=[], p=58, 
data=ICMP6(type=2, sum=54003, 
data=b'\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00P\xd44\x1aH$Pm\x8d\xb3\xc2\x80\x10\x01\xf6F\xe8\x00\x00\x01\x01\x08\n\xd7\x9dk\x8a:\xd1\xf4Xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')))

Applying IP6 to the remaining raw data raises the NeedData exception:

>>> IP6(Ethernet(pk).ip6.icmp6.data)
Traceback (most recent call last):
  File "/Users/oscar/pyenvs/dpkt/dpkt/dpkt/ip6.py", line 161, in unpack
    opt_type = compat_ord(self.data[index])
IndexError: index out of range

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/oscar/pyenvs/dpkt/dpkt/dpkt/dpkt.py", line 89, in __init__
    self.unpack(args[0])
  File "/Users/oscar/pyenvs/dpkt/dpkt/dpkt/ip6.py", line 83, in unpack
    ext = EXT_HDRS_CLS[next_ext_hdr](buf)
  File "/Users/oscar/pyenvs/dpkt/dpkt/dpkt/dpkt.py", line 89, in __init__
    self.unpack(args[0])
  File "/Users/oscar/pyenvs/dpkt/dpkt/dpkt/ip6.py", line 185, in unpack
    raise dpkt.NeedData
dpkt.dpkt.NeedData
coveralls commented 4 years ago

Coverage Status

Coverage increased (+0.08%) to 89.533% when pulling 7972f590bbb4e296fc7b78fcbe914d0acd4f4772 on fix-#477 into 6815b5b47cd1b028cec432fc6124eeec1b614df1 on master.

crosser commented 4 years ago

Confirm that it now works as expected in my original scenario. Thank you!