diff options
| author | Glenn Smith <glenn@vector35.com> | 2023-02-19 17:05:33 -0500 |
|---|---|---|
| committer | Glenn Smith <glenn@vector35.com> | 2023-02-19 17:21:20 -0500 |
| commit | 9993345001464331697167349803235498218652 (patch) | |
| tree | 68c0f3796472880913edd1163f287caf457d3ff6 | |
| parent | 18ffd57986569523887621d6b1937046849849a8 (diff) | |
Account for BinaryData::Ctor potentially failing
| -rw-r--r-- | binaryninjaapi.h | 20 | ||||
| -rw-r--r-- | binaryview.cpp | 25 | ||||
| -rw-r--r-- | examples/bin-info/src/bin-info.cpp | 7 | ||||
| -rw-r--r-- | examples/enterprise_test/src/enterprise_test.cpp | 7 | ||||
| -rw-r--r-- | examples/llil_parser/src/llil_parser.cpp | 7 | ||||
| -rw-r--r-- | examples/mlil_parser/src/mlil_parser.cpp | 7 | ||||
| -rw-r--r-- | 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<BinaryData> 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<BinaryData> 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<Symbol> 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> 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> 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<BinaryView> BinaryNinja::OpenView(const std::string& filename, bool updateAnalysis, std::function<bool(size_t, size_t)> progress, Json::Value options) { if (!progress) @@ -4475,7 +4498,7 @@ Ref<BinaryView> BinaryNinja::OpenView(const std::string& filename, bool updateAn { // Open file, read raw contents Ref<FileMetadata> 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<BinaryData> bd = new BinaryData(new FileMetadata(), argv[1]); + Ref<BinaryData> bd = BinaryData::CreateFromFilename(new FileMetadata(), argv[1]); + if (!bd) + { + fprintf(stderr, "Could not open input file.\n"); + return -1; + } Ref<BinaryView> 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<BinaryData> bd = new BinaryData(new FileMetadata(), argv[1]); + Ref<BinaryData> bd = BinaryData::CreateFromFilename(new FileMetadata(), argv[1]); + if (!bd) + { + fprintf(stderr, "Could not open input file.\n"); + return -1; + } Ref<BinaryView> 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<BinaryData> bd = new BinaryData(new FileMetadata(), argv[1]); + Ref<BinaryData> bd = BinaryData::CreateFromFilename(new FileMetadata(), argv[1]); + if (!bd) + { + fprintf(stderr, "Could not open input file.\n"); + return -1; + } Ref<BinaryView> 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<BinaryData> bd = new BinaryData(new FileMetadata(), argv[1]); + Ref<BinaryData> bd = BinaryData::CreateFromFilename(new FileMetadata(), argv[1]); + if (!bd) + { + fprintf(stderr, "Could not open input file.\n"); + return -1; + } Ref<BinaryView> 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<BinaryData> bd = new BinaryData(new FileMetadata(), argv[1]); + Ref<BinaryData> bd = BinaryData::CreateFromFilename(new FileMetadata(), argv[1]); + if (!bd) + { + fprintf(stderr, "Could not open input file.\n"); + return -1; + } Ref<BinaryView> bv; for (auto type : BinaryViewType::GetViewTypes()) { |
