From 9993345001464331697167349803235498218652 Mon Sep 17 00:00:00 2001 From: Glenn Smith Date: Sun, 19 Feb 2023 17:05:33 -0500 Subject: Account for BinaryData::Ctor potentially failing --- binaryninjaapi.h | 20 +++++++++++++++++++ binaryview.cpp | 25 +++++++++++++++++++++++- examples/bin-info/src/bin-info.cpp | 7 ++++++- examples/enterprise_test/src/enterprise_test.cpp | 7 ++++++- examples/llil_parser/src/llil_parser.cpp | 7 ++++++- examples/mlil_parser/src/mlil_parser.cpp | 7 ++++++- examples/print_syscalls/src/arm-syscall.cpp | 7 ++++++- 7 files changed, 74 insertions(+), 6 deletions(-) diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 9c8dd572..34a45160 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -5057,12 +5057,32 @@ namespace BinaryNinja { */ class BinaryData : public BinaryView { + BinaryData(BNBinaryView* view); + public: BinaryData(FileMetadata* file); BinaryData(FileMetadata* file, const DataBuffer& data); BinaryData(FileMetadata* file, const void* data, size_t len); BinaryData(FileMetadata* file, const std::string& path); BinaryData(FileMetadata* file, FileAccessor* accessor); + + /*! + Open a raw file from a given path. + This is lifted out into a method because this operation can fail. + \param file Metadata structure + \param path Path to file to open + \return Reference to binary data if successful, nullptr reference otherwise + */ + static Ref CreateFromFilename(FileMetadata* file, const std::string& path); + + /*! + Open a raw file from a given path. + This is lifted out into a method because this operation can fail. + \param file Metadata structure + \param accessor File accessor object for reading file contents + \return Reference to binary data if successful, nullptr reference otherwise + */ + static Ref CreateFromFile(FileMetadata* file, FileAccessor* accessor); }; class Platform; diff --git a/binaryview.cpp b/binaryview.cpp index c818bed6..52fd3dd3 100644 --- a/binaryview.cpp +++ b/binaryview.cpp @@ -4412,6 +4412,9 @@ Ref Relocation::GetSymbol() const } +BinaryData::BinaryData(BNBinaryView* view) : BinaryView(view) {} + + BinaryData::BinaryData(FileMetadata* file) : BinaryView(BNCreateBinaryDataView(file->GetObject())) {} @@ -4435,6 +4438,26 @@ BinaryData::BinaryData(FileMetadata* file, FileAccessor* accessor) : {} +Ref BinaryData::CreateFromFilename(FileMetadata* file, const std::string& path) +{ + // This can fail, and throwing an exception in a c++ ctor is Ugly, so now there's a helper method here + BNBinaryView* handle = BNCreateBinaryDataViewFromFilename(file->GetObject(), path.c_str()); + if (!handle) + return nullptr; + return new BinaryData(handle); +} + + +Ref BinaryData::CreateFromFile(FileMetadata* file, FileAccessor* accessor) +{ + // This can fail, and throwing an exception in a c++ ctor is Ugly, so now there's a helper method here + BNBinaryView* handle = BNCreateBinaryDataViewFromFile(file->GetObject(), accessor->GetCallbacks()); + if (!handle) + return nullptr; + return new BinaryData(handle); +} + + Ref BinaryNinja::OpenView(const std::string& filename, bool updateAnalysis, std::function progress, Json::Value options) { if (!progress) @@ -4475,7 +4498,7 @@ Ref BinaryNinja::OpenView(const std::string& filename, bool updateAn { // Open file, read raw contents Ref file = new FileMetadata(filename); - view = new BinaryData(file, filename); + view = BinaryData::CreateFromFilename(file, filename); } if (!view) diff --git a/examples/bin-info/src/bin-info.cpp b/examples/bin-info/src/bin-info.cpp index 3d2b2451..cc6f4984 100644 --- a/examples/bin-info/src/bin-info.cpp +++ b/examples/bin-info/src/bin-info.cpp @@ -44,7 +44,12 @@ int main(int argc, char* argv[]) SetBundledPluginDirectory(GetBundledPluginDirectory()); InitPlugins(); - Ref bd = new BinaryData(new FileMetadata(), argv[1]); + Ref bd = BinaryData::CreateFromFilename(new FileMetadata(), argv[1]); + if (!bd) + { + fprintf(stderr, "Could not open input file.\n"); + return -1; + } Ref bv; for (auto type : BinaryViewType::GetViewTypes()) { diff --git a/examples/enterprise_test/src/enterprise_test.cpp b/examples/enterprise_test/src/enterprise_test.cpp index a0bff140..bc2444f5 100644 --- a/examples/enterprise_test/src/enterprise_test.cpp +++ b/examples/enterprise_test/src/enterprise_test.cpp @@ -43,7 +43,12 @@ int main(int argc, char* argv[]) SetBundledPluginDirectory(GetBundledPluginDirectory()); InitPlugins(); - Ref bd = new BinaryData(new FileMetadata(), argv[1]); + Ref bd = BinaryData::CreateFromFilename(new FileMetadata(), argv[1]); + if (!bd) + { + fprintf(stderr, "Could not open input file.\n"); + return -1; + } Ref bv; for (auto type : BinaryViewType::GetViewTypes()) { diff --git a/examples/llil_parser/src/llil_parser.cpp b/examples/llil_parser/src/llil_parser.cpp index 7566d4f1..af05c8f6 100644 --- a/examples/llil_parser/src/llil_parser.cpp +++ b/examples/llil_parser/src/llil_parser.cpp @@ -292,7 +292,12 @@ int main(int argc, char* argv[]) SetBundledPluginDirectory(GetBundledPluginDirectory()); InitPlugins(); - Ref bd = new BinaryData(new FileMetadata(), argv[1]); + Ref bd = BinaryData::CreateFromFilename(new FileMetadata(), argv[1]); + if (!bd) + { + fprintf(stderr, "Could not open input file.\n"); + return -1; + } Ref bv; for (auto type : BinaryViewType::GetViewTypes()) { diff --git a/examples/mlil_parser/src/mlil_parser.cpp b/examples/mlil_parser/src/mlil_parser.cpp index d858b59c..c5b077ab 100644 --- a/examples/mlil_parser/src/mlil_parser.cpp +++ b/examples/mlil_parser/src/mlil_parser.cpp @@ -241,7 +241,12 @@ int main(int argc, char* argv[]) SetBundledPluginDirectory(GetBundledPluginDirectory()); InitPlugins(); - Ref bd = new BinaryData(new FileMetadata(), argv[1]); + Ref bd = BinaryData::CreateFromFilename(new FileMetadata(), argv[1]); + if (!bd) + { + fprintf(stderr, "Could not open input file.\n"); + return -1; + } Ref bv; for (auto type : BinaryViewType::GetViewTypes()) { diff --git a/examples/print_syscalls/src/arm-syscall.cpp b/examples/print_syscalls/src/arm-syscall.cpp index b21a2a27..0623a4a7 100644 --- a/examples/print_syscalls/src/arm-syscall.cpp +++ b/examples/print_syscalls/src/arm-syscall.cpp @@ -44,7 +44,12 @@ int main(int argc, char* argv[]) SetBundledPluginDirectory(GetBundledPluginDirectory()); InitPlugins(); - Ref bd = new BinaryData(new FileMetadata(), argv[1]); + Ref bd = BinaryData::CreateFromFilename(new FileMetadata(), argv[1]); + if (!bd) + { + fprintf(stderr, "Could not open input file.\n"); + return -1; + } Ref bv; for (auto type : BinaryViewType::GetViewTypes()) { -- cgit v1.3.1