diff options
author | Sebastian Rasmussen <sebras@gmail.com> | 2016-04-18 13:00:24 +0200 |
---|---|---|
committer | Robin Watts <robin.watts@artifex.com> | 2016-04-22 17:26:48 +0100 |
commit | f9f144849ca9611dd46e6cbb27b9f1100371e455 (patch) | |
tree | c2bc1b4be466822d624dbecdc8668c593c6cef90 /source | |
parent | f88bfe2e62dbadb96d4f52d7aa025f0a516078da (diff) | |
download | mupdf-f9f144849ca9611dd46e6cbb27b9f1100371e455.tar.xz |
pdf: Remember to drop objects inserted into dicts.
Diffstat (limited to 'source')
-rw-r--r-- | source/pdf/pdf-clean-file.c | 3 | ||||
-rw-r--r-- | source/pdf/pdf-device.c | 4 | ||||
-rw-r--r-- | source/pdf/pdf-write.c | 69 | ||||
-rw-r--r-- | source/pdf/pdf-xobject.c | 42 | ||||
-rw-r--r-- | source/tools/pdfposter.c | 9 |
5 files changed, 54 insertions, 73 deletions
diff --git a/source/pdf/pdf-clean-file.c b/source/pdf/pdf-clean-file.c index af0d6857..05f5a7fc 100644 --- a/source/pdf/pdf-clean-file.c +++ b/source/pdf/pdf-clean-file.c @@ -281,9 +281,8 @@ static void retainpages(fz_context *ctx, globals *glo, int argc, char **argv) if (dest_is_valid_page(ctx, dest, page_object_nums, pagecount)) { pdf_obj *key_str = pdf_new_string(ctx, doc, pdf_to_name(ctx, key), strlen(pdf_to_name(ctx, key))); - pdf_array_push(ctx, names_list, key_str); + pdf_array_push_drop(ctx, names_list, key_str); pdf_array_push(ctx, names_list, val); - pdf_drop_obj(ctx, key_str); } } diff --git a/source/pdf/pdf-device.c b/source/pdf/pdf-device.c index 7ac9c7ca..6831f788 100644 --- a/source/pdf/pdf-device.c +++ b/source/pdf/pdf-device.c @@ -358,7 +358,7 @@ pdf_dev_add_font_res(fz_context *ctx, pdf_device *pdev, fz_font *font) /* Not there so add to resources */ fz_snprintf(text, sizeof(text), "Font/F%d", pdev->num_cid_fonts); - pdf_dict_putp(ctx, pdev->resources, text, fres); + pdf_dict_putp_drop(ctx, pdev->resources, text, fres); /* And add index to our list for this page */ if (pdev->num_cid_fonts == pdev->max_cid_fonts) @@ -909,7 +909,7 @@ pdf_dev_begin_mask(fz_context *ctx, fz_device *dev, const fz_rect *bbox, int lum pdf_dict_put(ctx, smask, PDF_NAME_G, form_ref); color_obj = pdf_new_array(ctx, doc, colorspace->n); for (i = 0; i < colorspace->n; i++) - pdf_array_push(ctx, color_obj, pdf_new_real(ctx, doc, color[i])); + pdf_array_push_drop(ctx, color_obj, pdf_new_real(ctx, doc, color[i])); pdf_dict_put_drop(ctx, smask, PDF_NAME_BC, color_obj); color_obj = NULL; diff --git a/source/pdf/pdf-write.c b/source/pdf/pdf-write.c index 243e83eb..388a5820 100644 --- a/source/pdf/pdf-write.c +++ b/source/pdf/pdf-write.c @@ -1138,14 +1138,13 @@ add_linearization_objs(fz_context *ctx, pdf_document *doc, pdf_write_state *opts pdf_obj *params_ref = NULL; pdf_obj *hint_obj = NULL; pdf_obj *hint_ref = NULL; - pdf_obj *o = NULL; + pdf_obj *o; int params_num, hint_num; fz_var(params_obj); fz_var(params_ref); fz_var(hint_obj); fz_var(hint_ref); - fz_var(o); fz_try(ctx) { @@ -1164,11 +1163,10 @@ add_linearization_objs(fz_context *ctx, pdf_document *doc, pdf_write_state *opts pdf_dict_put(ctx, params_obj, PDF_NAME_L, opts->linear_l); opts->linear_h0 = pdf_new_int(ctx, doc, INT_MIN); o = pdf_new_array(ctx, doc, 2); + pdf_dict_put_drop(ctx, params_obj, PDF_NAME_H, o); pdf_array_push(ctx, o, opts->linear_h0); opts->linear_h1 = pdf_new_int(ctx, doc, INT_MIN); pdf_array_push(ctx, o, opts->linear_h1); - pdf_dict_put_drop(ctx, params_obj, PDF_NAME_H, o); - o = NULL; opts->linear_o = pdf_new_int(ctx, doc, INT_MIN); pdf_dict_put(ctx, params_obj, PDF_NAME_O, opts->linear_o); opts->linear_e = pdf_new_int(ctx, doc, INT_MIN); @@ -1210,7 +1208,6 @@ add_linearization_objs(fz_context *ctx, pdf_document *doc, pdf_write_state *opts pdf_drop_obj(ctx, params_ref); pdf_drop_obj(ctx, hint_ref); pdf_drop_obj(ctx, hint_obj); - pdf_drop_obj(ctx, o); } fz_catch(ctx) { @@ -1242,7 +1239,7 @@ lpr_inherit_res_contents(fz_context *ctx, pdf_obj *res, pdf_obj *dict, pdf_obj * else o = NULL; if (o) - pdf_dict_put(ctx, res, text, o); + pdf_dict_put_drop(ctx, res, text, o); return; } @@ -1567,44 +1564,52 @@ static fz_buffer *hexbuf(fz_context *ctx, unsigned char *p, int n) static void addhexfilter(fz_context *ctx, pdf_document *doc, pdf_obj *dict) { pdf_obj *f, *dp, *newf, *newdp; - pdf_obj *nullobj; - nullobj = pdf_new_null(ctx, doc); newf = newdp = NULL; - f = pdf_dict_get(ctx, dict, PDF_NAME_Filter); dp = pdf_dict_get(ctx, dict, PDF_NAME_DecodeParms); - if (pdf_is_name(ctx, f)) + fz_var(newf); + fz_var(newdp); + + fz_try(ctx) { - newf = pdf_new_array(ctx, doc, 2); - pdf_array_push(ctx, newf, PDF_NAME_ASCIIHexDecode); - pdf_array_push(ctx, newf, f); - f = newf; - if (pdf_is_dict(ctx, dp)) + if (pdf_is_name(ctx, f)) + { + newf = pdf_new_array(ctx, doc, 2); + pdf_array_push(ctx, newf, PDF_NAME_ASCIIHexDecode); + pdf_array_push(ctx, newf, f); + f = newf; + if (pdf_is_dict(ctx, dp)) + { + newdp = pdf_new_array(ctx, doc, 2); + pdf_array_push_drop(ctx, newdp, pdf_new_null(ctx, doc)); + pdf_array_push(ctx, newdp, dp); + dp = newdp; + } + } + else if (pdf_is_array(ctx, f)) { - newdp = pdf_new_array(ctx, doc, 2); - pdf_array_push(ctx, newdp, nullobj); - pdf_array_push(ctx, newdp, dp); - dp = newdp; + pdf_array_insert(ctx, f, PDF_NAME_ASCIIHexDecode, 0); + if (pdf_is_array(ctx, dp)) + pdf_array_insert_drop(ctx, dp, pdf_new_null(ctx, doc), 0); } + else + f = PDF_NAME_ASCIIHexDecode; + + pdf_dict_put(ctx, dict, PDF_NAME_Filter, f); + if (dp) + pdf_dict_put(ctx, dict, PDF_NAME_DecodeParms, dp); + } - else if (pdf_is_array(ctx, f)) + fz_always(ctx) { - pdf_array_insert(ctx, f, PDF_NAME_ASCIIHexDecode, 0); - if (pdf_is_array(ctx, dp)) - pdf_array_insert(ctx, dp, nullobj, 0); + pdf_drop_obj(ctx, newf); + pdf_drop_obj(ctx, newdp); } - else - f = PDF_NAME_ASCIIHexDecode; - - pdf_dict_put(ctx, dict, PDF_NAME_Filter, f); - if (dp) - pdf_dict_put(ctx, dict, PDF_NAME_DecodeParms, dp); + fz_catch(ctx) + fz_rethrow(ctx); - pdf_drop_obj(ctx, nullobj); - pdf_drop_obj(ctx, newf); - pdf_drop_obj(ctx, newdp); } static fz_buffer *deflatebuf(fz_context *ctx, unsigned char *p, int n) diff --git a/source/pdf/pdf-xobject.c b/source/pdf/pdf-xobject.c index fa765a5d..95680ed5 100644 --- a/source/pdf/pdf-xobject.c +++ b/source/pdf/pdf-xobject.c @@ -121,51 +121,31 @@ pdf_new_xobject(fz_context *ctx, pdf_document *doc, const fz_rect *bbox, const f pdf_obj *idict = NULL; pdf_obj *dict = NULL; pdf_xobject *form = NULL; - pdf_obj *obj = NULL; pdf_obj *res = NULL; - pdf_obj *procset = NULL; + pdf_obj *procset; fz_var(idict); fz_var(dict); fz_var(form); - fz_var(obj); fz_var(res); - fz_var(procset); + fz_try(ctx) { dict = pdf_new_dict(ctx, doc, 0); - - obj = pdf_new_rect(ctx, doc, bbox); - pdf_dict_put(ctx, dict, PDF_NAME_BBox, obj); - pdf_drop_obj(ctx, obj); - obj = NULL; - - obj = pdf_new_int(ctx, doc, 1); - pdf_dict_put(ctx, dict, PDF_NAME_FormType, obj); - pdf_drop_obj(ctx, obj); - obj = NULL; - - obj = pdf_new_int(ctx, doc, 0); - pdf_dict_put(ctx, dict, PDF_NAME_Length, obj); - pdf_drop_obj(ctx, obj); - obj = NULL; - - obj = pdf_new_matrix(ctx, doc, mat); - pdf_dict_put(ctx, dict, PDF_NAME_Matrix, obj); - pdf_drop_obj(ctx, obj); - obj = NULL; + pdf_dict_put_drop(ctx, dict, PDF_NAME_BBox, pdf_new_rect(ctx, doc, bbox)); + pdf_dict_put_drop(ctx, dict, PDF_NAME_FormType, pdf_new_int(ctx, doc, 1)); + pdf_dict_put_drop(ctx, dict, PDF_NAME_Length, pdf_new_int(ctx, doc, 0)); + pdf_dict_put_drop(ctx, dict, PDF_NAME_Matrix, pdf_new_matrix(ctx, doc, mat)); res = pdf_new_dict(ctx, doc, 0); + pdf_dict_put(ctx, dict, PDF_NAME_Resources, res); + procset = pdf_new_array(ctx, doc, 2); + pdf_dict_put_drop(ctx, res, PDF_NAME_ProcSet, procset); pdf_array_push(ctx, procset, PDF_NAME_PDF); pdf_array_push(ctx, procset, PDF_NAME_Text); - pdf_dict_put(ctx, res, PDF_NAME_ProcSet, procset); - pdf_drop_obj(ctx, procset); - procset = NULL; - pdf_dict_put(ctx, dict, PDF_NAME_Resources, res); pdf_dict_put(ctx, dict, PDF_NAME_Subtype, PDF_NAME_Form); - pdf_dict_put(ctx, dict, PDF_NAME_Type, PDF_NAME_XObject); form = fz_malloc_struct(ctx, pdf_xobject); @@ -204,13 +184,11 @@ pdf_new_xobject(fz_context *ctx, pdf_document *doc, const fz_rect *bbox, const f } fz_catch(ctx) { - pdf_drop_obj(ctx, procset); pdf_drop_obj(ctx, res); - pdf_drop_obj(ctx, obj); pdf_drop_obj(ctx, dict); pdf_drop_obj(ctx, idict); pdf_drop_xobject(ctx, form); - fz_rethrow_message(ctx, "failed to create xobject)"); + fz_rethrow_message(ctx, "failed to create xobject"); } return idict; diff --git a/source/tools/pdfposter.c b/source/tools/pdfposter.c index 0393f137..92735386 100644 --- a/source/tools/pdfposter.c +++ b/source/tools/pdfposter.c @@ -46,7 +46,7 @@ intersect_box(fz_context *ctx, pdf_document *doc, pdf_obj *page, pdf_obj *box_na pdf_array_push(ctx, newbox, pdf_new_real(ctx, doc, old_rect.y0)); pdf_array_push(ctx, newbox, pdf_new_real(ctx, doc, old_rect.x1)); pdf_array_push(ctx, newbox, pdf_new_real(ctx, doc, old_rect.y1)); - pdf_dict_put(ctx, page, box_name, newbox); + pdf_dict_put_drop(ctx, page, box_name, newbox); } /* @@ -128,7 +128,7 @@ static void decimatepages(fz_context *ctx, pdf_document *doc) pdf_array_push(ctx, newmediabox, pdf_new_real(ctx, doc, mb.y1)); pdf_dict_put(ctx, newpageobj, PDF_NAME_Parent, parent); - pdf_dict_put(ctx, newpageobj, PDF_NAME_MediaBox, newmediabox); + pdf_dict_put_drop(ctx, newpageobj, PDF_NAME_MediaBox, newmediabox); intersect_box(ctx, doc, newpageobj, PDF_NAME_CropBox, &mb); intersect_box(ctx, doc, newpageobj, PDF_NAME_BleedBox, &mb); @@ -146,9 +146,8 @@ static void decimatepages(fz_context *ctx, pdf_document *doc) pdf_drop_obj(ctx, parent); /* Update page count and kids array */ - pdf_dict_put(ctx, pages, PDF_NAME_Count, pdf_new_int(ctx, doc, kidcount)); - pdf_dict_put(ctx, pages, PDF_NAME_Kids, kids); - pdf_drop_obj(ctx, kids); + pdf_dict_put_drop(ctx, pages, PDF_NAME_Count, pdf_new_int(ctx, doc, kidcount)); + pdf_dict_put_drop(ctx, pages, PDF_NAME_Kids, kids); } int pdfposter_main(int argc, char **argv) |