[gs-commits] mupdf/master - 0_6-199-g57d4495 - Check that object offsets are within the file when reading the xref table.
Tor Andersson
tor at ghostscript.com
Sun Jul 18 15:26:19 UTC 2010
commit 57d4495abfd5f4bf7782161253f02143a162c5c5
Author: Tor Andersson <tor at ghostscript.com>
Date: Sun Jul 18 15:00:31 2010 +0000
Check that object offsets are within the file when reading the xref table.
Ignore-this: 2074993745da765345547806260d8862
darcs-hash:20100718150031-f546f-45be3736d114b663d38f93dcea4f3a9e4d3931a6.gz
2 files changed, 15 insertions(+), 6 deletions(-)
diff --git a/mupdf/mupdf.h b/mupdf/mupdf.h
index 2489d79..8aeb574 100644
--- a/mupdf/mupdf.h
+++ b/mupdf/mupdf.h
@@ -121,6 +121,7 @@ struct pdf_xref_s
fz_stream *file;
int version;
int startxref;
+ int filesize;
pdf_crypt *crypt;
fz_obj *trailer;
diff --git a/mupdf/pdf_xref.c b/mupdf/pdf_xref.c
index 86b97da..eba185e 100644
--- a/mupdf/pdf_xref.c
+++ b/mupdf/pdf_xref.c
@@ -47,7 +47,9 @@ pdf_readstartxref(pdf_xref *xref)
if (error)
return fz_rethrow(error, "cannot seek to end of file");
- t = MAX(0, fz_tell(xref->file) - ((int)sizeof buf));
+ xref->filesize = fz_tell(xref->file);
+
+ t = MAX(0, xref->filesize - (int)sizeof buf);
error = fz_seek(xref->file, t, 0);
if (error)
return fz_rethrow(error, "cannot seek to offset %d", t);
@@ -269,12 +271,12 @@ pdf_readoldxref(fz_obj **trailerp, pdf_xref *xref, char *buf, int cap)
xref->len = ofs + len;
}
- for (i = 0; i < len; i++)
+ for (i = ofs; i < ofs + len; i++)
{
error = fz_read(&n, xref->file, (unsigned char *) buf, 20);
if (error)
return fz_rethrow(error, "cannot read xref table");
- if (!xref->table[ofs + i].type)
+ if (!xref->table[i].type)
{
s = buf;
@@ -282,9 +284,12 @@ pdf_readoldxref(fz_obj **trailerp, pdf_xref *xref, char *buf, int cap)
while (*s != '\0' && iswhite(*s))
s++;
- xref->table[ofs + i].ofs = atoi(s);
- xref->table[ofs + i].gen = atoi(s + 11);
- xref->table[ofs + i].type = s[17];
+ xref->table[i].ofs = atoi(s);
+ xref->table[i].gen = atoi(s + 11);
+ xref->table[i].type = s[17];
+
+ if (xref->table[i].ofs < 0 || xref->table[i].ofs >= xref->filesize)
+ return fz_throw("object offset out of range: %d", xref->table[i].ofs);
}
}
}
@@ -347,6 +352,9 @@ pdf_readnewxrefsection(pdf_xref *xref, fz_stream *stm, int i0, int i1, int w0, i
xref->table[i].type = t == 0 ? 'f' : t == 1 ? 'n' : t == 2 ? 'o' : 0;
xref->table[i].ofs = w1 ? b : 0;
xref->table[i].gen = w2 ? c : 0;
+
+ if (xref->table[i].ofs < 0 || xref->table[i].ofs >= xref->filesize)
+ return fz_throw("object offset out of range: %d", xref->table[i].ofs);
}
}
--
git/hooks/post-receive
More information about the gs-commits
mailing list