summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlastair Poole <netstar@gmail.com>2021-09-06 00:14:51 +0100
committerAlastair Poole <netstar@gmail.com>2021-09-06 00:14:51 +0100
commit94ceea2a747b18576606803490b5e7ee1a778447 (patch)
treee1b3b99149dd71b9759f70306d4ce3f335a9b6a7
parent47aaa31886e77286cb3b55089bc96f416c4d2e96 (diff)
downloadenlightenment-94ceea2a747b18576606803490b5e7ee1a778447.tar.gz
procstats: use after free.
Don't set callbacks on objects that persist longer than module. Delete safely.
-rw-r--r--src/modules/procstats/e_mod_main.c31
1 files changed, 16 insertions, 15 deletions
diff --git a/src/modules/procstats/e_mod_main.c b/src/modules/procstats/e_mod_main.c
index 60178281c2..ad15b35431 100644
--- a/src/modules/procstats/e_mod_main.c
+++ b/src/modules/procstats/e_mod_main.c
@@ -15,17 +15,19 @@ static Ecore_Timer *_clients_timer = NULL;
typedef struct _Proc_Stats Proc_Stats;
struct _Proc_Stats
{
- E_Client *client;
- Evas_Object *obj;
- Evas_Object *obj_swallow;
- Evas_Object *popup;
- pid_t pid;
- uint64_t mem_size;
- uint64_t cpu_time;
- uint64_t cpu_time_prev;
+ E_Client *client;
+ Evas_Object *obj;
+ Evas_Object *obj_swallow;
+ Evas_Object *popup;
+ E_Object_Delfn *delfn;
+ pid_t pid;
+ uint64_t mem_size;
+ uint64_t cpu_time;
+ uint64_t cpu_time_prev;
};
static void _proc_stats_item_display(Proc_Stats *item);
+static void _proc_stats_item_remove(Proc_Stats *item);
static Eina_Bool
_memory_total(void)
@@ -78,19 +80,18 @@ _proc_stats_item_del(Proc_Stats *item)
item->popup = NULL;
edje_object_signal_emit(item->obj, "e,state,procstats,off", "e");
evas_object_del(item->obj_swallow);
+ e_object_delfn_del(E_OBJECT(item->client), item->delfn);
+
free(item);
item = NULL;
}
static void
-_proc_stats_client_del_cb(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+_proc_stats_client_del_cb(void *data, void *obj EINA_UNUSED)
{
Proc_Stats *item = data;
- if (item->popup) evas_object_del(item->popup);
- item->popup = NULL;
- evas_object_hide(item->obj_swallow);
- edje_object_signal_emit(obj, "e,state,procstats,off", "e");
+ _proc_stats_item_remove(item);
}
static void
@@ -208,8 +209,8 @@ _proc_stats_item_add(E_Client *ec, E_Module *module)
edje_object_part_swallow(ec->frame_object, "e.procstats.swallow", ic);
edje_object_signal_emit(ec->frame_object, "e,state,procstats,on", "e");
- evas_object_event_callback_add(item->obj, EVAS_CALLBACK_DEL, _proc_stats_client_del_cb, item);
- evas_object_event_callback_add(item->obj, EVAS_CALLBACK_MOVE, _proc_stats_client_move_cb, item);
+ item->delfn = e_object_delfn_add(E_OBJECT(ec), _proc_stats_client_del_cb, item);
+ evas_object_event_callback_add(ic, EVAS_CALLBACK_MOVE, _proc_stats_client_move_cb, item);
evas_object_event_callback_add(ic, EVAS_CALLBACK_MOUSE_UP, _proc_stats_icon_clicked_cb, item);
_clients = eina_list_append(_clients, item);