diff options
| author | Peter LaFosse <peter@vector35.com> | 2021-10-26 12:30:53 -0400 |
|---|---|---|
| committer | Peter LaFosse <peter@vector35.com> | 2021-11-05 10:30:12 -0400 |
| commit | 2386158d10d402b7783ab6f1253f548d230896c8 (patch) | |
| tree | 49466741f8e27a86c739438fbcc8d12209e3e702 /python | |
| parent | 9290bd614d83b389ba0c1159379d3d357c658b1e (diff) | |
Properly calculate the width of NamedTypeReferences in TypedDataReader
Diffstat (limited to 'python')
| -rw-r--r-- | python/binaryview.py | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/python/binaryview.py b/python/binaryview.py index ba7748a2..c1bfde83 100644 --- a/python/binaryview.py +++ b/python/binaryview.py @@ -7984,22 +7984,26 @@ class TypedDataReader: assert isinstance(self.type, _types.Type), "Attempting to create TypedDataReader with TypeBuilder" def __bytes__(self): - return self.view.read(self.address, len(self.type)) + return self.view.read(self.address, len(self)) def __repr__(self): return f"<TypedDataReader type:{self.type} value:{self.value}>" def __len__(self): - return len(self.type) + _type = self.type + if isinstance(_type, _types.NamedTypeReferenceType): + _type = _type.target(self.view) + assert _type is not None + return len(_type) def __int__(self): _type = self.type if isinstance(_type, _types.NamedTypeReferenceType): _type = _type.target(self.view) if isinstance(_type, _types.PointerType): - return self.int_from_bytes(bytes(self), _type.width, False, self.endian) + return self.int_from_bytes(bytes(self), len(self), False, self.endian) elif isinstance(_type, (_types.IntegerType, _types.EnumerationType)): - return self.int_from_bytes(bytes(self), _type.width, bool(_type.signed), self.endian) + return self.int_from_bytes(bytes(self), len(self), bool(_type.signed), self.endian) raise Exception(f"Attempting to coerce non integral type: {type(_type)} to an integer") def __getitem__(self, key:Union[str, int]) -> 'TypedDataReader': |
