summaryrefslogtreecommitdiffstats
path: root/libqpdf
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2013-12-14 21:08:54 +0100
committerJay Berkenbilt <ejb@ql.org>2013-12-14 21:17:23 +0100
commite9a319fb9536347aeab076cdb18e1ff97eb66c07 (patch)
tree1479c589e9fb385b3486b51d1e2029a9d1195a5d /libqpdf
parent7393a038686ceb96461afe5d8ffa901a286baee6 (diff)
downloadqpdf-e9a319fb9536347aeab076cdb18e1ff97eb66c07.tar.zst
Allow arbitrary whitespace, not just newline, after xref
Fixes #27.
Diffstat (limited to 'libqpdf')
-rw-r--r--libqpdf/QPDF.cc9
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;