forked from enlightenment/efl
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!!!!!! SVN revision: 28557
This commit is contained in:
parent
9dc3984a39
commit
11e483cc0b
|
@ -43,9 +43,31 @@ evas_image_load_file_head_svg(RGBA_Image *im, const char *file, const char *key)
|
||||||
RsvgHandle *rsvg;
|
RsvgHandle *rsvg;
|
||||||
RsvgDimensionData dim;
|
RsvgDimensionData dim;
|
||||||
int w, h;
|
int w, h;
|
||||||
|
char *ext;
|
||||||
|
|
||||||
if (!file) return 0;
|
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));
|
getcwd(pcwd, sizeof(pcwd));
|
||||||
strncpy(cwd, file, sizeof(cwd) - 1);
|
strncpy(cwd, file, sizeof(cwd) - 1);
|
||||||
cwd[sizeof(cwd) - 1] = 0;
|
cwd[sizeof(cwd) - 1] = 0;
|
||||||
|
@ -64,7 +86,9 @@ evas_image_load_file_head_svg(RGBA_Image *im, const char *file, const char *key)
|
||||||
im->image = evas_common_image_surface_new(im);
|
im->image = evas_common_image_surface_new(im);
|
||||||
if (!im->image)
|
if (!im->image)
|
||||||
{
|
{
|
||||||
rsvg_handle_free(rsvg);
|
rsvg_handle_close(rsvg, NULL);
|
||||||
|
g_object_unref(rsvg);
|
||||||
|
// rsvg_handle_free(rsvg);
|
||||||
chdir(pcwd);
|
chdir(pcwd);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -75,7 +99,11 @@ evas_image_load_file_head_svg(RGBA_Image *im, const char *file, const char *key)
|
||||||
h = dim.height;
|
h = dim.height;
|
||||||
if ((w < 1) || (h < 1) || (w > 8192) || (h > 8192))
|
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);
|
chdir(pcwd);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -109,7 +137,9 @@ evas_image_load_file_head_svg(RGBA_Image *im, const char *file, const char *key)
|
||||||
im->image->w = w;
|
im->image->w = w;
|
||||||
im->image->h = h;
|
im->image->h = h;
|
||||||
im->flags |= RGBA_IMAGE_HAS_ALPHA;
|
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);
|
chdir(pcwd);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -119,17 +149,37 @@ int
|
||||||
evas_image_load_file_data_svg(RGBA_Image *im, const char *file, const char *key)
|
evas_image_load_file_data_svg(RGBA_Image *im, const char *file, const char *key)
|
||||||
{
|
{
|
||||||
char cwd[PATH_MAX], pcwd[PATH_MAX], *p;
|
char cwd[PATH_MAX], pcwd[PATH_MAX], *p;
|
||||||
|
|
||||||
RsvgHandle *rsvg;
|
RsvgHandle *rsvg;
|
||||||
RsvgDimensionData dim;
|
RsvgDimensionData dim;
|
||||||
int w, h;
|
int w, h;
|
||||||
|
|
||||||
cairo_surface_t *surface;
|
cairo_surface_t *surface;
|
||||||
cairo_t *cr;
|
cairo_t *cr;
|
||||||
|
char *ext;
|
||||||
|
|
||||||
if (!file) return 0;
|
if (!file) return 0;
|
||||||
if (!im->image) 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));
|
getcwd(pcwd, sizeof(pcwd));
|
||||||
strncpy(cwd, file, sizeof(cwd) - 1);
|
strncpy(cwd, file, sizeof(cwd) - 1);
|
||||||
cwd[sizeof(cwd) - 1] = 0;
|
cwd[sizeof(cwd) - 1] = 0;
|
||||||
|
@ -151,7 +201,11 @@ evas_image_load_file_data_svg(RGBA_Image *im, const char *file, const char *key)
|
||||||
h = dim.height;
|
h = dim.height;
|
||||||
if ((w < 1) || (h < 1) || (w > 8192) || (h > 8192))
|
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);
|
chdir(pcwd);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -190,7 +244,9 @@ evas_image_load_file_data_svg(RGBA_Image *im, const char *file, const char *key)
|
||||||
{
|
{
|
||||||
evas_common_image_surface_free(im->image);
|
evas_common_image_surface_free(im->image);
|
||||||
im->image = NULL;
|
im->image = NULL;
|
||||||
rsvg_handle_free(rsvg);
|
rsvg_handle_close(rsvg, NULL);
|
||||||
|
g_object_unref(rsvg);
|
||||||
|
// rsvg_handle_free(rsvg);
|
||||||
chdir(pcwd);
|
chdir(pcwd);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -203,7 +259,9 @@ evas_image_load_file_data_svg(RGBA_Image *im, const char *file, const char *key)
|
||||||
{
|
{
|
||||||
evas_common_image_surface_free(im->image);
|
evas_common_image_surface_free(im->image);
|
||||||
im->image = NULL;
|
im->image = NULL;
|
||||||
rsvg_handle_free(rsvg);
|
rsvg_handle_close(rsvg, NULL);
|
||||||
|
g_object_unref(rsvg);
|
||||||
|
// rsvg_handle_free(rsvg);
|
||||||
chdir(pcwd);
|
chdir(pcwd);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -213,7 +271,9 @@ evas_image_load_file_data_svg(RGBA_Image *im, const char *file, const char *key)
|
||||||
cairo_surface_destroy(surface);
|
cairo_surface_destroy(surface);
|
||||||
evas_common_image_surface_free(im->image);
|
evas_common_image_surface_free(im->image);
|
||||||
im->image = NULL;
|
im->image = NULL;
|
||||||
rsvg_handle_free(rsvg);
|
rsvg_handle_close(rsvg, NULL);
|
||||||
|
g_object_unref(rsvg);
|
||||||
|
// rsvg_handle_free(rsvg);
|
||||||
chdir(pcwd);
|
chdir(pcwd);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -225,7 +285,9 @@ evas_image_load_file_data_svg(RGBA_Image *im, const char *file, const char *key)
|
||||||
cairo_surface_destroy(surface);
|
cairo_surface_destroy(surface);
|
||||||
/* need to check if this is required... */
|
/* need to check if this is required... */
|
||||||
cairo_destroy(cr);
|
cairo_destroy(cr);
|
||||||
rsvg_handle_free(rsvg);
|
rsvg_handle_close(rsvg, NULL);
|
||||||
|
g_object_unref(rsvg);
|
||||||
|
// rsvg_handle_free(rsvg);
|
||||||
chdir(pcwd);
|
chdir(pcwd);
|
||||||
evas_common_image_set_alpha_sparse(im);
|
evas_common_image_set_alpha_sparse(im);
|
||||||
return 1;
|
return 1;
|
||||||
|
|
Loading…
Reference in New Issue