From: Changgyu Choi Date: Fri, 4 Aug 2023 02:17:08 +0000 (+0900) Subject: Protect to access released handle X-Git-Tag: accepted/tizen/7.0/unified/20240104.170609~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1368520e35e4d13cbaaf52b7ab01b5f11d96cf48;p=platform%2Fcore%2Fappfw%2Frpc-port.git Protect to access released handle Change-Id: Ib228d1991930e220226e83b2d7ed87155589e595 Signed-off-by: Changgyu Choi --- diff --git a/src/ac-internal.cc b/src/ac-internal.cc index 70821d6..9f44608 100644 --- a/src/ac-internal.cc +++ b/src/ac-internal.cc @@ -96,7 +96,14 @@ int AccessController::Check(int fd, const std::string& sender_appid) { void AccessController::CheckAsync(int fd, std::string sender_appid, CompleteCallback callback) { + /* This is for handle freed issue */ + auto tmp_handle = new std::shared_ptr(shared_from_this()); Job job([=]() -> Job::Type { + if ((*tmp_handle).use_count() == 1) { + delete tmp_handle; + return Job::Type::Continue; + } + int res = Check(fd, sender_appid); auto* cbdata = new std::pair(callback, res); guint sid = g_idle_add( @@ -112,6 +119,7 @@ void AccessController::CheckAsync(int fd, std::string sender_appid, delete cbdata; } + delete tmp_handle; return Job::Type::Continue; }); diff --git a/src/ac-internal.hh b/src/ac-internal.hh index a2309ee..daefbd7 100644 --- a/src/ac-internal.hh +++ b/src/ac-internal.hh @@ -33,7 +33,7 @@ namespace internal { using CompleteCallback = std::function; -class AccessController { +class AccessController : public std::enable_shared_from_this { public: explicit AccessController(bool trusted = false) : trusted_(trusted) {} diff --git a/src/cynara_thread.cc b/src/cynara_thread.cc index 0a8efd2..a5ee3e9 100644 --- a/src/cynara_thread.cc +++ b/src/cynara_thread.cc @@ -41,16 +41,15 @@ CynaraThread::CynaraThread() { CynaraThread::~CynaraThread() { Job finish_job; - Push(finish_job); + Push(std::move(finish_job)); thread_.join(); } void CynaraThread::ThreadRun() { + Job job; while (true) { - Job job; queue_.WaitAndPop(job); - Job::Type ret = job.Do(); - if (ret == Job::Type::Finish) + if (job.Do() == Job::Type::Finish) return; } } diff --git a/src/cynara_thread.hh b/src/cynara_thread.hh index 412931a..b4c7944 100644 --- a/src/cynara_thread.hh +++ b/src/cynara_thread.hh @@ -56,7 +56,6 @@ class CynaraThread { private: CynaraThread(); - Job Pop(); std::thread thread_; mutable SharedQueue queue_; diff --git a/src/stub-internal.cc b/src/stub-internal.cc index 72b59b2..b0bc883 100644 --- a/src/stub-internal.cc +++ b/src/stub-internal.cc @@ -129,12 +129,12 @@ void Stub::Ignore() { void Stub::AddPrivilege(const std::string& privilege) { std::lock_guard lock(GetMutex()); - access_controller_.AddPrivilege(privilege); + access_controller_->AddPrivilege(privilege); } void Stub::SetTrusted(const bool trusted) { std::lock_guard lock(GetMutex()); - access_controller_.SetTrusted(trusted); + access_controller_->SetTrusted(trusted); } std::shared_ptr Stub::FindPort(const std::string& instance) const { @@ -412,7 +412,7 @@ gboolean Stub::Server::OnRequestReceived(GIOChannel* channel, GIOCondition cond, _E("Reject request. %u:%u", cred->GetUid(), getuid()); res = -1; } else { - stub->access_controller_.CheckAsync(client->GetFd(), app_id, + stub->access_controller_->CheckAsync(client->GetFd(), app_id, response_func); return G_SOURCE_CONTINUE; } diff --git a/src/stub-internal.hh b/src/stub-internal.hh index 0f2723c..f58413f 100644 --- a/src/stub-internal.hh +++ b/src/stub-internal.hh @@ -108,7 +108,8 @@ class Stub { std::recursive_mutex& GetMutex() const; private: - AccessController access_controller_; + std::shared_ptr access_controller_ = + std::make_shared(); std::string port_name_; std::list> ports_; IEventListener* listener_ = nullptr;