From 0b8ef50287d96abbd9f212b172c0c041d73d20b1 Mon Sep 17 00:00:00 2001 From: Ilho Kim Date: Thu, 2 Jun 2022 16:21:44 +0900 Subject: [PATCH] Receive client's request at each thread Currently, pkginfo-server read each request in the main thread but if some client sends the request slowly, there is a possibility that the main thread is blocked Change-Id: I7cdd27a5c81d2badd6885c2251390eb4ab5d8fcd Signed-off-by: Ilho Kim --- src/client/pkginfo_client.cc | 30 +++++++++++----------- src/client/pkginfo_client.hh | 2 +- src/server/create_cache_request.cc | 6 ++++- src/server/create_cache_request.hh | 3 ++- src/server/cynara_checker/cynara_checker.cc | 21 ++++++++------- src/server/cynara_checker/cynara_checker.hh | 6 +++-- src/server/pkg_request.cc | 16 +++++++++--- src/server/pkg_request.hh | 5 +++- .../request_handler/abstract_request_handler.hh | 2 +- .../request_handler/command_request_handler.cc | 2 +- .../request_handler/command_request_handler.hh | 2 +- .../create_cache_request_handler.cc | 2 +- .../create_cache_request_handler.hh | 2 +- .../request_handler/create_db_request_handler.cc | 2 +- .../request_handler/create_db_request_handler.hh | 2 +- .../request_handler/get_appinfo_request_handler.cc | 4 +-- .../request_handler/get_appinfo_request_handler.hh | 2 +- .../request_handler/get_cert_request_handler.cc | 2 +- .../request_handler/get_cert_request_handler.hh | 2 +- .../request_handler/get_depinfo_request_handler.cc | 2 +- .../request_handler/get_depinfo_request_handler.hh | 2 +- .../request_handler/get_pkginfo_request_handler.cc | 4 +-- .../request_handler/get_pkginfo_request_handler.hh | 2 +- .../request_handler/query_request_handler.cc | 2 +- .../request_handler/query_request_handler.hh | 2 +- .../request_handler_direct_access.cc | 2 +- .../request_handler_direct_access.h | 2 +- .../request_handler/set_cert_request_handler.cc | 2 +- .../request_handler/set_cert_request_handler.hh | 2 +- .../request_handler/set_pkginfo_request_handler.cc | 4 +-- .../request_handler/set_pkginfo_request_handler.hh | 2 +- src/server/runner.cc | 25 ++++-------------- src/server/worker_thread.cc | 26 +++++++++++++++++++ 33 files changed, 113 insertions(+), 79 deletions(-) diff --git a/src/client/pkginfo_client.cc b/src/client/pkginfo_client.cc index 43ad8ff..f552f3c 100644 --- a/src/client/pkginfo_client.cc +++ b/src/client/pkginfo_client.cc @@ -45,22 +45,30 @@ bool PkgInfoClient::SendRequest() { return false; } + tizen_base::Parcel p; + p.WriteParcelable(*parcel_.get()); + const auto& raw = p.GetRaw(); + int len = raw.size(); + // CREATE_DB request type need to be executed directly by the caller if (req_type_ == pkgmgr_common::ReqType::CREATE_DB) { is_offline_ = true; - return RequestHandlerDirectAccess(); + return RequestHandlerDirectAccess(p.GetRaw()); } if (!check_server.IsReady()) { LOG(WARNING) << "Server is not ready, try to direct access"; is_offline_ = true; - return RequestHandlerDirectAccess(); + return RequestHandlerDirectAccess(p.GetRaw()); } + LOG(WARNING) << "Try to send request, Request type: " + << pkgmgr_common::ReqTypeToString(req_type_); + if (!socket_->Connect()) { LOG(ERROR) << "Failed to connect client socket, try to direct access"; is_offline_ = true; - return RequestHandlerDirectAccess(); + return RequestHandlerDirectAccess(p.GetRaw()); } if (socket_->SendData(&req_type_, sizeof(req_type_)) != 0) { @@ -68,11 +76,6 @@ bool PkgInfoClient::SendRequest() { return false; } - tizen_base::Parcel p; - p.WriteParcelable(*parcel_.get()); - const auto& raw = p.GetRaw(); - int len = raw.size(); - if (socket_->SendData(&len, sizeof(len)) != 0) { LOG(ERROR) << "fail to send data"; return false; @@ -121,13 +124,10 @@ PkgInfoClient::GetResultParcel() { return res; } -bool PkgInfoClient::RequestHandlerDirectAccess() { - tizen_base::Parcel p; - p.WriteParcelable(*parcel_.get()); - std::vector raw = p.GetRaw(); - +bool PkgInfoClient::RequestHandlerDirectAccess( + const std::vector& raw) { static void* handle = nullptr; - static void* (*dl_func)(int, unsigned char*, int, const char *); + static void* (*dl_func)(int, const unsigned char*, int, const char *); if (handle == nullptr) { handle = dlopen(LIBPKGMGR_INFO, RTLD_GLOBAL | RTLD_LAZY); @@ -137,7 +137,7 @@ bool PkgInfoClient::RequestHandlerDirectAccess() { return false; } dl_func = reinterpret_cast( + int, const unsigned char*, int, const char *)>( dlsym(handle, DIRECT_ACCESS_FUNC)); if (dl_func == nullptr) { LOG(ERROR) << "cannot find " << DIRECT_ACCESS_FUNC << " symbol in " diff --git a/src/client/pkginfo_client.hh b/src/client/pkginfo_client.hh index d874e8c..e0634ba 100644 --- a/src/client/pkginfo_client.hh +++ b/src/client/pkginfo_client.hh @@ -23,7 +23,7 @@ class PkgInfoClient { std::shared_ptr GetResultParcel(); private: - bool RequestHandlerDirectAccess(); + bool RequestHandlerDirectAccess(const std::vector& raw); std::shared_ptr parcel_; std::shared_ptr result_parcel_; diff --git a/src/server/create_cache_request.cc b/src/server/create_cache_request.cc index 43bef9e..2ad143a 100644 --- a/src/server/create_cache_request.cc +++ b/src/server/create_cache_request.cc @@ -21,7 +21,7 @@ namespace pkgmgr_server { -unsigned char* CreateCacheRequest::GetData() { +const unsigned char* CreateCacheRequest::GetData() { return nullptr; } @@ -45,4 +45,8 @@ bool CreateCacheRequest::SendData(unsigned char* data, int size) { return true; } +bool CreateCacheRequest::GetPrivilegeChecked() { + return true; +} + } // namespace pkgmgr_server diff --git a/src/server/create_cache_request.hh b/src/server/create_cache_request.hh index a428f4e..88e6372 100644 --- a/src/server/create_cache_request.hh +++ b/src/server/create_cache_request.hh @@ -31,12 +31,13 @@ namespace pkgmgr_server { class EXPORT_API CreateCacheRequest : public PkgRequest { public: CreateCacheRequest(uid_t uid) : uid_(uid) {} - unsigned char* GetData() override; + const unsigned char* GetData() override; int GetSize() override; pid_t GetSenderPID() override; uid_t GetSenderUID() override; pkgmgr_common::ReqType GetRequestType() override; bool SendData(unsigned char* data, int size) override; + bool GetPrivilegeChecked() override; private: uid_t uid_; diff --git a/src/server/cynara_checker/cynara_checker.cc b/src/server/cynara_checker/cynara_checker.cc index 7fdc588..e100594 100644 --- a/src/server/cynara_checker/cynara_checker.cc +++ b/src/server/cynara_checker/cynara_checker.cc @@ -50,7 +50,7 @@ CynaraChecker& CynaraChecker::GetInst() { void CynaraChecker::ReplyCb(cynara_check_id id, cynara_async_call_cause cause, int resp, void* data) { - auto runner = static_cast(data); + auto worker_thread = static_cast(data); auto& inst = CynaraChecker::GetInst(); switch (cause) { case CYNARA_CALL_CAUSE_ANSWER: { @@ -64,7 +64,8 @@ void CynaraChecker::ReplyCb(cynara_check_id id, cynara_async_call_cause cause, } LOG(DEBUG) << "Allowed request"; - runner->QueueRequest(it->second); + it->second->SetPrivilegeChecked(true); + worker_thread->PushQueue(it->second); inst.cynara_id_map_.erase(it); break; @@ -112,21 +113,21 @@ void CynaraChecker::StatusCb(int old_fd, int new_fd, } } -void CynaraChecker::CheckPrivilege(Runner* runner, +bool CynaraChecker::CheckPrivilege(WorkerThread* worker_thread, const std::shared_ptr& req, const std::vector& privileges) { if (privileges.empty() || req->GetSenderUID() < REGULAR_USER) { LOG(DEBUG) << "Allowed request"; - runner->QueueRequest(req); - return; + return true; } + std::unique_lock u(lock_); int ret; if (cynara_ == nullptr) { ret = cynara_async_initialize(&cynara_, nullptr, StatusCb, nullptr); if (ret != CYNARA_API_SUCCESS) { LOG(ERROR) << "Failed to initialize cynara_"; - return; + return false; } } @@ -135,7 +136,7 @@ void CynaraChecker::CheckPrivilege(Runner* runner, &smack_label); if (ret != CYNARA_API_SUCCESS) { LOG(ERROR) << "Failed to get smack label"; - return; + return false; } std::unique_ptr lblPtr(smack_label, std::free); @@ -143,7 +144,7 @@ void CynaraChecker::CheckPrivilege(Runner* runner, if (session == nullptr) { LOG(ERROR) << "Failed to get client session for pid:" << req->GetSenderPID(); - return; + return false; } std::unique_ptr sessPtr(session, std::free); @@ -152,12 +153,14 @@ void CynaraChecker::CheckPrivilege(Runner* runner, for (auto& priv : privileges) { ret = cynara_async_create_request(cynara_, smack_label, session, std::to_string(req->GetSenderUID()).c_str(), priv.c_str(), - &id, ReplyCb, runner); + &id, ReplyCb, worker_thread); if (check == false) { cynara_id_map_[id] = req; check = true; } } + + return false; } } // namespace pkgmgr_server diff --git a/src/server/cynara_checker/cynara_checker.hh b/src/server/cynara_checker/cynara_checker.hh index 98bc3ea..5a7ddc5 100644 --- a/src/server/cynara_checker/cynara_checker.hh +++ b/src/server/cynara_checker/cynara_checker.hh @@ -20,12 +20,13 @@ #include #include +#include #include #include #include #include "pkg_request.hh" -#include "runner.hh" +#include "worker_thread.hh" namespace pkgmgr_server { @@ -38,7 +39,7 @@ class EXPORT_API CynaraChecker { static CynaraChecker& GetInst(); void Init(); void Fini(); - void CheckPrivilege(Runner* runner, + bool CheckPrivilege(WorkerThread* worker_thread, const std::shared_ptr& req, const std::vector& privileges); @@ -55,6 +56,7 @@ class EXPORT_API CynaraChecker { cynara_async* cynara_ = nullptr; guint cynara_sid_ = 0; std::unordered_map> cynara_id_map_; + std::mutex lock_; }; } // namespace pkgmgr_server diff --git a/src/server/pkg_request.cc b/src/server/pkg_request.cc index 41b7a59..e018219 100644 --- a/src/server/pkg_request.cc +++ b/src/server/pkg_request.cc @@ -23,10 +23,12 @@ namespace pkgmgr_server { PkgRequest::PkgRequest() - : request_type_(pkgmgr_common::REQ_TYPE_NONE), data_size_(-1) {} + : request_type_(pkgmgr_common::REQ_TYPE_NONE), data_size_(-1), + privilege_checked_(false) {} PkgRequest::PkgRequest(int fd) - : request_type_(pkgmgr_common::REQ_TYPE_NONE), data_size_(-1) { + : request_type_(pkgmgr_common::REQ_TYPE_NONE), data_size_(-1), + privilege_checked_(false) { socket_ = std::unique_ptr( new (std::nothrow) pkgmgr_common::socket::DataSocket(fd)); if (socket_ == nullptr) @@ -38,7 +40,7 @@ PkgRequest::~PkgRequest() { delete[] data_; } -unsigned char* PkgRequest::GetData() { +const unsigned char* PkgRequest::GetData() { return data_; } @@ -105,4 +107,12 @@ bool PkgRequest::SendData(unsigned char* data, int size) { return (socket_->SendData(data, size) == 0); } +bool PkgRequest::GetPrivilegeChecked() { + return privilege_checked_; +} + +void PkgRequest::SetPrivilegeChecked(bool checked) { + privilege_checked_ = checked; +} + } // namespace pkgmgr_server diff --git a/src/server/pkg_request.hh b/src/server/pkg_request.hh index 083b8e3..c0ce81e 100644 --- a/src/server/pkg_request.hh +++ b/src/server/pkg_request.hh @@ -39,18 +39,21 @@ class EXPORT_API PkgRequest { int GetFd(); bool ReceiveData(); - virtual unsigned char* GetData(); + virtual const unsigned char* GetData(); virtual int GetSize(); virtual pid_t GetSenderPID(); virtual uid_t GetSenderUID(); virtual pkgmgr_common::ReqType GetRequestType(); virtual bool SendData(unsigned char* data, int size); + virtual bool GetPrivilegeChecked(); + virtual void SetPrivilegeChecked(bool cheked); private: std::unique_ptr socket_; unsigned char* data_ = nullptr; pkgmgr_common::ReqType request_type_; int data_size_; + bool privilege_checked_; }; } // namespace pkgmgr_server diff --git a/src/server/request_handler/abstract_request_handler.hh b/src/server/request_handler/abstract_request_handler.hh index 83da0fc..ce3ca7f 100644 --- a/src/server/request_handler/abstract_request_handler.hh +++ b/src/server/request_handler/abstract_request_handler.hh @@ -21,7 +21,7 @@ namespace request_handler { class EXPORT_API AbstractRequestHandler { public: virtual ~AbstractRequestHandler() = default; - virtual bool HandleRequest(unsigned char* data, int size, + virtual bool HandleRequest(const unsigned char* data, int size, const std::string& locale) = 0; virtual std::vector ExtractResult() = 0; diff --git a/src/server/request_handler/command_request_handler.cc b/src/server/request_handler/command_request_handler.cc index 0fe00ab..c5a4320 100644 --- a/src/server/request_handler/command_request_handler.cc +++ b/src/server/request_handler/command_request_handler.cc @@ -20,7 +20,7 @@ namespace pcp = pkgmgr_common::parcel; namespace pkgmgr_server { namespace request_handler { -bool CommandRequestHandler::HandleRequest(unsigned char* data, int size, +bool CommandRequestHandler::HandleRequest(const unsigned char* data, int size, const std::string& locale) { auto abstract_parcel = pcp::ParcelableFactory::GetInst().CreateParcel(data, size); diff --git a/src/server/request_handler/command_request_handler.hh b/src/server/request_handler/command_request_handler.hh index aa4cb4b..c50daee 100644 --- a/src/server/request_handler/command_request_handler.hh +++ b/src/server/request_handler/command_request_handler.hh @@ -20,7 +20,7 @@ namespace request_handler { class EXPORT_API CommandRequestHandler : public AbstractRequestHandler { public: - bool HandleRequest(unsigned char* data, int size, + bool HandleRequest(const unsigned char* data, int size, const std::string& locale) override; std::vector ExtractResult() override; diff --git a/src/server/request_handler/create_cache_request_handler.cc b/src/server/request_handler/create_cache_request_handler.cc index 7193ae6..e83adaa 100644 --- a/src/server/request_handler/create_cache_request_handler.cc +++ b/src/server/request_handler/create_cache_request_handler.cc @@ -70,7 +70,7 @@ int CreateCacheRequestHandler::Scheduler::Set(int policy, CreateCacheRequestHandler::CreateCacheRequestHandler(): scheduler_(gettid()) { } -bool CreateCacheRequestHandler::HandleRequest(unsigned char* data, int size, +bool CreateCacheRequestHandler::HandleRequest(const unsigned char* data, int size, const std::string& locale) { psd::CacheDBHandler db(GetUID(), GetPID()); db.SetLocale(locale); diff --git a/src/server/request_handler/create_cache_request_handler.hh b/src/server/request_handler/create_cache_request_handler.hh index cee35c0..66d5bbd 100644 --- a/src/server/request_handler/create_cache_request_handler.hh +++ b/src/server/request_handler/create_cache_request_handler.hh @@ -20,7 +20,7 @@ namespace request_handler { class EXPORT_API CreateCacheRequestHandler : public AbstractRequestHandler { public: CreateCacheRequestHandler(); - bool HandleRequest(unsigned char* data, int size, + bool HandleRequest(const unsigned char* data, int size, const std::string& locale) override; std::vector ExtractResult() override; diff --git a/src/server/request_handler/create_db_request_handler.cc b/src/server/request_handler/create_db_request_handler.cc index 5cbd424..94b141c 100644 --- a/src/server/request_handler/create_db_request_handler.cc +++ b/src/server/request_handler/create_db_request_handler.cc @@ -22,7 +22,7 @@ namespace psd = pkgmgr_server::database; namespace pkgmgr_server { namespace request_handler { -bool CreateDBRequestHandler::HandleRequest(unsigned char* data, int size, +bool CreateDBRequestHandler::HandleRequest(const unsigned char* data, int size, const std::string& locale) { auto abstract_parcel = pcp::ParcelableFactory::GetInst().CreateParcel(data, size); diff --git a/src/server/request_handler/create_db_request_handler.hh b/src/server/request_handler/create_db_request_handler.hh index ff1c50a..b11fd51 100644 --- a/src/server/request_handler/create_db_request_handler.hh +++ b/src/server/request_handler/create_db_request_handler.hh @@ -19,7 +19,7 @@ namespace request_handler { class EXPORT_API CreateDBRequestHandler : public AbstractRequestHandler { public: - bool HandleRequest(unsigned char* data, int size, + bool HandleRequest(const unsigned char* data, int size, const std::string& locale) override; std::vector ExtractResult() override; diff --git a/src/server/request_handler/get_appinfo_request_handler.cc b/src/server/request_handler/get_appinfo_request_handler.cc index e26069f..fae88c3 100644 --- a/src/server/request_handler/get_appinfo_request_handler.cc +++ b/src/server/request_handler/get_appinfo_request_handler.cc @@ -18,8 +18,8 @@ namespace psd = pkgmgr_server::database; namespace pkgmgr_server { namespace request_handler { -bool GetAppinfoRequestHandler::HandleRequest(unsigned char* data, int size, - const std::string& locale) { +bool GetAppinfoRequestHandler::HandleRequest(const unsigned char* data, + int size, const std::string& locale) { auto abstract_parcel = pcp::ParcelableFactory::GetInst().CreateParcel(data, size); diff --git a/src/server/request_handler/get_appinfo_request_handler.hh b/src/server/request_handler/get_appinfo_request_handler.hh index 0110e36..d5fbb40 100644 --- a/src/server/request_handler/get_appinfo_request_handler.hh +++ b/src/server/request_handler/get_appinfo_request_handler.hh @@ -19,7 +19,7 @@ namespace request_handler { class EXPORT_API GetAppinfoRequestHandler : public AbstractRequestHandler { public: - bool HandleRequest(unsigned char *data, int size, + bool HandleRequest(const unsigned char* data, int size, const std::string &locale) override; std::vector ExtractResult() override; diff --git a/src/server/request_handler/get_cert_request_handler.cc b/src/server/request_handler/get_cert_request_handler.cc index cbad2c9..fa405f5 100644 --- a/src/server/request_handler/get_cert_request_handler.cc +++ b/src/server/request_handler/get_cert_request_handler.cc @@ -18,7 +18,7 @@ namespace psd = pkgmgr_server::database; namespace pkgmgr_server { namespace request_handler { -bool GetCertRequestHandler::HandleRequest(unsigned char* data, int size, +bool GetCertRequestHandler::HandleRequest(const unsigned char* data, int size, const std::string& locale) { auto abstract_parcel = pcp::ParcelableFactory::GetInst().CreateParcel(data, size); diff --git a/src/server/request_handler/get_cert_request_handler.hh b/src/server/request_handler/get_cert_request_handler.hh index 4f9d9af..1d867f0 100644 --- a/src/server/request_handler/get_cert_request_handler.hh +++ b/src/server/request_handler/get_cert_request_handler.hh @@ -19,7 +19,7 @@ namespace request_handler { class EXPORT_API GetCertRequestHandler : public AbstractRequestHandler { public: - bool HandleRequest(unsigned char* data, int size, + bool HandleRequest(const unsigned char* data, int size, const std::string& locale) override; std::vector ExtractResult() override; diff --git a/src/server/request_handler/get_depinfo_request_handler.cc b/src/server/request_handler/get_depinfo_request_handler.cc index be7480c..313a78d 100644 --- a/src/server/request_handler/get_depinfo_request_handler.cc +++ b/src/server/request_handler/get_depinfo_request_handler.cc @@ -19,7 +19,7 @@ namespace psd = pkgmgr_server::database; namespace pkgmgr_server { namespace request_handler { -bool GetDepinfoRequestHandler::HandleRequest(unsigned char* data, int size, +bool GetDepinfoRequestHandler::HandleRequest(const unsigned char* data, int size, const std::string& locale) { auto abstract_parcel = pcp::ParcelableFactory::GetInst().CreateParcel(data, size); diff --git a/src/server/request_handler/get_depinfo_request_handler.hh b/src/server/request_handler/get_depinfo_request_handler.hh index 44bb7a9..bd44dc2 100644 --- a/src/server/request_handler/get_depinfo_request_handler.hh +++ b/src/server/request_handler/get_depinfo_request_handler.hh @@ -19,7 +19,7 @@ namespace request_handler { class EXPORT_API GetDepinfoRequestHandler : public AbstractRequestHandler { public: - bool HandleRequest(unsigned char* data, int size, + bool HandleRequest(const unsigned char* data, int size, const std::string& locale) override; std::vector ExtractResult() override; diff --git a/src/server/request_handler/get_pkginfo_request_handler.cc b/src/server/request_handler/get_pkginfo_request_handler.cc index acd9f67..60b6016 100644 --- a/src/server/request_handler/get_pkginfo_request_handler.cc +++ b/src/server/request_handler/get_pkginfo_request_handler.cc @@ -19,8 +19,8 @@ namespace psd = pkgmgr_server::database; namespace pkgmgr_server { namespace request_handler { -bool GetPkginfoRequestHandler::HandleRequest(unsigned char* data, int size, - const std::string& locale) { +bool GetPkginfoRequestHandler::HandleRequest(const unsigned char* data, + int size, const std::string& locale) { auto abstract_parcel = pcp::ParcelableFactory::GetInst().CreateParcel(data, size); diff --git a/src/server/request_handler/get_pkginfo_request_handler.hh b/src/server/request_handler/get_pkginfo_request_handler.hh index 0bf022f..a930dde 100644 --- a/src/server/request_handler/get_pkginfo_request_handler.hh +++ b/src/server/request_handler/get_pkginfo_request_handler.hh @@ -19,7 +19,7 @@ namespace request_handler { class EXPORT_API GetPkginfoRequestHandler : public AbstractRequestHandler { public: - bool HandleRequest(unsigned char* data, int size, + bool HandleRequest(const unsigned char* data, int size, const std::string& locale) override; std::vector ExtractResult() override; diff --git a/src/server/request_handler/query_request_handler.cc b/src/server/request_handler/query_request_handler.cc index f7dbc19..4a2474d 100644 --- a/src/server/request_handler/query_request_handler.cc +++ b/src/server/request_handler/query_request_handler.cc @@ -19,7 +19,7 @@ namespace psd = pkgmgr_server::database; namespace pkgmgr_server { namespace request_handler { -bool QueryRequestHandler::HandleRequest(unsigned char* data, int size, +bool QueryRequestHandler::HandleRequest(const unsigned char* data, int size, const std::string& locale) { auto abstract_parcel = pcp::ParcelableFactory::GetInst().CreateParcel(data, size); diff --git a/src/server/request_handler/query_request_handler.hh b/src/server/request_handler/query_request_handler.hh index 7d6d267..9ee9a6c 100644 --- a/src/server/request_handler/query_request_handler.hh +++ b/src/server/request_handler/query_request_handler.hh @@ -20,7 +20,7 @@ namespace request_handler { class EXPORT_API QueryRequestHandler : public AbstractRequestHandler { public: - bool HandleRequest(unsigned char* data, int size, + bool HandleRequest(const unsigned char* data, int size, const std::string& locale) override; std::vector ExtractResult() override; diff --git a/src/server/request_handler/request_handler_direct_access.cc b/src/server/request_handler/request_handler_direct_access.cc index cfdf403..5d0c6a9 100644 --- a/src/server/request_handler/request_handler_direct_access.cc +++ b/src/server/request_handler/request_handler_direct_access.cc @@ -36,7 +36,7 @@ #define EXPORT_API __attribute__((visibility("default"))) extern "C" EXPORT_API void* _request_handler_direct_access(int req_type, - unsigned char* data, int size, const char *locale) { + const unsigned char* data, int size, const char *locale) { if (data == nullptr || size < 0 || locale == nullptr) { LOG(ERROR) << "Invalid parameter"; return nullptr; diff --git a/src/server/request_handler/request_handler_direct_access.h b/src/server/request_handler/request_handler_direct_access.h index e7c2c0e..3c82542 100644 --- a/src/server/request_handler/request_handler_direct_access.h +++ b/src/server/request_handler/request_handler_direct_access.h @@ -21,7 +21,7 @@ extern "C" { #endif -void *_request_handler_direct_access(int req_type, unsigned char* data, +void *_request_handler_direct_access(int req_type, const unsigned char* data, int size, const char *locale); #ifdef __cplusplus diff --git a/src/server/request_handler/set_cert_request_handler.cc b/src/server/request_handler/set_cert_request_handler.cc index 6c105f7..f8ae5c4 100644 --- a/src/server/request_handler/set_cert_request_handler.cc +++ b/src/server/request_handler/set_cert_request_handler.cc @@ -19,7 +19,7 @@ namespace psd = pkgmgr_server::database; namespace pkgmgr_server { namespace request_handler { -bool SetCertRequestHandler::HandleRequest(unsigned char* data, int size, +bool SetCertRequestHandler::HandleRequest(const unsigned char* data, int size, const std::string& locale) { auto abstract_parcel = pcp::ParcelableFactory::GetInst().CreateParcel(data, size); diff --git a/src/server/request_handler/set_cert_request_handler.hh b/src/server/request_handler/set_cert_request_handler.hh index 828b3de..4ece595 100644 --- a/src/server/request_handler/set_cert_request_handler.hh +++ b/src/server/request_handler/set_cert_request_handler.hh @@ -21,7 +21,7 @@ class EXPORT_API SetCertRequestHandler : public AbstractRequestHandler { public: SetCertRequestHandler(bool is_offline = false) : AbstractRequestHandler(), is_offline_(is_offline) {} - bool HandleRequest(unsigned char* data, int size, + bool HandleRequest(const unsigned char* data, int size, const std::string& locale) override; std::vector ExtractResult() override; diff --git a/src/server/request_handler/set_pkginfo_request_handler.cc b/src/server/request_handler/set_pkginfo_request_handler.cc index d8dd915..01813ea 100644 --- a/src/server/request_handler/set_pkginfo_request_handler.cc +++ b/src/server/request_handler/set_pkginfo_request_handler.cc @@ -21,8 +21,8 @@ namespace psd = pkgmgr_server::database; namespace pkgmgr_server { namespace request_handler { -bool SetPkginfoRequestHandler::HandleRequest(unsigned char* data, int size, - const std::string& locale) { +bool SetPkginfoRequestHandler::HandleRequest(const unsigned char* data, + int size, const std::string& locale) { auto abstract_parcel = pcp::ParcelableFactory::GetInst().CreateParcel(data, size); diff --git a/src/server/request_handler/set_pkginfo_request_handler.hh b/src/server/request_handler/set_pkginfo_request_handler.hh index 94aa5a4..eb61340 100644 --- a/src/server/request_handler/set_pkginfo_request_handler.hh +++ b/src/server/request_handler/set_pkginfo_request_handler.hh @@ -21,7 +21,7 @@ class EXPORT_API SetPkginfoRequestHandler : public AbstractRequestHandler { public: SetPkginfoRequestHandler(bool is_offline = false) : AbstractRequestHandler(), is_offline_(is_offline) {} - bool HandleRequest(unsigned char* data, int size, + bool HandleRequest(const unsigned char* data, int size, const std::string& locale) override; std::vector ExtractResult() override; diff --git a/src/server/runner.cc b/src/server/runner.cc index b9fab8d..03b5be4 100644 --- a/src/server/runner.cc +++ b/src/server/runner.cc @@ -21,8 +21,6 @@ #include #include -#include -#include #include "cache_flag.hh" #include "create_cache_request.hh" @@ -46,16 +44,6 @@ static const std::string SOCK_PATH = "/run/pkgmgr-info-server"; const char PRIVILEGE_PACKAGE_MANAGER_ADMIN[] = "http://tizen.org/privilege/packagemanager.admin"; -std::vector GetPrivileges(pkgmgr_common::ReqType type) { - std::vector ret; - if (type == pkgmgr_common::SET_CERT_INFO) - ret.emplace_back(PRIVILEGE_PACKAGE_MANAGER_ADMIN); - else if (type == pkgmgr_common::SET_PKG_INFO) - ret.emplace_back(PRIVILEGE_PACKAGE_MANAGER_ADMIN); - - return ret; -} - } // namespace Runner::Runner(unsigned int thread_num) { @@ -100,15 +88,12 @@ int Runner::OnReceiveRequest(int fd, GIOCondition cond, void* user_data) { } auto req = std::make_shared(client_fd); - if (req->ReceiveData()) { - pkgmgr_common::ReqType type = req->GetRequestType(); - if (CacheFlag::SetPreparing()) { - runner->QueueRequest( - std::make_shared(req->GetSenderUID())); - } - std::vector&& privileges = GetPrivileges(type); - CynaraChecker::GetInst().CheckPrivilege(runner, req, privileges); + + if (CacheFlag::SetPreparing()) { + runner->QueueRequest( + std::make_shared(req->GetSenderUID())); } + runner->QueueRequest(std::move(req)); return G_SOURCE_CONTINUE; } diff --git a/src/server/worker_thread.cc b/src/server/worker_thread.cc index 34a4e6d..a80bb6d 100644 --- a/src/server/worker_thread.cc +++ b/src/server/worker_thread.cc @@ -23,6 +23,7 @@ #include #include "abstract_parcelable.hh" +#include "cynara_checker.hh" #include "request_handler_factory.hh" #include "server/database/db_handle_provider.hh" #include "utils/logging.hh" @@ -56,6 +57,19 @@ uid_t ConvertUID(uid_t uid) { return uid; } +const char PRIVILEGE_PACKAGE_MANAGER_ADMIN[] = + "http://tizen.org/privilege/packagemanager.admin"; + +std::vector GetPrivileges(pkgmgr_common::ReqType type) { + std::vector ret; + if (type == pkgmgr_common::SET_CERT_INFO) + ret.emplace_back(PRIVILEGE_PACKAGE_MANAGER_ADMIN); + else if (type == pkgmgr_common::SET_PKG_INFO) + ret.emplace_back(PRIVILEGE_PACKAGE_MANAGER_ADMIN); + + return ret; +} + } // namespace namespace pkgmgr_server { @@ -105,6 +119,18 @@ void WorkerThread::Run() { if (req == nullptr) return; + if (!req->GetPrivilegeChecked()) { + if (!req->ReceiveData()) { + LOG(ERROR) << "Fail to receive data"; + continue; + } + + pkgmgr_common::ReqType type = req->GetRequestType(); + std::vector privileges = GetPrivileges(type); + if (!CynaraChecker::GetInst().CheckPrivilege(this, req, privileges)) + continue; + } + auto type = req->GetRequestType(); LOG(WARNING) << "Request type: " << pkgmgr_common::ReqTypeToString(type) << " pid: " << req->GetSenderPID(); -- 2.7.4