summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean-Philippe Andre <jp.andre@samsung.com>2017-12-18 19:04:56 +0900
committerJean-Philippe Andre <jp.andre@samsung.com>2017-12-18 19:54:31 +0900
commit147ef4f91deb99d44c67cbb37fa737d42d8a1792 (patch)
tree2f3e045a43ade34999b4884a24ec0106a3d69163
parent06fea06c867aee5c5d5d79d9e1302e262054b5bb (diff)
downloadefl-147ef4f91deb99d44c67cbb37fa737d42d8a1792.tar.gz
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.
-rw-r--r--src/lib/ecore/ecore_events.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/src/lib/ecore/ecore_events.c b/src/lib/ecore/ecore_events.c
index 49cacd1f07..3adbe042ea 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: