Skip to content

MultipleTypeField: wrong default applied #1955

@avekceeb

Description

@avekceeb

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions