summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2011-12-08 15:32:03 +0100
committerTor Andersson <tor.andersson@artifex.com>2011-12-08 21:46:55 +0100
commit34c971b594bad41fa6c2ad4a9798e5a18de129b5 (patch)
tree0c3956c35f827d1649e0520abf18974a4e0ec8e2
parente64a57b1e9c2ba6c6f54eff73c414be9e78dafbe (diff)
downloadmupdf-34c971b594bad41fa6c2ad4a9798e5a18de129b5.tar.xz
Throw exceptions for read errors.
-rw-r--r--apps/pdfdraw.c2
-rw-r--r--apps/win_main.c2
-rw-r--r--fitz/filt_basic.c32
-rw-r--r--fitz/filt_dctd.c2
-rw-r--r--fitz/filt_faxd.c42
-rw-r--r--fitz/filt_flate.c2
-rw-r--r--fitz/filt_jbig2d.c4
-rw-r--r--fitz/filt_predict.c2
-rw-r--r--fitz/res_font.c19
-rw-r--r--fitz/stm_open.c6
-rw-r--r--fitz/stm_read.c46
-rw-r--r--pdf/pdf_xref.c3
12 files changed, 60 insertions, 102 deletions
diff --git a/apps/pdfdraw.c b/apps/pdfdraw.c
index 6d43dc01..ff9f72a3 100644
--- a/apps/pdfdraw.c
+++ b/apps/pdfdraw.c
@@ -365,7 +365,7 @@ int main(int argc, char **argv)
ctx = fz_new_context(&fz_alloc_default);
if (ctx == NULL)
{
- fprintf(stderr, "Failed to init context\n");
+ fprintf(stderr, "cannot init context\n");
exit(1);
}
diff --git a/apps/win_main.c b/apps/win_main.c
index 3e293957..45880e12 100644
--- a/apps/win_main.c
+++ b/apps/win_main.c
@@ -861,7 +861,7 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShow
ctx = fz_new_context(&fz_alloc_default);
if (ctx == NULL)
{
- fprintf(stderr, "Failed to init context");
+ fprintf(stderr, "cannot init context");
exit(1);
}
pdfapp_init(ctx, &gapp);
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;
diff --git a/pdf/pdf_xref.c b/pdf/pdf_xref.c
index b447dde6..65c695f6 100644
--- a/pdf/pdf_xref.c
+++ b/pdf/pdf_xref.c
@@ -424,7 +424,7 @@ pdf_read_xref_sections(pdf_xref *xref, int ofs, char *buf, int cap)
fz_catch(ctx)
{
fz_drop_obj(trailer);
- fz_throw(ctx, "Failed to read xref at offset %d", ofs);
+ fz_throw(ctx, "cannot read xref at offset %d", ofs);
}
fz_drop_obj(trailer);
@@ -675,6 +675,7 @@ pdf_open_xref_with_stream(fz_stream *file, char *password)
fz_drop_obj(xref->trailer);
xref->trailer = NULL;
}
+ fz_warn(xref->ctx, "trying to repair broken xref");
pdf_repair_xref(xref, xref->scratch, sizeof xref->scratch);
repaired = 1;
}