remove "gadget_removed" smart callback from gadgets which use it upon deletion

ensure that this isn't called in a use-after-free scenario
This commit is contained in:
Mike Blumenkrantz 2017-06-30 17:02:44 -04:00
parent af60915713
commit 02d8da9cd9
4 changed files with 54 additions and 51 deletions

View File

@ -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)
{

View File

@ -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)
{

View File

@ -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);

View File

@ -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)
{