fix: solve memory issues of sdk apis
This commit is contained in:
parent
39cee0e7ef
commit
fb3bcfca28
@ -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 {
|
||||||
|
@ -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
|
||||||
|
@ -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) {
|
||||||
|
@ -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*)));
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user