jpeg pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=147ef4f91deb99d44c67cbb37fa737d42d8a1792

commit 147ef4f91deb99d44c67cbb37fa737d42d8a1792
Author: Jean-Philippe Andre <jp.an...@samsung.com>
Date:   Mon Dec 18 19:04:56 2017 +0900

    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 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:

-- 


Reply via email to