cedric pushed a commit to branch master.

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

commit efda7d492d55b2117bdc29d5c03f03fc1a32db3a
Author: Cedric BAIL <ced...@osg.samsung.com>
Date:   Tue Oct 18 16:49:04 2016 -0700

    ecore: handle recursive trigger of promise by the cancel of a future.
    
    This avoid double free/double callback call.
---
 src/lib/ecore/efl_promise.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/src/lib/ecore/efl_promise.c b/src/lib/ecore/efl_promise.c
index 4bc7496..aa59b8b 100644
--- a/src/lib/ecore/efl_promise.c
+++ b/src/lib/ecore/efl_promise.c
@@ -139,11 +139,16 @@ static void
 _efl_loop_future_propagate(Eo *obj, Efl_Loop_Future_Data *pd)
 {
    Efl_Event ev;
+   Eina_Bool cancel;
 
    ev.object = obj;
+   cancel = pd->fulfilled && !pd->message;
 
-   if (pd->fulfilled &&
-       !pd->message)
+   // This has to be done early on to avoid recursive success/failure to
+   // bypass the fulfilled check.
+   pd->fulfilled = EINA_TRUE;
+
+   if (cancel)
      {
         _efl_loop_future_failure(&ev, pd, EINA_ERROR_FUTURE_CANCEL);
      }
@@ -155,7 +160,6 @@ _efl_loop_future_propagate(Eo *obj, Efl_Loop_Future_Data 
*pd)
      {
         _efl_loop_future_failure(&ev, pd, pd->message->error);
      }
-   pd->fulfilled = EINA_TRUE;
 
    if (!pd->delayed)
      {

-- 


Reply via email to