diff options
author | Jay Berkenbilt <ejb@ql.org> | 2013-12-14 21:08:54 +0100 |
---|---|---|
committer | Jay Berkenbilt <ejb@ql.org> | 2013-12-14 21:17:23 +0100 |
commit | e9a319fb9536347aeab076cdb18e1ff97eb66c07 (patch) | |
tree | 1479c589e9fb385b3486b51d1e2029a9d1195a5d /libqpdf | |
parent | 7393a038686ceb96461afe5d8ffa901a286baee6 (diff) | |
download | qpdf-e9a319fb9536347aeab076cdb18e1ff97eb66c07.tar.zst |
Allow arbitrary whitespace, not just newline, after xref
Fixes #27.
Diffstat (limited to 'libqpdf')
-rw-r--r-- | libqpdf/QPDF.cc | 9 |
1 files changed, 7 insertions, 2 deletions
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<QPDFObjGen> 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; |