Evas masking: Fix double free() with scaled images
authorJean-Philippe Andre <jp.andre@samsung.com>
Fri, 27 Feb 2015 08:56:49 +0000 (17:56 +0900)
committerJean-Philippe Andre <jp.andre@samsung.com>
Fri, 27 Feb 2015 08:56:49 +0000 (17:56 +0900)
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.

src/lib/evas/canvas/evas_render.c
src/modules/evas/engines/gl_generic/evas_engine.c

index 32c989e..a087a45 100644 (file)
@@ -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;
index 95c4c97..edc85b5 100644 (file)
@@ -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;