summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGlenn Smith <glenn@vector35.com>2022-07-19 18:27:50 -0400
committerGlenn Smith <glenn@vector35.com>2022-09-29 21:02:24 -0400
commit0725c6fbd58b3d40ffefdb319121a29ba4168517 (patch)
tree43321b54b45dd16154bc104886b5e3ef08017b75
parent460656be13999759eb1eeb5bd9a868b34c0aea22 (diff)
Make DebugInfo::parse failable
-rw-r--r--binaryninjaapi.h4
-rw-r--r--binaryninjacore.h2
-rw-r--r--debuginfo.cpp21
-rw-r--r--python/debuginfo.py17
-rw-r--r--rust/src/debuginfo.rs25
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;
}