From 34c971b594bad41fa6c2ad4a9798e5a18de129b5 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Thu, 8 Dec 2011 15:32:03 +0100 Subject: Throw exceptions for read errors. --- fitz/filt_basic.c | 32 ++++++++++---------------------- fitz/filt_dctd.c | 2 +- fitz/filt_faxd.c | 42 +++++++++++++++++------------------------- fitz/filt_flate.c | 2 +- fitz/filt_jbig2d.c | 4 +--- fitz/filt_predict.c | 2 -- fitz/res_font.c | 19 ++++++------------- fitz/stm_open.c | 6 +++--- fitz/stm_read.c | 46 +++++++++++++++++----------------------------- 9 files changed, 56 insertions(+), 99 deletions(-) (limited to 'fitz') diff --git a/fitz/filt_basic.c b/fitz/filt_basic.c index 0842ec36..1ab70f7f 100644 --- a/fitz/filt_basic.c +++ b/fitz/filt_basic.c @@ -22,8 +22,6 @@ read_null(fz_stream *stm, unsigned char *buf, int len) struct null_filter *state = stm->state; int amount = MIN(len, state->remain); int n = fz_read(state->chain, buf, amount); - if (n < 0) - return fz_error_note(n, "read error in null filter"); state->remain -= n; return n; } @@ -33,7 +31,6 @@ close_null(fz_stream *stm) { struct null_filter *state = stm->state; fz_stream *chain = state->chain; - fz_free(stm->ctx, state); fz_close(chain); } @@ -127,7 +124,7 @@ read_ahxd(fz_stream *stm, unsigned char *buf, int len) } else if (!iswhite(c)) { - return fz_error_make("bad data in ahxd: '%c'", c); + fz_throw(stm->ctx, "bad data in ahxd: '%c'", c); } } @@ -139,7 +136,6 @@ close_ahxd(fz_stream *stm) { fz_ahxd *state = stm->state; fz_stream *chain = state->chain; - fz_free(stm->ctx, state); fz_close(chain); } @@ -233,7 +229,7 @@ read_a85d(fz_stream *stm, unsigned char *buf, int len) case 0: break; case 1: - return fz_error_make("partial final byte in a85d"); + fz_throw(stm->ctx, "partial final byte in a85d"); case 2: word = word * (85 * 85 * 85) + 0xffffff; state->bp[0] = word >> 24; @@ -261,7 +257,7 @@ read_a85d(fz_stream *stm, unsigned char *buf, int len) else if (!iswhite(c)) { - return fz_error_make("bad data in a85d: '%c'", c); + fz_throw(stm->ctx, "bad data in a85d: '%c'", c); } while (state->rp < state->wp && p < ep) @@ -330,7 +326,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_error_make("premature end of data in run length decode"); + fz_throw(stm->ctx, "premature end of data in run length decode"); } } @@ -340,7 +336,7 @@ read_rld(fz_stream *stm, unsigned char *buf, int len) { int c = fz_read_byte(state->chain); if (c < 0) - return fz_error_make("premature end of data in run length decode"); + fz_throw(stm->ctx, "premature end of data in run length decode"); *p++ = c; state->n--; } @@ -398,14 +394,8 @@ static int read_arc4(fz_stream *stm, unsigned char *buf, int len) { fz_arc4c *state = stm->state; - int n; - - n = fz_read(state->chain, buf, len); - if (n < 0) - return fz_error_note(n, "read error in arc4 filter"); - + int n = fz_read(state->chain, buf, len); fz_arc4_encrypt(&state->arc4, buf, buf, n); - return n; } @@ -456,7 +446,7 @@ read_aesd(fz_stream *stm, unsigned char *buf, int len) { int c = fz_read_byte(state->chain); if (c < 0) - return fz_error_make("premature end in aes filter"); + fz_throw(stm->ctx, "premature end in aes filter"); state->iv[state->ivcount++] = c; } @@ -466,12 +456,10 @@ read_aesd(fz_stream *stm, unsigned char *buf, int len) while (p < ep) { int n = fz_read(state->chain, state->bp, 16); - if (n < 0) - return fz_error_note(n, "read error in aes filter"); - else if (n == 0) + if (n == 0) return p - buf; else if (n < 16) - return fz_error_make("partial block in aes filter"); + fz_throw(stm->ctx, "partial block in aes filter"); aes_crypt_cbc(&state->aes, AES_DECRYPT, 16, state->iv, state->bp, state->bp); state->rp = state->bp; @@ -482,7 +470,7 @@ read_aesd(fz_stream *stm, unsigned char *buf, int len) { int pad = state->bp[15]; if (pad < 1 || pad > 16) - return fz_error_make("aes padding out of range: %d", pad); + fz_throw(stm->ctx, "aes padding out of range: %d", pad); state->wp -= pad; } diff --git a/fitz/filt_dctd.c b/fitz/filt_dctd.c index fb0e77e7..355cca91 100644 --- a/fitz/filt_dctd.c +++ b/fitz/filt_dctd.c @@ -87,7 +87,7 @@ read_dctd(fz_stream *stm, unsigned char *buf, int len) { if (cinfo->src) state->chain->rp = state->chain->wp - cinfo->src->bytes_in_buffer; - return fz_error_make("jpeg error: %s", state->msg); + fz_throw(stm->ctx, "jpeg error: %s", state->msg); } if (!state->init) diff --git a/fitz/filt_faxd.c b/fitz/filt_faxd.c index 14a71a87..f94a2cd6 100644 --- a/fitz/filt_faxd.c +++ b/fitz/filt_faxd.c @@ -265,6 +265,7 @@ enum struct fz_faxd_s { + fz_context *ctx; fz_stream *chain; int k; @@ -331,8 +332,8 @@ get_code(fz_faxd *fax, const cfd_node *table, int initialbits) } /* decode one 1d code */ -static fz_error -dec1d(fz_faxd *fax) +static void +dec1d(fz_context *ctx, fz_faxd *fax) { int code; @@ -345,13 +346,13 @@ dec1d(fz_faxd *fax) code = get_code(fax, cf_white_decode, cfd_white_initial_bits); if (code == UNCOMPRESSED) - return fz_error_make("uncompressed data in faxd"); + fz_throw(ctx, "uncompressed data in faxd"); if (code < 0) - return fz_error_make("negative code in 1d faxd"); + fz_throw(ctx, "negative code in 1d faxd"); if (fax->a + code > fax->columns) - return fz_error_make("overflow in 1d faxd"); + fz_throw(ctx, "overflow in 1d faxd"); if (fax->c) setbits(fax->dst, fax->a, fax->a + code); @@ -365,13 +366,11 @@ dec1d(fz_faxd *fax) } else fax->stage = STATE_MAKEUP; - - return fz_okay; } /* decode one 2d code */ -static fz_error -dec2d(fz_faxd *fax) +static void +dec2d(fz_context *ctx, fz_faxd *fax) { int code, b1, b2; @@ -386,13 +385,13 @@ dec2d(fz_faxd *fax) code = get_code(fax, cf_white_decode, cfd_white_initial_bits); if (code == UNCOMPRESSED) - return fz_error_make("uncompressed data in faxd"); + fz_throw(ctx, "uncompressed data in faxd"); if (code < 0) - return fz_error_make("negative code in 2d faxd"); + fz_throw(ctx, "negative code in 2d faxd"); if (fax->a + code > fax->columns) - return fz_error_make("overflow in 2d faxd"); + fz_throw(ctx, "overflow in 2d faxd"); if (fax->c) setbits(fax->dst, fax->a, fax->a + code); @@ -408,7 +407,7 @@ dec2d(fz_faxd *fax) fax->stage = STATE_NORMAL; } - return fz_okay; + return; } code = get_code(fax, cf_2d_decode, cfd_2d_initial_bits); @@ -485,16 +484,14 @@ dec2d(fz_faxd *fax) break; case UNCOMPRESSED: - return fz_error_make("uncompressed data in faxd"); + fz_throw(ctx, "uncompressed data in faxd"); case ERROR: - return fz_error_make("invalid code in 2d faxd"); + fz_throw(ctx, "invalid code in 2d faxd"); default: - return fz_error_make("invalid code in 2d faxd (%d)", code); + fz_throw(ctx, "invalid code in 2d faxd (%d)", code); } - - return 0; } static int @@ -504,7 +501,6 @@ read_faxd(fz_stream *stm, unsigned char *buf, int len) unsigned char *p = buf; unsigned char *ep = buf + len; unsigned char *tmp; - fz_error error; if (fax->stage == STATE_DONE) return 0; @@ -558,16 +554,12 @@ loop: else if (fax->dim == 1) { fax->eolc = 0; - error = dec1d(fax); - if (error) - return fz_error_note(error, "cannot decode 1d code"); + dec1d(stm->ctx, fax); } else if (fax->dim == 2) { fax->eolc = 0; - error = dec2d(fax); - if (error) - return fz_error_note(error, "cannot decode 2d code"); + dec2d(stm->ctx, fax); } /* no eol check after makeup codes nor in the middle of an H code */ diff --git a/fitz/filt_flate.c b/fitz/filt_flate.c index 11100c94..d7077bc8 100644 --- a/fitz/filt_flate.c +++ b/fitz/filt_flate.c @@ -59,7 +59,7 @@ read_flated(fz_stream *stm, unsigned char *outbuf, int outlen) } else if (code != Z_OK) { - return fz_error_make("zlib error: %s", zp->msg); + fz_throw(stm->ctx, "zlib error: %s", zp->msg); } } diff --git a/fitz/filt_jbig2d.c b/fitz/filt_jbig2d.c index 18aa0a22..e2ae4d93 100644 --- a/fitz/filt_jbig2d.c +++ b/fitz/filt_jbig2d.c @@ -56,8 +56,6 @@ read_jbig2d(fz_stream *stm, unsigned char *buf, int len) while (1) { n = fz_read(state->chain, tmp, sizeof tmp); - if (n < 0) - return fz_error_note(n, "read error in jbig2 filter"); if (n == 0) break; jbig2_data_in(state->ctx, tmp, n); @@ -67,7 +65,7 @@ read_jbig2d(fz_stream *stm, unsigned char *buf, int len) state->page = jbig2_page_out(state->ctx); if (!state->page) - return fz_error_make("jbig2_page_out failed"); + fz_throw(stm->ctx, "jbig2_page_out failed"); } s = state->page->data; diff --git a/fitz/filt_predict.c b/fitz/filt_predict.c index ed0d6d98..d640373e 100644 --- a/fitz/filt_predict.c +++ b/fitz/filt_predict.c @@ -153,8 +153,6 @@ read_predict(fz_stream *stm, unsigned char *buf, int len) while (p < ep) { n = fz_read(state->chain, state->in, state->stride + ispng); - if (n < 0) - return fz_error_note(n, "read error in prediction filter"); if (n == 0) return p - buf; diff --git a/fitz/res_font.c b/fitz/res_font.c index 4b30d424..3fea732a 100644 --- a/fitz/res_font.c +++ b/fitz/res_font.c @@ -154,7 +154,7 @@ char *ft_error_string(int err) return "Unknown error"; } -static fz_error +static void fz_init_freetype(fz_context *ctx) { int fterr; @@ -164,12 +164,12 @@ fz_init_freetype(fz_context *ctx) if (fct->ftlib) { fct->ftlib_refs++; - return fz_okay; + return; } fterr = FT_Init_FreeType(&fct->ftlib); if (fterr) - return fz_error_make("cannot init freetype: %s", ft_error_string(fterr)); + fz_throw(ctx, "cannot init freetype: %s", ft_error_string(fterr)); FT_Library_Version(fct->ftlib, &maj, &min, &pat); if (maj == 2 && min == 1 && pat < 7) @@ -177,11 +177,10 @@ fz_init_freetype(fz_context *ctx) fterr = FT_Done_FreeType(fct->ftlib); if (fterr) fz_warn(ctx, "freetype finalizing: %s", ft_error_string(fterr)); - return fz_error_make("freetype version too old: %d.%d.%d", maj, min, pat); + fz_throw(ctx, "freetype version too old: %d.%d.%d", maj, min, pat); } fct->ftlib_refs++; - return fz_okay; } static void @@ -203,13 +202,10 @@ fz_font * fz_new_font_from_file(fz_context *ctx, char *path, int index) { FT_Face face; - fz_error error; fz_font *font; int fterr; - error = fz_init_freetype(ctx); - if (error) - fz_throw(ctx, "cannot init freetype library"); + fz_init_freetype(ctx); fterr = FT_New_Face(ctx->font->ftlib, path, index, &face); if (fterr) @@ -229,13 +225,10 @@ fz_font * fz_new_font_from_memory(fz_context *ctx, unsigned char *data, int len, int index) { FT_Face face; - fz_error error; fz_font *font; int fterr; - error = fz_init_freetype(ctx); - if (error) - fz_throw(ctx, "cannot init freetype library"); + fz_init_freetype(ctx); fterr = FT_New_Memory_Face(ctx->font->ftlib, data, len, index, &face); if (fterr) diff --git a/fitz/stm_open.c b/fitz/stm_open.c index aa99451b..9f657f27 100644 --- a/fitz/stm_open.c +++ b/fitz/stm_open.c @@ -58,7 +58,7 @@ static int read_file(fz_stream *stm, unsigned char *buf, int len) { int n = read(*(int*)stm->state, buf, len); if (n < 0) - return fz_error_make("read error: %s", strerror(errno)); + fz_throw(stm->ctx, "read error: %s", strerror(errno)); return n; } @@ -66,7 +66,7 @@ static void seek_file(fz_stream *stm, int offset, int whence) { int n = lseek(*(int*)stm->state, offset, whence); if (n < 0) - fz_warn(stm->ctx, "cannot lseek: %s", strerror(errno)); + fz_throw(stm->ctx, "cannot lseek: %s", strerror(errno)); stm->pos = n; stm->rp = stm->bp; stm->wp = stm->bp; @@ -100,7 +100,7 @@ fz_open_file(fz_context *ctx, const char *name) { int fd = open(name, O_BINARY | O_RDONLY, 0); if (fd == -1) - fz_throw(ctx, "Failed to open %s", name); + fz_throw(ctx, "cannot open %s", name); return fz_open_fd(ctx, fd); } diff --git a/fitz/stm_read.c b/fitz/stm_read.c index 5622a24f..9f9fc302 100644 --- a/fitz/stm_read.c +++ b/fitz/stm_read.c @@ -20,12 +20,7 @@ fz_read(fz_stream *stm, unsigned char *buf, int len) if (len - count < stm->ep - stm->bp) { n = stm->read(stm, stm->bp, stm->ep - stm->bp); - if (n < 0) - { - stm->error = 1; - return fz_error_note(n, "read error"); - } - else if (n == 0) + if (n == 0) { stm->eof = 1; } @@ -47,12 +42,7 @@ fz_read(fz_stream *stm, unsigned char *buf, int len) else { n = stm->read(stm, buf + count, len - count); - if (n < 0) - { - stm->error = 1; - return fz_error_note(n, "read error"); - } - else if (n == 0) + if (n == 0) { stm->eof = 1; } @@ -76,21 +66,24 @@ fz_fill_buffer(fz_stream *stm) if (stm->error || stm->eof) return; - n = stm->read(stm, stm->bp, stm->ep - stm->bp); - if (n < 0) + fz_try(stm->ctx) { - stm->error = 1; - fz_error_handle(n, "read error; treating as end of file"); - } - else if (n == 0) - { - stm->eof = 1; + n = stm->read(stm, stm->bp, stm->ep - stm->bp); + if (n == 0) + { + stm->eof = 1; + } + else if (n > 0) + { + stm->rp = stm->bp; + stm->wp = stm->bp + n; + stm->pos += n; + } } - else if (n > 0) + fz_catch(stm->ctx) { - stm->rp = stm->bp; - stm->wp = stm->bp + n; - stm->pos += n; + fz_warn(stm->ctx, "read error; treating as end of file"); + stm->error = 1; } } @@ -118,11 +111,6 @@ fz_read_all(fz_stream *stm, int initial) } n = fz_read(stm, buf->data + buf->len, buf->cap - buf->len); - if (n < 0) - { - fz_drop_buffer(ctx, buf); - fz_throw(ctx, "read error"); - } if (n == 0) break; -- cgit v1.2.3