From 54728872f059b0422e392f92cc988f3a50ff117c Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Wed, 24 Oct 2018 17:10:42 +0200 Subject: Do run processor clip stack balancing in close (not drop) callback. The close callback should make sure everything is cleanly shut down. The drop callback frees leftover memory when shutting down either cleanly or when aborting processing due to errors. --- source/pdf/pdf-op-run.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) (limited to 'source/pdf/pdf-op-run.c') diff --git a/source/pdf/pdf-op-run.c b/source/pdf/pdf-op-run.c index 2b6edea4..f0ce5e9d 100644 --- a/source/pdf/pdf-op-run.c +++ b/source/pdf/pdf-op-run.c @@ -2199,21 +2199,30 @@ static void pdf_run_END(fz_context *ctx, pdf_processor *proc) } static void -pdf_drop_run_processor(fz_context *ctx, pdf_processor *proc) +pdf_close_run_processor(fz_context *ctx, pdf_processor *proc) { pdf_run_processor *pr = (pdf_run_processor *)proc; while (pr->gtop) pdf_grestore(ctx, pr); - pdf_drop_material(ctx, &pr->gstate[0].fill); - pdf_drop_material(ctx, &pr->gstate[0].stroke); - pdf_drop_font(ctx, pr->gstate[0].text.font); - pdf_drop_obj(ctx, pr->gstate[0].softmask); - fz_drop_stroke_state(ctx, pr->gstate[0].stroke_state); - - while (pr->gstate[0].clip_depth--) + while (pr->gstate[0].clip_depth) + { fz_pop_clip(ctx, pr->dev); + pr->gstate[0].clip_depth--; + } +} + +static void +pdf_drop_run_processor(fz_context *ctx, pdf_processor *proc) +{ + pdf_run_processor *pr = (pdf_run_processor *)proc; + + while (pr->gtop >= 0) + { + pdf_drop_gstate(ctx, &pr->gstate[pr->gtop]); + pr->gtop--; + } fz_drop_path(ctx, pr->path); fz_drop_text(ctx, pr->tos.text); @@ -2230,6 +2239,7 @@ pdf_new_run_processor(fz_context *ctx, fz_device *dev, fz_matrix ctm, const char { proc->super.usage = usage; + proc->super.close_processor = pdf_close_run_processor; proc->super.drop_processor = pdf_drop_run_processor; /* general graphics state */ -- cgit v1.2.3