forked from ojasookert/CVE-2017-0785
-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathutils.py
More file actions
35 lines (28 loc) · 1.33 KB
/
utils.py
File metadata and controls
35 lines (28 loc) · 1.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import struct
def _reverse_dict(d):
return dict(map(reversed, d.items()))
def create_struct_funcs(format_, definition):
struct_format = format_ + ''.join(map(lambda field: field[1], definition))
keys = list(map(lambda field: field[0], definition))
mappers = dict(map(lambda field: (field[0], field[2]),
filter(lambda field: len(field) > 2, definition)))
reverse_mappers = dict(map(lambda item: (item[0], _reverse_dict(item[1])),
mappers.items()))
def pack(**kwargs):
unknown_fields = set(kwargs.keys()) - set(keys)
missing_fields = set(keys) - set(kwargs.keys())
if len(unknown_fields) > 0:
raise TypeError('Unknown field(s): {!r}'.format(unknown_fields))
if len(missing_fields) > 0:
raise TypeError('Missing field(s): {!r}'.format(missing_fields))
for key, mapper in mappers.items():
kwargs[key] = mapper[kwargs[key]]
return struct.pack(struct_format, *map(lambda key: kwargs[key], keys))
def unpack(data):
result = dict(zip(keys, struct.unpack(struct_format, data)))
for key, mapper in reverse_mappers.items():
result[key] = mapper[result[key]]
return result
def size():
return struct.calcsize(struct_format)
return pack, unpack, size