ecore: Avoid double free with promises
authorJean-Philippe Andre <jp.andre@samsung.com>
Fri, 15 Dec 2017 10:09:02 +0000 (19:09 +0900)
committerWonki Kim <wonki_.kim@samsung.com>
Wed, 10 Jan 2018 11:08:13 +0000 (20:08 +0900)
src/lib/ecore/ecore_main.c
src/lib/ecore/efl_promise.c

index b512194..2782bb2 100644 (file)
@@ -1690,6 +1690,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;
index 17e9548..3e522b4 100644 (file)
@@ -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);
      }