diff options
author | Robin Watts <robin.watts@artifex.com> | 2011-12-17 00:49:23 +0000 |
---|---|---|
committer | Robin Watts <robin.watts@artifex.com> | 2011-12-17 00:49:23 +0000 |
commit | 3eae1449777c4ecccc73a156c7dfff42f927ccc4 (patch) | |
tree | b0cd1bc08b3af218dd06c501402782db91ad0523 /fitz/filt_jbig2d.c | |
parent | c53b6af33c996a7ae6815ac15254297d43f43a9c (diff) | |
download | mupdf-3eae1449777c4ecccc73a156c7dfff42f927ccc4.tar.xz |
More memsqueezing fixes; stream creation.
Diffstat (limited to 'fitz/filt_jbig2d.c')
-rw-r--r-- | fitz/filt_jbig2d.c | 44 |
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); } |