diff options
author | Sebastian Rasmussen <sebras@gmail.com> | 2017-06-11 23:11:42 +0800 |
---|---|---|
committer | Sebastian Rasmussen <sebras@gmail.com> | 2017-09-07 21:02:53 +0800 |
commit | 8cb0a389794356d7b6624f78365a5e92efdeb8e8 (patch) | |
tree | f05e3442351a46af3e4d5209f8b754c6b33f948f | |
parent | a27d9903ec238af6e4c1c59de1e1dae817b4f028 (diff) | |
download | mupdf-8cb0a389794356d7b6624f78365a5e92efdeb8e8.tar.xz |
Make sure to always drop a fz_device even upon error.
-rw-r--r-- | include/mupdf/fitz/device.h | 3 | ||||
-rw-r--r-- | platform/java/mupdf_native.c | 4 | ||||
-rw-r--r-- | platform/x11/pdfapp.c | 32 | ||||
-rw-r--r-- | source/fitz/font.c | 17 | ||||
-rw-r--r-- | source/fitz/image.c | 12 | ||||
-rw-r--r-- | source/fitz/output-cbz.c | 16 | ||||
-rw-r--r-- | source/fitz/output-pcl.c | 8 | ||||
-rw-r--r-- | source/fitz/output-ps.c | 8 | ||||
-rw-r--r-- | source/fitz/output-pwg.c | 8 | ||||
-rw-r--r-- | source/fitz/output-svg.c | 9 | ||||
-rw-r--r-- | source/fitz/stext-output.c | 9 | ||||
-rw-r--r-- | source/tools/muconvert.c | 24 |
12 files changed, 108 insertions, 42 deletions
diff --git a/include/mupdf/fitz/device.h b/include/mupdf/fitz/device.h index 0198a3e6..891f3aad 100644 --- a/include/mupdf/fitz/device.h +++ b/include/mupdf/fitz/device.h @@ -161,7 +161,8 @@ void fz_close_device(fz_context *ctx, fz_device *dev); /* fz_drop_device: Free a device of any type and its resources. - Don't forget to call fz_close_device before dropping the device, or you may get incomplete output! + Don't forget to call fz_close_device before dropping the device, + or you may get incomplete output! */ void fz_drop_device(fz_context *ctx, fz_device *dev); diff --git a/platform/java/mupdf_native.c b/platform/java/mupdf_native.c index d363242a..a2e58249 100644 --- a/platform/java/mupdf_native.c +++ b/platform/java/mupdf_native.c @@ -5101,9 +5101,9 @@ FUN(Page_textAsHtml)(JNIEnv *env, jobject self) } fz_always(ctx) { - fz_drop_stext_page(ctx, text); - fz_drop_device(ctx, dev); fz_drop_output(ctx, out); + fz_drop_device(ctx, dev); + fz_drop_stext_page(ctx, text); } fz_catch(ctx) { diff --git a/platform/x11/pdfapp.c b/platform/x11/pdfapp.c index 4dc5652c..3fffd4ef 100644 --- a/platform/x11/pdfapp.c +++ b/platform/x11/pdfapp.c @@ -816,9 +816,15 @@ static void pdfapp_updatepage(pdfapp_t *app) fz_rect_from_irect(&bounds, fz_round_rect(&ibounds, &bounds)); fz_clear_pixmap_rect_with_value(app->ctx, app->image, 255, &ibounds); idev = fz_new_draw_device_with_bbox(app->ctx, NULL, app->image, &ibounds); - pdfapp_runpage(app, idev, &ctm, &bounds, NULL); - fz_close_device(app->ctx, idev); - fz_drop_device(app->ctx, idev); + fz_try(app->ctx) + { + pdfapp_runpage(app, idev, &ctm, &bounds, NULL); + fz_close_device(app->ctx, idev); + } + fz_always(app->ctx) + fz_drop_device(app->ctx, idev); + fz_catch(app->ctx) + fz_rethrow(app->ctx); } } @@ -841,7 +847,7 @@ void pdfapp_reloadpage(pdfapp_t *app) static void pdfapp_showpage(pdfapp_t *app, int loadpage, int drawpage, int repaint, int transition, int searching) { char buf[MAX_TITLE]; - fz_device *idev; + fz_device *idev = NULL; fz_device *tdev; fz_colorspace *colorspace; fz_matrix ctm; @@ -875,9 +881,15 @@ static void pdfapp_showpage(pdfapp_t *app, int loadpage, int drawpage, int repai if (app->page_list || app->annotations_list) { tdev = fz_new_stext_device(app->ctx, app->page_text, NULL); - pdfapp_runpage(app, tdev, &fz_identity, &fz_infinite_rect, &cookie); - fz_close_device(app->ctx, tdev); - fz_drop_device(app->ctx, tdev); + fz_try(app->ctx) + { + pdfapp_runpage(app, tdev, &fz_identity, &fz_infinite_rect, &cookie); + fz_close_device(app->ctx, tdev); + } + fz_always(app->ctx) + fz_drop_device(app->ctx, tdev); + fz_catch(app->ctx) + fz_rethrow(app->ctx); } } @@ -913,6 +925,7 @@ static void pdfapp_showpage(pdfapp_t *app, int loadpage, int drawpage, int repai app->image = NULL; fz_var(app->image); + fz_var(idev); fz_try(app->ctx) { @@ -923,17 +936,16 @@ static void pdfapp_showpage(pdfapp_t *app, int loadpage, int drawpage, int repai idev = fz_new_draw_device(app->ctx, NULL, app->image); pdfapp_runpage(app, idev, &ctm, &bounds, &cookie); fz_close_device(app->ctx, idev); - fz_drop_device(app->ctx, idev); } if (app->invert) fz_invert_pixmap(app->ctx, app->image); if (app->tint) fz_tint_pixmap(app->ctx, app->image, app->tint_r, app->tint_g, app->tint_b); } + fz_always(app->ctx) + fz_drop_device(app->ctx, idev); fz_catch(app->ctx) - { cookie.errors++; - } } if (transition) diff --git a/source/fitz/font.c b/source/fitz/font.c index 9a113460..9044b26b 100644 --- a/source/fitz/font.c +++ b/source/fitz/font.c @@ -1274,12 +1274,17 @@ fz_prepare_t3_glyph(fz_context *ctx, fz_font *font, int gid, int nested_depth) FZ_DEVFLAG_LINEJOIN_UNDEFINED | FZ_DEVFLAG_MITERLIMIT_UNDEFINED | FZ_DEVFLAG_LINEWIDTH_UNDEFINED; - font->t3run(ctx, font->t3doc, font->t3resources, contents, dev, &fz_identity, NULL, 0); - fz_close_device(ctx, dev); - font->t3flags[gid] = dev->flags; - d1_rect = dev->d1_rect; - fz_drop_device(ctx, dev); - dev = NULL; + fz_try(ctx) + { + font->t3run(ctx, font->t3doc, font->t3resources, contents, dev, &fz_identity, NULL, 0); + fz_close_device(ctx, dev); + font->t3flags[gid] = dev->flags; + d1_rect = dev->d1_rect; + } + fz_always(ctx) + fz_drop_device(ctx, dev); + fz_catch(ctx) + fz_rethrow(ctx); if (fz_display_list_is_empty(ctx, font->t3lists[gid])) { /* If empty, no need for a huge bbox, especially as the logic diff --git a/source/fitz/image.c b/source/fitz/image.c index 2716cf56..9eedea8a 100644 --- a/source/fitz/image.c +++ b/source/fitz/image.c @@ -1074,9 +1074,15 @@ display_list_image_get_pixmap(fz_context *ctx, fz_image *image_, fz_irect *subar fz_clear_pixmap(ctx, pix); /* clear to transparent */ dev = fz_new_draw_device(ctx, &ctm, pix); - fz_run_display_list(ctx, image->list, dev, &fz_identity, NULL, NULL); - fz_close_device(ctx, dev); - fz_drop_device(ctx, dev); + fz_try(ctx) + { + fz_run_display_list(ctx, image->list, dev, &fz_identity, NULL, NULL); + fz_close_device(ctx, dev); + } + fz_always(ctx) + fz_drop_device(ctx, dev); + fz_catch(ctx) + fz_rethrow(ctx); /* Never do more subsampling, cos we've already given them the right size */ if (l2factor) diff --git a/source/fitz/output-cbz.c b/source/fitz/output-cbz.c index 68a71fed..0abeb1a4 100644 --- a/source/fitz/output-cbz.c +++ b/source/fitz/output-cbz.c @@ -31,8 +31,12 @@ cbz_end_page(fz_context *ctx, fz_document_writer *wri_, fz_device *dev) fz_buffer *buffer; char name[40]; - fz_close_device(ctx, dev); - fz_drop_device(ctx, dev); + fz_try(ctx) + fz_close_device(ctx, dev); + fz_always(ctx) + fz_drop_device(ctx, dev); + fz_catch(ctx) + fz_rethrow(ctx); wri->count += 1; @@ -111,8 +115,12 @@ pixmap_end_page(fz_context *ctx, fz_document_writer *wri_, fz_device *dev) fz_pixmap_writer *wri = (fz_pixmap_writer*)wri_; char path[PATH_MAX]; - fz_close_device(ctx, dev); - fz_drop_device(ctx, dev); + fz_try(ctx) + fz_close_device(ctx, dev); + fz_always(ctx) + fz_drop_device(ctx, dev); + fz_catch(ctx) + fz_rethrow(ctx); wri->count += 1; diff --git a/source/fitz/output-pcl.c b/source/fitz/output-pcl.c index 32072518..e3999b25 100644 --- a/source/fitz/output-pcl.c +++ b/source/fitz/output-pcl.c @@ -1423,8 +1423,12 @@ pcl_end_page(fz_context *ctx, fz_document_writer *wri_, fz_device *dev) { fz_pcl_writer *wri = (fz_pcl_writer*)wri_; - fz_close_device(ctx, dev); - fz_drop_device(ctx, dev); + fz_try(ctx) + fz_close_device(ctx, dev); + fz_always(ctx) + fz_drop_device(ctx, dev); + fz_catch(ctx) + fz_rethrow(ctx); if (wri->mono) { diff --git a/source/fitz/output-ps.c b/source/fitz/output-ps.c index 8f19693e..f0af6ff0 100644 --- a/source/fitz/output-ps.c +++ b/source/fitz/output-ps.c @@ -287,8 +287,12 @@ ps_end_page(fz_context *ctx, fz_document_writer *wri_, fz_device *dev) fz_pixmap *pix = wri->pixmap; fz_band_writer *bw; - fz_close_device(ctx, dev); - fz_drop_device(ctx, dev); + fz_try(ctx) + fz_close_device(ctx, dev); + fz_always(ctx) + fz_drop_device(ctx, dev); + fz_catch(ctx) + fz_rethrow(ctx); bw = fz_new_ps_band_writer(ctx, wri->out); fz_try(ctx) diff --git a/source/fitz/output-pwg.c b/source/fitz/output-pwg.c index 7e2a4178..8abcbb6d 100644 --- a/source/fitz/output-pwg.c +++ b/source/fitz/output-pwg.c @@ -419,8 +419,12 @@ pwg_end_page(fz_context *ctx, fz_document_writer *wri_, fz_device *dev) { fz_pwg_writer *wri = (fz_pwg_writer*)wri_; - fz_close_device(ctx, dev); - fz_drop_device(ctx, dev); + fz_try(ctx) + fz_close_device(ctx, dev); + fz_always(ctx) + fz_drop_device(ctx, dev); + fz_catch(ctx) + fz_rethrow(ctx); if (wri->mono) { diff --git a/source/fitz/output-svg.c b/source/fitz/output-svg.c index 20d57c17..7bae9d4f 100644 --- a/source/fitz/output-svg.c +++ b/source/fitz/output-svg.c @@ -45,8 +45,13 @@ svg_end_page(fz_context *ctx, fz_document_writer *wri_, fz_device *dev) { fz_svg_writer *wri = (fz_svg_writer*)wri_; - fz_close_device(ctx, dev); - fz_drop_device(ctx, dev); + fz_try(ctx) + fz_close_device(ctx, dev); + fz_always(ctx) + fz_drop_device(ctx, dev); + fz_catch(ctx) + fz_rethrow(ctx); + fz_drop_output(ctx, wri->out); wri->out = NULL; } diff --git a/source/fitz/stext-output.c b/source/fitz/stext-output.c index 63cd3c17..c2218357 100644 --- a/source/fitz/stext-output.c +++ b/source/fitz/stext-output.c @@ -471,8 +471,13 @@ static void text_end_page(fz_context *ctx, fz_document_writer *wri_, fz_device *dev) { fz_text_writer *wri = (fz_text_writer*)wri_; - fz_close_device(ctx, dev); - fz_drop_device(ctx, dev); + + fz_try(ctx) + fz_close_device(ctx, dev); + fz_always(ctx) + fz_drop_device(ctx, dev); + fz_catch(ctx) + fz_rethrow(ctx); switch (wri->format) { diff --git a/source/tools/muconvert.c b/source/tools/muconvert.c index 08932772..b38538ac 100644 --- a/source/tools/muconvert.c +++ b/source/tools/muconvert.c @@ -66,14 +66,26 @@ static void runpage(int number) { fz_rect mediabox; fz_page *page; - fz_device *dev; + fz_device *dev = NULL; page = fz_load_page(ctx, doc, number - 1); - fz_bound_page(ctx, page, &mediabox); - dev = fz_begin_page(ctx, out, &mediabox); - fz_run_page(ctx, page, dev, &fz_identity, NULL); - fz_end_page(ctx, out); - fz_drop_page(ctx, page); + + fz_var(dev); + + fz_try(ctx) + { + fz_bound_page(ctx, page, &mediabox); + dev = fz_begin_page(ctx, out, &mediabox); + fz_run_page(ctx, page, dev, &fz_identity, NULL); + } + fz_always(ctx) + { + if (dev) + fz_end_page(ctx, out); + fz_drop_page(ctx, page); + } + fz_catch(ctx) + fz_rethrow(ctx); } static void runrange(const char *range) |