summaryrefslogtreecommitdiffstats
path: root/libqpdf/QPDF.cc
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2012-12-25 20:38:18 +0100
committerJay Berkenbilt <ejb@ql.org>2012-12-25 20:43:37 +0100
commit7f84239cad2ec58166245394e56a4647085e025e (patch)
treede91917df48f54d645c90f67a1cb1a49214b5d5f /libqpdf/QPDF.cc
parentbcfc9847beb0f059a98ef5c8c02646b43fab4272 (diff)
downloadqpdf-7f84239cad2ec58166245394e56a4647085e025e.tar.zst
Find PDF header anywhere in the first 1024 bytes
Diffstat (limited to 'libqpdf/QPDF.cc')
-rw-r--r--libqpdf/QPDF.cc20
1 files changed, 17 insertions, 3 deletions
diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc
index ccbfaf7c..ba96cb64 100644
--- a/libqpdf/QPDF.cc
+++ b/libqpdf/QPDF.cc
@@ -13,6 +13,7 @@
#include <qpdf/Pl_Discard.hh>
#include <qpdf/FileInputSource.hh>
#include <qpdf/BufferInputSource.hh>
+#include <qpdf/OffsetInputSource.hh>
#include <qpdf/QPDFExc.hh>
#include <qpdf/QPDF_Null.hh>
@@ -213,7 +214,7 @@ QPDF::getWarnings()
void
QPDF::parse(char const* password)
{
- PCRE header_re("^%PDF-(1.\\d+)\\b");
+ PCRE header_re("\\A((?s).*?)%PDF-(1.\\d+)\\b");
PCRE eof_re("(?s:startxref\\s+(\\d+)\\s+%%EOF\\b)");
if (password)
@@ -221,11 +222,24 @@ QPDF::parse(char const* password)
this->provided_password = password;
}
- std::string line = this->file->readLine(20);
+ // Find the header anywhere in the first 1024 bytes of the file.
+ char buffer[1044];
+ this->file->read(buffer, sizeof(buffer));
+ std::string line(buffer);
PCRE::Match m1 = header_re.match(line.c_str());
if (m1)
{
- this->pdf_version = m1.getMatch(1);
+ size_t global_offset = m1.getMatch(1).length();
+ if (global_offset != 0)
+ {
+ // Emperical evidence strongly suggests that when there is
+ // leading material prior to the PDF header, all explicit
+ // offsets in the file are such that 0 points to the
+ // beginning of the header.
+ QTC::TC("qpdf", "QPDF global offset");
+ this->file = new OffsetInputSource(this->file, global_offset);
+ }
+ this->pdf_version = m1.getMatch(2);
if (atof(this->pdf_version.c_str()) < 1.2)
{
this->tokenizer.allowPoundAnywhereInName();