subsurface: check data validation before calling function 26/241226/3
authorSeunghun Lee <shiin.lee@samsung.com>
Sun, 17 May 2020 23:33:50 +0000 (08:33 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Sun, 23 Aug 2020 23:36:54 +0000 (23:36 +0000)
Change-Id: I1b3eb6e73a1ef3f72e62001c85cbb3f2c259c70c

src/bin/e_comp_wl_subsurface.c

index 72a3ff9706971a6279294645641fec3502074924..0358a2e02b8da7ca5190412b35ebf1288d0eb046 100644 (file)
@@ -10,6 +10,7 @@ static void       _e_comp_wl_subsurface_invalid_parent_handle(E_Client *ec, stru
 static void       _e_comp_wl_subsurface_parent_commit(E_Client *ec, Eina_Bool parent_synchronized);
 static Eina_Bool  _e_comp_wl_subsurface_synchronized_get(E_Comp_Wl_Subsurf_Data *sdata);
 static void       _e_comp_wl_subsurface_synchronized_commit(E_Client *ec);
+static void       _e_comp_wl_subsurface_remove_from_parent(E_Client *parent, E_Client *subc);
 
 static void
 _e_comp_wl_subsurface_restack_bg_rectangle(E_Client *ec)
@@ -729,26 +730,8 @@ _e_comp_wl_subsurface_cb_ec_uniconify(void *data EINA_UNUSED, E_Client *ec)
 }
 
 static void
-_e_comp_wl_subsurface_destroy_sdata(E_Client *ec)
+_e_comp_wl_subsurface_data_destroy(E_Comp_Wl_Subsurf_Data *sdata)
 {
-   E_Comp_Wl_Subsurf_Data *sdata;
-
-   if (!ec || !ec->comp_data || !ec->comp_data->sub.data) return;
-
-   sdata = ec->comp_data->sub.data;
-   if (sdata->parent)
-     {
-        /* remove this client from parents sub list */
-        sdata->parent->comp_data->sub.list =
-          eina_list_remove(sdata->parent->comp_data->sub.list, ec);
-        sdata->parent->comp_data->sub.list_pending =
-          eina_list_remove(sdata->parent->comp_data->sub.list_pending, ec);
-        sdata->parent->comp_data->sub.below_list =
-          eina_list_remove(sdata->parent->comp_data->sub.below_list, ec);
-        sdata->parent->comp_data->sub.below_list_pending =
-          eina_list_remove(sdata->parent->comp_data->sub.below_list_pending, ec);
-     }
-
    e_comp_wl_surface_state_finish(&sdata->cached);
    e_comp_wl_buffer_reference(&sdata->cached_buffer_ref, NULL);
 
@@ -757,8 +740,6 @@ _e_comp_wl_subsurface_destroy_sdata(E_Client *ec)
    /* wl_resource_set_user_data(ec->comp_data->surface, NULL); */
 
    E_FREE(sdata);
-
-   ec->comp_data->sub.data = NULL;
 }
 
 static void
@@ -783,8 +764,16 @@ _e_comp_wl_subsurface_cb_ec_del(void *data EINA_UNUSED, E_Client *ec)
    /* make sure this is a wayland client */
    if (e_pixmap_type_get(ec->pixmap) != E_PIXMAP_TYPE_WL) return;
 
+   if (!ec->comp_data)
+     return;
+
    if (ec->comp_data->sub.data)
-     _e_comp_wl_subsurface_destroy_sdata(ec);
+     {
+        if (ec->comp_data->sub.data->parent)
+          _e_comp_wl_subsurface_remove_from_parent(ec->comp_data->sub.data->parent, ec);
+        _e_comp_wl_subsurface_data_destroy(ec->comp_data->sub.data);
+        ec->comp_data->sub.data = NULL;
+     }
 
    if (ec->comp_data->sub.below_obj)
      {
@@ -812,7 +801,13 @@ _e_comp_wl_subsurface_destroy(struct wl_resource *resource)
    if (!e_object_unref(E_OBJECT(ec))) return;
    if (e_object_is_del(E_OBJECT(ec))) return;
 
-   _e_comp_wl_subsurface_destroy_sdata(ec);
+   if ((ec->comp_data) && (ec->comp_data->sub.data))
+     {
+        if (ec->comp_data->sub.data->parent)
+          _e_comp_wl_subsurface_remove_from_parent(ec->comp_data->sub.data->parent, ec);
+        _e_comp_wl_subsurface_data_destroy(ec->comp_data->sub.data);
+        ec->comp_data->sub.data = NULL;
+     }
 }
 
 static Eina_Bool
@@ -1264,3 +1259,16 @@ _e_comp_wl_subsurface_invalid_parent_handle(E_Client *ec, struct wl_resource *re
     */
    wl_resource_set_implementation(resource, &_e_subsurface_dummy_interface, NULL, NULL);
 }
+
+static void
+_e_comp_wl_subsurface_remove_from_parent(E_Client *parent, E_Client *subc)
+{
+   parent->comp_data->sub.list =
+      eina_list_remove(parent->comp_data->sub.list, subc);
+   parent->comp_data->sub.list_pending =
+      eina_list_remove(parent->comp_data->sub.list_pending, subc);
+   parent->comp_data->sub.below_list =
+      eina_list_remove(parent->comp_data->sub.below_list, subc);
+   parent->comp_data->sub.below_list_pending =
+      eina_list_remove(parent->comp_data->sub.below_list_pending, subc);
+}