From 4dd2ae389a26a64444968b00db6b7dc8f2d6c0c5 Mon Sep 17 00:00:00 2001 From: Jiancong <94389147@qq.com> Date: Tue, 3 Apr 2018 10:57:25 +0800 Subject: [PATCH] Fix the cycle-referenced caused memory leak by shared_ptr used, this issue is recognized by valgrind memcheck tool. --- external/process-cpp-minimal/include/core/posix/signal.h | 2 +- external/process-cpp-minimal/src/core/posix/signal.cpp | 8 +++----- src/anbox/cmds/session_manager.cpp | 9 +++++++-- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/external/process-cpp-minimal/include/core/posix/signal.h b/external/process-cpp-minimal/include/core/posix/signal.h index d11724a..a647149 100644 --- a/external/process-cpp-minimal/include/core/posix/signal.h +++ b/external/process-cpp-minimal/include/core/posix/signal.h @@ -100,7 +100,7 @@ protected: * @brief Traps the specified signals for the entire process. */ CORE_POSIX_DLL_PUBLIC -std::shared_ptr trap_signals_for_process( +SignalTrap* trap_signals_for_process( std::initializer_list blocked_signals); /** diff --git a/external/process-cpp-minimal/src/core/posix/signal.cpp b/external/process-cpp-minimal/src/core/posix/signal.cpp index fd90047..4dd38cf 100644 --- a/external/process-cpp-minimal/src/core/posix/signal.cpp +++ b/external/process-cpp-minimal/src/core/posix/signal.cpp @@ -203,12 +203,10 @@ private: }; } -std::shared_ptr core::posix::trap_signals_for_process( - std::initializer_list blocked_signals) +core::posix::SignalTrap* core::posix::trap_signals_for_process( + std::initializer_list blocked_signals) { - return std::make_shared( - impl::SignalTrap::Scope::process, - blocked_signals); + return new impl::SignalTrap(impl::SignalTrap::Scope::process, blocked_signals); } std::shared_ptr core::posix::trap_signals_for_all_subsequent_threads( diff --git a/src/anbox/cmds/session_manager.cpp b/src/anbox/cmds/session_manager.cpp index 4988967..1551e81 100644 --- a/src/anbox/cmds/session_manager.cpp +++ b/src/anbox/cmds/session_manager.cpp @@ -131,7 +131,7 @@ anbox::cmds::SessionManager::SessionManager() use_system_dbus_)); action([this](const cli::Command::Context &) { - auto trap = core::posix::trap_signals_for_process( + core::posix::SignalTrap* trap = core::posix::trap_signals_for_process( {core::posix::Signal::sig_term, core::posix::Signal::sig_int}); trap->signal_raised().connect([trap](const core::posix::Signal &signal) { INFO("Signal %i received. Good night.", static_cast(signal)); @@ -139,11 +139,13 @@ anbox::cmds::SessionManager::SessionManager() }); if (standalone_ && !experimental_) { + delete trap; ERROR("Experimental features selected, but --experimental flag not set"); return EXIT_FAILURE; } if (!fs::exists("/dev/binder") || !fs::exists("/dev/ashmem")) { + delete trap; ERROR("Failed to start as either binder or ashmem kernel drivers are not loaded"); return EXIT_FAILURE; } @@ -176,8 +178,10 @@ anbox::cmds::SessionManager::SessionManager() input_manager, display_frame, single_window_); - if (!platform) + if (!platform) { + delete trap; return EXIT_FAILURE; + } auto app_db = std::make_shared(); @@ -283,6 +287,7 @@ anbox::cmds::SessionManager::SessionManager() rt->stop(); + delete trap; return EXIT_SUCCESS; }); }