From 2a0dff5ad313fdb8db3112eaf635bd56516ddf49 Mon Sep 17 00:00:00 2001 From: rahra Date: Sat, 18 Jan 2020 22:01:59 +0100 Subject: [PATCH] fixed memory leak in cairo_image_surface_create_from_jpeg_stream() (thanks to @xielei296) --- src/cairo_jpg.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/cairo_jpg.c b/src/cairo_jpg.c index 0435201..90759be 100644 --- a/src/cairo_jpg.c +++ b/src/cairo_jpg.c @@ -35,7 +35,7 @@ * gcc -std=c99 -Wall -o cairo_jpg -DCAIRO_JPEG_MAIN `pkg-config cairo libjpeg --cflags --libs` cairo_jpg.c * * @author Bernhard R. Fischer, 4096R/8E24F29D bf@abenteuerland.at - * @version 2018/12/11 + * @version 2020/01/18 * @license LGPL3. */ @@ -380,7 +380,7 @@ cairo_surface_t *cairo_image_surface_create_from_jpeg_mem(void *data, size_t len } -/*! This function reads an JPEG image from a stream and creates a Cairo image +/*! This function reads a JPEG image from a stream and creates a Cairo image * surface. * @param read_func Pointer to function which reads data. * @param closure Pointer which is passed to read_func(). @@ -397,6 +397,7 @@ cairo_surface_t *cairo_image_surface_create_from_jpeg_stream(cairo_read_func_len cairo_surface_t *cairo_image_surface_create_from_jpeg_stream(cairo_read_func_t read_func, void *closure) #endif { + cairo_surface_t *sfc; void *data, *tmp; ssize_t len, rlen; int eof = 0; @@ -434,7 +435,11 @@ cairo_surface_t *cairo_image_surface_create_from_jpeg_stream(cairo_read_func_t r } // call jpeg decompression and return surface - return cairo_image_surface_create_from_jpeg_mem(data, len); + sfc = cairo_image_surface_create_from_jpeg_mem(data, len); + if (cairo_surface_status(sfc) != CAIRO_STATUS_SUCCESS) + free(data); + + return sfc; }