summaryrefslogtreecommitdiff
path: root/shared
diff options
context:
space:
mode:
authorRafal Mielniczuk <rafal.mielniczuk2@gmail.com>2012-07-11 18:48:25 +0200
committerKristian Høgsberg <krh@bitplanet.net>2012-07-11 15:42:51 -0400
commit9d4ddefcce0979710836b9ea499c7ab3deb9d690 (patch)
tree49c908c458265cb3255b097d2102a1ac6d21b82d /shared
parent96ddcb25abe308340f088954e1b32e25c1fab8ed (diff)
image-loader: don't leak pixman_image bits data
Set the pixman_image destroy function to free bits data
Diffstat (limited to 'shared')
-rw-r--r--shared/image-loader.c24
1 files changed, 21 insertions, 3 deletions
diff --git a/shared/image-loader.c b/shared/image-loader.c
index b47c1a7e..6a5c85cf 100644
--- a/shared/image-loader.c
+++ b/shared/image-loader.c
@@ -64,11 +64,18 @@ error_exit(j_common_ptr cinfo)
longjmp(cinfo->client_data, 1);
}
+static void
+pixman_image_destroy_func(pixman_image_t *image, void *data)
+{
+ free(data);
+}
+
static pixman_image_t *
load_jpeg(FILE *fp)
{
struct jpeg_decompress_struct cinfo;
struct jpeg_error_mgr jerr;
+ struct pixman_image_t *pixman_image = NULL;
unsigned int i;
int stride, first;
JSAMPLE *data, *rows[4];
@@ -110,10 +117,15 @@ load_jpeg(FILE *fp)
jpeg_destroy_decompress(&cinfo);
- return pixman_image_create_bits(PIXMAN_a8r8g8b8,
+ pixman_image = pixman_image_create_bits(PIXMAN_a8r8g8b8,
cinfo.output_width,
cinfo.output_height,
(uint32_t *) data, stride);
+
+ pixman_image_set_destroy_function(pixman_image,
+ pixman_image_destroy_func, data);
+
+ return pixman_image;
}
static inline int
@@ -180,6 +192,7 @@ load_png(FILE *fp)
png_uint_32 width, height;
int depth, color_type, interlace, stride;
unsigned int i;
+ pixman_image_t *pixman_image = NULL;
png = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL,
png_error_callback, NULL);
@@ -260,8 +273,13 @@ load_png(FILE *fp)
free(row_pointers);
png_destroy_read_struct(&png, &info, NULL);
- return pixman_image_create_bits(PIXMAN_a8r8g8b8, width, height,
- (uint32_t *) data, stride);
+ pixman_image = pixman_image_create_bits(PIXMAN_a8r8g8b8,
+ width, height, (uint32_t *) data, stride);
+
+ pixman_image_set_destroy_function(pixman_image,
+ pixman_image_destroy_func, data);
+
+ return pixman_image;
}
#ifdef HAVE_WEBP