diff options
| author | Peter LaFosse <peter@vector35.com> | 2023-04-10 15:10:01 -0400 |
|---|---|---|
| committer | Peter LaFosse <peter@vector35.com> | 2023-04-18 08:43:13 -0400 |
| commit | 72f2b74a7ab8e3494b2eae7470ce147db436e221 (patch) | |
| tree | de9345f38adf26d0df9034765804f8b21a360ac0 /python/types.py | |
| parent | 35adefaa9d1ecf5e8c09a787dbd6bda1d1a49325 (diff) | |
Fix deserialization of EnumerationMember values
Diffstat (limited to 'python/types.py')
| -rw-r--r-- | python/types.py | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/python/types.py b/python/types.py index ee47c841..0b68bd54 100644 --- a/python/types.py +++ b/python/types.py @@ -60,6 +60,24 @@ MemberOffset = int TB = TypeVar('TB', bound='TypeBuilder') +def convert_integer(value: ctypes.c_uint64, signed: bool, width: int) -> int: + if width not in [1, 2, 4, 8]: + raise ValueError("Width must be 1, 2, 4, or 8 bytes") + func = { + True: { + 1: ctypes.c_int8, + 2: ctypes.c_int16, + 4: ctypes.c_int32, + 8: ctypes.c_int64 + }, + False: { + 1: ctypes.c_uint8, + 2: ctypes.c_uint16, + 4: ctypes.c_uint32, + 8: ctypes.c_uint64 + } + } + return func[bool(signed)][width](value).value class QualifiedName: def __init__(self, name: Optional[QualifiedNameType] = None): @@ -1510,10 +1528,12 @@ class EnumerationBuilder(TypeBuilder): members = core.BNGetEnumerationBuilderMembers(self.enum_builder_handle, count) assert members is not None, "core.BNGetEnumerationBuilderMembers returned None" result = [] + try: for i in range(count.value): + value = convert_integer(members[i].value, self.signed, self.width) result.append( - EnumerationMember(members[i].name, members[i].value if not members[i].isDefault else None) + EnumerationMember(members[i].name, value if not members[i].isDefault else None) ) return result finally: @@ -2563,7 +2583,8 @@ class EnumerationType(IntegerType): try: result = [] for i in range(0, count.value): - result.append(EnumerationMember(members[i].name, members[i].value if not members[i].isDefault else None)) + value = convert_integer(members[i].value, self.signed, self.width) + result.append(EnumerationMember(members[i].name, value if not members[i].isDefault else None)) return result finally: core.BNFreeEnumerationMemberList(members, count.value) |
