summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGlenn Smith <glenn@vector35.com>2023-02-19 17:05:33 -0500
committerGlenn Smith <glenn@vector35.com>2023-02-19 17:21:20 -0500
commit9993345001464331697167349803235498218652 (patch)
tree68c0f3796472880913edd1163f287caf457d3ff6
parent18ffd57986569523887621d6b1937046849849a8 (diff)
Account for BinaryData::Ctor potentially failing
-rw-r--r--binaryninjaapi.h20
-rw-r--r--binaryview.cpp25
-rw-r--r--examples/bin-info/src/bin-info.cpp7
-rw-r--r--examples/enterprise_test/src/enterprise_test.cpp7
-rw-r--r--examples/llil_parser/src/llil_parser.cpp7
-rw-r--r--examples/mlil_parser/src/mlil_parser.cpp7
-rw-r--r--examples/print_syscalls/src/arm-syscall.cpp7
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())
{