Modify app registration handler
authorHwankyu Jhun <h.jhun@samsung.com>
Mon, 6 Jan 2025 23:17:21 +0000 (08:17 +0900)
committerHwankyu Jhun <h.jhun@samsung.com>
Thu, 16 Jan 2025 03:47:07 +0000 (12:47 +0900)
To prevent wrong request handling, amd checks the request id.

Change-Id: Ic95c41a51ba9511b35d76e8f2ff721219e925760
Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
src/lib/amd_app_status.cc
src/lib/app_status/app_status_manager.cc
src/lib/app_status/app_status_manager.hh
src/lib/launch/step_do_starting_app.cc

index 187814dc9cc3d524410aa28e594a60dec066fbce..a82e4e9d1b009af6173de4437113b690023fe762 100644 (file)
@@ -591,7 +591,7 @@ int _app_status_register_pid(pid_t pid, const char* appid, uid_t uid) {
     return -1;
 
   return amd::AppStatusManager::GetInst().RegisterPID(
-      pid, appid, uid, pid);
+      pid, appid, uid, pid, 0);
 }
 
 static int DispatchAppRunningInfo(request_h request) {
@@ -855,7 +855,7 @@ static int DispatchAppRegisterPID(request_h request) {
 
   _W("[APP_REGISTER_PID] appid(%s), pid(%d)", appid.c_str(), pid);
   return amd::AppStatusManager::GetInst().RegisterPID(
-      pid, appid, target_uid, req->GetPID());
+      pid, appid, target_uid, req->GetPID(), req->GetID());
 }
 
 static int DispatchAppRunningInstanceInfo(request_h request) {
@@ -914,11 +914,15 @@ static int DispatchAppNotifyStart(request_h request) {
   auto& manager = amd::AppStatusManager::GetInst();
   auto handle = manager.Find(pid);
   if (handle == nullptr) {
+    auto& b = req->GetBundle();
+    auto req_id_str = b->GetString(AUL_K_REQUEST_ID);
+    unsigned int req_id = std::stoul(req_id_str);
     uid_t uid = req->GetUID();
     if (uid >= REGULAR_UID_MIN) {
       std::string appid = GetAppIdFromFile(pid, uid);
-      _W("appid(%s), pid(%d), uid(%u)", appid.c_str(), pid, uid);
-      manager.RegisterPID(pid, appid, uid, pid);
+      _W("appid(%s), pid(%d), uid(%u), req_id(%u)", appid.c_str(), pid, uid,
+         req_id);
+      manager.RegisterPID(pid, appid, uid, pid, req_id);
       handle = manager.Find(pid);
       if (handle == nullptr) {
         _E("Failed to register pid(%d)", pid);
index 10ffec2fae694d38b37b32271d5df2ba76e0c476..a1ffcb40af7b9577d70e4ffdcbe3cd54408a5b31 100644 (file)
@@ -646,7 +646,7 @@ void AppStatusManager::UserFinish(uid_t uid) {
 }
 
 int AppStatusManager::RegisterPID(int pid, const std::string& appid,
-    uid_t uid, int caller_pid) {
+    uid_t uid, int caller_pid, unsigned int req_id) {
   auto app_info = AppInfoManager::GetInst().FindAppInfo(uid, appid);
   if (app_info == nullptr) {
     _E("Failed to find appinfo. %s:%u", appid.c_str(), uid);
@@ -670,7 +670,8 @@ int AppStatusManager::RegisterPID(int pid, const std::string& appid,
   }
 
   auto pending_item = RequestManager::GetInst().FindPendingItem(appid);
-  if (pending_item != nullptr && pending_item->GetPid() != pid) {
+  if (pending_item != nullptr && pending_item->GetPid() != pid &&
+      pending_item->GetRequestId() != req_id) {
     _W("pending_item has already been created. kill(%d)", pid);
     kill(pid, SIGKILL);
     return -1;
index f110b247789522715a504c801ef7aabc189545a4..5a459306e49a58ad8b9ac122f289055f020fdc65 100644 (file)
@@ -74,7 +74,8 @@ class AppStatusManager : public AppStatus::IEvent, public Launchpad::IEvent {
 
   int PublishStatus(int pid, int context_status);
   void CleanUp(AppStatusPtr app);
-  int RegisterPID(int pid, const std::string& appid, uid_t uid, int caller_pid);
+  int RegisterPID(int pid, const std::string& appid, uid_t uid, int caller_pid,
+                  unsigned int req_id);
   int TerminateBackgroundApps(GCompareFunc func);
 
   AppStatusPtr AddAppInfo(LaunchContext* context);
index 9e8ffeca351ddf9c8a4e71c9371dbe6af476466f..30d63013badf36ab4cb3353372a9efeccb14b139 100644 (file)
@@ -112,6 +112,10 @@ void SetAppInfoForLaunchpad(LaunchContext* context) {
     bundle_del(b, AUL_K_MULTIPLE_INSTANCE_APPID);
     bundle_add(b, AUL_K_MULTIPLE_INSTANCE_APPID, context->GetAppId().c_str());
   }
+
+  bundle_del(b, AUL_K_REQUEST_ID);
+  bundle_add(b, AUL_K_REQUEST_ID,
+             std::to_string(context->GetRequestId()).c_str());
 }
 
 int FakeLaunchApp(LaunchContext* context) {