Enlightenment CVS committal

Author  : raster
Project : e17
Module  : libs/evas

Dir     : e17/libs/evas/src/modules/loaders/svg


Modified Files:
        evas_image_load_svg.c 


Log Message:


hooray! librsvg leak!. if you try and load a file that is NOT an svg with
librsvg - and it fails, it does not FREE UP MEMORY - it LEAKS. BAD RSVG. BAd
BAD! ok - a code to explicitly avoid loading anything NOT .svg or .svg.gz!!!!!!

===================================================================
RCS file: /cvs/e/e17/libs/evas/src/modules/loaders/svg/evas_image_load_svg.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -3 -r1.11 -r1.12
--- evas_image_load_svg.c       5 Nov 2006 05:07:53 -0000       1.11
+++ evas_image_load_svg.c       4 Mar 2007 21:17:36 -0000       1.12
@@ -43,9 +43,31 @@
    RsvgHandle         *rsvg;
    RsvgDimensionData   dim;
    int                 w, h;
+   char               *ext;
    
    if (!file) return 0;
-   
+
+   /* ignore all files not called .svg or .svg.gz - because rsvg has a leak
+    * where closing the handle doesn't free mem */
+   ext = strrchr(file, '.');
+   if (!ext) return;
+   if (!strcasecmp(ext, ".gz"))
+     {
+       if (p > file)
+         {
+            ext = p - 1;
+            while ((*p != '.') && (p > file))
+              {
+                 p--;
+              }
+            if (p <= file) return 0;
+            if (strcasecmp(p, ".svg.gz")) return 0;
+         }
+       else
+         return 0;
+     }
+   else if (strcasecmp(ext, ".svg")) return 0;
+
    getcwd(pcwd, sizeof(pcwd));
    strncpy(cwd, file, sizeof(cwd) - 1);
    cwd[sizeof(cwd) - 1] = 0;
@@ -64,7 +86,9 @@
        im->image = evas_common_image_surface_new(im);
        if (!im->image)
          {
-            rsvg_handle_free(rsvg);
+            rsvg_handle_close(rsvg, NULL);
+            g_object_unref(rsvg);
+//          rsvg_handle_free(rsvg);
             chdir(pcwd);
             return 0;
          }
@@ -75,7 +99,11 @@
    h = dim.height;
    if ((w < 1) || (h < 1) || (w > 8192) || (h > 8192))
      {
-       rsvg_handle_free(rsvg);
+       evas_common_image_surface_free(im->image);
+       im->image = NULL;
+       rsvg_handle_close(rsvg, NULL);
+       g_object_unref(rsvg);
+//     rsvg_handle_free(rsvg);
        chdir(pcwd);
        return 0;
      }
@@ -109,7 +137,9 @@
    im->image->w = w;
    im->image->h = h;
    im->flags |= RGBA_IMAGE_HAS_ALPHA;
-   rsvg_handle_free(rsvg);
+   rsvg_handle_close(rsvg, NULL);
+   g_object_unref(rsvg);
+//   rsvg_handle_free(rsvg);
    chdir(pcwd);
    return 1;
 }
@@ -119,17 +149,37 @@
 evas_image_load_file_data_svg(RGBA_Image *im, const char *file, const char 
*key)
 {
    char               cwd[PATH_MAX], pcwd[PATH_MAX], *p;
-   
    RsvgHandle         *rsvg;
    RsvgDimensionData   dim;
    int                 w, h;
-
    cairo_surface_t    *surface;
    cairo_t            *cr;
+   char               *ext;
 
    if (!file) return 0;
    if (!im->image) return 0;
 
+   /* ignore all files not called .svg or .svg.gz - because rsvg has a leak
+    * where closing the handle doesn't free mem */
+   ext = strrchr(file, '.');
+   if (!ext) return;
+   if (!strcasecmp(ext, ".gz"))
+     {
+       if (p > file)
+         {
+            ext = p - 1;
+            while ((*p != '.') && (p > file))
+              {
+                 p--;
+              }
+            if (p <= file) return 0;
+            if (strcasecmp(p, ".svg.gz")) return 0;
+         }
+       else
+         return 0;
+     }
+   else if (strcasecmp(ext, ".svg")) return 0;
+
    getcwd(pcwd, sizeof(pcwd));
    strncpy(cwd, file, sizeof(cwd) - 1);
    cwd[sizeof(cwd) - 1] = 0;
@@ -151,7 +201,11 @@
    h = dim.height;
    if ((w < 1) || (h < 1) || (w > 8192) || (h > 8192))
      {
-       rsvg_handle_free(rsvg);
+       evas_common_image_surface_free(im->image);
+       im->image = NULL;
+       rsvg_handle_close(rsvg, NULL);
+       g_object_unref(rsvg);
+//     rsvg_handle_free(rsvg);
        chdir(pcwd);
        return 0;
      }
@@ -190,7 +244,9 @@
      {
        evas_common_image_surface_free(im->image);
        im->image = NULL;
-       rsvg_handle_free(rsvg);
+       rsvg_handle_close(rsvg, NULL);
+       g_object_unref(rsvg);
+//     rsvg_handle_free(rsvg);
        chdir(pcwd);
        return 0;
      }
@@ -203,7 +259,9 @@
      {
        evas_common_image_surface_free(im->image);
        im->image = NULL;
-       rsvg_handle_free(rsvg);
+       rsvg_handle_close(rsvg, NULL);
+       g_object_unref(rsvg);
+//     rsvg_handle_free(rsvg);
        chdir(pcwd);
        return 0;
      }
@@ -213,7 +271,9 @@
        cairo_surface_destroy(surface);
        evas_common_image_surface_free(im->image);
        im->image = NULL;
-       rsvg_handle_free(rsvg);
+       rsvg_handle_close(rsvg, NULL);
+       g_object_unref(rsvg);
+//     rsvg_handle_free(rsvg);
        chdir(pcwd);
        return 0;
      }
@@ -225,7 +285,9 @@
    cairo_surface_destroy(surface);
    /* need to check if this is required... */
    cairo_destroy(cr);
-   rsvg_handle_free(rsvg);
+   rsvg_handle_close(rsvg, NULL);
+   g_object_unref(rsvg);
+//   rsvg_handle_free(rsvg);
    chdir(pcwd);
    evas_common_image_set_alpha_sparse(im);
    return 1;



-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys-and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to