From 02d8da9cd9f8575c3d747c5ae5ef57847818733d Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Fri, 30 Jun 2017 17:02:44 -0400 Subject: [PATCH] remove "gadget_removed" smart callback from gadgets which use it upon deletion ensure that this isn't called in a use-after-free scenario --- src/modules/luncher/bar.c | 39 ++++++++++++++++++----------------- src/modules/luncher/grid.c | 33 +++++++++++++++-------------- src/modules/sysinfo/sysinfo.c | 4 ++-- src/modules/time/clock.c | 29 +++++++++++++------------- 4 files changed, 54 insertions(+), 51 deletions(-) diff --git a/src/modules/luncher/bar.c b/src/modules/luncher/bar.c index 45845c5f8..2e196ee20 100644 --- a/src/modules/luncher/bar.c +++ b/src/modules/luncher/bar.c @@ -1771,11 +1771,30 @@ _bar_mouse_out(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, vo } static void -_bar_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_data EINA_UNUSED) +_bar_removed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_data) +{ + Instance *inst = data; + char buf[4096]; + + if (inst->o_main != event_data) return; + if (e_user_dir_snprintf(buf, sizeof(buf), "applications/bar/%s", inst->cfg->dir) >= sizeof(buf)) + return; + + E_FREE_FUNC(inst->iconify_provider, e_comp_object_effect_mover_del); + + luncher_config->items = eina_list_remove(luncher_config->items, inst->cfg); + eina_stringshare_del(inst->cfg->style); + eina_stringshare_del(inst->cfg->dir); + E_FREE(inst->cfg); +} + +static void +_bar_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_data EINA_UNUSED) { Instance *inst = data; Ecore_Event_Handler *handler; + evas_object_smart_callback_del_full(e_gadget_site_get(obj), "gadget_removed", _bar_removed_cb, inst); inst->main_del = EINA_TRUE; _bar_empty(inst); e_object_del(E_OBJECT(inst->order)); @@ -1886,24 +1905,6 @@ _bar_drop_enter(void *data, const char *type EINA_UNUSED, void *event_data EINA_ evas_object_show(inst->place_holder); } -static void -_bar_removed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_data) -{ - Instance *inst = data; - char buf[4096]; - - if (inst->o_main != event_data) return; - if (e_user_dir_snprintf(buf, sizeof(buf), "applications/bar/%s", inst->cfg->dir) >= sizeof(buf)) - return; - - E_FREE_FUNC(inst->iconify_provider, e_comp_object_effect_mover_del); - - luncher_config->items = eina_list_remove(luncher_config->items, inst->cfg); - eina_stringshare_del(inst->cfg->style); - eina_stringshare_del(inst->cfg->dir); - E_FREE(inst->cfg); -} - static void _bar_iconify_end(void *data, Evas_Object *obj EINA_UNUSED, const char *sig EINA_UNUSED, const char *src EINA_UNUSED) { diff --git a/src/modules/luncher/grid.c b/src/modules/luncher/grid.c index bc8d9af57..2f520056f 100644 --- a/src/modules/luncher/grid.c +++ b/src/modules/luncher/grid.c @@ -447,10 +447,26 @@ _grid_resize(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void } static void -_grid_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_data EINA_UNUSED) +_grid_removed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_data) +{ + Instance *inst = data; + char buf[4096]; + + if (inst->o_main != event_data) return; + if (e_user_dir_snprintf(buf, sizeof(buf), "applications/bar/%s", inst->cfg->dir) >= sizeof(buf)) + return; + + luncher_config->items = eina_list_remove(luncher_config->items, inst->cfg); + eina_stringshare_del(inst->cfg->dir); + E_FREE(inst->cfg); +} + +static void +_grid_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_data EINA_UNUSED) { Instance *inst = data; + evas_object_smart_callback_del_full(e_gadget_site_get(obj), "gadget_removed", _grid_removed_cb, inst); e_object_del(E_OBJECT(inst->order)); E_FREE_FUNC(inst->drop_handler, evas_object_del); luncher_instances = eina_list_remove(luncher_instances, inst); @@ -551,21 +567,6 @@ _grid_drop_enter(void *data, const char *type EINA_UNUSED, void *event_data EINA evas_object_show(inst->place_holder); } -static void -_grid_removed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_data) -{ - Instance *inst = data; - char buf[4096]; - - if (inst->o_main != event_data) return; - if (e_user_dir_snprintf(buf, sizeof(buf), "applications/bar/%s", inst->cfg->dir) >= sizeof(buf)) - return; - - luncher_config->items = eina_list_remove(luncher_config->items, inst->cfg); - eina_stringshare_del(inst->cfg->dir); - E_FREE(inst->cfg); -} - static void _grid_anchor_changed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { diff --git a/src/modules/sysinfo/sysinfo.c b/src/modules/sysinfo/sysinfo.c index 80993f2a9..956e28888 100644 --- a/src/modules/sysinfo/sysinfo.c +++ b/src/modules/sysinfo/sysinfo.c @@ -8,7 +8,6 @@ _sysinfo_removed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_data) Instance *inst = data; if (inst->o_main != event_data) return; - sysinfo_batman_remove(inst, NULL, NULL, NULL); sysinfo_thermal_remove(inst, NULL, NULL, NULL); sysinfo_cpuclock_remove(inst, NULL, NULL, NULL); @@ -23,10 +22,11 @@ _sysinfo_removed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_data) } static void -_sysinfo_deleted_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_data EINA_UNUSED) +_sysinfo_deleted_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_data EINA_UNUSED) { Instance *inst = data; + evas_object_smart_callback_del_full(e_gadget_site_get(obj), "gadget_removed", _sysinfo_removed_cb, inst); sysinfo_batman_remove(inst, NULL, NULL, NULL); sysinfo_thermal_remove(inst, NULL, NULL, NULL); sysinfo_cpuclock_remove(inst, NULL, NULL, NULL); diff --git a/src/modules/time/clock.c b/src/modules/time/clock.c index b1488fa95..7354e0a1a 100644 --- a/src/modules/time/clock.c +++ b/src/modules/time/clock.c @@ -295,12 +295,26 @@ _clock_sizing_changed_cb(void *data, Evas_Object *obj EINA_UNUSED, const char *e } static void -clock_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_clock_gadget_removed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Instance *inst = data; + + if (inst->o_clock != event_info) return; + time_config->items = eina_list_remove(time_config->items, inst->cfg); + eina_stringshare_del(inst->cfg->timezone); + eina_stringshare_del(inst->cfg->time_str[0]); + eina_stringshare_del(inst->cfg->time_str[1]); + E_FREE(inst->cfg); +} + +static void +clock_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) { Instance *inst = data; Eina_List *l; Eina_Bool advanced = EINA_FALSE, seconds = EINA_FALSE; + evas_object_smart_callback_del_full(e_gadget_site_get(obj), "gadget_removed", _clock_gadget_removed_cb, inst); clock_instances = eina_list_remove(clock_instances, inst); evas_object_del(inst->popup); time_daynames_clear(inst); @@ -359,19 +373,6 @@ _clock_gadget_configure(Evas_Object *g) return config_clock(inst->cfg, e_comp_object_util_zone_get(g)); } -static void -_clock_gadget_removed_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) -{ - Instance *inst = data; - - if (inst->o_clock != event_info) return; - time_config->items = eina_list_remove(time_config->items, inst->cfg); - eina_stringshare_del(inst->cfg->timezone); - eina_stringshare_del(inst->cfg->time_str[0]); - eina_stringshare_del(inst->cfg->time_str[1]); - E_FREE(inst->cfg); -} - static void _clock_gadget_created_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) {