From 3082e4e6066dde405e4f01edec4518fd9f2c3fc7 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Wed, 9 Aug 2017 20:46:02 -0400 Subject: Find xref without PCRE --- libqpdf/QPDF.cc | 14 ++++++++++---- libqpdf/QUtil.cc | 4 ++-- qpdf/qtest/qpdf/issue-101.out | 2 +- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc index 295787b1..fc3120bb 100644 --- a/libqpdf/QPDF.cc +++ b/libqpdf/QPDF.cc @@ -477,15 +477,21 @@ QPDF::read_xref(qpdf_offset_t xref_offset) // The PDF spec says xref must be followed by a line // terminator, but files exist in the wild where it is // terminated by arbitrary whitespace. - PCRE xref_re("^xref\\s+"); - PCRE::Match m = xref_re.match(buf); - if (m) + if ((strncmp(buf, "xref", 4) == 0) && + QUtil::is_space(buf[4])) { QTC::TC("qpdf", "QPDF xref space", ((buf[4] == '\n') ? 0 : (buf[4] == '\r') ? 1 : (buf[4] == ' ') ? 2 : 9999)); - xref_offset = read_xrefTable(xref_offset + m.getMatch(0).length()); + int skip = 4; + // buf is null-terminated, and QUtil::is_space('\0') is + // false, so this won't overrun. + while (QUtil::is_space(buf[skip])) + { + ++skip; + } + xref_offset = read_xrefTable(xref_offset + skip); } else { diff --git a/libqpdf/QUtil.cc b/libqpdf/QUtil.cc index 29217cc6..10ca7d3b 100644 --- a/libqpdf/QUtil.cc +++ b/libqpdf/QUtil.cc @@ -511,13 +511,13 @@ QUtil::srandom(unsigned int seed) bool QUtil::is_hex_digit(char ch) { - return (strchr("0123456789abcdefABCDEF", ch) != 0); + return (ch && (strchr("0123456789abcdefABCDEF", ch) != 0)); } bool QUtil::is_space(char ch) { - return (strchr(" \f\n\r\t\v", ch) != 0); + return (ch && (strchr(" \f\n\r\t\v", ch) != 0)); } bool diff --git a/qpdf/qtest/qpdf/issue-101.out b/qpdf/qtest/qpdf/issue-101.out index 95697276..7010cdda 100644 --- a/qpdf/qtest/qpdf/issue-101.out +++ b/qpdf/qtest/qpdf/issue-101.out @@ -10,7 +10,7 @@ WARNING: issue-101.pdf (trailer, file position 2026): /Length key in stream dict WARNING: issue-101.pdf (trailer, file position 2097): attempting to recover stream length WARNING: issue-101.pdf (trailer, file position 2097): recovered stream length: 709 WARNING: issue-101.pdf (trailer, file position 2928): unknown token while reading object; treating as string -WARNING: issue-101.pdf (trailer, file position 2930): unknown token while reading object; treating as string +WARNING: issue-101.pdf (trailer, file position 2929): unknown token while reading object; treating as string WARNING: issue-101.pdf (trailer, file position 2928): expected dictionary key but found non-name object; inserting key /QPDFFake1 WARNING: issue-101.pdf (trailer, file position 2928): expected dictionary key but found non-name object; inserting key /QPDFFake2 WARNING: issue-101.pdf (trailer, file position 2928): expected dictionary key but found non-name object; inserting key /QPDFFake3 -- cgit v1.2.3-54-g00ecf