summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mupdf/pdf_open.c41
1 files changed, 33 insertions, 8 deletions
diff --git a/mupdf/pdf_open.c b/mupdf/pdf_open.c
index 4c5e3681..81af23af 100644
--- a/mupdf/pdf_open.c
+++ b/mupdf/pdf_open.c
@@ -365,6 +365,7 @@ readnewxref(fz_obj **trailerp, pdf_xref *xref, char *buf, int cap)
int oid, gen, stmofs;
int size, w0, w1, w2;
int t;
+ int i;
pdf_logxref("load new xref format\n");
@@ -372,6 +373,38 @@ readnewxref(fz_obj **trailerp, pdf_xref *xref, char *buf, int cap)
if (error)
return fz_rethrow(error, "cannot parse compressed xref stream object");
+ obj = fz_dictgets(trailer, "Size");
+ if (!obj)
+ {
+ fz_dropobj(trailer);
+ return fz_throw("xref stream missing Size entry");
+ }
+ size = fz_toint(obj);
+
+ if (size >= xref->cap)
+ {
+ xref->cap = size + 1; /* for hack to allow broken pdf generators with off-by-one errors */
+ xref->table = fz_realloc(xref->table, xref->cap * sizeof(pdf_xrefentry));
+ if (!xref->table)
+ {
+ fz_dropobj(trailer);
+ return fz_rethrow(-1, "out of memory: xref table");
+ }
+ }
+
+ if (size > xref->len)
+ {
+ for (i = xref->len; i < xref->cap; i++)
+ {
+ xref->table[i].ofs = 0;
+ xref->table[i].gen = 0;
+ xref->table[i].stmofs = 0;
+ xref->table[i].obj = nil;
+ xref->table[i].type = 0;
+ }
+ xref->len = size;
+ }
+
if (oid < 0 || oid >= xref->len)
{
if (oid == xref->len && oid < xref->cap)
@@ -393,14 +426,6 @@ readnewxref(fz_obj **trailerp, pdf_xref *xref, char *buf, int cap)
xref->table[oid].stmofs = stmofs;
xref->table[oid].ofs = 0;
- obj = fz_dictgets(trailer, "Size");
- if (!obj)
- {
- fz_dropobj(trailer);
- return fz_throw("xref stream missing Size entry");
- }
- size = fz_toint(obj);
-
obj = fz_dictgets(trailer, "W");
if (!obj) {
fz_dropobj(trailer);