Parse anonymous LF_UNION type (#1013)

This commit is contained in:
MS 2024-06-09 13:52:04 -04:00 committed by GitHub
parent be4c351d7d
commit 0dca127649
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 26 additions and 2 deletions

View file

@ -221,7 +221,7 @@ class CvdumpTypesParser:
) )
LF_ENUM_UDT = re.compile(r"^\s*UDT\((?P<udt>0x\w+)\)$") LF_ENUM_UDT = re.compile(r"^\s*UDT\((?P<udt>0x\w+)\)$")
LF_UNION_LINE = re.compile( LF_UNION_LINE = re.compile(
r"^.*field list type (?P<field_type>0x\w+),.*Size = (?P<size>\d+)\s*,class name = (?P<name>(?:[^,]|,\S)+),\s.*UDT\((?P<udt>0x\w+)\)$" r"^.*field list type (?P<field_type>0x\w+),.*Size = (?P<size>\d+)\s*,class name = (?P<name>(?:[^,]|,\S)+)(?:,\s.*UDT\((?P<udt>0x\w+)\))?$"
) )
MODES_OF_INTEREST = { MODES_OF_INTEREST = {
@ -659,4 +659,5 @@ def read_union_line(self, line: str):
self._set("is_forward_ref", True) self._set("is_forward_ref", True)
self._set("size", int(match.group("size"))) self._set("size", int(match.group("size")))
self._set("udt", normalize_type_id(match.group("udt"))) if match.group("udt") is not None:
self._set("udt", normalize_type_id(match.group("udt")))

View file

@ -551,3 +551,26 @@ def test_fieldlist_enumerate(parser: CvdumpTypesParser):
{"name": "c_text", "value": 4}, {"name": "c_text", "value": 4},
], ],
} }
UNNAMED_UNION_DATA = """
0x369d : Length = 34, Leaf = 0x1203 LF_FIELDLIST
list[0] = LF_MEMBER, public, type = T_32PRCHAR(0470), offset = 0
member name = 'sz'
list[1] = LF_MEMBER, public, type = T_32PUSHORT(0421), offset = 0
member name = 'wz'
0x369e : Length = 22, Leaf = 0x1506 LF_UNION
# members = 2, field list type 0x369d, NESTED, Size = 4 ,class name = __unnamed
"""
def test_unnamed_union():
"""Make sure we can parse anonymous union types without a UDT"""
parser = CvdumpTypesParser()
for line in UNNAMED_UNION_DATA.split("\n"):
parser.read_line(line)
# Make sure we can parse the members line
union = parser.keys["0x369e"]
assert union["size"] == 4