summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKim Woelders <kim@woelders.dk>2019-09-29 18:58:13 +0200
committerKim Woelders <kim@woelders.dk>2019-09-29 19:44:41 +0200
commit9977ac202642f3139c2f978ef2c7d50c03723ee4 (patch)
tree33e290286d29244c4085fc0bc637e703892fb871
parent701f87ffa6a7e8bbaf816121595b4478e168f641 (diff)
downloadimlib2-9977ac202642f3139c2f978ef2c7d50c03723ee4.tar.gz
JPG loader: Fix memory leaks in error paths
-rw-r--r--src/modules/loaders/loader_jpeg.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/src/modules/loaders/loader_jpeg.c b/src/modules/loaders/loader_jpeg.c
index 7a07394..de16168 100644
--- a/src/modules/loaders/loader_jpeg.c
+++ b/src/modules/loaders/loader_jpeg.c
@@ -50,11 +50,13 @@ load(ImlibImage * im, ImlibProgressFunction progress,
struct jpeg_decompress_struct cinfo;
struct ImLib_JPEG_error_mgr jerr;
FILE *f;
+ DATA8 *data;
f = fopen(im->real_file, "rb");
if (!f)
return 0;
+ data = NULL;
cinfo.err = jpeg_std_error(&(jerr.pub));
jerr.pub.error_exit = _JPEGFatalErrorHandler;
jerr.pub.emit_message = _JPEGErrorHandler2;
@@ -78,7 +80,7 @@ load(ImlibImage * im, ImlibProgressFunction progress,
if (im->loader || immediate_load || progress)
{
- DATA8 *ptr, *line[16], *data;
+ DATA8 *ptr, *line[16];
DATA32 *ptr2;
int x, y, l, i, scans, count, prevy;
@@ -97,10 +99,7 @@ load(ImlibImage * im, ImlibProgressFunction progress,
/* must set the im->data member before callign progress function */
ptr2 = im->data = malloc(w * h * sizeof(DATA32));
if (!im->data)
- {
- free(data);
- goto quit_error;
- }
+ goto quit_error;
count = 0;
prevy = 0;
@@ -120,7 +119,6 @@ load(ImlibImage * im, ImlibProgressFunction progress,
switch (cinfo.out_color_space)
{
default:
- free(data);
goto quit_error;
case JCS_GRAYSCALE:
for (x = 0; x < w; x++)
@@ -172,16 +170,18 @@ load(ImlibImage * im, ImlibProgressFunction progress,
done:
jpeg_finish_decompress(&cinfo);
- free(data);
}
quit:
jpeg_destroy_decompress(&cinfo);
+ free(data);
fclose(f);
return rc;
quit_error:
rc = 0; /* Error */
+ free(im->data);
+ im->data = NULL;
im->w = im->h = 0;
goto quit;
}