From b62cbe250885484a42ee161798830b1da9520097 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sat, 31 Oct 2015 17:03:55 -0400 Subject: 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. --- libqpdf/QPDF.cc | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) (limited to 'libqpdf') 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 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"); -- cgit v1.2.3-54-g00ecf