e_desk_area: check comp_data before add some signal listener add 34/309934/2
authorJunseok Kim <juns.kim@samsung.com>
Thu, 18 Apr 2024 04:45:03 +0000 (13:45 +0900)
committerJunSeok Kim <juns.kim@samsung.com>
Thu, 18 Apr 2024 08:01:54 +0000 (08:01 +0000)
There was a e20 crash that listener accesses to comp_data even if the
client didn't have their comp_data.
To fix this crash, check the client has their comp_data.

Change-Id: I5dc206328fd3d2ff0c365592bd79f79047d10d0a

src/bin/e_desk_area.c

index 048ba28e8ae8c7b04c0982af73d9ae0c66c8de39..e4f437bf6e8a8577e9a0874fee82e24b4a00d2cc 100644 (file)
@@ -708,6 +708,8 @@ _e_desk_area_private_client_del(E_Desk_Area_Private_Client *eda_client)
    E_Client *ec = eda_client->ec;
    E_Comp_Object *cw;
 
+   if (!e_desk_area_has_ec(eda, ec)) return;
+
    // TODO: this code has to be refactoring
    e_util_transform_del(ec->desk_area.transform);
    ec->desk_area.transform = NULL;
@@ -722,18 +724,25 @@ _e_desk_area_private_client_del(E_Desk_Area_Private_Client *eda_client)
    _e_desk_area_client_data_del(eda, ec);
 
    // wl_list remove
-   wl_list_remove(&eda_client->comp_object_color_set.link);
-   wl_list_remove(&eda_client->comp_object_resize.link);
+   if (eda_client->comp_object_color_set.notify)
+     wl_list_remove(&eda_client->comp_object_color_set.link);
+   if (eda_client->comp_object_resize.notify)
+     wl_list_remove(&eda_client->comp_object_resize.link);
+   if (eda_client->redirect.notify)
+     wl_list_remove(&eda_client->redirect.link);
+   if (eda_client->ping.notify)
+     wl_list_remove(&eda_client->ping.link);
+   if (eda_client->kill_request.notify)
+     wl_list_remove(&eda_client->kill_request.link);
+   if (eda_client->delete_request.notify)
+     wl_list_remove(&eda_client->delete_request.link);
+
    wl_list_remove(&eda_client->comp_object_stack_below.link);
    wl_list_remove(&eda_client->comp_object_stack_above.link);
    wl_list_remove(&eda_client->comp_object_set_layer.link);
    wl_list_remove(&eda_client->comp_object_lower.link);
    wl_list_remove(&eda_client->comp_object_raise.link);
 
-   wl_list_remove(&eda_client->redirect.link);
-   wl_list_remove(&eda_client->ping.link);
-   wl_list_remove(&eda_client->kill_request.link);
-   wl_list_remove(&eda_client->delete_request.link);
    wl_list_remove(&eda_client->client_activate_done.link);
    wl_list_remove(&eda_client->client_unmaximize.link);
    wl_list_remove(&eda_client->client_maximize.link);
@@ -2440,14 +2449,6 @@ e_desk_area_ec_add(E_Desk_Area *eda, E_Client *ec)
    e_client_unmaximize_listener_add(ec, &eda_client->client_unmaximize);
    eda_client->client_activate_done.notify = _desk_area_cb_client_activate_done;
    e_client_activate_done_listener_add(ec, &eda_client->client_activate_done);
-   eda_client->delete_request.notify = _desk_area_cb_client_delete_request;
-   e_client_delete_request_listener_add(ec, &eda_client->delete_request);
-   eda_client->kill_request.notify = _desk_area_cb_client_kill_request;
-   e_client_kill_request_listener_add(ec, &eda_client->kill_request);
-   eda_client->ping.notify = _desk_area_cb_client_ping;
-   e_client_ping_listener_add(ec, &eda_client->ping);
-   eda_client->redirect.notify = _desk_area_cb_client_redirect;
-   e_client_redirect_listener_add(ec, &eda_client->redirect);
 
    // e_comp_object listeners
    eda_client->comp_object_lower.notify = _desk_area_cb_comp_object_lower;
@@ -2460,10 +2461,23 @@ e_desk_area_ec_add(E_Desk_Area *eda, E_Client *ec)
    e_comp_object_stack_above_listener_add(ec->frame, &eda_client->comp_object_stack_above);
    eda_client->comp_object_stack_below.notify = _desk_area_cb_comp_object_stack_below;
    e_comp_object_stack_below_listener_add(ec->frame, &eda_client->comp_object_stack_below);
-   eda_client->comp_object_resize.notify = _desk_area_cb_comp_object_resize;
-   e_comp_object_resize_listener_add(ec->frame, &eda_client->comp_object_resize);
-   eda_client->comp_object_color_set.notify = _desk_area_cb_comp_object_color_set;
-   e_comp_object_color_set_listener_add(ec->frame, &eda_client->comp_object_color_set);
+
+   // needs ec->comp_data listeners
+   if (ec->comp_data)
+     {
+        eda_client->redirect.notify = _desk_area_cb_client_redirect;
+        e_client_redirect_listener_add(ec, &eda_client->redirect);
+        eda_client->ping.notify = _desk_area_cb_client_ping;
+        e_client_ping_listener_add(ec, &eda_client->ping);
+        eda_client->kill_request.notify = _desk_area_cb_client_kill_request;
+        e_client_kill_request_listener_add(ec, &eda_client->kill_request);
+        eda_client->delete_request.notify = _desk_area_cb_client_delete_request;
+        e_client_delete_request_listener_add(ec, &eda_client->delete_request);
+        eda_client->comp_object_resize.notify = _desk_area_cb_comp_object_resize;
+        e_comp_object_resize_listener_add(ec->frame, &eda_client->comp_object_resize);
+        eda_client->comp_object_color_set.notify = _desk_area_cb_comp_object_color_set;
+        e_comp_object_color_set_listener_add(ec->frame, &eda_client->comp_object_color_set);
+     }
 
    _e_desk_area_client_data_set(eda, ec);
    _e_desk_area_smart_client_add(eda->smart_obj, ec);