summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Rasmussen <sebras@gmail.com>2017-06-11 23:11:42 +0800
committerSebastian Rasmussen <sebras@gmail.com>2017-09-07 21:02:53 +0800
commit8cb0a389794356d7b6624f78365a5e92efdeb8e8 (patch)
treef05e3442351a46af3e4d5209f8b754c6b33f948f
parenta27d9903ec238af6e4c1c59de1e1dae817b4f028 (diff)
downloadmupdf-8cb0a389794356d7b6624f78365a5e92efdeb8e8.tar.xz
Make sure to always drop a fz_device even upon error.
-rw-r--r--include/mupdf/fitz/device.h3
-rw-r--r--platform/java/mupdf_native.c4
-rw-r--r--platform/x11/pdfapp.c32
-rw-r--r--source/fitz/font.c17
-rw-r--r--source/fitz/image.c12
-rw-r--r--source/fitz/output-cbz.c16
-rw-r--r--source/fitz/output-pcl.c8
-rw-r--r--source/fitz/output-ps.c8
-rw-r--r--source/fitz/output-pwg.c8
-rw-r--r--source/fitz/output-svg.c9
-rw-r--r--source/fitz/stext-output.c9
-rw-r--r--source/tools/muconvert.c24
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)