diff options
author | Jean-Philippe Andre <jp.andre@samsung.com> | 2015-02-27 17:56:49 +0900 |
---|---|---|
committer | Jean-Philippe Andre <jp.andre@samsung.com> | 2015-02-27 17:56:49 +0900 |
commit | 2e3ee0e658f884a126293a8fe41059c0bada5599 (patch) | |
tree | 9e886865143bfd3c99d7bf0e65a9d4d913745214 | |
parent | ab89dc401c12e550880065dfe092f3e53aa201ac (diff) | |
download | efl-2e3ee0e658f884a126293a8fe41059c0bada5599.tar.gz |
Evas masking: Fix double free() with scaled images
The function image_scaled_update() frees() the old scaled image
passed as input if it doesn't match the old dimensions. This commit
will avoid double frees.
-rw-r--r-- | src/lib/evas/canvas/evas_render.c | 2 | ||||
-rw-r--r-- | src/modules/evas/engines/gl_generic/evas_engine.c | 13 |
2 files changed, 11 insertions, 4 deletions
diff --git a/src/lib/evas/canvas/evas_render.c b/src/lib/evas/canvas/evas_render.c index 32c989e8be..a087a45618 100644 --- a/src/lib/evas/canvas/evas_render.c +++ b/src/lib/evas/canvas/evas_render.c @@ -1850,8 +1850,6 @@ evas_render_mask_subrender(Evas_Public_Data *evas, if (scaled) { done = EINA_TRUE; - if (mdata->surface && (mdata->surface != scaled)) - ENFN->image_map_surface_free(ENDT, mdata->surface); mdata->surface = scaled; mdata->w = w; mdata->h = h; diff --git a/src/modules/evas/engines/gl_generic/evas_engine.c b/src/modules/evas/engines/gl_generic/evas_engine.c index 95c4c97d2a..edc85b5673 100644 --- a/src/modules/evas/engines/gl_generic/evas_engine.c +++ b/src/modules/evas/engines/gl_generic/evas_engine.c @@ -959,6 +959,7 @@ eng_image_scaled_update(void *data EINA_UNUSED, void *scaled, void *image, Evas_GL_Image *dst = scaled; Evas_GL_Image *src = image; Evas_Engine_GL_Context *gc; + Eina_Bool reffed = EINA_FALSE; if (!src) return NULL; @@ -971,7 +972,15 @@ eng_image_scaled_update(void *data EINA_UNUSED, void *scaled, void *image, (dst->scaled.w == dst_w) && (dst->scaled.h == dst_h)) return dst; - if (dst) evas_gl_common_image_free(dst); + if (dst) + { + if (dst->scaled.origin == src) + { + src->references++; + reffed = EINA_TRUE; + } + evas_gl_common_image_free(dst); + } evas_gl_common_image_update(gc, src); if (!src->tex) { @@ -992,7 +1001,7 @@ eng_image_scaled_update(void *data EINA_UNUSED, void *scaled, void *image, dst->tex->references++; dst->tex_only = 1; - src->references++; + if (!reffed) src->references++; dst->scaled.origin = src; dst->scaled.w = dst_w; dst->scaled.h = dst_h; |