From 8ab5d75d9181b2271c9c6119c491787699192485 Mon Sep 17 00:00:00 2001 From: Seunghun Lee Date: Mon, 18 May 2020 08:33:50 +0900 Subject: [PATCH] subsurface: check data validation before calling function Change-Id: I1b3eb6e73a1ef3f72e62001c85cbb3f2c259c70c --- src/bin/e_comp_wl_subsurface.c | 54 +++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/src/bin/e_comp_wl_subsurface.c b/src/bin/e_comp_wl_subsurface.c index 72a3ff9706..0358a2e02b 100644 --- a/src/bin/e_comp_wl_subsurface.c +++ b/src/bin/e_comp_wl_subsurface.c @@ -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); +} -- 2.34.1