summaryrefslogtreecommitdiff
path: root/source/pdf/pdf-image.c
diff options
context:
space:
mode:
authorSimon Bünzli <zeniko@gmail.com>2013-08-18 13:35:51 +0200
committerRobin Watts <robin.watts@artifex.com>2013-08-28 13:35:50 +0100
commit2ed5d370aea6966115e27eb415612209a2696217 (patch)
tree86ba96baf1fc1f521fc01b477a45137df54d26a5 /source/pdf/pdf-image.c
parente5451f0cb4cadeae01769221fe7f505ca155b9a1 (diff)
downloadmupdf-2ed5d370aea6966115e27eb415612209a2696217.tar.xz
fix memory leaks
* If fz_alpha_from_gray throws in fz_render_t3_glyph, then glyph is leaked. * If fz_new_image throws in pdf_load_image_imp, then colorspace and mask are leaked. * pdf_copy_pattern_gstate overwrites font and softmask without dropping them first.
Diffstat (limited to 'source/pdf/pdf-image.c')
-rw-r--r--source/pdf/pdf-image.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/source/pdf/pdf-image.c b/source/pdf/pdf-image.c
index 5d0d59d3..10ae89ff 100644
--- a/source/pdf/pdf-image.c
+++ b/source/pdf/pdf-image.c
@@ -25,6 +25,7 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs
fz_var(stm);
fz_var(mask);
fz_var(image);
+ fz_var(colorspace);
fz_try(ctx)
{
@@ -55,7 +56,6 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs
indexed = 0;
usecolorkey = 0;
- mask = NULL;
if (imagemask)
bpc = 1;
@@ -118,7 +118,7 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs
else if (forcemask)
fz_warn(ctx, "Ignoring recursive image soft mask");
else
- mask = (fz_image *)pdf_load_image_imp(doc, rdb, obj, NULL, 1);
+ mask = pdf_load_image_imp(doc, rdb, obj, NULL, 1);
}
else if (pdf_is_array(obj))
{
@@ -158,10 +158,14 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs
}
image = fz_new_image(ctx, w, h, bpc, colorspace, 96, 96, interpolate, imagemask, decode, usecolorkey ? colorkey : NULL, NULL, mask);
+ colorspace = NULL;
+ mask = NULL;
image->tile = fz_decomp_image_from_stream(ctx, stm, image, cstm != NULL, indexed, 0, 0);
}
fz_catch(ctx)
{
+ fz_drop_colorspace(ctx, colorspace);
+ fz_drop_image(ctx, mask);
fz_drop_image(ctx, image);
fz_rethrow(ctx);
}
@@ -171,7 +175,7 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs
fz_image *
pdf_load_inline_image(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *file)
{
- return (fz_image *)pdf_load_image_imp(doc, rdb, dict, file, 0);
+ return pdf_load_image_imp(doc, rdb, dict, file, 0);
}
int
@@ -232,7 +236,7 @@ pdf_load_jpx(pdf_document *doc, pdf_obj *dict, int forcemask)
if (forcemask)
fz_warn(ctx, "Ignoring recursive JPX soft mask");
else
- mask = (fz_image *)pdf_load_image_imp(doc, NULL, obj, NULL, 1);
+ mask = pdf_load_image_imp(doc, NULL, obj, NULL, 1);
}
obj = pdf_dict_getsa(dict, "Decode", "D");