diff options
author | Jean-Philippe Andre <jp.andre@samsung.com> | 2017-12-15 19:09:02 +0900 |
---|---|---|
committer | Jean-Philippe Andre <jp.andre@samsung.com> | 2017-12-18 19:54:31 +0900 |
commit | fed81234480b7ed5b4d414f2df18b49992809a35 (patch) | |
tree | 73823c39b4eb3b2bf04f19408ec2061e01b547d1 | |
parent | 796b1dd56684e5acf606c1f6f37edd61c9c47dbf (diff) | |
download | efl-fed81234480b7ed5b4d414f2df18b49992809a35.tar.gz |
ecore: Avoid double free with promises
-rw-r--r-- | src/lib/ecore/ecore_main.c | 3 | ||||
-rw-r--r-- | src/lib/ecore/efl_promise.c | 14 |
2 files changed, 13 insertions, 4 deletions
diff --git a/src/lib/ecore/ecore_main.c b/src/lib/ecore/ecore_main.c index 3ef5a7a5e0..ab90919e5d 100644 --- a/src/lib/ecore/ecore_main.c +++ b/src/lib/ecore/ecore_main.c @@ -1574,6 +1574,9 @@ _ecore_main_content_clear(Efl_Loop_Data *pd) EINA_LIST_FREE(tmp, promise) ecore_loop_promise_fulfill(promise); + // FIXME + __eina_promise_cancel_all(); + while (pd->fd_handlers) { Ecore_Fd_Handler *fdh = pd->fd_handlers; diff --git a/src/lib/ecore/efl_promise.c b/src/lib/ecore/efl_promise.c index 17e95489c6..3e522b4564 100644 --- a/src/lib/ecore/efl_promise.c +++ b/src/lib/ecore/efl_promise.c @@ -824,8 +824,11 @@ _efl_promise_all_free(Efl_Promise_All *all) EINA_ARRAY_ITER_NEXT(&all->members, i, fa, iterator) { if (fa->d) - EINA_REFCOUNT_UNREF(fa->d) - _efl_promise_msg_free(fa->d); + { + EINA_REFCOUNT_UNREF(fa->d) + _efl_promise_msg_free(fa->d); + fa->d = NULL; + } } efl_del(all->promise); all->promise = NULL; @@ -839,8 +842,11 @@ _efl_promise_all_die(void *data, const Efl_Event *ev EINA_UNUSED) while ((fa = eina_array_pop(&all->members))) { - EINA_REFCOUNT_UNREF(fa->d) - _efl_promise_msg_free(fa->d); + if (fa->d) + { + EINA_REFCOUNT_UNREF(fa->d) + _efl_promise_msg_free(fa->d); + } assert(fa->f == NULL); free(fa); } |