From e9a319fb9536347aeab076cdb18e1ff97eb66c07 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sat, 14 Dec 2013 15:08:54 -0500 Subject: Allow arbitrary whitespace, not just newline, after xref Fixes #27. --- libqpdf/QPDF.cc | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'libqpdf/QPDF.cc') diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc index e3c3d83e..d1ebb8c2 100644 --- a/libqpdf/QPDF.cc +++ b/libqpdf/QPDF.cc @@ -487,7 +487,7 @@ QPDF::read_xref(qpdf_offset_t xref_offset) qpdf_offset_t QPDF::read_xrefTable(qpdf_offset_t xref_offset) { - PCRE xref_first_re("^\\s*(\\d+)\\s+(\\d+)"); + PCRE xref_first_re("^\\s*(\\d+)\\s+(\\d+)\\s*"); PCRE xref_entry_re("(?s:(^\\d{10}) (\\d{5}) ([fn])[ \r\n]{2}$)"); std::vector deleted_items; @@ -496,7 +496,10 @@ QPDF::read_xrefTable(qpdf_offset_t xref_offset) bool done = false; while (! done) { - std::string line = this->file->readLine(50); + char linebuf[51]; + memset(linebuf, 0, sizeof(linebuf)); + this->file->read(linebuf, sizeof(linebuf) - 1); + std::string line = linebuf; PCRE::Match m1 = xref_first_re.match(line.c_str()); if (! m1) { @@ -505,6 +508,8 @@ QPDF::read_xrefTable(qpdf_offset_t xref_offset) "xref table", this->file->getLastOffset(), "xref syntax invalid"); } + file->seek(this->file->getLastOffset() + m1.getMatch(0).length(), + 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; -- cgit v1.2.3-54-g00ecf