kimcinoo pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=ba09a8101bedf320873d830e97fded0c64370e43

commit ba09a8101bedf320873d830e97fded0c64370e43
Author: Shinwoo Kim <cinoo....@samsung.com>
Date:   Mon Oct 14 11:09:31 2019 +0900

    evas_image: fix memory leak
    
    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
---
 .../evas/engines/software_generic/evas_engine.c      | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/src/modules/evas/engines/software_generic/evas_engine.c 
b/src/modules/evas/engines/software_generic/evas_engine.c
index e0577863b6..0dc6c64b52 100644
--- a/src/modules/evas/engines/software_generic/evas_engine.c
+++ b/src/modules/evas/engines/software_generic/evas_engine.c
@@ -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 *

-- 


Reply via email to