From efda7d492d55b2117bdc29d5c03f03fc1a32db3a Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Tue, 18 Oct 2016 16:49:04 -0700 Subject: 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 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) { -- cgit v1.2.1