diff options
author | Tor Andersson <tor@ghostscript.com> | 2008-08-15 01:42:07 +0200 |
---|---|---|
committer | Tor Andersson <tor@ghostscript.com> | 2008-08-15 01:42:07 +0200 |
commit | 04d6081ee6357ba0d0ce2a3281b6e651f10c8656 (patch) | |
tree | 8fe24ef2b541390d591647dc212bb174f4f1f0d1 | |
parent | 6ca3300b112b6197010fd7d92ae56454ab3885d5 (diff) | |
download | mupdf-04d6081ee6357ba0d0ce2a3281b6e651f10c8656.tar.xz |
Implement a better workaround for PDF files with off-by-one errors in the xref.
-rw-r--r-- | mupdf/pdf_open.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/mupdf/pdf_open.c b/mupdf/pdf_open.c index 7d4e450a..acd65caf 100644 --- a/mupdf/pdf_open.c +++ b/mupdf/pdf_open.c @@ -366,8 +366,17 @@ readnewxref(fz_obj **trailerp, pdf_xref *xref, char *buf, int cap) if (oid < 0 || oid >= xref->len) { - fz_dropobj(trailer); - return fz_throw("object id (%d) out of range (0..%d)", oid, xref->len - 1); + if (oid == xref->len && oid < xref->cap) + { + /* allow broken pdf files that have off-by-one errors in the xref */ + fz_warn("object id (%d) out of range (0..%d)", oid, xref->len - 1); + xref->len ++; + } + else + { + fz_dropobj(trailer); + return fz_throw("object id (%d) out of range (0..%d)", oid, xref->len - 1); + } } xref->table[oid].type = 'n'; @@ -679,8 +688,8 @@ pdf_loadxref(pdf_xref *xref, char *filename) assert(xref->table == nil); - xref->len = fz_toint(size) + 1; /* + 1 because of lots of broken pdf generators with off-by-one errors */ - xref->cap = xref->len; + xref->len = fz_toint(size); + xref->cap = xref->len + 1; /* for hack to allow broken pdf generators with off-by-one errors */ xref->table = fz_malloc(xref->cap * sizeof(pdf_xrefentry)); if (!xref->table) { |