diff options
author | Rafal Mielniczuk <rafal.mielniczuk2@gmail.com> | 2012-07-11 18:48:25 +0200 |
---|---|---|
committer | Kristian Høgsberg <krh@bitplanet.net> | 2012-07-11 15:42:51 -0400 |
commit | 9d4ddefcce0979710836b9ea499c7ab3deb9d690 (patch) | |
tree | 49c908c458265cb3255b097d2102a1ac6d21b82d /shared | |
parent | 96ddcb25abe308340f088954e1b32e25c1fab8ed (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.c | 24 |
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 |