Receive client's request at each thread 14/276014/1
authorIlho Kim <ilho159.kim@samsung.com>
Thu, 2 Jun 2022 07:21:44 +0000 (16:21 +0900)
committerIlho Kim <ilho159.kim@samsung.com>
Wed, 8 Jun 2022 11:31:59 +0000 (20:31 +0900)
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 <ilho159.kim@samsung.com>
(cherry picked from commit 0b8ef50287d96abbd9f212b172c0c041d73d20b1)

29 files changed:
src/client/pkginfo_client.cc
src/client/pkginfo_client.hh
src/server/cynara_checker/cynara_checker.cc
src/server/cynara_checker/cynara_checker.hh
src/server/pkg_request.cc
src/server/pkg_request.hh
src/server/request_handler/abstract_request_handler.hh
src/server/request_handler/command_request_handler.cc
src/server/request_handler/command_request_handler.hh
src/server/request_handler/create_db_request_handler.cc
src/server/request_handler/create_db_request_handler.hh
src/server/request_handler/get_appinfo_request_handler.cc
src/server/request_handler/get_appinfo_request_handler.hh
src/server/request_handler/get_cert_request_handler.cc
src/server/request_handler/get_cert_request_handler.hh
src/server/request_handler/get_depinfo_request_handler.cc
src/server/request_handler/get_depinfo_request_handler.hh
src/server/request_handler/get_pkginfo_request_handler.cc
src/server/request_handler/get_pkginfo_request_handler.hh
src/server/request_handler/query_request_handler.cc
src/server/request_handler/query_request_handler.hh
src/server/request_handler/request_handler_direct_access.cc
src/server/request_handler/request_handler_direct_access.h
src/server/request_handler/set_cert_request_handler.cc
src/server/request_handler/set_cert_request_handler.hh
src/server/request_handler/set_pkginfo_request_handler.cc
src/server/request_handler/set_pkginfo_request_handler.hh
src/server/runner.cc
src/server/worker_thread.cc

index 684f6d31b26cd78b5e0264dbf299e2fa264b2baf..04045bf091c823e9802d3c0b6475ff2908984a98 100644 (file)
@@ -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<uint8_t> raw = p.GetRaw();
-
+bool PkgInfoClient::RequestHandlerDirectAccess(
+    const std::vector<uint8_t>& 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_LOCAL | RTLD_LAZY);
@@ -137,7 +137,7 @@ bool PkgInfoClient::RequestHandlerDirectAccess() {
       return false;
     }
     dl_func = reinterpret_cast<void* (*)(
-        int, unsigned char*, int, const char *)>(
+        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 "
index d874e8c1190b7b6a036f8ca76bc15c1e637a11bb..e0634bac311e5b90cc587478d411512dbd68faa3 100644 (file)
@@ -23,7 +23,7 @@ class PkgInfoClient {
   std::shared_ptr<pkgmgr_common::parcel::AbstractParcelable> GetResultParcel();
 
  private:
-  bool RequestHandlerDirectAccess();
+  bool RequestHandlerDirectAccess(const std::vector<uint8_t>& raw);
 
   std::shared_ptr<pkgmgr_common::parcel::AbstractParcelable> parcel_;
   std::shared_ptr<pkgmgr_common::parcel::AbstractParcelable> result_parcel_;
index 7fdc5883959e2763d47fa4438c2215ffb5599c3f..e100594fb68e567ef5b4700834b3d00314a11c1d 100644 (file)
@@ -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<Runner*>(data);
+  auto worker_thread = static_cast<WorkerThread*>(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<PkgRequest>& req,
     const std::vector<std::string>& privileges) {
   if (privileges.empty() || req->GetSenderUID() < REGULAR_USER) {
     LOG(DEBUG) << "Allowed request";
-    runner->QueueRequest(req);
-    return;
+    return true;
   }
 
+  std::unique_lock<std::mutex> 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<char, decltype(std::free)*> 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<char, decltype(std::free)*> 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
index 98bc3ea74e503822f92cc1eeb9b6dc52a5e5ebb7..5a7ddc51d14759f6152077375c7e86aa000a23df 100644 (file)
 #include <glib.h>
 #include <cynara-client-async.h>
 
+#include <mutex>
 #include <string>
 #include <unordered_map>
 #include <vector>
 
 #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<PkgRequest>& req,
       const std::vector<std::string>& privileges);
 
@@ -55,6 +56,7 @@ class EXPORT_API CynaraChecker {
   cynara_async* cynara_ = nullptr;
   guint cynara_sid_ = 0;
   std::unordered_map<cynara_check_id, std::shared_ptr<PkgRequest>> cynara_id_map_;
+  std::mutex lock_;
 };
 
 }  // namespace pkgmgr_server
index 0da63003b7226f7d84dccc144f2f3d013f5322be..6a9fefac2570d796b20b2520d6b35dadd1bde5cc 100644 (file)
@@ -23,7 +23,8 @@
 namespace pkgmgr_server {
 
 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<pkgmgr_common::socket::DataSocket>(
       new (std::nothrow) pkgmgr_common::socket::DataSocket(fd));
   if (socket_ == nullptr)
@@ -35,7 +36,7 @@ PkgRequest::~PkgRequest() {
     delete[] data_;
 }
 
-unsigned char* PkgRequest::GetData() {
+const unsigned char* PkgRequest::GetData() {
   return data_;
 }
 
@@ -102,4 +103,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
index f22f6088c832b2205167a616507775e6b0e999d8..781516f9847fb7403a6490535b55ef4d6dccf776 100644 (file)
@@ -34,7 +34,7 @@ class EXPORT_API PkgRequest {
  public:
   PkgRequest(int fd);
   ~PkgRequest();
-  unsigned char* GetData();
+  const unsigned char* GetData();
   int GetSize();
   int GetFd();
   pid_t GetSenderPID();
@@ -42,12 +42,15 @@ class EXPORT_API PkgRequest {
   pkgmgr_common::ReqType GetRequestType();
   bool ReceiveData();
   bool SendData(unsigned char* data, int size);
+  bool GetPrivilegeChecked();
+  void SetPrivilegeChecked(bool cheked);
 
  private:
   std::unique_ptr<pkgmgr_common::socket::DataSocket> socket_;
   unsigned char* data_ = nullptr;
   pkgmgr_common::ReqType request_type_;
   int data_size_;
+  bool privilege_checked_;
 };
 
 }  // namespace pkgmgr_server
index 8285e80bdc4d0bebb0f84decb7c4b3a1831c955e..d8f095585d785905af93099e4c02e17af8282cec 100644 (file)
@@ -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<uint8_t> ExtractResult() = 0;
index 0fe00abe47587b00eec5981e0f1a6c565429bde9..c5a43205214fbefbd7338cf134e96d6adec4ab6a 100644 (file)
@@ -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);
index aa4cb4b3d757188fde231c82588bf3a81d03ac85..c50daee3107729a5566046ad27f58a5f749b1975 100644 (file)
@@ -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<uint8_t> ExtractResult() override;
index 5cbd424bab3e4d27ec426f324ae62fb427e01ba3..94b141c6f29c44b4fb2c5a97afd248dfaa517397 100644 (file)
@@ -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);
index ff1c50af3aabfed72d7b61d6c41543c93f6d2b2b..b11fd514c2fd262e5b338803ad4d77f5e15f0328 100644 (file)
@@ -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<uint8_t> ExtractResult() override;
index 73bf7947f873c28cded588086f40f96a43046a17..aaaa50a9edcc7b9bc06846fd0f0bec3db45b9e77 100644 (file)
@@ -19,8 +19,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);
 
index 8fac2d9d1a32e06fe226ba1d7d0cb229424358d0..dbfdd01e958a147a75c3eee0c5c6d207ae27f993 100644 (file)
@@ -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<uint8_t> ExtractResult() override;
index cbad2c9ce38e11875eac26a8d8722b99ed58c41a..fa405f5bbea62c15224a41082cacf0f12fd80755 100644 (file)
@@ -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);
index 4f9d9af8570394c815d21d2d59a10e273834c57f..1d867f0bbd8ac7d07f1999cf011ad75a2ff93be9 100644 (file)
@@ -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<uint8_t> ExtractResult() override;
index be7480c40a9f073311e24d3bf4735af1a5687f5a..313a78d6ac1bdbefcf57747353baf4215cb27ca3 100644 (file)
@@ -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);
index 44bb7a9ce3fddaf86370cc679ccf47a1f32a4d46..bd44dc24a78daeb3fdd97ab87930699cf2120634 100644 (file)
@@ -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<uint8_t> ExtractResult() override;
index f198912746278286814e2e9f20c3cf29c86b667c..db4bb686b90bc8288ba11c1297c2805a3ebdf4b1 100644 (file)
@@ -20,8 +20,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);
 
index 0bf022f1dfa52f47a44f53843f5e5c0abf05cabb..a930dde611414dcbf94d1d52ad8dd12e14417297 100644 (file)
@@ -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<uint8_t> ExtractResult() override;
index f7dbc1926f3ad64af346261dbfd4d0457805ef7b..4a2474daa5dbdc25445c21475e945cd3d72da79d 100644 (file)
@@ -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);
index 7d6d26790707ddde26f9d50107711c8ca75f5223..9ee9a6c8e7005091617ae7f893296781acdf89b3 100644 (file)
@@ -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<uint8_t> ExtractResult() override;
index 3fa03e8b5b9d24aae3fe6f6c59af17893ad30573..65fce7402969d8c886ee1a797ad03bbe8a698e76 100644 (file)
@@ -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;
index e7c2c0eae0cd7c85143ca2d66c22d6c323569466..3c82542bcebf1dd27a15fe12cc802172cc7f101c 100644 (file)
@@ -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
index 32c360a0de739aa9096fbb6468916cdf1372b2a0..0ec9ea5ab529c55706d203288f899314118d8200 100644 (file)
@@ -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);
index dae2054c890ecabc9d96ff30fcdda90a96dcb25b..3df214fd1b8c4f5481db05912b0c37d1643e0e99 100644 (file)
@@ -19,7 +19,7 @@ namespace request_handler {
 
 class EXPORT_API SetCertRequestHandler : 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<uint8_t> ExtractResult() override;
index d530b5dc232a24614ca74a427124fbc6c1ae828d..a78f40f5ee763b60d6fdf7fe49d54bad35276766 100644 (file)
@@ -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);
 
index 8006920127973ee8dbe233f68b3c2326e31c9512..aa65e714065b7effd9832def5dee3bbadf605a58 100644 (file)
@@ -19,7 +19,7 @@ namespace request_handler {
 
 class EXPORT_API SetPkginfoRequestHandler : 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<uint8_t> ExtractResult() override;
index 1c2b07704d2db878bba8740330b3b008809c3a15..e3802156dd182fff33ae66e476b142aa0ca31821 100644 (file)
@@ -21,8 +21,6 @@
 
 #include <algorithm>
 #include <string>
-#include <unordered_map>
-#include <vector>
 
 #include "cynara_checker.hh"
 #include "pkg_request.hh"
@@ -44,16 +42,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<std::string> GetPrivileges(pkgmgr_common::ReqType type) {
-  std::vector<std::string> 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) {
@@ -92,11 +80,7 @@ int Runner::OnReceiveRequest(int fd, GIOCondition cond, void* user_data) {
   }
 
   auto req = std::make_shared<PkgRequest>(client_fd);
-  if (req->ReceiveData()) {
-    pkgmgr_common::ReqType type = req->GetRequestType();
-    std::vector<std::string>&& privileges = GetPrivileges(type);
-    CynaraChecker::GetInst().CheckPrivilege(runner, req, privileges);
-  }
+  runner->QueueRequest(std::move(req));
 
   return G_SOURCE_CONTINUE;
 }
index 5ec23501fd49e5ac30d06b27a8279fb778ce60fc..8e765be53ebee26055cf07134ad14ea71c94a1a0 100644 (file)
@@ -22,6 +22,7 @@
 #include "abstract_parcelable.hh"
 #include "command_request_handler.hh"
 #include "create_db_request_handler.hh"
+#include "cynara_checker.hh"
 #include "db_handle_provider.hh"
 #include "get_appinfo_request_handler.hh"
 #include "get_cert_request_handler.hh"
 #define SQLITE_ENABLE_MEMORY_MANAGEMENT
 #endif
 
+namespace {
+
+const char PRIVILEGE_PACKAGE_MANAGER_ADMIN[] =
+    "http://tizen.org/privilege/packagemanager.admin";
+
+std::vector<std::string> GetPrivileges(pkgmgr_common::ReqType type) {
+  std::vector<std::string> 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 {
 
 WorkerThread::WorkerThread(unsigned int num) : stop_all_(false) {
@@ -103,7 +121,19 @@ void WorkerThread::Run() {
       req = PopQueue();
     }
 
-    pkgmgr_common::ReqType type = req->GetRequestType();
+    if (!req->GetPrivilegeChecked()) {
+      if (!req->ReceiveData()) {
+        LOG(ERROR) << "Fail to receive data";
+        continue;
+      }
+
+      pkgmgr_common::ReqType type = req->GetRequestType();
+      std::vector<std::string> 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();
     if (type <= pkgmgr_common::ReqType::REQ_TYPE_NONE