summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Watts <robin.watts@artifex.com>2017-07-18 15:35:59 +0100
committerRobin Watts <robin.watts@artifex.com>2017-07-19 19:41:22 +0100
commit7a25da923d28e55e39dd7a62360960e3f5aa1994 (patch)
tree4c47b60b8f7c5605b15733f1916bb8755dbc50e7
parentc56b659155991d0c8839ca38244056d9c5abf0f2 (diff)
downloadmupdf-7a25da923d28e55e39dd7a62360960e3f5aa1994.tar.xz
Fix colorspace leaks with group colorspaces.
-rw-r--r--source/pdf/pdf-op-run.c8
-rw-r--r--source/pdf/pdf-run.c9
2 files changed, 14 insertions, 3 deletions
diff --git a/source/pdf/pdf-op-run.c b/source/pdf/pdf-op-run.c
index 12797b8e..48dd9d53 100644
--- a/source/pdf/pdf-op-run.c
+++ b/source/pdf/pdf-op-run.c
@@ -1214,6 +1214,7 @@ pdf_run_xobject(fz_context *ctx, pdf_run_processor *proc, pdf_xobject *xobj, pdf
fz_matrix xobj_matrix;
int transparency;
pdf_document *doc;
+ fz_colorspace *cs = NULL;
/* Avoid infinite recursion */
if (xobj == NULL || pdf_mark_obj(ctx, xobj->obj))
@@ -1223,6 +1224,7 @@ pdf_run_xobject(fz_context *ctx, pdf_run_processor *proc, pdf_xobject *xobj, pdf
fz_var(gstate);
fz_var(oldtop);
fz_var(oldbot);
+ fz_var(cs);
gparent_save = pr->gparent;
pr->gparent = pr->gtop;
@@ -1263,8 +1265,10 @@ pdf_run_xobject(fz_context *ctx, pdf_run_processor *proc, pdf_xobject *xobj, pdf
/* Remember that we tried to call fz_begin_group. Even
* if it throws an error, we must call fz_end_group. */
cleanup_state = 2;
+ if (isolated)
+ cs = pdf_xobject_colorspace(ctx, xobj);
fz_begin_group(ctx, pr->dev, &bbox,
- (isolated ? pdf_xobject_colorspace(ctx, xobj) : NULL),
+ cs,
(is_smask ? 1 : isolated),
pdf_xobject_knockout(ctx, xobj),
gstate->blendmode, gstate->fill.alpha);
@@ -1303,6 +1307,8 @@ pdf_run_xobject(fz_context *ctx, pdf_run_processor *proc, pdf_xobject *xobj, pdf
}
fz_always(ctx)
{
+ fz_drop_colorspace(ctx, cs);
+
/* Undo any gstate mismatches due to the pdf_process_contents call */
if (oldbot != -1)
{
diff --git a/source/pdf/pdf-run.c b/source/pdf/pdf-run.c
index 7bff750b..b484f1d1 100644
--- a/source/pdf/pdf-run.c
+++ b/source/pdf/pdf-run.c
@@ -72,9 +72,14 @@ pdf_run_page_contents_with_usage(fz_context *ctx, pdf_document *doc, pdf_page *p
}
else
{
- colorspace = fz_default_output_intent(ctx, default_cs);
+ colorspace = fz_keep_colorspace(ctx, fz_default_output_intent(ctx, default_cs));
}
- fz_begin_group(ctx, dev, fz_transform_rect(&mediabox, &local_ctm), colorspace, 1, 0, 0, 1);
+ fz_try(ctx)
+ fz_begin_group(ctx, dev, fz_transform_rect(&mediabox, &local_ctm), colorspace, 1, 0, 0, 1);
+ fz_always(ctx)
+ fz_drop_colorspace(ctx, colorspace);
+ fz_catch(ctx)
+ fz_rethrow(ctx);
}
proc = pdf_new_run_processor(ctx, dev, &local_ctm, usage, NULL, 0);