1
0

fix: solve memory issues of sdk apis

This commit is contained in:
saturneric 2024-12-02 23:52:57 +01:00
parent 39cee0e7ef
commit fb3bcfca28
5 changed files with 57 additions and 35 deletions

View File

@ -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;
void GFExecuteCommandBatchSync(GFCommandExecuteContext** contexts,
int32_t contexts_size) {
QList<GpgFrontend::GpgCommandExecutor::ExecuteContext> core_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](
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 {

View File

@ -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

View File

@ -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) {

View File

@ -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*)));

View File

@ -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 **;
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;
}