From b3a31b101cf7283d753c71e211c78f5f0c1ee54c Mon Sep 17 00:00:00 2001 From: Peter LaFosse Date: Wed, 28 Jun 2017 00:29:00 -0400 Subject: Remove need for explicitly initializing settings file --- settings.cpp | 97 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 settings.cpp (limited to 'settings.cpp') diff --git a/settings.cpp b/settings.cpp new file mode 100644 index 00000000..97c2a232 --- /dev/null +++ b/settings.cpp @@ -0,0 +1,97 @@ +#include "binaryninjaapi.h" + +using namespace BinaryNinja; +using namespace std; + + +bool Setting::GetBool(const std::string& pluginName, const std::string& name, bool defaultValue) +{ + return BNSettingGetBool(pluginName.c_str(), name.c_str(), defaultValue); +} + +uint64_t Setting::GetInteger(const std::string& pluginName, const std::string& name, uint64_t defaultValue) +{ + return BNSettingGetInteger(pluginName.c_str(), name.c_str(), defaultValue); +} + +std::string Setting::GetString(const std::string& pluginName, const std::string& name, const std::string& defaultValue) +{ + return BNSettingGetString(pluginName.c_str(), name.c_str(), defaultValue.c_str()); +} + +double Setting::GetDouble(const std::string& pluginName, const std::string& name, double defaultValue) +{ + return BNSettingGetDouble(pluginName.c_str(), name.c_str(), defaultValue); +} + +std::vector Setting::GetIntegerList(const std::string& pluginName, + const std::string& name, + const std::vector& defaultValue) +{ + uint64_t* buffer = new uint64_t[defaultValue.size()]; + memcpy(&buffer[0], &defaultValue[0], sizeof(uint64_t) * defaultValue.size()); + size_t size = defaultValue.size(); + uint64_t* outBuffer = BNSettingGetIntegerList(pluginName.c_str(), name.c_str(), buffer, &size); + delete[] buffer; + + vector out(outBuffer, outBuffer + size); + BNFreeSettingIntegerList(buffer); + return out; +} + +std::vector Setting::GetStringList(const std::string& pluginName, + const std::string& name, + const std::vector& defaultValue) +{ + char** buffer = new char*[defaultValue.size()]; + for (size_t i = 0; i < defaultValue.size(); i++) + buffer[i] = BNAllocString(defaultValue[i].c_str()); + size_t size = defaultValue.size(); + char** outBuffer = (char**)BNSettingGetStringList(pluginName.c_str(), name.c_str(), (const char**)buffer, &size); + + vector result; + for (size_t i = 0; i < size; i++) + result.push_back(string(outBuffer[i])); + + for (size_t i = 0; i < defaultValue.size(); i++) + BNFreeString(buffer[i]); + delete[] buffer; + BNFreeStringList(outBuffer, size); + return result; +} + + +bool Setting::IsPresent(const std::string& pluginName, const std::string& name) +{ + return BNSettingIsPresent(pluginName.c_str(), name.c_str()); +} + +bool Setting::IsBool(const std::string& pluginName, const std::string& name) +{ + return BNSettingIsBool(pluginName.c_str(), name.c_str()); +} + +bool Setting::IsInteger(const std::string& pluginName, const std::string& name) +{ + return BNSettingIsInteger(pluginName.c_str(), name.c_str()); +} + +bool Setting::IsString(const std::string& pluginName, const std::string& name) +{ + return BNSettingIsString(pluginName.c_str(), name.c_str()); +} + +bool Setting::IsIntegerList(const std::string& pluginName, const std::string& name) +{ + return BNSettingIsIntegerList(pluginName.c_str(), name.c_str()); +} + +bool Setting::IsStringList(const std::string& pluginName, const std::string& name) +{ + return BNSettingIsStringList(pluginName.c_str(), name.c_str()); +} + +bool Setting::IsDouble(const std::string& pluginName, const std::string& name) +{ + return BNSettingIsDouble(pluginName.c_str(), name.c_str()); +} -- cgit v1.3.1 From c407679358f035aa9e16e3bb740f8e6d9a73d138 Mon Sep 17 00:00:00 2001 From: Peter LaFosse Date: Sat, 1 Jul 2017 10:02:12 -0400 Subject: Refactor of metadata api names. modify how QueryMetadata works --- binaryninjaapi.h | 2 +- binaryninjacore.h | 24 ++++++++++++------------ binaryview.cpp | 42 ++++++++++++++++-------------------------- metadata.cpp | 26 +++++++++++++------------- settings.cpp | 1 + 5 files changed, 43 insertions(+), 52 deletions(-) (limited to 'settings.cpp') diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 426095b0..13ca3446 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -1128,7 +1128,7 @@ namespace BinaryNinja std::vector GetAllocatedRanges(); void StoreMetadata(const std::string& key, Metadata* inValue); - bool QueryMetadata(const std::string& key, Metadata** outValue); + std::unique_ptr QueryMetadata(const std::string& key); std::string GetStringMetadata(const std::string& key); std::vector GetRawMetadata(const std::string& key); uint64_t GetUIntMetadata(const std::string& key); diff --git a/binaryninjacore.h b/binaryninjacore.h index 25aa150d..0394517f 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -2917,17 +2917,17 @@ extern "C" // Create Metadata of various types BINARYNINJACOREAPI BNMetadata* BNNewMetadataReference(BNMetadata* data); - BINARYNINJACOREAPI BNMetadata* BNCreateStructuredBooleanData(bool data); - BINARYNINJACOREAPI BNMetadata* BNCreateStructuredStringData(const char* data); - BINARYNINJACOREAPI BNMetadata* BNCreateStructuredUnsignedIntegerData(uint64_t data); - BINARYNINJACOREAPI BNMetadata* BNCreateStructuredSignedIntegerData(int64_t data); - BINARYNINJACOREAPI BNMetadata* BNCreateStructuredDoubleData(double data); - BINARYNINJACOREAPI BNMetadata* BNCreateStructuredBooleanListData(const bool* data, size_t size); - BINARYNINJACOREAPI BNMetadata* BNCreateStructuredStringListData(const char** data, size_t size); - BINARYNINJACOREAPI BNMetadata* BNCreateStructuredUnsignedIntegerListData(const uint64_t* data, size_t size); - BINARYNINJACOREAPI BNMetadata* BNCreateStructuredSignedIntegerListData(const int64_t* data, size_t size); - BINARYNINJACOREAPI BNMetadata* BNCreateStructuredDoubleListData(const double* data, size_t size); - BINARYNINJACOREAPI BNMetadata* BNCreateStructuredRawData(const uint8_t* data, size_t size); + BINARYNINJACOREAPI BNMetadata* BNCreateMetadataBooleanData(bool data); + BINARYNINJACOREAPI BNMetadata* BNCreateMetadataStringData(const char* data); + BINARYNINJACOREAPI BNMetadata* BNCreateMetadataUnsignedIntegerData(uint64_t data); + BINARYNINJACOREAPI BNMetadata* BNCreateMetadataSignedIntegerData(int64_t data); + BINARYNINJACOREAPI BNMetadata* BNCreateMetadataDoubleData(double data); + BINARYNINJACOREAPI BNMetadata* BNCreateMetadataBooleanListData(const bool* data, size_t size); + BINARYNINJACOREAPI BNMetadata* BNCreateMetadataStringListData(const char** data, size_t size); + BINARYNINJACOREAPI BNMetadata* BNCreateMetadataUnsignedIntegerListData(const uint64_t* data, size_t size); + BINARYNINJACOREAPI BNMetadata* BNCreateMetadataSignedIntegerListData(const int64_t* data, size_t size); + BINARYNINJACOREAPI BNMetadata* BNCreateMetadataDoubleListData(const double* data, size_t size); + BINARYNINJACOREAPI BNMetadata* BNCreateMetadataRawData(const uint8_t* data, size_t size); BINARYNINJACOREAPI void BNFreeMetadata(BNMetadata* data); BINARYNINJACOREAPI void BNFreeMetadataBooleanList(bool* data); BINARYNINJACOREAPI void BNFreeMetadataStringList(char** data, size_t size); @@ -2963,7 +2963,7 @@ extern "C" // Store/Query structured data to/from a BinaryView BINARYNINJACOREAPI void BNBinaryViewStoreMetadata(BNBinaryView* view, const char* key, BNMetadata* value); - BINARYNINJACOREAPI bool BNBinaryViewQueryMetadata(BNBinaryView* view, const char* key, BNMetadata** value); + BINARYNINJACOREAPI BNMetadata* BNBinaryViewQueryMetadata(BNBinaryView* view, const char* key); #ifdef __cplusplus } #endif diff --git a/binaryview.cpp b/binaryview.cpp index 6eb299a3..b330508d 100644 --- a/binaryview.cpp +++ b/binaryview.cpp @@ -20,6 +20,7 @@ #include #include +#include #include "binaryninjaapi.h" using namespace BinaryNinja; @@ -1833,48 +1834,37 @@ void BinaryView::StoreMetadata(const std::string& key, Metadata* inValue) BNBinaryViewStoreMetadata(m_object, key.c_str(), inValue->GetObject()); } - -bool BinaryView::QueryMetadata(const std::string& key, Metadata** outValue) +unique_ptr BinaryView::QueryMetadata(const std::string& key) { - BNMetadata* value = nullptr; - bool status = BNBinaryViewQueryMetadata(m_object, key.c_str(), &value); - if (!status) - { - *outValue = nullptr; - return false; - } - *outValue = new Metadata(value); - return true; + BNMetadata* value = BNBinaryViewQueryMetadata(m_object, key.c_str()); + if (!value) + return nullptr; + auto a = new Metadata(value); + return unique_ptr(a); } string BinaryView::GetStringMetadata(const string& key) { - Metadata* data; - if (!QueryMetadata(key, &data) || !data || data->IsString()) + auto data = QueryMetadata(key); + if (!data || !data->IsString()) throw QueryMetadataException("Failed to find key: " + key); - auto result = data->GetString(); - delete data; - return result; + return data->GetString(); } vector BinaryView::GetRawMetadata(const string& key) { - Metadata* data; - if (!QueryMetadata(key, &data) || !data || data->IsRaw()) + auto data = QueryMetadata(key); + if (!data || !data->IsRaw()) throw QueryMetadataException("Failed to find key: " + key); - auto result = data->GetRaw(); - delete data; - return result; + return data->GetRaw(); } uint64_t BinaryView::GetUIntMetadata(const string& key) { - Metadata* data; - if (!QueryMetadata(key, &data) || !data || data->IsUnsignedInteger()) + auto data = QueryMetadata(key); + if (!data || !data->IsUnsignedInteger()) throw QueryMetadataException("Failed to find key: " + key); - auto result = data->GetUnsignedInteger(); - delete data; - return result; + return data->GetUnsignedInteger(); } BinaryData::BinaryData(FileMetadata* file): BinaryView(BNCreateBinaryDataView(file->GetObject())) diff --git a/metadata.cpp b/metadata.cpp index 2f398940..3f01f4bb 100644 --- a/metadata.cpp +++ b/metadata.cpp @@ -3,34 +3,34 @@ using namespace std; using namespace BinaryNinja; -Metadata::Metadata(BNMetadata* structuredData) +Metadata::Metadata(BNMetadata* metadata) { - m_object = structuredData; + m_object = metadata; } Metadata::Metadata(bool data) { - m_object = BNCreateStructuredBooleanData(data); + m_object = BNCreateMetadataBooleanData(data); } Metadata::Metadata(const string& data) { - m_object = BNCreateStructuredStringData(data.c_str()); + m_object = BNCreateMetadataStringData(data.c_str()); } Metadata::Metadata(uint64_t data) { - m_object = BNCreateStructuredUnsignedIntegerData(data); + m_object = BNCreateMetadataUnsignedIntegerData(data); } Metadata::Metadata(int64_t data) { - m_object = BNCreateStructuredSignedIntegerData(data); + m_object = BNCreateMetadataSignedIntegerData(data); } Metadata::Metadata(double data) { - m_object = BNCreateStructuredDoubleData(data); + m_object = BNCreateMetadataDoubleData(data); } Metadata::Metadata(const vector& data) @@ -39,7 +39,7 @@ Metadata::Metadata(const vector& data) for (size_t i = 0; i < data.size(); i++) input[i] = data[i]; - m_object = BNCreateStructuredBooleanListData(input, data.size()); + m_object = BNCreateMetadataBooleanListData(input, data.size()); delete[] input; } @@ -49,7 +49,7 @@ Metadata::Metadata(const vector& data) for (size_t i = 0; i < data.size(); i++) input[i] = BNAllocString(data[i].c_str()); - m_object = BNCreateStructuredStringListData((const char**)input, data.size()); + m_object = BNCreateMetadataStringListData((const char**)input, data.size()); for (size_t i = 0; i < data.size(); i++) BNFreeString(input[i]); @@ -62,7 +62,7 @@ Metadata::Metadata(const vector& data) for (size_t i = 0; i < data.size(); i++) input[i] = data[i]; - m_object = BNCreateStructuredUnsignedIntegerListData(input, data.size()); + m_object = BNCreateMetadataUnsignedIntegerListData(input, data.size()); delete[] input; } @@ -72,7 +72,7 @@ Metadata::Metadata(const vector& data) for (size_t i = 0; i < data.size(); i++) input[i] = data[i]; - m_object = BNCreateStructuredSignedIntegerListData(input, data.size()); + m_object = BNCreateMetadataSignedIntegerListData(input, data.size()); delete[] input; } @@ -82,7 +82,7 @@ Metadata::Metadata(const vector& data) for (size_t i = 0; i < data.size(); i++) input[i] = data[i]; - m_object = BNCreateStructuredDoubleListData(input, data.size()); + m_object = BNCreateMetadataDoubleListData(input, data.size()); delete[] input; } @@ -92,7 +92,7 @@ Metadata::Metadata(const vector& data) for (size_t i = 0; i < data.size(); i++) input[i] = data[i]; - m_object = BNCreateStructuredRawData(input, data.size()); + m_object = BNCreateMetadataRawData(input, data.size()); delete[] input; } diff --git a/settings.cpp b/settings.cpp index 97c2a232..b7e08793 100644 --- a/settings.cpp +++ b/settings.cpp @@ -1,4 +1,5 @@ #include "binaryninjaapi.h" +#include using namespace BinaryNinja; using namespace std; -- cgit v1.3.1 From 88ec179d9519221744240e347bc94da09bbc2157 Mon Sep 17 00:00:00 2001 From: Peter LaFosse Date: Sat, 1 Jul 2017 16:41:36 -0400 Subject: expose Settings 'Set' APIs to C++ --- binaryninjaapi.h | 26 ++++++++++++++++++++++ settings.cpp | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+) (limited to 'settings.cpp') diff --git a/binaryninjaapi.h b/binaryninjaapi.h index f2fa1e07..3eb8b82e 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -2881,6 +2881,32 @@ namespace BinaryNinja static bool IsIntegerList(const std::string& settingGroup, const std::string& name); static bool IsStringList(const std::string& settingGroup, const std::string& name); static bool IsDouble(const std::string& settingGroup, const std::string& name); + + static bool Set(const std::string& settingGroup, + const std::string& name, + bool value, + bool autoFlush=true); + static bool Set(const std::string& settingGroup, + const std::string& name, + uint64_t value, + bool autoFlush=true); + static bool Set(const std::string& settingGroup, + const std::string& name, + const std::string& value, + bool autoFlush=true); + static bool Set(const std::string& settingGroup, + const std::string& name, + const std::vector& value, + bool autoFlush=true); + static bool Set(const std::string& settingGroup, + const std::string& name, + const std::vector& value, + bool autoFlush=true); + static bool Set(const std::string& settingGroup, + const std::string& name, + double value, + bool autoFlush=true); + static bool FlushSettings(); }; typedef BNMetadataType MetadataType; diff --git a/settings.cpp b/settings.cpp index b7e08793..a60b7e3a 100644 --- a/settings.cpp +++ b/settings.cpp @@ -96,3 +96,69 @@ bool Setting::IsDouble(const std::string& pluginName, const std::string& name) { return BNSettingIsDouble(pluginName.c_str(), name.c_str()); } + +bool Setting::Set(const std::string& settingGroup, + const std::string& name, + bool value, + bool autoFlush) +{ + return BNSettingSetBool(settingGroup.c_str(), name.c_str(), value, autoFlush); +} + +bool Setting::Set(const std::string& settingGroup, + const std::string& name, + uint64_t value, + bool autoFlush) +{ + return BNSettingSetInteger(settingGroup.c_str(), name.c_str(), value, autoFlush); +} + +bool Setting::Set(const std::string& settingGroup, + const std::string& name, + const std::string& value, + bool autoFlush) +{ + return BNSettingSetString(settingGroup.c_str(), name.c_str(), value.c_str(), autoFlush); +} + +bool Setting::Set(const std::string& settingGroup, + const std::string& name, + const std::vector& value, + bool autoFlush) +{ + return BNSettingSetIntegerList(settingGroup.c_str(), name.c_str(), &value[0], value.size(), autoFlush); +} + +bool Setting::Set(const std::string& settingGroup, + const std::string& name, + const std::vector& value, + bool autoFlush) +{ + char** buffer = new char*[value.size()]; + if (!buffer) + return false; + for (size_t i = 0; i < value.size(); i++) + buffer[i] = BNAllocString(value[i].c_str()); + + bool result = BNSettingSetStringList(settingGroup.c_str(), + name.c_str(), + (const char**)buffer, + value.size(), + autoFlush); + + BNFreeStringList(buffer, value.size()); + return result; +} + +bool Setting::Set(const std::string& settingGroup, + const std::string& name, + double value, + bool autoFlush) +{ + return BNSettingSetDouble(settingGroup.c_str(), name.c_str(), value, autoFlush); +} + +bool Setting::FlushSettings() +{ + return BNSettingFlushSettings(); +} \ No newline at end of file -- cgit v1.3.1 From c154e1f9400f6a8838405f4a4fd41dbc6f2fcba3 Mon Sep 17 00:00:00 2001 From: Peter LaFosse Date: Mon, 3 Jul 2017 17:58:04 -0400 Subject: Add setting removal APIs, allow negative integers --- binaryninjaapi.h | 11 +++++++---- binaryninjacore.h | 12 +++++++----- python/setting.py | 33 ++++++++++++++++++++++++++++----- settings.cpp | 28 +++++++++++++++++++--------- 4 files changed, 61 insertions(+), 23 deletions(-) (limited to 'settings.cpp') diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 3eb8b82e..f5850ad0 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -2868,9 +2868,9 @@ namespace BinaryNinja { public: static bool GetBool(const std::string& settingGroup, const std::string& name, bool defaultValue); - static uint64_t GetInteger(const std::string& settingGroup, const std::string& name, uint64_t defaultValue=0); + static int64_t GetInteger(const std::string& settingGroup, const std::string& name, int64_t defaultValue=0); static std::string GetString(const std::string& settingGroup, const std::string& name, const std::string& defaultValue=""); - static std::vector GetIntegerList(const std::string& settingGroup, const std::string& name, const std::vector& defaultValue={}); + static std::vector GetIntegerList(const std::string& settingGroup, const std::string& name, const std::vector& defaultValue={}); static std::vector GetStringList(const std::string& settingGroup, const std::string& name, const std::vector& defaultValue={}); static double GetDouble(const std::string& settingGroup, const std::string& name, double defaultValue=0.0); @@ -2888,7 +2888,7 @@ namespace BinaryNinja bool autoFlush=true); static bool Set(const std::string& settingGroup, const std::string& name, - uint64_t value, + int64_t value, bool autoFlush=true); static bool Set(const std::string& settingGroup, const std::string& name, @@ -2896,7 +2896,7 @@ namespace BinaryNinja bool autoFlush=true); static bool Set(const std::string& settingGroup, const std::string& name, - const std::vector& value, + const std::vector& value, bool autoFlush=true); static bool Set(const std::string& settingGroup, const std::string& name, @@ -2906,6 +2906,9 @@ namespace BinaryNinja const std::string& name, double value, bool autoFlush=true); + + static bool RemoveSettingGroup(const std::string& settingGroup, bool autoFlush=true); + static bool RemoveSetting(const std::string& settingGroup, const std::string& setting, bool autoFlush=true); static bool FlushSettings(); }; diff --git a/binaryninjacore.h b/binaryninjacore.h index 0394517f..eb9927ab 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -2885,15 +2885,15 @@ extern "C" // Settings APIs BINARYNINJACOREAPI bool BNSettingGetBool(const char* settingGroup, const char* name, bool defaultValue); - BINARYNINJACOREAPI uint64_t BNSettingGetInteger(const char* settingGroup, const char* name, uint64_t defaultValue); + BINARYNINJACOREAPI int64_t BNSettingGetInteger(const char* settingGroup, const char* name, int64_t defaultValue); BINARYNINJACOREAPI char* BNSettingGetString(const char* settingGroup, const char* name, const char* defaultValue); // intoutSize is number of elements in defaultValue one entry and number of elements in return type on exit - BINARYNINJACOREAPI uint64_t* BNSettingGetIntegerList(const char* settingGroup, const char* name, uint64_t* defaultValue, size_t* inoutSize); + BINARYNINJACOREAPI int64_t* BNSettingGetIntegerList(const char* settingGroup, const char* name, int64_t* defaultValue, size_t* inoutSize); // intoutSize is number of elements in defaultValue one entry and number of elements in return type on exit BINARYNINJACOREAPI const char** BNSettingGetStringList(const char* settingGroup, const char* name, const char** defaultValue, size_t* inoutSize); BINARYNINJACOREAPI double BNSettingGetDouble(const char* settingGroup, const char* name, double defaultValue); - BINARYNINJACOREAPI void BNFreeSettingIntegerList(uint64_t* integerList); + BINARYNINJACOREAPI void BNFreeSettingIntegerList(int64_t* integerList); //Check the type of a core setting BINARYNINJACOREAPI bool BNSettingIsBool(const char* name, const char* settingGroup); BINARYNINJACOREAPI bool BNSettingIsInteger(const char* name, const char* settingGroup); @@ -2905,12 +2905,14 @@ extern "C" BINARYNINJACOREAPI bool BNSettingIsPresent(const char* settingGroup, const char* name); BINARYNINJACOREAPI bool BNSettingSetBool(const char* settingGroup, const char* name, bool value, bool autoFlush); - BINARYNINJACOREAPI bool BNSettingSetInteger(const char* settingGroup, const char* name, uint64_t value, bool autoFlush); + BINARYNINJACOREAPI bool BNSettingSetInteger(const char* settingGroup, const char* name, int64_t value, bool autoFlush); BINARYNINJACOREAPI bool BNSettingSetString(const char* settingGroup, const char* name, const char* value, bool autoFlush); BINARYNINJACOREAPI bool BNSettingSetDouble(const char* settingGroup, const char* name, double value, bool autoFlush); - BINARYNINJACOREAPI bool BNSettingSetIntegerList(const char* settingGroup, const char* name, const uint64_t* value, size_t size, bool autoFlush); + BINARYNINJACOREAPI bool BNSettingSetIntegerList(const char* settingGroup, const char* name, const int64_t* value, size_t size, bool autoFlush); BINARYNINJACOREAPI bool BNSettingSetStringList(const char* settingGroup, const char* name, const char** value, size_t size, bool autoFlush); + BINARYNINJACOREAPI bool BNSettingRemoveSetting(const char* settingGroup, const char* setting, bool autoFlush); + BINARYNINJACOREAPI bool BNSettingRemoveSettingGroup(const char* settingGroup, bool autoFlush); BINARYNINJACOREAPI bool BNSettingFlushSettings(); //Metadata APIs diff --git a/python/setting.py b/python/setting.py index 975f393e..d52ac1ec 100644 --- a/python/setting.py +++ b/python/setting.py @@ -40,7 +40,7 @@ class Setting(object): def get_integer_list(self, name): length = ctypes.c_ulonglong() length.value = 0 - default_list = ctypes.POINTER(ctypes.c_ulonglong)() + default_list = ctypes.POINTER(ctypes.c_longlong)() result = core.BNSettingGetIntegerList(self.plugin_name, name, default_list, ctypes.byref(length)) out_list = [] for i in xrange(length.value): @@ -56,7 +56,7 @@ class Setting(object): out_list = [] for i in xrange(length.value): out_list.append(result[i]) - core.BNFreeSettingStringList(result, length) + core.BNFreeStringList(result, length) return out_list def get_double(self, name, default_value=0.0): @@ -92,16 +92,16 @@ class Setting(object): def set_string(self, name, value, auto_flush=True): return core.BNSettingSetString(self.plugin_name, name, value, auto_flush) - def set_integerList(self, name, value, auto_flush=True): + def set_integer_list(self, name, value, auto_flush=True): length = ctypes.c_ulonglong() length.value = len(value) - default_list = (ctypes.c_ulonglong * len(value))() + default_list = (ctypes.c_longlong * len(value))() for i in xrange(len(value)): default_list[i] = value[i] return core.BNSettingSetIntegerList(self.plugin_name, name, default_list, length, auto_flush) - def set_stringList(self, name, value, auto_flush=True): + def set_string_list(self, name, value, auto_flush=True): length = ctypes.c_ulonglong() length.value = len(value) default_list = (ctypes.c_char_p * len(value))() @@ -112,3 +112,26 @@ class Setting(object): def set_double(self, name, value, auto_flush=True): return core.BNSettingSetDouble(self.plugin_name, name, value, auto_flush) + + def set(self, name, value, auto_flush=True): + if isinstance(value, bool): + return self.set_bool(name, value, auto_flush) + elif isinstance(value, int): + return self.set_integer(name, value, auto_flush) + elif isinstance(value, str): + return self.set_string(name, value, auto_flush) + elif isinstance(value, list) and len(value) == 0: + return self.set_integer_list(name, value, auto_flush) + elif isinstance(value, list) and len(value) > 0 and isinstance(value[0], int): + return self.set_integer_list(name, value, auto_flush) + elif isinstance(value, list) and len(value) > 0 and isinstance(value[0], str): + return self.set_string_list(name, value, auto_flush) + elif isinstance(value, float): + return self.set_double(name, value, auto_flush) + raise ValueError("value is not one of (int, bool, float, str, [int], [str]) types") + + def remove_setting_group(self, auto_flush=True): + core.BNSettingRemoveSettingGroup(self.plugin_name, auto_flush) + + def remove_setting(self, setting, auto_flush=True): + core.BNSettingRemoveSetting(self.plugin_name, setting, auto_flush) \ No newline at end of file diff --git a/settings.cpp b/settings.cpp index a60b7e3a..b30e6098 100644 --- a/settings.cpp +++ b/settings.cpp @@ -10,7 +10,7 @@ bool Setting::GetBool(const std::string& pluginName, const std::string& name, bo return BNSettingGetBool(pluginName.c_str(), name.c_str(), defaultValue); } -uint64_t Setting::GetInteger(const std::string& pluginName, const std::string& name, uint64_t defaultValue) +int64_t Setting::GetInteger(const std::string& pluginName, const std::string& name, int64_t defaultValue) { return BNSettingGetInteger(pluginName.c_str(), name.c_str(), defaultValue); } @@ -25,17 +25,17 @@ double Setting::GetDouble(const std::string& pluginName, const std::string& name return BNSettingGetDouble(pluginName.c_str(), name.c_str(), defaultValue); } -std::vector Setting::GetIntegerList(const std::string& pluginName, +std::vector Setting::GetIntegerList(const std::string& pluginName, const std::string& name, - const std::vector& defaultValue) + const std::vector& defaultValue) { - uint64_t* buffer = new uint64_t[defaultValue.size()]; - memcpy(&buffer[0], &defaultValue[0], sizeof(uint64_t) * defaultValue.size()); + int64_t* buffer = new int64_t[defaultValue.size()]; + memcpy(&buffer[0], &defaultValue[0], sizeof(int64_t) * defaultValue.size()); size_t size = defaultValue.size(); - uint64_t* outBuffer = BNSettingGetIntegerList(pluginName.c_str(), name.c_str(), buffer, &size); + int64_t* outBuffer = BNSettingGetIntegerList(pluginName.c_str(), name.c_str(), buffer, &size); delete[] buffer; - vector out(outBuffer, outBuffer + size); + vector out(outBuffer, outBuffer + size); BNFreeSettingIntegerList(buffer); return out; } @@ -107,7 +107,7 @@ bool Setting::Set(const std::string& settingGroup, bool Setting::Set(const std::string& settingGroup, const std::string& name, - uint64_t value, + int64_t value, bool autoFlush) { return BNSettingSetInteger(settingGroup.c_str(), name.c_str(), value, autoFlush); @@ -123,7 +123,7 @@ bool Setting::Set(const std::string& settingGroup, bool Setting::Set(const std::string& settingGroup, const std::string& name, - const std::vector& value, + const std::vector& value, bool autoFlush) { return BNSettingSetIntegerList(settingGroup.c_str(), name.c_str(), &value[0], value.size(), autoFlush); @@ -158,6 +158,16 @@ bool Setting::Set(const std::string& settingGroup, return BNSettingSetDouble(settingGroup.c_str(), name.c_str(), value, autoFlush); } +bool Setting::RemoveSettingGroup(const std::string& settingGroup, bool autoFlush) +{ + return BNSettingRemoveSettingGroup(settingGroup.c_str(), autoFlush); +} + +bool Setting::RemoveSetting(const std::string& settingGroup, const std::string& setting, bool autoFlush) +{ + return BNSettingRemoveSetting(settingGroup.c_str(), setting.c_str(), autoFlush); +} + bool Setting::FlushSettings() { return BNSettingFlushSettings(); -- cgit v1.3.1 From ee34b3e1ad9536ff3530489afde88f9161fa6967 Mon Sep 17 00:00:00 2001 From: Peter LaFosse Date: Fri, 4 Aug 2017 12:50:09 -0400 Subject: Fixing UAF in settings --- settings.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'settings.cpp') diff --git a/settings.cpp b/settings.cpp index b30e6098..328cf0e3 100644 --- a/settings.cpp +++ b/settings.cpp @@ -36,7 +36,7 @@ std::vector Setting::GetIntegerList(const std::string& pluginName, delete[] buffer; vector out(outBuffer, outBuffer + size); - BNFreeSettingIntegerList(buffer); + BNFreeSettingIntegerList(outBuffer); return out; } -- cgit v1.3.1