summaryrefslogtreecommitdiff
path: root/fitz/filt_basic.c
diff options
context:
space:
mode:
Diffstat (limited to 'fitz/filt_basic.c')
-rw-r--r--fitz/filt_basic.c88
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);
}