ecore: handle recursive trigger of promise by the cancel of a future.

This avoid double free/double callback call.
This commit is contained in:
Cedric BAIL 2016-10-18 16:49:04 -07:00
parent 69e330e781
commit efda7d492d
1 changed files with 7 additions and 3 deletions

View 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)
{