Commit 87ee8ad0710ccc8e7712487caaf707032974dca1
1 parent
77d1a0cf
In QPDFParser constructor add add parameter parse_pdf
Prepare for treating indirect references differently depending on whether we are parsing a PDF file (in which case reference to objects not in the xref table are null even if they are in the object cache) or whether parse from user code (in which case an indirect reference can refer to a user created object).
Showing
6 changed files
with
16 additions
and
11 deletions
libqpdf/QPDF.cc
| ... | ... | @@ -1462,7 +1462,8 @@ QPDF::readTrailer() |
| 1462 | 1462 | { |
| 1463 | 1463 | qpdf_offset_t offset = m->file->tell(); |
| 1464 | 1464 | bool empty = false; |
| 1465 | - auto object = QPDFParser(m->file, "trailer", m->tokenizer, nullptr, this).parse(empty, false); | |
| 1465 | + auto object = | |
| 1466 | + QPDFParser(m->file, "trailer", m->tokenizer, nullptr, this, true).parse(empty, false); | |
| 1466 | 1467 | if (empty) { |
| 1467 | 1468 | // Nothing in the PDF spec appears to allow empty objects, but they have been encountered in |
| 1468 | 1469 | // actual PDF files and Adobe Reader appears to ignore them. |
| ... | ... | @@ -1484,8 +1485,9 @@ QPDF::readObject(std::string const& description, QPDFObjGen og) |
| 1484 | 1485 | |
| 1485 | 1486 | StringDecrypter decrypter{this, og}; |
| 1486 | 1487 | StringDecrypter* decrypter_ptr = m->encp->encrypted ? &decrypter : nullptr; |
| 1487 | - auto object = QPDFParser(m->file, m->last_object_description, m->tokenizer, decrypter_ptr, this) | |
| 1488 | - .parse(empty, false); | |
| 1488 | + auto object = | |
| 1489 | + QPDFParser(m->file, m->last_object_description, m->tokenizer, decrypter_ptr, this, true) | |
| 1490 | + .parse(empty, false); | |
| 1489 | 1491 | if (empty) { |
| 1490 | 1492 | // Nothing in the PDF spec appears to allow empty objects, but they have been encountered in |
| 1491 | 1493 | // actual PDF files and Adobe Reader appears to ignore them. |
| ... | ... | @@ -1604,7 +1606,7 @@ QPDF::readObjectInStream(std::shared_ptr<InputSource>& input, int obj) |
| 1604 | 1606 | m->last_object_description += " 0"; |
| 1605 | 1607 | |
| 1606 | 1608 | bool empty = false; |
| 1607 | - auto object = QPDFParser(input, m->last_object_description, m->tokenizer, nullptr, this) | |
| 1609 | + auto object = QPDFParser(input, m->last_object_description, m->tokenizer, nullptr, this, true) | |
| 1608 | 1610 | .parse(empty, false); |
| 1609 | 1611 | if (empty) { |
| 1610 | 1612 | // Nothing in the PDF spec appears to allow empty objects, but they have been encountered in | ... | ... |
libqpdf/QPDFObjectHandle.cc
| ... | ... | @@ -2146,7 +2146,8 @@ QPDFObjectHandle::parseContentStream_data( |
| 2146 | 2146 | tokenizer.readToken(input, "content", true); |
| 2147 | 2147 | qpdf_offset_t offset = input->getLastOffset(); |
| 2148 | 2148 | input->seek(offset, SEEK_SET); |
| 2149 | - auto obj = QPDFParser(input, "content", tokenizer, nullptr, context).parse(empty, true); | |
| 2149 | + auto obj = | |
| 2150 | + QPDFParser(input, "content", tokenizer, nullptr, context, false).parse(empty, true); | |
| 2150 | 2151 | if (!obj.isInitialized()) { |
| 2151 | 2152 | // EOF |
| 2152 | 2153 | break; |
| ... | ... | @@ -2205,7 +2206,8 @@ QPDFObjectHandle::parse( |
| 2205 | 2206 | StringDecrypter* decrypter, |
| 2206 | 2207 | QPDF* context) |
| 2207 | 2208 | { |
| 2208 | - return QPDFParser(input, object_description, tokenizer, decrypter, context).parse(empty, false); | |
| 2209 | + return QPDFParser(input, object_description, tokenizer, decrypter, context, false) | |
| 2210 | + .parse(empty, false); | |
| 2209 | 2211 | } |
| 2210 | 2212 | |
| 2211 | 2213 | #ifndef QPDF_FUTURE | ... | ... |
libqpdf/QPDFOutlineDocumentHelper.cc
| ... | ... | @@ -71,7 +71,7 @@ QPDFOutlineDocumentHelper::resolveNamedDest(QPDFObjectHandle name) |
| 71 | 71 | m->dest_dict = qpdf.getRoot().getKey("/Dests"); |
| 72 | 72 | } |
| 73 | 73 | QTC::TC("qpdf", "QPDFOutlineDocumentHelper name named dest"); |
| 74 | - result= m->dest_dict.getKeyIfDict(name.getName()); | |
| 74 | + result = m->dest_dict.getKeyIfDict(name.getName()); | |
| 75 | 75 | } else if (name.isString()) { |
| 76 | 76 | if (!m->names_dest) { |
| 77 | 77 | auto dests = qpdf.getRoot().getKey("/Names").getKeyIfDict("/Dests"); | ... | ... |
libqpdf/QPDF_json.cc
| ... | ... | @@ -272,10 +272,10 @@ class QPDF::JSONReactor: public JSON::Reactor |
| 272 | 272 | struct StackFrame |
| 273 | 273 | { |
| 274 | 274 | StackFrame(state_e state) : |
| 275 | - state(state){}; | |
| 275 | + state(state) {}; | |
| 276 | 276 | StackFrame(state_e state, QPDFObjectHandle&& object) : |
| 277 | 277 | state(state), |
| 278 | - object(object){}; | |
| 278 | + object(object) {}; | |
| 279 | 279 | state_e state; |
| 280 | 280 | QPDFObjectHandle object; |
| 281 | 281 | }; | ... | ... |
libqpdf/qpdf/QPDFParser.hh
| ... | ... | @@ -16,7 +16,8 @@ class QPDFParser |
| 16 | 16 | std::string const& object_description, |
| 17 | 17 | QPDFTokenizer& tokenizer, |
| 18 | 18 | QPDFObjectHandle::StringDecrypter* decrypter, |
| 19 | - QPDF* context) : | |
| 19 | + QPDF* context, | |
| 20 | + bool parse_pdf) : | |
| 20 | 21 | input(input), |
| 21 | 22 | object_description(object_description), |
| 22 | 23 | tokenizer(tokenizer), | ... | ... |