From e7bd6babd4b6567db153806eb928591f2b26f4e2 Mon Sep 17 00:00:00 2001 From: Robin Watts Date: Tue, 27 May 2014 18:11:07 +0100 Subject: Further fix for Bug 695260: Cope with out of memory in fz_draw_end_mask If we hit an out of memory error in fz_draw_end_mask, then pop the stack, and rethrow. Ensure that the generic device code catches this error and sets the error_depth to 1 so that the final pop is ignored. --- source/fitz/device.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'source/fitz/device.c') diff --git a/source/fitz/device.c b/source/fitz/device.c index d9249732..a13cd470 100644 --- a/source/fitz/device.c +++ b/source/fitz/device.c @@ -402,6 +402,8 @@ fz_begin_mask(fz_device *dev, const fz_rect *area, int luminosity, fz_colorspace void fz_end_mask(fz_device *dev) { + fz_context *ctx = dev->ctx; + if (dev->error_depth) { /* Converts from mask to clip, so no change in stack depth */ @@ -412,8 +414,17 @@ fz_end_mask(fz_device *dev) dev->container[dev->container_len-1].flags &= ~fz_device_container_stack_in_mask; dev->container[dev->container_len-1].flags |= fz_device_container_stack_is_mask; } - if (dev->end_mask) - dev->end_mask(dev); + fz_try(ctx) + { + if (dev->end_mask) + dev->end_mask(dev); + } + fz_catch(ctx) + { + dev->error_depth = 1; + strcpy(dev->errmess, fz_caught_message(ctx)); + /* Error swallowed */ + } } void -- cgit v1.2.3