From: Cedric BAIL Date: Tue, 18 Oct 2016 23:49:04 +0000 (-0700) Subject: ecore: handle recursive trigger of promise by the cancel of a future. X-Git-Tag: upstream/1.20.0~4038 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=efda7d492d55b2117bdc29d5c03f03fc1a32db3a;p=platform%2Fupstream%2Fefl.git ecore: handle recursive trigger of promise by the cancel of a future. This avoid double free/double callback call. --- 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) {