diff options
| -rw-r--r-- | binaryninjaapi.h | 4 | ||||
| -rw-r--r-- | binaryninjacore.h | 2 | ||||
| -rw-r--r-- | debuginfo.cpp | 21 | ||||
| -rw-r--r-- | python/debuginfo.py | 17 | ||||
| -rw-r--r-- | rust/src/debuginfo.rs | 25 |
5 files changed, 41 insertions, 28 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h index bf00f6f2..a01ab998 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -11997,7 +11997,7 @@ namespace BinaryNinja { class CustomDebugInfoParser : public DebugInfoParser { static bool IsValidCallback(void* ctxt, BNBinaryView* view); - static void ParseCallback(void* ctxt, BNDebugInfo* debugInfo, BNBinaryView* view); + static bool ParseCallback(void* ctxt, BNDebugInfo* debugInfo, BNBinaryView* view); BNDebugInfoParser* Register(const std::string& name); public: @@ -12005,7 +12005,7 @@ namespace BinaryNinja { virtual ~CustomDebugInfoParser() {} virtual bool IsValid(Ref<BinaryView>) = 0; - virtual void ParseInfo(Ref<DebugInfo>, Ref<BinaryView>) = 0; + virtual bool ParseInfo(Ref<DebugInfo>, Ref<BinaryView>) = 0; }; /*! diff --git a/binaryninjacore.h b/binaryninjacore.h index daffe5bf..421a6d23 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -6276,7 +6276,7 @@ extern "C" BINARYNINJACOREAPI char* BNRustSimplifyStrToStr(const char* const); BINARYNINJACOREAPI BNDebugInfoParser* BNRegisterDebugInfoParser(const char* name, - bool (*isValid)(void*, BNBinaryView*), void (*parseInfo)(void*, BNDebugInfo*, BNBinaryView*), void* context); + bool (*isValid)(void*, BNBinaryView*), bool (*parseInfo)(void*, BNDebugInfo*, BNBinaryView*), void* context); BINARYNINJACOREAPI void BNUnregisterDebugInfoParser(const char* rawName); BINARYNINJACOREAPI BNDebugInfoParser* BNGetDebugInfoParserByName(const char* name); BINARYNINJACOREAPI BNDebugInfoParser** BNGetDebugInfoParsers(size_t* count); diff --git a/debuginfo.cpp b/debuginfo.cpp index fb10039e..c67582cb 100644 --- a/debuginfo.cpp +++ b/debuginfo.cpp @@ -363,10 +363,21 @@ string DebugInfoParser::GetName() const Ref<DebugInfo> DebugInfoParser::Parse(Ref<BinaryView> view, Ref<DebugInfo> existingDebugInfo) const { + BNDebugInfo* info = nullptr; if (existingDebugInfo) - return new DebugInfo( - BNNewDebugInfoReference(BNParseDebugInfo(m_object, view->GetObject(), existingDebugInfo->GetObject()))); - return new DebugInfo(BNParseDebugInfo(m_object, view->GetObject(), nullptr)); + { + info = BNParseDebugInfo(m_object, view->GetObject(), existingDebugInfo->GetObject()); + if (!info) + return nullptr; + info = BNNewDebugInfoReference(info); + } + else + { + info = BNParseDebugInfo(m_object, view->GetObject(), nullptr); + if (!info) + return nullptr; + } + return new DebugInfo(info); } @@ -388,10 +399,10 @@ bool CustomDebugInfoParser::IsValidCallback(void* ctxt, BNBinaryView* view) } -void CustomDebugInfoParser::ParseCallback(void* ctxt, BNDebugInfo* debugInfo, BNBinaryView* view) +bool CustomDebugInfoParser::ParseCallback(void* ctxt, BNDebugInfo* debugInfo, BNBinaryView* view) { CustomDebugInfoParser* parser = (CustomDebugInfoParser*)ctxt; - parser->ParseInfo(new DebugInfo(debugInfo), new BinaryView(view)); + return parser->ParseInfo(new DebugInfo(debugInfo), new BinaryView(view)); } diff --git a/python/debuginfo.py b/python/debuginfo.py index 7b5a6dbc..4a809643 100644 --- a/python/debuginfo.py +++ b/python/debuginfo.py @@ -107,16 +107,17 @@ class _DebugInfoParserMetaClass(type): @staticmethod def _parse_info( debug_info: core.BNDebugInfo, view: core.BNBinaryView, - callback: Callable[["DebugInfo", 'binaryview.BinaryView'], None] - ) -> None: + callback: Callable[["DebugInfo", 'binaryview.BinaryView'], bool] + ) -> bool: try: file_metadata = filemetadata.FileMetadata(handle=core.BNGetFileForView(view)) view_obj = binaryview.BinaryView(file_metadata=file_metadata, handle=core.BNNewViewReference(view)) parser_ref = core.BNNewDebugInfoReference(debug_info) assert parser_ref is not None, "core.BNNewDebugInfoReference returned None" - callback(DebugInfo(parser_ref), view_obj) + return callback(DebugInfo(parser_ref), view_obj) except: log_error(traceback.format_exc()) + return False @classmethod def register( @@ -130,7 +131,7 @@ class _DebugInfoParserMetaClass(type): ctypes.POINTER(core.BNBinaryView ))(lambda ctxt, view: cls._is_valid(view, is_valid)) parse_info_cb = ctypes.CFUNCTYPE( - None, ctypes.c_void_p, ctypes.POINTER(core.BNDebugInfo), ctypes.POINTER(core.BNBinaryView) + ctypes.c_bool, ctypes.c_void_p, ctypes.POINTER(core.BNDebugInfo), ctypes.POINTER(core.BNBinaryView) )(lambda ctxt, debug_info, view: cls._parse_info(debug_info, view, parse_info)) # Don't let our callbacks get garbage collected @@ -216,17 +217,19 @@ class DebugInfoParser(object, metaclass=_DebugInfoParserMetaClass): """Returns whether this debug-info parser is valid for the provided binary view""" return core.BNIsDebugInfoParserValidForView(self.handle, view.handle) - def parse_debug_info(self, view: 'binaryview.BinaryView', debug_info: Optional["DebugInfo"] = None) -> "DebugInfo": + def parse_debug_info(self, view: 'binaryview.BinaryView', debug_info: Optional["DebugInfo"] = None) -> Optional["DebugInfo"]: """Returns a ``DebugInfo`` object populated with debug info by this debug-info parser. Only provide a ``DebugInfo`` object if you wish to append to the existing debug info""" if isinstance(debug_info, DebugInfo): parser = core.BNParseDebugInfo(self.handle, view.handle, debug_info.handle) - assert parser is not None, "core.BNParseDebugInfo returned None" + if parser is None: + return None parser_ref = core.BNNewDebugInfoReference(parser) assert parser_ref is not None, "core.BNNewDebugInfoReference returned None" return DebugInfo(parser_ref) else: parser = core.BNParseDebugInfo(self.handle, view.handle, None) - assert parser is not None, "core.BNParseDebugInfo returned None" + if parser is None: + return None return DebugInfo(parser) diff --git a/rust/src/debuginfo.rs b/rust/src/debuginfo.rs index 08453b2d..7ce2c485 100644 --- a/rust/src/debuginfo.rs +++ b/rust/src/debuginfo.rs @@ -136,19 +136,17 @@ impl DebugInfoParser { &self, view: &BinaryView, existing_debug_info: Option<&DebugInfo>, - ) -> Ref<DebugInfo> { - match existing_debug_info { + ) -> Option<Ref<DebugInfo>> { + let info: *mut BNDebugInfo = match existing_debug_info { Some(debug_info) => unsafe { - DebugInfo::from_raw(BNParseDebugInfo( - self.handle, - view.handle, - debug_info.handle, - )) - }, - None => unsafe { - DebugInfo::from_raw(BNParseDebugInfo(self.handle, view.handle, ptr::null_mut())) + BNParseDebugInfo(self.handle, view.handle, debug_info.handle) }, + None => unsafe { BNParseDebugInfo(self.handle, view.handle, ptr::null_mut()) }, + }; + if info.is_null() { + return None; } + return Some(unsafe { DebugInfo::from_raw(info) }); } // Registers a DebugInfoParser. See `binaryninja::debuginfo::DebugInfoParser` for more details. @@ -173,7 +171,8 @@ impl DebugInfoParser { ctxt: *mut c_void, debug_info: *mut BNDebugInfo, view: *mut BNBinaryView, - ) where + ) -> bool + where C: CustomDebugInfoParser, { ffi_wrap!("CustomDebugInfoParser::parse_info", unsafe { @@ -181,7 +180,7 @@ impl DebugInfoParser { let view = BinaryView::from_raw(view); let mut debug_info = DebugInfo::from_raw(debug_info); - cmd.parse_info(&mut debug_info, &view); + cmd.parse_info(&mut debug_info, &view) }) } @@ -868,5 +867,5 @@ impl ToOwned for DebugInfo { /// Implement this trait to implement a debug info parser. See `DebugInfoParser` for more details. pub trait CustomDebugInfoParser: 'static + Sync { fn is_valid(&self, view: &BinaryView) -> bool; - fn parse_info(&self, debug_info: &mut DebugInfo, view: &BinaryView); + fn parse_info(&self, debug_info: &mut DebugInfo, view: &BinaryView) -> bool; } |
