Commit ba3953f1bf20d5d0331f253e4da1e3e3ce10e895
1 parent
5754ab8b
Tune QPDF::readObject
Showing
1 changed file
with
14 additions
and
24 deletions
libqpdf/QPDF.cc
| ... | ... | @@ -1291,32 +1291,27 @@ QPDF::readObject(std::string const& description, QPDFObjGen og) |
| 1291 | 1291 | { |
| 1292 | 1292 | setLastObjectDescription(description, og); |
| 1293 | 1293 | qpdf_offset_t offset = m->file->tell(); |
| 1294 | - | |
| 1295 | 1294 | bool empty = false; |
| 1296 | - std::shared_ptr<StringDecrypter> decrypter_ph; | |
| 1297 | - StringDecrypter* decrypter = nullptr; | |
| 1298 | - if (m->encp->encrypted) { | |
| 1299 | - decrypter_ph = std::make_unique<StringDecrypter>(this, og); | |
| 1300 | - decrypter = decrypter_ph.get(); | |
| 1301 | - } | |
| 1302 | - auto object = QPDFParser(m->file, m->last_object_description, m->tokenizer, decrypter, this) | |
| 1295 | + | |
| 1296 | + StringDecrypter decrypter{this, og}; | |
| 1297 | + StringDecrypter* decrypter_ptr = m->encp->encrypted ? &decrypter : nullptr; | |
| 1298 | + auto object = QPDFParser(m->file, m->last_object_description, m->tokenizer, decrypter_ptr, this) | |
| 1303 | 1299 | .parse(empty, false); |
| 1304 | 1300 | if (empty) { |
| 1305 | 1301 | // Nothing in the PDF spec appears to allow empty objects, but they have been encountered in |
| 1306 | 1302 | // actual PDF files and Adobe Reader appears to ignore them. |
| 1307 | 1303 | warn(damagedPDF(m->file, m->file->getLastOffset(), "empty object treated as null")); |
| 1308 | - } else if (object.isDictionary()) { | |
| 1309 | - // check for stream | |
| 1310 | - qpdf_offset_t cur_offset = m->file->tell(); | |
| 1311 | - if (readToken(m->file).isWord("stream")) { | |
| 1312 | - readStream(object, og, offset); | |
| 1313 | - } else { | |
| 1314 | - m->file->seek(cur_offset, SEEK_SET); | |
| 1315 | - } | |
| 1304 | + return object; | |
| 1305 | + } | |
| 1306 | + auto token = readToken(m->file); | |
| 1307 | + if (object.isDictionary() && token.isWord("stream")) { | |
| 1308 | + readStream(object, og, offset); | |
| 1309 | + token = readToken(m->file); | |
| 1310 | + } | |
| 1311 | + if (!token.isWord("endobj")) { | |
| 1312 | + QTC::TC("qpdf", "QPDF err expected endobj"); | |
| 1313 | + warn(damagedPDF("expected endobj")); | |
| 1316 | 1314 | } |
| 1317 | - | |
| 1318 | - // Override last_offset so that it points to the beginning of the object we just read | |
| 1319 | - m->file->setLastOffset(offset); | |
| 1320 | 1315 | return object; |
| 1321 | 1316 | } |
| 1322 | 1317 | |
| ... | ... | @@ -1602,11 +1597,6 @@ QPDF::readObjectAtOffset( |
| 1602 | 1597 | |
| 1603 | 1598 | QPDFObjectHandle oh = readObject(description, og); |
| 1604 | 1599 | |
| 1605 | - if (!readToken(m->file).isWord("endobj")) { | |
| 1606 | - QTC::TC("qpdf", "QPDF err expected endobj"); | |
| 1607 | - warn(damagedPDF("expected endobj")); | |
| 1608 | - } | |
| 1609 | - | |
| 1610 | 1600 | if (isUnresolved(og)) { |
| 1611 | 1601 | // Store the object in the cache here so it gets cached whether we first know the offset or |
| 1612 | 1602 | // whether we first know the object ID and generation (in which we case we would get here | ... | ... |