aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf/QPDF.cc
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2015-10-31 22:03:55 +0100
committerJay Berkenbilt <ejb@ql.org>2015-10-31 23:56:43 +0100
commitb62cbe250885484a42ee161798830b1da9520097 (patch)
tree3a8f5316828ce39d193fbea3dea0bbfe7bdf8d89 /libqpdf/QPDF.cc
parentf0b85a1eb139a08bdf52e1fc9902364bbf8b1068 (diff)
downloadqpdf-b62cbe250885484a42ee161798830b1da9520097.tar.zst
Tolerate some mangled xref tables
If xref table entries lack the spec-required trailing whitespace or contain a small amount of extra space, handle them anyway.
Diffstat (limited to 'libqpdf/QPDF.cc')
-rw-r--r--libqpdf/QPDF.cc9
1 files changed, 3 insertions, 6 deletions
diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc
index 8bc8afc8..a14a07ea 100644
--- a/libqpdf/QPDF.cc
+++ b/libqpdf/QPDF.cc
@@ -488,7 +488,7 @@ qpdf_offset_t
QPDF::read_xrefTable(qpdf_offset_t xref_offset)
{
PCRE xref_first_re("^\\s*(\\d+)\\s+(\\d+)\\s*");
- PCRE xref_entry_re("(?s:(^\\d{10}) (\\d{5}) ([fn])[ \r\n]{2}$)");
+ PCRE xref_entry_re("(?s:(^\\d{10}) (\\d{5}) ([fn])\\s*$)");
std::vector<QPDFObjGen> deleted_items;
@@ -512,8 +512,6 @@ QPDF::read_xrefTable(qpdf_offset_t xref_offset)
SEEK_SET);
int obj = atoi(m1.getMatch(1).c_str());
int num = atoi(m1.getMatch(2).c_str());
- static int const xref_entry_size = 20;
- char xref_entry[xref_entry_size + 1];
for (int i = obj; i < obj + num; ++i)
{
if (i == 0)
@@ -521,9 +519,8 @@ QPDF::read_xrefTable(qpdf_offset_t xref_offset)
// This is needed by checkLinearization()
this->first_xref_item_offset = this->file->tell();
}
- memset(xref_entry, 0, sizeof(xref_entry));
- this->file->read(xref_entry, xref_entry_size);
- PCRE::Match m2 = xref_entry_re.match(xref_entry);
+ std::string xref_entry = this->file->readLine(30);
+ PCRE::Match m2 = xref_entry_re.match(xref_entry.c_str());
if (! m2)
{
QTC::TC("qpdf", "QPDF invalid xref entry");