From 0db2a8cfb02195e6bba777ef9794fd33e605f11f Mon Sep 17 00:00:00 2001 From: Phil <phil@secdev.org> Date: Fri, 15 Aug 2008 19:59:52 +0200 Subject: [PATCH] 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 [,...]]) --- scapy/layers/dhcp.py | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/scapy/layers/dhcp.py b/scapy/layers/dhcp.py index 8f45d820..fdb4d717 100644 --- a/scapy/layers/dhcp.py +++ b/scapy/layers/dhcp.py @@ -151,15 +151,13 @@ class DHCPOptionsField(StrField): def i2repr(self,pkt,x): s = [] for v in x: - if type(v) is tuple and len(v) in [2,3]: + if type(v) is tuple and len(v) >= 2: if DHCPRevOptions.has_key(v[0]) and isinstance(DHCPRevOptions[v[0]][1],Field): f = DHCPRevOptions[v[0]][1] - vv = f.i2repr(pkt,v[1]) + vv = ",".join(f.i2repr(pkt,val) for val in v[1:]) else: - vv = repr(v[1]) + vv = ",".join(repr(val) for val in v[1:]) r = "%s=%s" % (v[0],vv) - if len(v) > 2: - r += " (garbage=%r)" % v[2] s.append(r) else: s.append(sane(v)) @@ -191,15 +189,17 @@ class DHCPOptionsField(StrField): x = x[olen+2:] else: olen = ord(x[1]) + lval = [f.name] try: - left, val = f.getfield(pkt,x[2:olen+2]) + left = x[2:olen+2] + while left: + left, val = f.getfield(pkt,left) + lval.append(val) except: opt.append(x) break - if left: - otuple = (f.name, val, left) else: - otuple = (f.name, val) + otuple = tuple(lval) opt.append(otuple) x = x[olen+2:] else: @@ -212,22 +212,20 @@ class DHCPOptionsField(StrField): return x s = "" for o in x: - if type(o) is tuple and len(o) in [2,3]: - name, val = o[:2] + if type(o) is tuple and len(o) >= 2: + name = o[0] + lval = o[1:] if isinstance(name, int): - onum, oval = name, val + onum, oval = name, "".join(lval) elif DHCPRevOptions.has_key(name): onum, f = DHCPRevOptions[name] - if f is None: - oval = val - else: - oval = f.addfield(pkt,"",f.any2i(pkt,val)) + if f is not None: + lval = [f.addfield(pkt,"",f.any2i(pkt,val)) for val in lval] + oval = "".join(lval) else: warning("Unknown field option %s" % name) continue - if len(o) > 2: - oval += o[2] s += chr(onum) s += chr(len(oval)) -- GitLab