From 95549bab101423802355ef6d84c8b3a752ff9917 Mon Sep 17 00:00:00 2001 From: sMezaOrellana Date: Fri, 29 Nov 2024 22:59:23 +0100 Subject: [PATCH 1/4] Add support for newlines inside and correct parsing of expression --- addrin.py | 10 ++++++++++ dissect/cstruct/expression.py | 2 +- dissect/cstruct/parser.py | 2 +- sockaddr.py | 0 structs.h | 21 +++++++++++++++++++++ 5 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 addrin.py create mode 100644 sockaddr.py create mode 100644 structs.h diff --git a/addrin.py b/addrin.py new file mode 100644 index 0000000..3fad4ad --- /dev/null +++ b/addrin.py @@ -0,0 +1,10 @@ +from dissect.cstruct import cstruct, dumpstruct + +if __name__ == '__main__': + definitions = 'structs.h' + contents = '' + with open(definitions, "r") as file: + contents = file.read() + + structs = cstruct() + structs.load(contents) diff --git a/dissect/cstruct/expression.py b/dissect/cstruct/expression.py index 1cc3c0a..fc0518e 100644 --- a/dissect/cstruct/expression.py +++ b/dissect/cstruct/expression.py @@ -142,7 +142,7 @@ def tokenize(self) -> list[str]: self.tokens.append(">>") elif self.match(expected="<", append=False) and self.match(expected="<", append=False): self.tokens.append("<<") - elif self.match(expected={" ", "\t"}, append=False): + elif self.match(expected={" ", "\n", "\t"}, append=False): continue else: raise ExpressionTokenizerError( diff --git a/dissect/cstruct/parser.py b/dissect/cstruct/parser.py index 7634113..77a8800 100644 --- a/dissect/cstruct/parser.py +++ b/dissect/cstruct/parser.py @@ -63,7 +63,7 @@ def _tokencollection() -> TokenCollection: "ENUM", ) TOK.add(r"(?<=})\s*(?P(?:[a-zA-Z0-9_]+\s*,\s*)+[a-zA-Z0-9_]+)\s*(?=;)", "DEFS") - TOK.add(r"(?P\**?\s*[a-zA-Z0-9_]+)(?:\s*:\s*(?P\d+))?(?:\[(?P[^;\n]*)\])?\s*(?=;)", "NAME") + TOK.add(r"(?P\**?\s*[a-zA-Z0-9_]+)(?:\s*:\s*(?P\d+))?(?:\[(?P[^;]*)\])?\s*(?=;)", "NAME") TOK.add(r"[a-zA-Z_][a-zA-Z0-9_]*", "IDENTIFIER") TOK.add(r"[{}]", "BLOCK") TOK.add(r"\$(?P[^\s]+) = (?P{[^}]+})\w*[\r\n]+", "LOOKUP") diff --git a/sockaddr.py b/sockaddr.py new file mode 100644 index 0000000..e69de29 diff --git a/structs.h b/structs.h new file mode 100644 index 0000000..340067a --- /dev/null +++ b/structs.h @@ -0,0 +1,21 @@ +struct sockaddr_in { + + /* Pad to size of `struct sockaddr'. */ + // unsigned char sin_zero[sizeof(struct sockaddr) - __SOCKADDR_COMMON_SIZE - + // sizeof(in_port_t) - sizeof(struct in_addr)]; + unsigned char sin_zero[ 10 + -2]; + +}; + + + + + + + + + + + + From 6a2b42d9932926364b9cadb07be48d5e87f3f2c2 Mon Sep 17 00:00:00 2001 From: sMezaOrellana Date: Fri, 29 Nov 2024 23:01:40 +0100 Subject: [PATCH 2/4] Removal of local test files --- addrin.py | 10 ---------- sockaddr.py | 0 structs.h | 21 --------------------- 3 files changed, 31 deletions(-) delete mode 100644 addrin.py delete mode 100644 sockaddr.py delete mode 100644 structs.h diff --git a/addrin.py b/addrin.py deleted file mode 100644 index 3fad4ad..0000000 --- a/addrin.py +++ /dev/null @@ -1,10 +0,0 @@ -from dissect.cstruct import cstruct, dumpstruct - -if __name__ == '__main__': - definitions = 'structs.h' - contents = '' - with open(definitions, "r") as file: - contents = file.read() - - structs = cstruct() - structs.load(contents) diff --git a/sockaddr.py b/sockaddr.py deleted file mode 100644 index e69de29..0000000 diff --git a/structs.h b/structs.h deleted file mode 100644 index 340067a..0000000 --- a/structs.h +++ /dev/null @@ -1,21 +0,0 @@ -struct sockaddr_in { - - /* Pad to size of `struct sockaddr'. */ - // unsigned char sin_zero[sizeof(struct sockaddr) - __SOCKADDR_COMMON_SIZE - - // sizeof(in_port_t) - sizeof(struct in_addr)]; - unsigned char sin_zero[ 10 - -2]; - -}; - - - - - - - - - - - - From fa973f28c7da1e850662ce7ee232f16cf987fbc3 Mon Sep 17 00:00:00 2001 From: sMezaOrellana Date: Fri, 29 Nov 2024 23:10:48 +0100 Subject: [PATCH 3/4] Add linting for test new case --- tests/test_types_structure.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/tests/test_types_structure.py b/tests/test_types_structure.py index 8d251eb..0d05b42 100644 --- a/tests/test_types_structure.py +++ b/tests/test_types_structure.py @@ -761,3 +761,36 @@ def __init__(self, _0 = None, _1 = None, _2 = None, _3 = None, _4 = None): cached = structure._make_structure__init__(5) assert structure._make_structure__init__.cache_info() == (1, 1, 128, 1) assert result is cached + + +def test_structure_definition_newline(cs: cstruct, compiled: bool) -> None: + cdef = """ + struct test { + char magic[4 + ]; + + wchar wmagic[4]; + uint8 a; + uint16 b; + uint32 c; + char string[]; + wchar wstring[]; + }; + """ + cs.endian = ">" + cs.load(cdef, compiled=compiled) + + assert verify_compiled(cs.test, compiled) + + buf = b"test\x00t\x00e\x00s\x00t\x01\x02\x03\x04\x05\x06\x07lalala\x00\x00t\x00e\x00s\x00t\x00\x00" + + obj = cs.test() + obj.magic = "test" + obj.wmagic = "test" + obj.a = 0x01 + obj.b = 0x0203 + obj.c = 0x04050607 + obj.string = b"lalala" + obj.wstring = "test" + + assert obj.dumps() == buf From 6b22ff430376be023142c474da00e8cf43c06806 Mon Sep 17 00:00:00 2001 From: sMezaOrellana Date: Fri, 29 Nov 2024 23:11:19 +0100 Subject: [PATCH 4/4] Add linting for test new case --- tests/test_types_structure.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/test_types_structure.py b/tests/test_types_structure.py index 0d05b42..948e4bc 100644 --- a/tests/test_types_structure.py +++ b/tests/test_types_structure.py @@ -769,7 +769,8 @@ def test_structure_definition_newline(cs: cstruct, compiled: bool) -> None: char magic[4 ]; - wchar wmagic[4]; + wchar wmagic[4 + ]; uint8 a; uint16 b; uint32 c;