e_keyrouter: fix crash issue in e_keyrouter_find_and_remove_client_from_list 69/299769/1
authorJihoon Kim <jihoon48.kim@samsung.com>
Fri, 6 Oct 2023 11:14:00 +0000 (20:14 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Tue, 10 Oct 2023 05:16:29 +0000 (14:16 +0900)
Change-Id: Iff4522dc7ea7342849f3324a4256e048547517dd
Signed-off-by: Jihoon Kim <jihoon48.kim@samsung.com>
src/bin/e_keyrouter_list.c

index 047d116..7357698 100644 (file)
@@ -117,17 +117,32 @@ _e_keyrouter_find_key_in_list(struct wl_resource *surface, struct wl_client *wc,
 
    EINA_SAFETY_ON_TRUE_RETURN_VAL(((!surface) && (!wc)), EINA_FALSE);
 
+   g_mutex_lock(&krt->grab_key_mutex);
    list = _e_keyrouter_get_list(mode, key);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(list, EINA_FALSE);
+   if (!list)
+     {
+        g_mutex_unlock(&krt->grab_key_mutex);
+        return EINA_FALSE;
+     }
 
    EINA_LIST_FOREACH_SAFE(*list, l, l_next, key_node_data)
      {
         if (!key_node_data) continue;
 
-        if ((surface) && (surface == key_node_data->surface)) return EINA_TRUE;
-        else if ((wc == key_node_data->wc)) return EINA_TRUE;
+        if ((surface) && (surface == key_node_data->surface))
+          {
+             g_mutex_unlock(&krt->grab_key_mutex);
+             return EINA_TRUE;
+          }
+        else if ((wc == key_node_data->wc))
+          {
+             g_mutex_unlock(&krt->grab_key_mutex);
+             return EINA_TRUE;
+          }
      }
 
+   g_mutex_unlock(&krt->grab_key_mutex);
+
    return EINA_FALSE;
 }
 
@@ -215,8 +230,13 @@ e_keyrouter_find_and_remove_client_from_list(struct wl_resource *surface, struct
    Eina_List *l = NULL, *l_next = NULL;
    E_Keyrouter_Key_List_NodePtr key_node_data = NULL;
 
+   g_mutex_lock(&krt->grab_key_mutex);
    list = _e_keyrouter_get_list(mode, key);
-   EINA_SAFETY_ON_NULL_RETURN(list);
+   if (!list)
+     {
+        g_mutex_unlock(&krt->grab_key_mutex);
+        return;
+     }
 
    EINA_LIST_FOREACH_SAFE(*list, l, l_next, key_node_data)
      {
@@ -252,6 +272,8 @@ e_keyrouter_find_and_remove_client_from_list(struct wl_resource *surface, struct
              KLDBG("Remove a %s Mode Grabbed key(%d) by wc(%p)", e_keyrouter_mode_to_string(mode), key, wc);
           }
      }
+
+   g_mutex_unlock(&krt->grab_key_mutex);
 }
 
 void
@@ -444,8 +466,6 @@ _e_keyrouter_get_list(int mode, int key)
 {
    Eina_List **list = NULL;
 
-   g_mutex_lock(&e_comp->input_key_grabs_mutex);
-
    switch (mode)
      {
         case TIZEN_KEYROUTER_MODE_EXCLUSIVE:             list = &krt->HardKeys[key].excl_ptr;    break;
@@ -456,8 +476,6 @@ _e_keyrouter_get_list(int mode, int key)
         default: break;
      }
 
-   g_mutex_unlock(&e_comp->input_key_grabs_mutex);
-
    return list;
 }