-
-
Notifications
You must be signed in to change notification settings - Fork 2.2k
Closed
Labels
Description
Hi guys,
Brief description
MultipleTypeField doesn't apply default values for its flds, but uses default of dflt instead.
Per my understanding this is a bug.
Environment
- Scapy version: 2.4.2
- Python version:
3.5
How to reproduce
from scapy.all import *
class MyPack(Packet):
name = 'MY'
fields_desc = [
IntField('switch', 0),
MultipleTypeField([
(XShortField('myfield', 0xDEAD), lambda pkt: pkt.switch == 1),
(XIntField('myfield', 0xBEEFBEEF), lambda pkt: pkt.switch == 2)],
XByteField('myfield', 0x88)
)
]
o = MyPack()
o.show()
o = MyPack(b'\x00\x00\x00\x02\x77\x77\x77\x77')
o.show()
o = MyPack(switch=2, myfield=0xBEEFBEEF)
o.show()
o = MyPack(switch=1)
o.show()Actual result
###[ MY ]###
switch = 0
myfield = 0x88
###[ MY ]###
switch = 2
myfield = 0x77777777
###[ MY ]###
switch = 2
myfield = 0xbeefbeef
###[ MY ]###
switch = 1
myfield = 0x88 <--- problem. should be 0xDEAD
Expected result
First three ctors are OK, but the last one MyPack(switch=1) doesn't apply XShortField('myfield', 0xDEAD) using given switch
Even worse things happen when using larger field for dflt:
class MyPack(Packet):
name = 'MY'
fields_desc = [
IntField('switch', 0),
MultipleTypeField([
(XByteField('myfield', 0x88), lambda pkt: pkt.switch == 1),
(XIntField('myfield', 0xBEEFBEEF), lambda pkt: pkt.switch == 2)],
XShortField('myfield', 0xDEAD)
)
]
o = MyPack(switch=1)
o.show2() File "/usr/local/lib/python3.5/dist-packages/scapy/fields.py", line 134, in addfield
return s + struct.pack(self.fmt, self.i2m(pkt, val))
struct.error: ubyte format requires 0 <= number <= 255
Thanks in advance,
--Dmitry