ecore: handle recursive trigger of promise by the cancel of a future.
authorCedric BAIL <cedric@osg.samsung.com>
Tue, 18 Oct 2016 23:49:04 +0000 (16:49 -0700)
committerCedric BAIL <cedric@osg.samsung.com>
Tue, 18 Oct 2016 23:49:48 +0000 (16:49 -0700)
This avoid double free/double callback call.

src/lib/ecore/efl_promise.c

index 4bc7496..aa59b8b 100644 (file)
@@ -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)
      {