summaryrefslogtreecommitdiff
path: root/fitz/filt_jbig2d.c
diff options
context:
space:
mode:
authorRobin Watts <robin.watts@artifex.com>2011-12-17 00:49:23 +0000
committerRobin Watts <robin.watts@artifex.com>2011-12-17 00:49:23 +0000
commit3eae1449777c4ecccc73a156c7dfff42f927ccc4 (patch)
treeb0cd1bc08b3af218dd06c501402782db91ad0523 /fitz/filt_jbig2d.c
parentc53b6af33c996a7ae6815ac15254297d43f43a9c (diff)
downloadmupdf-3eae1449777c4ecccc73a156c7dfff42f927ccc4.tar.xz
More memsqueezing fixes; stream creation.
Diffstat (limited to 'fitz/filt_jbig2d.c')
-rw-r--r--fitz/filt_jbig2d.c44
1 files changed, 32 insertions, 12 deletions
diff --git a/fitz/filt_jbig2d.c b/fitz/filt_jbig2d.c
index 69e3df50..2d2e2eb9 100644
--- a/fitz/filt_jbig2d.c
+++ b/fitz/filt_jbig2d.c
@@ -81,21 +81,41 @@ read_jbig2d(fz_stream *stm, unsigned char *buf, int len)
fz_stream *
fz_open_jbig2d(fz_stream *chain, fz_buffer *globals)
{
- fz_jbig2d *state;
+ fz_jbig2d *state = NULL;
+ fz_context *ctx = chain->ctx;
- state = fz_malloc_struct(chain->ctx, fz_jbig2d);
- state->chain = chain;
- state->ctx = jbig2_ctx_new(NULL, JBIG2_OPTIONS_EMBEDDED, NULL, NULL, NULL);
- state->gctx = NULL;
- state->page = NULL;
- state->idx = 0;
+ fz_var(state);
- if (globals)
+ fz_try(ctx)
{
- jbig2_data_in(state->ctx, globals->data, globals->len);
- state->gctx = jbig2_make_global_ctx(state->ctx);
- state->ctx = jbig2_ctx_new(NULL, JBIG2_OPTIONS_EMBEDDED, state->gctx, NULL, NULL);
+ state = fz_malloc_struct(chain->ctx, fz_jbig2d);
+ state->ctx = NULL;
+ state->gctx = NULL;
+ state->chain = chain;
+ state->ctx = jbig2_ctx_new(NULL, JBIG2_OPTIONS_EMBEDDED, NULL, NULL, NULL);
+ state->page = NULL;
+ state->idx = 0;
+
+ if (globals)
+ {
+ jbig2_data_in(state->ctx, globals->data, globals->len);
+ state->gctx = jbig2_make_global_ctx(state->ctx);
+ state->ctx = jbig2_ctx_new(NULL, JBIG2_OPTIONS_EMBEDDED, state->gctx, NULL, NULL);
+ }
+ }
+ fz_catch(ctx)
+ {
+ if (state)
+ {
+ if (state->gctx)
+ jbig2_global_ctx_free(state->gctx);
+ if (state->ctx)
+ jbig2_ctx_free(state->ctx);
+ }
+ fz_free(ctx, state);
+ fz_close(chain);
+ fz_rethrow(ctx);
}
- return fz_new_stream(chain->ctx, state, read_jbig2d, close_jbig2d);
+ return fz_new_stream(ctx, state, read_jbig2d, close_jbig2d);
}