From 335bc8dec4c78a33e1a3f42023f759641c6e86d9 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Andre Date: Mon, 18 Dec 2017 19:04:56 +0900 Subject: [PATCH] ecore: Avoid access to invalid eo id Not a fan of the solution, as I think some of the logic handling those futures is a bit broken. I'm not 100% sure about this patch. But this improves make check with CK_FORK=no in elm_suite. --- src/lib/ecore/ecore_events.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/lib/ecore/ecore_events.c b/src/lib/ecore/ecore_events.c index 49cacd1..3adbe04 100644 --- a/src/lib/ecore/ecore_events.c +++ b/src/lib/ecore/ecore_events.c @@ -71,10 +71,22 @@ ecore_event_add(int type, return (Ecore_Event *)msg; } +static void +_event_del_cb(void *data, const Efl_Event *ev) +{ + Ecore_Future_Schedule_Entry *entry = data; + if ((ev->object == (Eo *) entry->event) && entry->future) + { + eina_future_cancel(entry->future); + eina_value_flush(&entry->value); + } +} + EAPI void * ecore_event_del(Ecore_Event *event) { void *data = NULL; + if (!event) return data; ecore_event_message_data_get((Eo *)event, NULL, &data, NULL, NULL); _efl_loop_message_unsend((Eo *)event); return data; @@ -141,8 +153,9 @@ ecore_future_free(void *user_data, void *func_data EINA_UNUSED) static Eina_Future_Schedule_Entry * ecore_future_schedule(Eina_Future_Scheduler *sched, Eina_Future_Scheduler_Cb cb, Eina_Future *future, Eina_Value value) { - Ecore_Future_Schedule_Entry *entry = eina_mempool_malloc(mp_future_schedule_entry, - sizeof(Ecore_Future_Schedule_Entry)); + Ecore_Future_Schedule_Entry *entry; + + entry = eina_mempool_malloc(mp_future_schedule_entry, sizeof(*entry)); EINA_SAFETY_ON_NULL_RETURN_VAL(entry, NULL); entry->base.scheduler = sched; entry->cb = cb; @@ -150,6 +163,7 @@ ecore_future_schedule(Eina_Future_Scheduler *sched, Eina_Future_Scheduler_Cb cb, entry->value = value; entry->event = ecore_event_add(ECORE_EV_FUTURE_ID, entry, ecore_future_free, entry); EINA_SAFETY_ON_NULL_GOTO(entry->event, err); + efl_event_callback_add((Eo *) entry->event, EFL_EVENT_DEL, _event_del_cb, entry); return &entry->base; err: -- 2.7.4