Changeset 871:07926fd7d007
- Timestamp:
- 08/15/08 19:59:52
(5 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
| r870 |
r871 |
|
| 152 | 152 | s = [] |
|---|
| 153 | 153 | 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: |
|---|
| 155 | 155 | if DHCPRevOptions.has_key(v[0]) and isinstance(DHCPRevOptions[v[0]][1],Field): |
|---|
| 156 | 156 | f = DHCPRevOptions[v[0]][1] |
|---|
| 157 | | vv = f.i2repr(pkt,v[1]) |
|---|
| | 157 | vv = ",".join(f.i2repr(pkt,val) for val in v[1:]) |
|---|
| 158 | 158 | else: |
|---|
| 159 | | vv = repr(v[1]) |
|---|
| | 159 | vv = ",".join(repr(val) for val in v[1:]) |
|---|
| 160 | 160 | r = "%s=%s" % (v[0],vv) |
|---|
| 161 | | if len(v) > 2: |
|---|
| 162 | | r += " (garbage=%r)" % v[2] |
|---|
| 163 | 161 | s.append(r) |
|---|
| 164 | 162 | else: |
|---|
| … | … | |
| 192 | 190 | else: |
|---|
| 193 | 191 | olen = ord(x[1]) |
|---|
| | 192 | lval = [f.name] |
|---|
| 194 | 193 | 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) |
|---|
| 196 | 198 | except: |
|---|
| 197 | 199 | opt.append(x) |
|---|
| 198 | 200 | break |
|---|
| 199 | | if left: |
|---|
| 200 | | otuple = (f.name, val, left) |
|---|
| 201 | 201 | else: |
|---|
| 202 | | otuple = (f.name, val) |
|---|
| | 202 | otuple = tuple(lval) |
|---|
| 203 | 203 | opt.append(otuple) |
|---|
| 204 | 204 | x = x[olen+2:] |
|---|
| … | … | |
| 213 | 213 | s = "" |
|---|
| 214 | 214 | 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:] |
|---|
| 217 | 218 | |
|---|
| 218 | 219 | if isinstance(name, int): |
|---|
| 219 | | onum, oval = name, val |
|---|
| | 220 | onum, oval = name, "".join(lval) |
|---|
| 220 | 221 | elif DHCPRevOptions.has_key(name): |
|---|
| 221 | 222 | 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) |
|---|
| 226 | 226 | else: |
|---|
| 227 | 227 | warning("Unknown field option %s" % name) |
|---|
| 228 | 228 | continue |
|---|
| 229 | | if len(o) > 2: |
|---|
| 230 | | oval += o[2] |
|---|
| 231 | 229 | |
|---|
| 232 | 230 | s += chr(onum) |
|---|