aboutsummaryrefslogtreecommitdiffstats
path: root/src/sdk
diff options
context:
space:
mode:
authorsaturneric <[email protected]>2024-12-02 22:52:57 +0000
committersaturneric <[email protected]>2024-12-02 22:52:57 +0000
commitfb3bcfca2819eb43a84ee47c206140346c5d3459 (patch)
tree77972fa0c6c2da706143469ef37f7b5f492e12cb /src/sdk
parentfix: ui initializes before core fully initialized (diff)
downloadGpgFrontend-fb3bcfca2819eb43a84ee47c206140346c5d3459.tar.gz
GpgFrontend-fb3bcfca2819eb43a84ee47c206140346c5d3459.zip
fix: solve memory issues of sdk apis
Diffstat (limited to 'src/sdk')
-rw-r--r--src/sdk/GFSDKBasic.cpp39
-rw-r--r--src/sdk/GFSDKBasic.h10
-rw-r--r--src/sdk/GFSDKGpg.cpp4
-rw-r--r--src/sdk/private/GFSDKPrivat.cpp4
-rw-r--r--src/sdk/private/GFSDKPrivat.h37
5 files changed, 58 insertions, 36 deletions
diff --git a/src/sdk/GFSDKBasic.cpp b/src/sdk/GFSDKBasic.cpp
index 2815d17a..2b37ada4 100644
--- a/src/sdk/GFSDKBasic.cpp
+++ b/src/sdk/GFSDKBasic.cpp
@@ -53,43 +53,34 @@ auto GFProjectVersion() -> const char* {
auto GFQtEnvVersion() -> const char* { return GFStrDup(QT_VERSION_STR); }
-void GFExecuteCommandSync(const char* cmd, int32_t argc, const char** argv,
+void GFExecuteCommandSync(const char* cmd, int32_t argc, char** argv,
GFCommandExecuteCallback cb, void* data) {
- QStringList args;
- for (int i = 0; i < argc; i++) {
- args.append(GFUnStrDup(argv[i]));
- }
-
+ QStringList args = CharArrayToQStringList(argv, argc);
GpgFrontend::GpgCommandExecutor::ExecuteContext const context{
cmd, args, [=](int exit_code, const QString& out, const QString& err) {
cb(data, exit_code, out.toUtf8(), err.toUtf8());
}};
-
GpgFrontend::GpgCommandExecutor::ExecuteSync(context);
}
-void GFExecuteCommandBatchSync(int32_t context_size,
- const GFCommandExecuteContext* context) {
- QList<GpgFrontend::GpgCommandExecutor::ExecuteContext> contexts;
-
- for (int i = 0; i < context_size; i++) {
- const auto& exec_context = context[i];
-
- QStringList args;
- const char** argv = exec_context.argv;
- for (int j = 0; j < exec_context.argc; j++) {
- args.append(GFUnStrDup(argv[j]));
- }
-
- contexts.append(
- {exec_context.cmd, args,
- [data = exec_context.data, cb = exec_context.cb](
+void GFExecuteCommandBatchSync(GFCommandExecuteContext** contexts,
+ int32_t contexts_size) {
+ QList<GpgFrontend::GpgCommandExecutor::ExecuteContext> core_contexts;
+
+ QList<GFCommandExecuteContext> sdk_contexts =
+ ArrayToQList(contexts, contexts_size);
+ for (const auto sdk_context : sdk_contexts) {
+ QStringList args =
+ CharArrayToQStringList(sdk_context.argv, sdk_context.argc);
+ core_contexts.append(
+ {GFUnStrDup(sdk_context.cmd), args,
+ [data = sdk_context.data, cb = sdk_context.cb](
int exit_code, const QString& out, const QString& err) {
cb(data, exit_code, out.toUtf8(), err.toUtf8());
}});
}
- GpgFrontend::GpgCommandExecutor::ExecuteConcurrentlySync(contexts);
+ GpgFrontend::GpgCommandExecutor::ExecuteConcurrentlySync(core_contexts);
}
auto StrlenSafe(const char* str, size_t max_len) -> size_t {
diff --git a/src/sdk/GFSDKBasic.h b/src/sdk/GFSDKBasic.h
index 1c81299a..6af2176d 100644
--- a/src/sdk/GFSDKBasic.h
+++ b/src/sdk/GFSDKBasic.h
@@ -42,11 +42,11 @@ using GFCommandExecuteCallback = void (*)(void* data, int errcode,
const char* out, const char* err);
using GFCommandExecuteContext = struct {
- const char* cmd;
+ char* cmd;
int32_t argc;
- const char** argv;
+ char** argv;
GFCommandExecuteCallback cb;
- void* data;
+ void* data; ///< must free by user
};
using GFTranslatorDataReader = int (*)(const char* locale, char** data);
@@ -106,7 +106,7 @@ void GPGFRONTEND_MODULE_SDK_EXPORT GFFreeMemory(void*);
* @param data
*/
void GPGFRONTEND_MODULE_SDK_EXPORT
-GFExecuteCommandSync(const char* cmd, int32_t argc, const char** argv,
+GFExecuteCommandSync(const char* cmd, int32_t argc, char** argv,
GFCommandExecuteCallback cb, void* data);
/**
@@ -116,7 +116,7 @@ GFExecuteCommandSync(const char* cmd, int32_t argc, const char** argv,
* @param context
*/
void GPGFRONTEND_MODULE_SDK_EXPORT GFExecuteCommandBatchSync(
- int32_t context_size, const GFCommandExecuteContext* context);
+ GFCommandExecuteContext** contexts, int32_t contexts_size);
/**
* @brief
diff --git a/src/sdk/GFSDKGpg.cpp b/src/sdk/GFSDKGpg.cpp
index 52ea0520..3cbaba7e 100644
--- a/src/sdk/GFSDKGpg.cpp
+++ b/src/sdk/GFSDKGpg.cpp
@@ -48,7 +48,7 @@ auto GPGFRONTEND_MODULE_SDK_EXPORT GFGpgSignData(int channel, char** key_ids,
int key_ids_size, char* data,
int sign_mode, int ascii,
GFGpgSignResult** ps) -> int {
- auto singer_ids = CharArrayToQList(key_ids, key_ids_size);
+ auto singer_ids = CharArrayToQStringList(key_ids, key_ids_size);
GpgFrontend::KeyArgsList signer_keys;
for (const auto& signer_id : singer_ids) {
@@ -130,7 +130,7 @@ auto GPGFRONTEND_MODULE_SDK_EXPORT GFGpgKeyPrimaryUID(int channel, char* key_id,
auto GPGFRONTEND_MODULE_SDK_EXPORT
GFGpgEncryptData(int channel, char** key_ids, int key_ids_size, char* data,
int ascii, GFGpgEncryptionResult** ps) -> int {
- auto encrypt_key_ids = CharArrayToQList(key_ids, key_ids_size);
+ auto encrypt_key_ids = CharArrayToQStringList(key_ids, key_ids_size);
GpgFrontend::KeyArgsList encrypt_keys;
for (const auto& encrypt_key_id : encrypt_key_ids) {
diff --git a/src/sdk/private/GFSDKPrivat.cpp b/src/sdk/private/GFSDKPrivat.cpp
index 71136535..5a2c5256 100644
--- a/src/sdk/private/GFSDKPrivat.cpp
+++ b/src/sdk/private/GFSDKPrivat.cpp
@@ -105,7 +105,7 @@ auto ConvertEventParamsToMap(GFModuleEventParam* params)
return param_map;
}
-auto CharArrayToQList(char** char_array, int size) -> QStringList {
+auto CharArrayToQStringList(char** char_array, int size) -> QStringList {
QStringList list;
for (int i = 0; i < size; ++i) {
if (char_array[i] != nullptr) {
@@ -117,7 +117,7 @@ auto CharArrayToQList(char** char_array, int size) -> QStringList {
return list;
}
-auto QListToCharArray(const QStringList& list) -> char** {
+auto QStringListToCharArray(const QStringList& list) -> char** {
char** char_array = static_cast<char**>(
GpgFrontend::SecureMalloc(list.size() * sizeof(char*)));
diff --git a/src/sdk/private/GFSDKPrivat.h b/src/sdk/private/GFSDKPrivat.h
index 7cfa2c76..1d1cc8d3 100644
--- a/src/sdk/private/GFSDKPrivat.h
+++ b/src/sdk/private/GFSDKPrivat.h
@@ -28,7 +28,8 @@
#pragma once
-// declare logging category
+#include <core/function/SecureMemoryAllocator.h>
+
Q_DECLARE_LOGGING_CATEGORY(sdk)
#define LOG_D() qCDebug(sdk)
@@ -95,7 +96,7 @@ auto ConvertEventParamsToMap(GFModuleEventParam *params)
* @param size
* @return QStringList
*/
-auto CharArrayToQList(char **char_array, int size) -> QStringList;
+auto CharArrayToQStringList(char **char_array, int size) -> QStringList;
/**
* @brief
@@ -104,4 +105,34 @@ auto CharArrayToQList(char **char_array, int size) -> QStringList;
* @param size
* @return char**
*/
-auto QListToCharArray(const QStringList &list) -> char **; \ No newline at end of file
+auto QStringListToCharArray(const QStringList &list) -> char **;
+
+template <typename T>
+inline auto ArrayToQList(T **pl_components, int size) -> QList<T> {
+ if (pl_components == nullptr || size <= 0) {
+ return QList<T>();
+ }
+
+ QList<T> list;
+ for (int i = 0; i < size; ++i) {
+ list.append(*pl_components[i]);
+ GpgFrontend::SecureMemoryAllocator::Deallocate(pl_components[i]);
+ }
+ GpgFrontend::SecureMemoryAllocator::Deallocate(pl_components);
+ return list;
+}
+
+template <typename T>
+inline auto QListToArray(const QList<T> &list) -> T ** {
+ T **array = static_cast<T **>(
+ GpgFrontend::SecureMemoryAllocator::Allocate(list.size() * sizeof(T *)));
+ int index = 0;
+ for (const T &item : list) {
+ auto mem = static_cast<T *>(
+ GpgFrontend::SecureMemoryAllocator::Allocate(sizeof(T)));
+ array[index] = new (mem) T(item);
+ index++;
+ }
+
+ return array;
+} \ No newline at end of file