From 0822865ad450d19f5b2fff9e48edba322272327d Mon Sep 17 00:00:00 2001 From: Josh Watson Date: Fri, 10 May 2019 14:22:43 -0700 Subject: Fix Architecture.assemble so that it works with ArchitectureHooks --- python/architecture.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'python') diff --git a/python/architecture.py b/python/architecture.py index 2d81beb0..c72f8048 100644 --- a/python/architecture.py +++ b/python/architecture.py @@ -1057,8 +1057,7 @@ class Architecture(with_metaclass(_ArchitectureMetaClass, object)): def _assemble(self, ctxt, code, addr, result, errors): try: - data, error_str = self.assemble(code, addr) - errors[0] = core.BNAllocString(str(error_str)) + data = self.assemble(code, addr) if data is None: return False buf = ctypes.create_string_buffer(len(data)) @@ -1272,7 +1271,7 @@ class Architecture(with_metaclass(_ArchitectureMetaClass, object)): :return: the bytes for the assembled instructions or error string :rtype: (a tuple of instructions and empty string) or (or None and error string) """ - return None, "Architecture does not implement an assembler.\n" + raise NotImplementedError("Architecture does not implement an assembler.\n") @abc.abstractmethod def perform_is_never_branch_patch_available(self, data, addr): -- cgit v1.3.1 From a0cf5857956a2ec64a9be62f1283e4f65b3f2bd1 Mon Sep 17 00:00:00 2001 From: KyleMiles Date: Thu, 30 May 2019 19:18:13 -0400 Subject: Improve Error Handling and Add Some Documentation --- python/architecture.py | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'python') diff --git a/python/architecture.py b/python/architecture.py index c72f8048..e0ccfeeb 100644 --- a/python/architecture.py +++ b/python/architecture.py @@ -1056,6 +1056,11 @@ class Architecture(with_metaclass(_ArchitectureMetaClass, object)): log.log_error(traceback.format_exc()) def _assemble(self, ctxt, code, addr, result, errors): + """ + This function calls the `assemble` command for the actual architecture plugin. + If the plugin does not provide an `assemble(self, code, addr)`-style function, + it uses the default function provided in CoreArchitecture. + """ try: data = self.assemble(code, addr) if data is None: @@ -1064,6 +1069,10 @@ class Architecture(with_metaclass(_ArchitectureMetaClass, object)): ctypes.memmove(buf, data, len(data)) core.BNSetDataBufferContents(result, buf, len(data)) return True + except ValueError as e: # Overriden `assemble` functions should raise a ValueError if the input was invalid (with a reasonable error message) + log.log_error(traceback.format_exc()) + errors[0] = core.BNAllocString(str(e)) + return False except: log.log_error(traceback.format_exc()) errors[0] = core.BNAllocString("Unhandled exception during assembly.\n") @@ -1769,6 +1778,8 @@ class Architecture(with_metaclass(_ArchitectureMetaClass, object)): .. note :: It is important that the assembler used accepts a syntax identical to the one emitted by the \ disassembler. This will prevent confusing the user. + If there is an error in the input assembly, this function should raise a ValueError (with a reasonable error message). + :param str code: string representation of the instructions to be assembled :param int addr: virtual address that the instructions will be loaded at :return: the bytes for the assembled instructions -- cgit v1.3.1