procstats: use after free.

Don't set callbacks on objects that persist longer than module.
Delete safely.
This commit is contained in:
Alastair Poole 2021-09-06 00:14:51 +01:00
parent 47aaa31886
commit 94ceea2a74
1 changed files with 16 additions and 15 deletions

View File

@ -15,17 +15,19 @@ static Ecore_Timer *_clients_timer = NULL;
typedef struct _Proc_Stats Proc_Stats; typedef struct _Proc_Stats Proc_Stats;
struct _Proc_Stats struct _Proc_Stats
{ {
E_Client *client; E_Client *client;
Evas_Object *obj; Evas_Object *obj;
Evas_Object *obj_swallow; Evas_Object *obj_swallow;
Evas_Object *popup; Evas_Object *popup;
pid_t pid; E_Object_Delfn *delfn;
uint64_t mem_size; pid_t pid;
uint64_t cpu_time; uint64_t mem_size;
uint64_t cpu_time_prev; uint64_t cpu_time;
uint64_t cpu_time_prev;
}; };
static void _proc_stats_item_display(Proc_Stats *item); static void _proc_stats_item_display(Proc_Stats *item);
static void _proc_stats_item_remove(Proc_Stats *item);
static Eina_Bool static Eina_Bool
_memory_total(void) _memory_total(void)
@ -78,19 +80,18 @@ _proc_stats_item_del(Proc_Stats *item)
item->popup = NULL; item->popup = NULL;
edje_object_signal_emit(item->obj, "e,state,procstats,off", "e"); edje_object_signal_emit(item->obj, "e,state,procstats,off", "e");
evas_object_del(item->obj_swallow); evas_object_del(item->obj_swallow);
e_object_delfn_del(E_OBJECT(item->client), item->delfn);
free(item); free(item);
item = NULL; item = NULL;
} }
static void 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; Proc_Stats *item = data;
if (item->popup) evas_object_del(item->popup); _proc_stats_item_remove(item);
item->popup = NULL;
evas_object_hide(item->obj_swallow);
edje_object_signal_emit(obj, "e,state,procstats,off", "e");
} }
static void 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_part_swallow(ec->frame_object, "e.procstats.swallow", ic);
edje_object_signal_emit(ec->frame_object, "e,state,procstats,on", "e"); 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); item->delfn = e_object_delfn_add(E_OBJECT(ec), _proc_stats_client_del_cb, item);
evas_object_event_callback_add(item->obj, EVAS_CALLBACK_MOVE, _proc_stats_client_move_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); evas_object_event_callback_add(ic, EVAS_CALLBACK_MOUSE_UP, _proc_stats_icon_clicked_cb, item);
_clients = eina_list_append(_clients, item); _clients = eina_list_append(_clients, item);