evas_image: fix memory leak
authorShinwoo Kim <cinoo.kim@samsung.com>
Mon, 14 Oct 2019 02:09:31 +0000 (11:09 +0900)
committerWonki Kim <wonki_.kim@samsung.com>
Mon, 11 Nov 2019 02:18:24 +0000 (11:18 +0900)
Summary:
On the sw engine, an im could be changed and removed by evas_cache_image_size_set.
In this case, there is no chance to free its resource and ends up in memory leak.

Reviewers: Hermet, raster, jsuya, cedric

Reviewed By: cedric

Subscribers: cedric, #reviewers, #committers

Tags: #efl

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

src/modules/evas/engines/software_generic/evas_engine.c

index ff6af8a..e2c7eab 100755 (executable)
@@ -1252,9 +1252,25 @@ eng_image_size_get(void *data EINA_UNUSED, void *image, int *w, int *h)
 static void *
 eng_image_size_set(void *data EINA_UNUSED, void *image, int w, int h)
 {
-   Image_Entry *im = image;
+   RGBA_Image *rm;
+   Image_Entry *im = image, *im2;
    if (!im) return NULL;
-   return evas_cache_image_size_set(im, w, h);
+
+   /* sw engine im could be changed and removed in evas_cache_image_size_set.
+      in this case, there is no chance to free its resource.  */
+   evas_cache_image_ref(im);
+   im2 = evas_cache_image_size_set(im, w, h);
+   if (im != im2 && im->references == 1)
+     {
+        rm = (RGBA_Image *)im;
+        if (rm->native.data)
+          {
+             if (rm->native.func.free)
+               rm->native.func.free(im);
+          }
+     }
+   evas_cache_image_drop(im);
+   return im2;
 }
 
 static void *