summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCedric BAIL <cedric@osg.samsung.com>2016-10-18 16:49:04 -0700
committerCedric BAIL <cedric@osg.samsung.com>2016-10-18 16:49:48 -0700
commitefda7d492d55b2117bdc29d5c03f03fc1a32db3a (patch)
tree4309ce923344d0b84178600039c3c336d94f3d06
parent69e330e781663a1ac1ead69cf71350a80fe688cc (diff)
downloadefl-efda7d492d55b2117bdc29d5c03f03fc1a32db3a.tar.gz
ecore: handle recursive trigger of promise by the cancel of a future.
This avoid double free/double callback call.
-rw-r--r--src/lib/ecore/efl_promise.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/src/lib/ecore/efl_promise.c b/src/lib/ecore/efl_promise.c
index 4bc74966b7..aa59b8b9f2 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)
{