From 7a25da923d28e55e39dd7a62360960e3f5aa1994 Mon Sep 17 00:00:00 2001 From: Robin Watts Date: Tue, 18 Jul 2017 15:35:59 +0100 Subject: Fix colorspace leaks with group colorspaces. --- source/pdf/pdf-op-run.c | 8 +++++++- source/pdf/pdf-run.c | 9 +++++++-- 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); -- cgit v1.2.3