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 /source | |
parent | a27d9903ec238af6e4c1c59de1e1dae817b4f028 (diff) | |
download | mupdf-8cb0a389794356d7b6624f78365a5e92efdeb8e8.tar.xz |
Make sure to always drop a fz_device even upon error.
Diffstat (limited to 'source')
-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 |
9 files changed, 82 insertions, 29 deletions
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) |