elm_genlist/elm_gengrid: fix memory leak caused by efl_wref_del.
authorHosang Kim <hosang12.kim@samsung.com>
Thu, 21 May 2020 09:36:10 +0000 (18:36 +0900)
committerJongmin Lee <jm105.lee@samsung.com>
Sun, 24 May 2020 21:32:20 +0000 (06:32 +0900)
Summary:
efl_wref_del makes pointer to NULL.
So we should copy pointer before efl_wref_del is called.

Reviewers: SanghyeonLee, cedric

Reviewed By: SanghyeonLee

Subscribers: cedric, #reviewers, #committers

Tags: #efl

Differential Revision: https://phab.enlightenment.org/D11866

src/lib/elementary/elm_gengrid.c
src/lib/elementary/elm_genlist.c

index be581571aea4f3fc422bc4bece10eb171c2ce2cd..c72238a4f2c875e70e667c9aa6006abf5ad3ac26 100755 (executable)
@@ -197,8 +197,10 @@ _item_cache_free(Item_Cache *itc)
    /* does not exist if cache item has just been reused */
    if (itc->base_view)
      {
+        Evas_Object *view = itc->base_view;
         efl_wref_del(itc->base_view, &itc->base_view);
-        efl_del(itc->base_view);
+        efl_del(view);
+        itc->base_view = NULL;
      }
    eina_stringshare_del(itc->item_style);
    EINA_LIST_FREE(itc->contents, c)
@@ -1627,7 +1629,10 @@ _item_unrealize_cb(Elm_Gen_Item *it)
    Evas_Object *c;
    if (!_item_cache_add(it, _content_cache_add(it, &cache)))
      {
-        ELM_SAFE_FREE(VIEW(it), evas_object_del);
+        Evas_Object *view = VIEW(it);
+        efl_wref_del(VIEW(it), &VIEW(it));
+        ELM_SAFE_FREE(view, evas_object_del);
+        VIEW(it) = NULL;
         ELM_SAFE_FREE(it->spacer, evas_object_del);
         EINA_LIST_FREE(cache, c)
           evas_object_del(c);
index dd9283806585e340d9da62c30a311330c6069838..ab7ac57c4e3f00fbea0fe23d1fa9ba681d01876c 100644 (file)
@@ -1649,8 +1649,10 @@ _item_cache_free(Item_Cache *itc)
    /* does not exist if cache item has just been reused */
    if (itc->base_view)
      {
+        Evas_Object *view = itc->base_view;
         efl_wref_del(itc->base_view, &itc->base_view);
-        efl_del(itc->base_view);
+        efl_del(view);
+        itc->base_view = NULL;
      }
    itc->item_class = NULL;
    EINA_LIST_FREE(itc->contents, c)
@@ -5699,7 +5701,10 @@ _item_unrealize(Elm_Gen_Item *it)
 
    if (!_item_cache_add(it, _content_cache_add(it, &cache)))
      {
-        ELM_SAFE_FREE(VIEW(it), efl_del);
+        Evas_Object *view = VIEW(it);
+        efl_wref_del(VIEW(it), &VIEW(it));
+        ELM_SAFE_FREE(view, efl_del);
+        VIEW(it) = NULL;
         it->callbacks = EINA_FALSE;
         ELM_SAFE_FREE(it->spacer, evas_object_del);
         EINA_LIST_FREE(cache, c)