From 15a3be2dc1f762347e096e598fb9827a3c0c2095 Mon Sep 17 00:00:00 2001 From: Deve Date: Fri, 17 Aug 2018 23:40:39 +0200 Subject: [PATCH] Avoid invalid memory access in child process on Android --- src/utils/separate_process.cpp | 18 +++++++++++++----- src/utils/separate_process.hpp | 2 ++ 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/utils/separate_process.cpp b/src/utils/separate_process.cpp index 01d4c347d..12eaf07d5 100644 --- a/src/utils/separate_process.cpp +++ b/src/utils/separate_process.cpp @@ -124,6 +124,11 @@ SeparateProcess::~SeparateProcess() dlclose(m_child_handle); m_child_handle = NULL; m_child_abort_proc = NULL; + + for (char* arg : m_child_args) + { + delete[] arg; + } } #else @@ -343,17 +348,20 @@ bool SeparateProcess::createChildProcess(const std::string& exe, const std::string exe_file = StringUtils::getBasename(exe); auto rest_argv = StringUtils::split(argument, ' '); - - std::vector argv; - argv.push_back(const_cast(exe_file.c_str())); + + char* arg = new char[exe_file.size() + 1](); + memcpy(arg, exe_file.c_str(), exe_file.size()); + m_child_args.push_back(arg); for (unsigned i = 0; i < rest_argv.size(); i++) { - argv.push_back(const_cast(rest_argv[i].c_str())); + char* arg = new char[rest_argv[i].size() + 1](); + memcpy(arg, rest_argv[i].c_str(), rest_argv[i].size()); + m_child_args.push_back(arg); } Log::info("SeparateProcess", "Starting main()"); - m_child_thread = std::thread(main_proc, argv.size(), &argv[0]); + m_child_thread = std::thread(main_proc, m_child_args.size(), &m_child_args[0]); return true; } diff --git a/src/utils/separate_process.hpp b/src/utils/separate_process.hpp index 08121f19b..7cbc7e02f 100644 --- a/src/utils/separate_process.hpp +++ b/src/utils/separate_process.hpp @@ -25,6 +25,7 @@ #include #include #include +#include class SeparateProcess { @@ -41,6 +42,7 @@ private: void* m_child_handle; void (*m_child_abort_proc)(); std::thread m_child_thread; + std::vector m_child_args; #else int m_child_stdin_write = -1; int m_child_stdout_read = -1;