Changeset 871:07926fd7d007

Show
Ignore:
Timestamp:
08/15/08 19:59:52 (3 months ago)
Author:
Phil <phil@secdev.org>
Message:

Improved DHCP options decoding (ticket #105) (warning: semantic change)

DHCP option item could be a tuple ("option_name", value) or
("option_name", value, remainder). This form is now:
("option_name", value1 [, value2 [,...]])

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • scapy/layers/dhcp.py

    r870 r871  
    152152        s = [] 
    153153        for v in x: 
    154             if type(v) is tuple and len(v) in [2,3]
     154            if type(v) is tuple and len(v) >= 2
    155155                if  DHCPRevOptions.has_key(v[0]) and isinstance(DHCPRevOptions[v[0]][1],Field): 
    156156                    f = DHCPRevOptions[v[0]][1] 
    157                     vv = f.i2repr(pkt,v[1]) 
     157                    vv = ",".join(f.i2repr(pkt,val) for val in v[1:]) 
    158158                else: 
    159                     vv = repr(v[1]) 
     159                    vv = ",".join(repr(val) for val in v[1:]) 
    160160                r = "%s=%s" % (v[0],vv) 
    161                 if len(v) > 2: 
    162                     r += " (garbage=%r)" % v[2] 
    163161                s.append(r) 
    164162            else: 
     
    192190                else: 
    193191                    olen = ord(x[1]) 
     192                    lval = [f.name] 
    194193                    try: 
    195                         left, val = f.getfield(pkt,x[2:olen+2]) 
     194                        left = x[2:olen+2] 
     195                        while left: 
     196                            left, val = f.getfield(pkt,left) 
     197                            lval.append(val) 
    196198                    except: 
    197199                        opt.append(x) 
    198200                        break 
    199                     if left: 
    200                         otuple = (f.name, val, left) 
    201201                    else: 
    202                         otuple = (f.name, val) 
     202                        otuple = tuple(lval) 
    203203                    opt.append(otuple) 
    204204                    x = x[olen+2:] 
     
    213213        s = "" 
    214214        for o in x: 
    215             if type(o) is tuple and len(o) in [2,3]: 
    216                 name, val = o[:2] 
     215            if type(o) is tuple and len(o) >= 2: 
     216                name = o[0] 
     217                lval = o[1:] 
    217218 
    218219                if isinstance(name, int): 
    219                     onum, oval = name, val 
     220                    onum, oval = name, "".join(lval) 
    220221                elif DHCPRevOptions.has_key(name): 
    221222                    onum, f = DHCPRevOptions[name] 
    222                     if  f is None: 
    223                         oval = val 
    224                     else: 
    225                         oval = f.addfield(pkt,"",f.any2i(pkt,val)) 
     223                    if  f is not None: 
     224                        lval = [f.addfield(pkt,"",f.any2i(pkt,val)) for val in lval] 
     225                    oval = "".join(lval) 
    226226                else: 
    227227                    warning("Unknown field option %s" % name) 
    228228                    continue 
    229                 if len(o) > 2: 
    230                     oval += o[2] 
    231229 
    232230                s += chr(onum)