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