forked from enlightenment/efl
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.
This commit is contained in:
parent
ab89dc401c
commit
2e3ee0e658
|
@ -1850,8 +1850,6 @@ evas_render_mask_subrender(Evas_Public_Data *evas,
|
||||||
if (scaled)
|
if (scaled)
|
||||||
{
|
{
|
||||||
done = EINA_TRUE;
|
done = EINA_TRUE;
|
||||||
if (mdata->surface && (mdata->surface != scaled))
|
|
||||||
ENFN->image_map_surface_free(ENDT, mdata->surface);
|
|
||||||
mdata->surface = scaled;
|
mdata->surface = scaled;
|
||||||
mdata->w = w;
|
mdata->w = w;
|
||||||
mdata->h = h;
|
mdata->h = h;
|
||||||
|
|
|
@ -959,6 +959,7 @@ eng_image_scaled_update(void *data EINA_UNUSED, void *scaled, void *image,
|
||||||
Evas_GL_Image *dst = scaled;
|
Evas_GL_Image *dst = scaled;
|
||||||
Evas_GL_Image *src = image;
|
Evas_GL_Image *src = image;
|
||||||
Evas_Engine_GL_Context *gc;
|
Evas_Engine_GL_Context *gc;
|
||||||
|
Eina_Bool reffed = EINA_FALSE;
|
||||||
|
|
||||||
if (!src) return NULL;
|
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))
|
(dst->scaled.w == dst_w) && (dst->scaled.h == dst_h))
|
||||||
return dst;
|
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);
|
evas_gl_common_image_update(gc, src);
|
||||||
if (!src->tex)
|
if (!src->tex)
|
||||||
{
|
{
|
||||||
|
@ -992,7 +1001,7 @@ eng_image_scaled_update(void *data EINA_UNUSED, void *scaled, void *image,
|
||||||
dst->tex->references++;
|
dst->tex->references++;
|
||||||
dst->tex_only = 1;
|
dst->tex_only = 1;
|
||||||
|
|
||||||
src->references++;
|
if (!reffed) src->references++;
|
||||||
dst->scaled.origin = src;
|
dst->scaled.origin = src;
|
||||||
dst->scaled.w = dst_w;
|
dst->scaled.w = dst_w;
|
||||||
dst->scaled.h = dst_h;
|
dst->scaled.h = dst_h;
|
||||||
|
|
Loading…
Reference in New Issue