diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/architecture.py | 2 | ||||
| -rw-r--r-- | python/binaryview.py | 8 | ||||
| -rw-r--r-- | python/generator.cpp | 10 | ||||
| -rw-r--r-- | python/interaction.py | 8 | ||||
| -rw-r--r-- | python/platform.py | 4 | ||||
| -rw-r--r-- | python/types.py | 10 | ||||
| -rw-r--r-- | python/update.py | 16 |
7 files changed, 32 insertions, 26 deletions
diff --git a/python/architecture.py b/python/architecture.py index 51b1ae00..7dd8ff91 100644 --- a/python/architecture.py +++ b/python/architecture.py @@ -2570,7 +2570,7 @@ class CoreArchitecture(Architecture): errors = ctypes.c_char_p() if not core.BNAssemble(self.handle, code, addr, result.handle, errors): error_str = errors.value - core.BNFreeString(ctypes.cast(errors, ctypes.POINTER(ctypes.c_byte))) + core.free_string(errors) raise ValueError("Could not assemble: %s" % error_str) return bytes(result) diff --git a/python/binaryview.py b/python/binaryview.py index 4266e8a5..c9cd7562 100644 --- a/python/binaryview.py +++ b/python/binaryview.py @@ -5497,7 +5497,7 @@ class BinaryView(object): if not core.BNParseTypeString(self.handle, text, result, errors, type_list): assert errors.value is not None, "core.BNParseTypeString returned 'errors' set to None" error_str = errors.value.decode("utf-8") - core.BNFreeString(ctypes.cast(errors, ctypes.POINTER(ctypes.c_byte))) + core.free_string(errors) raise SyntaxError(error_str) type_obj = _types.Type(core.BNNewTypeReference(result.type), platform = self.platform) name = _types.QualifiedName._from_core_struct(result.name) @@ -5530,7 +5530,7 @@ class BinaryView(object): if not core.BNParseTypesString(self.handle, text, parse, errors, type_list): assert errors.value is not None, "core.BNParseTypesString returned errors set to None" error_str = errors.value.decode("utf-8") - core.BNFreeString(ctypes.cast(errors, ctypes.POINTER(ctypes.c_byte))) + core.free_string(errors) raise SyntaxError(error_str) type_dict = {} @@ -5591,7 +5591,7 @@ class BinaryView(object): else: error_str = "Error parsing specified PossibleValueSet" core.BNFreePossibleValueSet(result) - core.BNFreeString(ctypes.cast(errors, ctypes.POINTER(ctypes.c_byte))) + core.free_string(errors) raise ValueError(error_str) return variable.PossibleValueSet(self.arch, result) @@ -6685,7 +6685,7 @@ class BinaryView(object): if not core.BNParseExpression(self.handle, expression, offset, here, errors): assert errors.value is not None, "core.BNParseExpression returned errors set to None" error_str = errors.value.decode("utf-8") - core.BNFreeString(ctypes.cast(errors, ctypes.POINTER(ctypes.c_byte))) + core.free_string(errors) raise ValueError(error_str) return offset.value diff --git a/python/generator.cpp b/python/generator.cpp index 16fa5def..8b7b202c 100644 --- a/python/generator.cpp +++ b/python/generator.cpp @@ -209,13 +209,16 @@ int main(int argc, char* argv[]) fprintf(out, "def cstr(var) -> Optional[str]:\n"); fprintf(out, " if var is None:\n"); fprintf(out, " return None\n"); - fprintf(out, " return var.encode(\"utf-8\")\n"); + fprintf(out, " return var.encode(\"utf-8\")\n\n"); fprintf(out, "def pyNativeStr(arg):\n"); fprintf(out, " if isinstance(arg, str):\n"); fprintf(out, " return arg\n"); fprintf(out, " else:\n"); - fprintf(out, " return arg.decode('utf8')\n"); + fprintf(out, " return arg.decode('utf8')\n\n"); + + fprintf(out, "def free_string(value:ctypes.c_char_p) -> None:\n"); + fprintf(out, " BNFreeString(ctypes.cast(value, ctypes.POINTER(ctypes.c_byte)))\n\n"); // Create type objects fprintf(out, "# Type definitions\n"); @@ -245,6 +248,8 @@ int main(int argc, char* argv[]) if (!stringField) fprintf(out, "\tpass\n"); + + fprintf(out, "%sPointer = ctypes.POINTER(%s)\n", name.c_str(), name.c_str()); } else if (i.second->GetClass() == EnumerationTypeClass) { @@ -305,7 +310,6 @@ int main(int argc, char* argv[]) if (requiresDependency) continue; - fprintf(out, "%s._fields_ = [\n", name.c_str()); for (auto& j : type->GetStructure()->GetMembers()) { diff --git a/python/interaction.py b/python/interaction.py index aecb3b44..a22987bf 100644 --- a/python/interaction.py +++ b/python/interaction.py @@ -1072,7 +1072,7 @@ def get_text_line_input(prompt, title): if not core.BNGetTextLineInput(value, prompt, title): return None result = value.value - core.BNFreeString(ctypes.cast(value, ctypes.POINTER(ctypes.c_byte))) + core.free_string(value) return result @@ -1172,7 +1172,7 @@ def get_open_filename_input(prompt:str, ext:str="") -> Optional[str]: return None result = value.value assert result is not None - core.BNFreeString(ctypes.cast(value, ctypes.POINTER(ctypes.c_byte))) + core.free_string(value) return result.decode("utf-8") @@ -1197,7 +1197,7 @@ def get_save_filename_input(prompt:str, ext:str="", default_name:str="") -> Opti return None result = value.value assert result is not None - core.BNFreeString(ctypes.cast(value, ctypes.POINTER(ctypes.c_byte))) + core.free_string(value) return result.decode("utf-8") @@ -1220,7 +1220,7 @@ def get_directory_name_input(prompt:str, default_name:str=""): return None result = value.value assert result is not None - core.BNFreeString(ctypes.cast(value, ctypes.POINTER(ctypes.c_byte))) + core.free_string(value) return result.decode("utf-8") diff --git a/python/platform.py b/python/platform.py index 9c9d0657..882b4acb 100644 --- a/python/platform.py +++ b/python/platform.py @@ -422,7 +422,7 @@ class Platform(metaclass=_PlatformMetaClass): len(include_dirs), auto_type_source) assert errors.value is not None, "core.BNParseTypesFromSource returned errors set to None" error_str = errors.value.decode("utf-8") - core.BNFreeString(ctypes.cast(errors, ctypes.POINTER(ctypes.c_byte))) + core.free_string(errors) if not result: raise SyntaxError(error_str) type_dict = {} @@ -472,7 +472,7 @@ class Platform(metaclass=_PlatformMetaClass): len(include_dirs), auto_type_source) assert errors.value is not None, "core.BNParseTypesFromSourceFile returned errors set to None" error_str = errors.value.decode("utf-8") - core.BNFreeString(ctypes.cast(errors, ctypes.POINTER(ctypes.c_byte))) + core.free_string(errors) if not result: raise SyntaxError(error_str) type_dict = {} diff --git a/python/types.py b/python/types.py index 3cd44bd8..87fa7ddb 100644 --- a/python/types.py +++ b/python/types.py @@ -1662,10 +1662,12 @@ def preprocess_source(source, filename=None, include_dirs=[]): output = ctypes.c_char_p() errors = ctypes.c_char_p() result = core.BNPreprocessSource(source, filename, output, errors, dir_buf, len(include_dirs)) - output_str = output.value - error_str = errors.value - core.BNFreeString(ctypes.cast(output, ctypes.POINTER(ctypes.c_byte))) - core.BNFreeString(ctypes.cast(errors, ctypes.POINTER(ctypes.c_byte))) + assert output.value is not None + assert errors.value is not None + output_str = output.value.decode('utf-8') + error_str = errors.value.decode('utf-8') + core.free_string(output) + core.free_string(errors) if result: return (output_str, error_str) return (None, error_str) diff --git a/python/update.py b/python/update.py index 9537ad83..8d4611d6 100644 --- a/python/update.py +++ b/python/update.py @@ -38,7 +38,7 @@ class _UpdateChannelMetaClass(type): assert channels is not None, "core.BNGetUpdateChannels returned None" if errors: error_str = errors.value - core.BNFreeString(ctypes.cast(errors, ctypes.POINTER(ctypes.c_byte))) + core.free_string(errors) raise IOError(error_str) try: for i in range(0, count.value): @@ -54,7 +54,7 @@ class _UpdateChannelMetaClass(type): assert channels is not None, "core.BNGetUpdateChannels returned None" if errors: error_str = errors.value - core.BNFreeString(ctypes.cast(errors, ctypes.POINTER(ctypes.c_byte))) + core.free_string(errors) raise IOError(error_str) result = None for i in range(0, count.value): @@ -103,7 +103,7 @@ class UpdateChannel(metaclass=_UpdateChannelMetaClass): assert versions is not None, "core.BNGetUpdateChannelVersions returned None" if errors: error_str = errors.value - core.BNFreeString(ctypes.cast(errors, ctypes.POINTER(ctypes.c_byte))) + core.free_string(errors) raise IOError(error_str) result = [] for i in range(0, count.value): @@ -120,7 +120,7 @@ class UpdateChannel(metaclass=_UpdateChannelMetaClass): assert versions is not None, "core.BNGetUpdateChannelVersions returned None" if errors: error_str = errors.value - core.BNFreeString(ctypes.cast(errors, ctypes.POINTER(ctypes.c_byte))) + core.free_string(errors) raise IOError(error_str) result = None for i in range(0, count.value): @@ -137,7 +137,7 @@ class UpdateChannel(metaclass=_UpdateChannelMetaClass): result = core.BNAreUpdatesAvailable(self._name, None, None, errors) if errors: error_str = errors.value - core.BNFreeString(ctypes.cast(errors, ctypes.POINTER(ctypes.c_byte))) + core.free_string(errors) raise IOError(error_str) return result @@ -159,7 +159,7 @@ class UpdateChannel(metaclass=_UpdateChannelMetaClass): result = core.BNUpdateToLatestVersion(self._name, errors, cb.cb, None) if errors: error_str = errors.value - core.BNFreeString(ctypes.cast(errors, ctypes.POINTER(ctypes.c_byte))) + core.free_string(errors) raise IOError(error_str) return UpdateResult(result) @@ -207,7 +207,7 @@ class UpdateVersion(object): result = core.BNUpdateToVersion(self._channel.name, self._version, errors, cb.cb, None) if errors: error_str = errors.value - core.BNFreeString(ctypes.cast(errors, ctypes.POINTER(ctypes.c_byte))) + core.free_string(errors) raise IOError(error_str) return UpdateResult(result) @@ -294,7 +294,7 @@ def install_pending_update(): core.BNInstallPendingUpdate(errors) if errors: error_str = errors.value - core.BNFreeString(ctypes.cast(errors, ctypes.POINTER(ctypes.c_byte))) + core.free_string(errors) raise IOError(error_str) |
