discomfitor pushed a commit to branch master.

http://git.enlightenment.org/core/enlightenment.git/commit/?id=02d8da9cd9f8575c3d747c5ae5ef57847818733d

commit 02d8da9cd9f8575c3d747c5ae5ef57847818733d
Author: Mike Blumenkrantz <[email protected]>
Date:   Fri Jun 30 17:02:44 2017 -0400

    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));
@@ -1887,24 +1906,6 @@ _bar_drop_enter(void *data, const char *type 
EINA_UNUSED, void *event_data EINA_
 }
 
 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)
 {
    E_Client *ec = data;
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);
@@ -552,21 +568,6 @@ _grid_drop_enter(void *data, const char *type EINA_UNUSED, 
void *event_data EINA
 }
 
 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)
 {
    Instance *inst = data;
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);
@@ -360,19 +374,6 @@ _clock_gadget_configure(Evas_Object *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)
 {
    Instance *inst = data;

-- 


Reply via email to