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); } 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) { GFCommandExecuteCallback cb, void* data) {
QStringList args; QStringList args = CharArrayToQStringList(argv, argc);
for (int i = 0; i < argc; i++) {
args.append(GFUnStrDup(argv[i]));
}
GpgFrontend::GpgCommandExecutor::ExecuteContext const context{ GpgFrontend::GpgCommandExecutor::ExecuteContext const context{
cmd, args, [=](int exit_code, const QString& out, const QString& err) { cmd, args, [=](int exit_code, const QString& out, const QString& err) {
cb(data, exit_code, out.toUtf8(), err.toUtf8()); cb(data, exit_code, out.toUtf8(), err.toUtf8());
}}; }};
GpgFrontend::GpgCommandExecutor::ExecuteSync(context); GpgFrontend::GpgCommandExecutor::ExecuteSync(context);
} }
void GFExecuteCommandBatchSync(int32_t context_size, void GFExecuteCommandBatchSync(GFCommandExecuteContext** contexts,
const GFCommandExecuteContext* context) { int32_t contexts_size) {
QList<GpgFrontend::GpgCommandExecutor::ExecuteContext> contexts; QList<GpgFrontend::GpgCommandExecutor::ExecuteContext> core_contexts;
for (int i = 0; i < context_size; i++) { QList<GFCommandExecuteContext> sdk_contexts =
const auto& exec_context = context[i]; ArrayToQList(contexts, contexts_size);
for (const auto sdk_context : sdk_contexts) {
QStringList args; QStringList args =
const char** argv = exec_context.argv; CharArrayToQStringList(sdk_context.argv, sdk_context.argc);
for (int j = 0; j < exec_context.argc; j++) { core_contexts.append(
args.append(GFUnStrDup(argv[j])); {GFUnStrDup(sdk_context.cmd), args,
} [data = sdk_context.data, cb = sdk_context.cb](
contexts.append(
{exec_context.cmd, args,
[data = exec_context.data, cb = exec_context.cb](
int exit_code, const QString& out, const QString& err) { int exit_code, const QString& out, const QString& err) {
cb(data, exit_code, out.toUtf8(), err.toUtf8()); 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 { 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); const char* out, const char* err);
using GFCommandExecuteContext = struct { using GFCommandExecuteContext = struct {
const char* cmd; char* cmd;
int32_t argc; int32_t argc;
const char** argv; char** argv;
GFCommandExecuteCallback cb; GFCommandExecuteCallback cb;
void* data; void* data; ///< must free by user
}; };
using GFTranslatorDataReader = int (*)(const char* locale, char** data); using GFTranslatorDataReader = int (*)(const char* locale, char** data);
@ -106,7 +106,7 @@ void GPGFRONTEND_MODULE_SDK_EXPORT GFFreeMemory(void*);
* @param data * @param data
*/ */
void GPGFRONTEND_MODULE_SDK_EXPORT 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); GFCommandExecuteCallback cb, void* data);
/** /**
@ -116,7 +116,7 @@ GFExecuteCommandSync(const char* cmd, int32_t argc, const char** argv,
* @param context * @param context
*/ */
void GPGFRONTEND_MODULE_SDK_EXPORT GFExecuteCommandBatchSync( void GPGFRONTEND_MODULE_SDK_EXPORT GFExecuteCommandBatchSync(
int32_t context_size, const GFCommandExecuteContext* context); GFCommandExecuteContext** contexts, int32_t contexts_size);
/** /**
* @brief * @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 key_ids_size, char* data,
int sign_mode, int ascii, int sign_mode, int ascii,
GFGpgSignResult** ps) -> int { 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; GpgFrontend::KeyArgsList signer_keys;
for (const auto& signer_id : singer_ids) { 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 auto GPGFRONTEND_MODULE_SDK_EXPORT
GFGpgEncryptData(int channel, char** key_ids, int key_ids_size, char* data, GFGpgEncryptData(int channel, char** key_ids, int key_ids_size, char* data,
int ascii, GFGpgEncryptionResult** ps) -> int { 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; GpgFrontend::KeyArgsList encrypt_keys;
for (const auto& encrypt_key_id : encrypt_key_ids) { for (const auto& encrypt_key_id : encrypt_key_ids) {

View File

@ -105,7 +105,7 @@ auto ConvertEventParamsToMap(GFModuleEventParam* params)
return param_map; return param_map;
} }
auto CharArrayToQList(char** char_array, int size) -> QStringList { auto CharArrayToQStringList(char** char_array, int size) -> QStringList {
QStringList list; QStringList list;
for (int i = 0; i < size; ++i) { for (int i = 0; i < size; ++i) {
if (char_array[i] != nullptr) { if (char_array[i] != nullptr) {
@ -117,7 +117,7 @@ auto CharArrayToQList(char** char_array, int size) -> QStringList {
return list; return list;
} }
auto QListToCharArray(const QStringList& list) -> char** { auto QStringListToCharArray(const QStringList& list) -> char** {
char** char_array = static_cast<char**>( char** char_array = static_cast<char**>(
GpgFrontend::SecureMalloc(list.size() * sizeof(char*))); GpgFrontend::SecureMalloc(list.size() * sizeof(char*)));

View File

@ -28,7 +28,8 @@
#pragma once #pragma once
// declare logging category #include <core/function/SecureMemoryAllocator.h>
Q_DECLARE_LOGGING_CATEGORY(sdk) Q_DECLARE_LOGGING_CATEGORY(sdk)
#define LOG_D() qCDebug(sdk) #define LOG_D() qCDebug(sdk)
@ -95,7 +96,7 @@ auto ConvertEventParamsToMap(GFModuleEventParam *params)
* @param size * @param size
* @return QStringList * @return QStringList
*/ */
auto CharArrayToQList(char **char_array, int size) -> QStringList; auto CharArrayToQStringList(char **char_array, int size) -> QStringList;
/** /**
* @brief * @brief
@ -104,4 +105,34 @@ auto CharArrayToQList(char **char_array, int size) -> QStringList;
* @param size * @param size
* @return char** * @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;
}