diff options
author | Sebastian Rasmussen <sebras@gmail.com> | 2016-10-29 15:00:50 +0800 |
---|---|---|
committer | Sebastian Rasmussen <sebras@gmail.com> | 2016-12-14 18:44:40 +0100 |
commit | a8edb9b209d75b844165b041fc49e1db302d9c51 (patch) | |
tree | 9031cf7245087dcf6e2ea286d4b417c2e3679db8 /source/fitz | |
parent | f2e8dfeb3d4ccdcdbdf8e2e122883b0ec7145bc6 (diff) | |
download | mupdf-a8edb9b209d75b844165b041fc49e1db302d9c51.tar.xz |
Plug pixmap leak when fz_convert_pixmap() throws.
Diffstat (limited to 'source/fitz')
-rw-r--r-- | source/fitz/load-jpx.c | 28 | ||||
-rw-r--r-- | source/fitz/load-jxr.c | 11 | ||||
-rw-r--r-- | source/fitz/load-pnm.c | 14 | ||||
-rw-r--r-- | source/fitz/load-tiff.c | 18 |
4 files changed, 47 insertions, 24 deletions
diff --git a/source/fitz/load-jpx.c b/source/fitz/load-jpx.c index f93a0775..b94a6392 100644 --- a/source/fitz/load-jpx.c +++ b/source/fitz/load-jpx.c @@ -427,10 +427,18 @@ jpx_read_image(fz_context *ctx, fz_jpxd *state, unsigned char *data, size_t size /* CMYK is a subtractive colorspace, we want additive for premul alpha */ if (state->pix->n == 5) { - fz_pixmap *tmp = fz_new_pixmap(ctx, fz_device_rgb(ctx), state->pix->w, state->pix->h, 1); - fz_convert_pixmap(ctx, tmp, state->pix); + fz_pixmap *rgb = fz_new_pixmap(ctx, fz_device_rgb(ctx), state->pix->w, state->pix->h, 1); + + fz_try(ctx) + fz_convert_pixmap(ctx, rgb, state->pix); + fz_catch(ctx) + { + fz_drop_pixmap(ctx, rgb); + fz_rethrow(ctx); + } + fz_drop_pixmap(ctx, state->pix); - state->pix = tmp; + state->pix = rgb; } if (alphas > 0 && prealphas == 0) @@ -914,10 +922,18 @@ jpx_read_image(fz_context *ctx, unsigned char *data, size_t size, fz_colorspace /* CMYK is a subtractive colorspace, we want additive for premul alpha */ if (n == 4) { - fz_pixmap *tmp = fz_new_pixmap(ctx, fz_device_rgb(ctx), w, h, 1); - fz_convert_pixmap(ctx, tmp, img); + fz_pixmap *rgb = fz_new_pixmap(ctx, fz_device_rgb(ctx), w, h, 1); + + fz_try(ctx) + fz_convert_pixmap(ctx, rgb, img); + fz_catch(ctx) + { + fz_drop_pixmap(ctx, rgb); + fz_rethrow(ctx); + } + fz_drop_pixmap(ctx, img); - img = tmp; + img = rgb; } fz_premultiply_pixmap(ctx, img); } diff --git a/source/fitz/load-jxr.c b/source/fitz/load-jxr.c index a501e341..e61d6e7a 100644 --- a/source/fitz/load-jxr.c +++ b/source/fitz/load-jxr.c @@ -414,9 +414,18 @@ fz_load_jxr(fz_context *ctx, unsigned char *data, size_t size) if (info.comps >= 4) { fz_pixmap *rgb = fz_new_pixmap(ctx, fz_device_rgb(ctx), image->w, image->h, 1); - fz_convert_pixmap(ctx, rgb, image); + rgb->xres = image->xres; rgb->yres = image->yres; + + fz_try(ctx) + fz_convert_pixmap(ctx, rgb, image); + fz_catch(ctx) + { + fz_drop_pixmap(ctx, rgb); + fz_rethrow(ctx); + } + fz_drop_pixmap(ctx, image); image = rgb; } diff --git a/source/fitz/load-pnm.c b/source/fitz/load-pnm.c index 4c827e43..f724eb09 100644 --- a/source/fitz/load-pnm.c +++ b/source/fitz/load-pnm.c @@ -568,20 +568,20 @@ pam_binary_read_image(fz_context *ctx, struct info *pnm, unsigned char *p, unsig if (img->n > 4) { fz_pixmap *rgb = fz_new_pixmap(ctx, fz_device_rgb(ctx), img->w, img->h, 1); + rgb->xres = img->xres; rgb->yres = img->yres; fz_try(ctx) - { fz_convert_pixmap(ctx, rgb, img); - fz_drop_pixmap(ctx, img); - img = rgb; - rgb = NULL; - } - fz_always(ctx) - fz_drop_pixmap(ctx, rgb); fz_catch(ctx) + { + fz_drop_pixmap(ctx, rgb); fz_rethrow(ctx); + } + + fz_drop_pixmap(ctx, img); + img = rgb; } fz_premultiply_pixmap(ctx, img); diff --git a/source/fitz/load-tiff.c b/source/fitz/load-tiff.c index 60b0e8a6..117b9816 100644 --- a/source/fitz/load-tiff.c +++ b/source/fitz/load-tiff.c @@ -1288,21 +1288,19 @@ fz_load_tiff_subimage(fz_context *ctx, unsigned char *buf, size_t len, int subim { fz_pixmap *rgb = fz_new_pixmap(ctx, fz_device_rgb(ctx), image->w, image->h, 1); - fz_var(rgb); + rgb->xres = image->xres; + rgb->yres = image->yres; fz_try(ctx) - { fz_convert_pixmap(ctx, rgb, image); - rgb->xres = image->xres; - rgb->yres = image->yres; - fz_drop_pixmap(ctx, image); - image = rgb; - rgb = NULL; - } - fz_always(ctx) - fz_drop_pixmap(ctx, rgb); fz_catch(ctx) + { + fz_drop_pixmap(ctx, rgb); fz_rethrow(ctx); + } + + fz_drop_pixmap(ctx, image); + image = rgb; } fz_premultiply_pixmap(ctx, image); |