diff options
Diffstat (limited to 'fitz/filt_basic.c')
-rw-r--r-- | fitz/filt_basic.c | 88 |
1 files changed, 52 insertions, 36 deletions
diff --git a/fitz/filt_basic.c b/fitz/filt_basic.c index feb13076..0842ec36 100644 --- a/fitz/filt_basic.c +++ b/fitz/filt_basic.c @@ -23,7 +23,7 @@ read_null(fz_stream *stm, unsigned char *buf, int len) int amount = MIN(len, state->remain); int n = fz_read(state->chain, buf, amount); if (n < 0) - return fz_rethrow(n, "read error in null filter"); + return fz_error_note(n, "read error in null filter"); state->remain -= n; return n; } @@ -32,8 +32,10 @@ static void close_null(fz_stream *stm) { struct null_filter *state = stm->state; - fz_close(state->chain); - fz_free(state); + fz_stream *chain = state->chain; + + fz_free(stm->ctx, state); + fz_close(chain); } fz_stream * @@ -41,11 +43,12 @@ fz_open_null(fz_stream *chain, int len) { struct null_filter *state; - state = fz_malloc(sizeof(struct null_filter)); + assert(chain != NULL); + state = fz_malloc(chain->ctx, sizeof(struct null_filter)); state->chain = chain; state->remain = len; - return fz_new_stream(state, read_null, close_null); + return fz_new_stream(chain->ctx, state, read_null, close_null); } /* ASCII Hex Decode */ @@ -124,7 +127,7 @@ read_ahxd(fz_stream *stm, unsigned char *buf, int len) } else if (!iswhite(c)) { - return fz_throw("bad data in ahxd: '%c'", c); + return fz_error_make("bad data in ahxd: '%c'", c); } } @@ -135,8 +138,10 @@ static void close_ahxd(fz_stream *stm) { fz_ahxd *state = stm->state; - fz_close(state->chain); - fz_free(state); + fz_stream *chain = state->chain; + + fz_free(stm->ctx, state); + fz_close(chain); } fz_stream * @@ -144,11 +149,11 @@ fz_open_ahxd(fz_stream *chain) { fz_ahxd *state; - state = fz_malloc(sizeof(fz_ahxd)); + state = fz_malloc(chain->ctx, sizeof(fz_ahxd)); state->chain = chain; state->eod = 0; - return fz_new_stream(state, read_ahxd, close_ahxd); + return fz_new_stream(chain->ctx, state, read_ahxd, close_ahxd); } /* ASCII 85 Decode */ @@ -222,13 +227,13 @@ read_a85d(fz_stream *stm, unsigned char *buf, int len) { c = fz_read_byte(state->chain); if (c != '>') - fz_warn("bad eod marker in a85d"); + fz_warn(stm->ctx, "bad eod marker in a85d"); switch (count) { case 0: break; case 1: - return fz_throw("partial final byte in a85d"); + return fz_error_make("partial final byte in a85d"); case 2: word = word * (85 * 85 * 85) + 0xffffff; state->bp[0] = word >> 24; @@ -256,7 +261,7 @@ read_a85d(fz_stream *stm, unsigned char *buf, int len) else if (!iswhite(c)) { - return fz_throw("bad data in a85d: '%c'", c); + return fz_error_make("bad data in a85d: '%c'", c); } while (state->rp < state->wp && p < ep) @@ -270,8 +275,10 @@ static void close_a85d(fz_stream *stm) { fz_a85d *state = stm->state; - fz_close(state->chain); - fz_free(state); + fz_stream *chain = state->chain; + + fz_free(stm->ctx, state); + fz_close(chain); } fz_stream * @@ -279,13 +286,14 @@ fz_open_a85d(fz_stream *chain) { fz_a85d *state; - state = fz_malloc(sizeof(fz_a85d)); + assert(chain != NULL); + state = fz_malloc(chain->ctx, sizeof(fz_a85d)); state->chain = chain; state->rp = state->bp; state->wp = state->bp; state->eod = 0; - return fz_new_stream(state, read_a85d, close_a85d); + return fz_new_stream(chain->ctx, state, read_a85d, close_a85d); } /* Run Length Decode */ @@ -322,7 +330,7 @@ read_rld(fz_stream *stm, unsigned char *buf, int len) state->n = 257 - state->run; state->c = fz_read_byte(state->chain); if (state->c < 0) - return fz_throw("premature end of data in run length decode"); + return fz_error_make("premature end of data in run length decode"); } } @@ -332,7 +340,7 @@ read_rld(fz_stream *stm, unsigned char *buf, int len) { int c = fz_read_byte(state->chain); if (c < 0) - return fz_throw("premature end of data in run length decode"); + return fz_error_make("premature end of data in run length decode"); *p++ = c; state->n--; } @@ -355,8 +363,10 @@ static void close_rld(fz_stream *stm) { fz_rld *state = stm->state; - fz_close(state->chain); - fz_free(state); + fz_stream *chain = state->chain; + + fz_free(stm->ctx, state); + fz_close(chain); } fz_stream * @@ -364,13 +374,14 @@ fz_open_rld(fz_stream *chain) { fz_rld *state; - state = fz_malloc(sizeof(fz_rld)); + assert(chain != NULL); + state = fz_malloc(chain->ctx, sizeof(fz_rld)); state->chain = chain; state->run = 0; state->n = 0; state->c = 0; - return fz_new_stream(state, read_rld, close_rld); + return fz_new_stream(chain->ctx, state, read_rld, close_rld); } /* RC4 Filter */ @@ -391,7 +402,7 @@ read_arc4(fz_stream *stm, unsigned char *buf, int len) n = fz_read(state->chain, buf, len); if (n < 0) - return fz_rethrow(n, "read error in arc4 filter"); + return fz_error_note(n, "read error in arc4 filter"); fz_arc4_encrypt(&state->arc4, buf, buf, n); @@ -402,8 +413,10 @@ static void close_arc4(fz_stream *stm) { fz_arc4c *state = stm->state; - fz_close(state->chain); - fz_free(state); + fz_stream *chain = state->chain; + + fz_free(stm->ctx, state); + fz_close(chain); } fz_stream * @@ -411,11 +424,11 @@ fz_open_arc4(fz_stream *chain, unsigned char *key, unsigned keylen) { fz_arc4c *state; - state = fz_malloc(sizeof(fz_arc4c)); + state = fz_malloc(chain->ctx, sizeof(fz_arc4c)); state->chain = chain; fz_arc4_init(&state->arc4, key, keylen); - return fz_new_stream(state, read_arc4, close_arc4); + return fz_new_stream(chain->ctx, state, read_arc4, close_arc4); } /* AES Filter */ @@ -443,7 +456,7 @@ read_aesd(fz_stream *stm, unsigned char *buf, int len) { int c = fz_read_byte(state->chain); if (c < 0) - return fz_throw("premature end in aes filter"); + return fz_error_make("premature end in aes filter"); state->iv[state->ivcount++] = c; } @@ -454,11 +467,11 @@ read_aesd(fz_stream *stm, unsigned char *buf, int len) { int n = fz_read(state->chain, state->bp, 16); if (n < 0) - return fz_rethrow(n, "read error in aes filter"); + return fz_error_note(n, "read error in aes filter"); else if (n == 0) return p - buf; else if (n < 16) - return fz_throw("partial block in aes filter"); + return fz_error_make("partial block in aes filter"); aes_crypt_cbc(&state->aes, AES_DECRYPT, 16, state->iv, state->bp, state->bp); state->rp = state->bp; @@ -469,7 +482,7 @@ read_aesd(fz_stream *stm, unsigned char *buf, int len) { int pad = state->bp[15]; if (pad < 1 || pad > 16) - return fz_throw("aes padding out of range: %d", pad); + return fz_error_make("aes padding out of range: %d", pad); state->wp -= pad; } @@ -484,8 +497,10 @@ static void close_aesd(fz_stream *stm) { fz_aesd *state = stm->state; - fz_close(state->chain); - fz_free(state); + fz_stream *chain = state->chain; + + fz_free(stm->ctx, state); + fz_close(chain); } fz_stream * @@ -493,12 +508,13 @@ fz_open_aesd(fz_stream *chain, unsigned char *key, unsigned keylen) { fz_aesd *state; - state = fz_malloc(sizeof(fz_aesd)); + assert(chain != NULL); + state = fz_malloc(chain->ctx, sizeof(fz_aesd)); state->chain = chain; aes_setkey_dec(&state->aes, key, keylen * 8); state->ivcount = 0; state->rp = state->bp; state->wp = state->bp; - return fz_new_stream(state, read_aesd, close_aesd); + return fz_new_stream(chain->ctx, state, read_aesd, close_aesd); } |