From 8815d282ff5f9cb43c00f4fe67415afe5cda1770 Mon Sep 17 00:00:00 2001 From: Shinwoo Kim Date: Mon, 14 Oct 2019 11:09:31 +0900 Subject: [PATCH] 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 --- .../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 *