summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Watts <robin.watts@artifex.com>2016-03-15 10:26:32 +0000
committerRobin Watts <robin.watts@artifex.com>2016-03-15 10:29:15 +0000
commit82e172e1d9fb2e7d7d688c9efb2dbb742069f678 (patch)
treec8dac85c99a47a3832270a9b3f618d5f591d037b
parenta0960a7a95e879f08e69bd9face02f0e07ff7662 (diff)
downloadmupdf-82e172e1d9fb2e7d7d688c9efb2dbb742069f678.tar.xz
Fix leak/missing error cleanup in halftoning code.
Ensure we free buffers if we fail to malloc, and that we drop the temporary buffer at the end of halftoning a pixmap.
-rw-r--r--source/fitz/halftone.c65
1 files changed, 44 insertions, 21 deletions
diff --git a/source/fitz/halftone.c b/source/fitz/halftone.c
index f10aa05d..705d4718 100644
--- a/source/fitz/halftone.c
+++ b/source/fitz/halftone.c
@@ -63,8 +63,17 @@ static unsigned char mono_ht[] =
fz_halftone *fz_default_halftone(fz_context *ctx, int num_comps)
{
fz_halftone *ht = fz_new_halftone(ctx, num_comps);
+
assert(num_comps == 1); /* Only support 1 component for now */
- ht->comp[0] = fz_new_pixmap_with_data(ctx, NULL, 16, 16, mono_ht);
+
+ fz_try(ctx)
+ ht->comp[0] = fz_new_pixmap_with_data(ctx, NULL, 16, 16, mono_ht);
+ fz_catch(ctx)
+ {
+ fz_drop_halftone(ctx, ht);
+ fz_rethrow(ctx);
+ }
+
return ht;
}
@@ -163,8 +172,9 @@ static void do_threshold_1(unsigned char *ht_line, unsigned char *pixmap, unsign
fz_bitmap *fz_new_bitmap_from_pixmap(fz_context *ctx, fz_pixmap *pix, fz_halftone *ht)
{
- fz_bitmap *out;
- unsigned char *ht_line, *o, *p;
+ fz_bitmap *out = NULL;
+ unsigned char *ht_line = NULL;
+ unsigned char *o, *p;
int w, h, x, y, n, pstride, ostride;
fz_halftone *ht_orig = ht;
@@ -173,30 +183,43 @@ fz_bitmap *fz_new_bitmap_from_pixmap(fz_context *ctx, fz_pixmap *pix, fz_halfton
assert(pix->n == 2); /* Mono + Alpha */
+ fz_var(ht_line);
+ fz_var(out);
+
n = pix->n-1; /* Remove alpha */
if (ht == NULL)
{
ht = fz_default_halftone(ctx, n);
}
- ht_line = fz_malloc(ctx, pix->w * n);
- out = fz_new_bitmap(ctx, pix->w, pix->h, n, pix->xres, pix->yres);
- o = out->samples;
- p = pix->samples;
-
- h = pix->h;
- x = pix->x;
- y = pix->y;
- w = pix->w;
- ostride = out->stride;
- pstride = pix->w * pix->n;
- while (h--)
+ fz_try(ctx)
{
- make_ht_line(ht_line, ht, x, y++, w);
- do_threshold_1(ht_line, p, o, w);
- o += ostride;
- p += pstride;
+ ht_line = fz_malloc(ctx, pix->w * n);
+ out = fz_new_bitmap(ctx, pix->w, pix->h, n, pix->xres, pix->yres);
+ o = out->samples;
+ p = pix->samples;
+
+ h = pix->h;
+ x = pix->x;
+ y = pix->y;
+ w = pix->w;
+ ostride = out->stride;
+ pstride = pix->w * pix->n;
+ while (h--)
+ {
+ make_ht_line(ht_line, ht, x, y++, w);
+ do_threshold_1(ht_line, p, o, w);
+ o += ostride;
+ p += pstride;
+ }
}
- if (!ht_orig)
- fz_drop_halftone(ctx, ht);
+ fz_always(ctx)
+ {
+ if (!ht_orig)
+ fz_drop_halftone(ctx, ht);
+ fz_free(ctx, ht_line);
+ }
+ fz_catch(ctx)
+ fz_rethrow(ctx);
+
return out;
}