Commit 258343fcc97ce0e39f8f6f34f2c702999732beb6
1 parent
20edfb3f
In QPDF::readToken change input parameter to InputSource&
Showing
3 changed files
with
23 additions
and
22 deletions
include/qpdf/QPDF.hh
| @@ -1061,7 +1061,7 @@ class QPDF | @@ -1061,7 +1061,7 @@ class QPDF | ||
| 1061 | QPDFObjectHandle readObjectInStream(std::shared_ptr<InputSource>& input, int obj); | 1061 | QPDFObjectHandle readObjectInStream(std::shared_ptr<InputSource>& input, int obj); |
| 1062 | size_t recoverStreamLength( | 1062 | size_t recoverStreamLength( |
| 1063 | std::shared_ptr<InputSource> input, QPDFObjGen const& og, qpdf_offset_t stream_offset); | 1063 | std::shared_ptr<InputSource> input, QPDFObjGen const& og, qpdf_offset_t stream_offset); |
| 1064 | - QPDFTokenizer::Token readToken(std::shared_ptr<InputSource>, size_t max_len = 0); | 1064 | + QPDFTokenizer::Token readToken(InputSource&, size_t max_len = 0); |
| 1065 | 1065 | ||
| 1066 | QPDFObjectHandle readObjectAtOffset( | 1066 | QPDFObjectHandle readObjectAtOffset( |
| 1067 | bool attempt_recovery, | 1067 | bool attempt_recovery, |
libqpdf/QPDF.cc
| @@ -419,7 +419,7 @@ QPDF::findHeader() | @@ -419,7 +419,7 @@ QPDF::findHeader() | ||
| 419 | bool | 419 | bool |
| 420 | QPDF::findStartxref() | 420 | QPDF::findStartxref() |
| 421 | { | 421 | { |
| 422 | - if (readToken(m->file).isWord("startxref") && readToken(m->file).isInteger()) { | 422 | + if (readToken(*m->file).isWord("startxref") && readToken(*m->file).isInteger()) { |
| 423 | // Position in front of offset token | 423 | // Position in front of offset token |
| 424 | m->file->seek(m->file->getLastOffset(), SEEK_SET); | 424 | m->file->seek(m->file->getLastOffset(), SEEK_SET); |
| 425 | return true; | 425 | return true; |
| @@ -457,7 +457,7 @@ QPDF::parse(char const* password) | @@ -457,7 +457,7 @@ QPDF::parse(char const* password) | ||
| 457 | PatternFinder sf(*this, &QPDF::findStartxref); | 457 | PatternFinder sf(*this, &QPDF::findStartxref); |
| 458 | qpdf_offset_t xref_offset = 0; | 458 | qpdf_offset_t xref_offset = 0; |
| 459 | if (m->file->findLast("startxref", start_offset, 0, sf)) { | 459 | if (m->file->findLast("startxref", start_offset, 0, sf)) { |
| 460 | - xref_offset = QUtil::string_to_ll(readToken(m->file).getValue().c_str()); | 460 | + xref_offset = QUtil::string_to_ll(readToken(*m->file).getValue().c_str()); |
| 461 | } | 461 | } |
| 462 | 462 | ||
| 463 | try { | 463 | try { |
| @@ -575,12 +575,12 @@ QPDF::reconstruct_xref(QPDFExc& e) | @@ -575,12 +575,12 @@ QPDF::reconstruct_xref(QPDFExc& e) | ||
| 575 | // Don't allow very long tokens here during recovery. All the interesting tokens are covered. | 575 | // Don't allow very long tokens here during recovery. All the interesting tokens are covered. |
| 576 | static size_t const MAX_LEN = 10; | 576 | static size_t const MAX_LEN = 10; |
| 577 | while (m->file->tell() < eof) { | 577 | while (m->file->tell() < eof) { |
| 578 | - QPDFTokenizer::Token t1 = readToken(m->file, MAX_LEN); | 578 | + QPDFTokenizer::Token t1 = readToken(*m->file, MAX_LEN); |
| 579 | qpdf_offset_t token_start = m->file->tell() - toO(t1.getValue().length()); | 579 | qpdf_offset_t token_start = m->file->tell() - toO(t1.getValue().length()); |
| 580 | if (t1.isInteger()) { | 580 | if (t1.isInteger()) { |
| 581 | auto pos = m->file->tell(); | 581 | auto pos = m->file->tell(); |
| 582 | - QPDFTokenizer::Token t2 = readToken(m->file, MAX_LEN); | ||
| 583 | - if ((t2.isInteger()) && (readToken(m->file, MAX_LEN).isWord("obj"))) { | 582 | + QPDFTokenizer::Token t2 = readToken(*m->file, MAX_LEN); |
| 583 | + if ((t2.isInteger()) && (readToken(*m->file, MAX_LEN).isWord("obj"))) { | ||
| 584 | int obj = QUtil::string_to_int(t1.getValue().c_str()); | 584 | int obj = QUtil::string_to_int(t1.getValue().c_str()); |
| 585 | int gen = QUtil::string_to_int(t2.getValue().c_str()); | 585 | int gen = QUtil::string_to_int(t2.getValue().c_str()); |
| 586 | if (obj <= m->xref_table_max_id) { | 586 | if (obj <= m->xref_table_max_id) { |
| @@ -989,7 +989,7 @@ QPDF::read_xrefTable(qpdf_offset_t xref_offset) | @@ -989,7 +989,7 @@ QPDF::read_xrefTable(qpdf_offset_t xref_offset) | ||
| 989 | } | 989 | } |
| 990 | } | 990 | } |
| 991 | qpdf_offset_t pos = m->file->tell(); | 991 | qpdf_offset_t pos = m->file->tell(); |
| 992 | - if (readToken(m->file).isWord("trailer")) { | 992 | + if (readToken(*m->file).isWord("trailer")) { |
| 993 | break; | 993 | break; |
| 994 | } else { | 994 | } else { |
| 995 | m->file->seek(pos, SEEK_SET); | 995 | m->file->seek(pos, SEEK_SET); |
| @@ -1470,7 +1470,7 @@ QPDF::readTrailer() | @@ -1470,7 +1470,7 @@ QPDF::readTrailer() | ||
| 1470 | // Nothing in the PDF spec appears to allow empty objects, but they have been encountered in | 1470 | // Nothing in the PDF spec appears to allow empty objects, but they have been encountered in |
| 1471 | // actual PDF files and Adobe Reader appears to ignore them. | 1471 | // actual PDF files and Adobe Reader appears to ignore them. |
| 1472 | warn(damagedPDF("trailer", "empty object treated as null")); | 1472 | warn(damagedPDF("trailer", "empty object treated as null")); |
| 1473 | - } else if (object.isDictionary() && readToken(m->file).isWord("stream")) { | 1473 | + } else if (object.isDictionary() && readToken(*m->file).isWord("stream")) { |
| 1474 | warn(damagedPDF("trailer", m->file->tell(), "stream keyword found in trailer")); | 1474 | warn(damagedPDF("trailer", m->file->tell(), "stream keyword found in trailer")); |
| 1475 | } | 1475 | } |
| 1476 | // Override last_offset so that it points to the beginning of the object we just read | 1476 | // Override last_offset so that it points to the beginning of the object we just read |
| @@ -1496,10 +1496,10 @@ QPDF::readObject(std::string const& description, QPDFObjGen og) | @@ -1496,10 +1496,10 @@ QPDF::readObject(std::string const& description, QPDFObjGen og) | ||
| 1496 | warn(damagedPDF(*m->file, m->file->getLastOffset(), "empty object treated as null")); | 1496 | warn(damagedPDF(*m->file, m->file->getLastOffset(), "empty object treated as null")); |
| 1497 | return object; | 1497 | return object; |
| 1498 | } | 1498 | } |
| 1499 | - auto token = readToken(m->file); | 1499 | + auto token = readToken(*m->file); |
| 1500 | if (object.isDictionary() && token.isWord("stream")) { | 1500 | if (object.isDictionary() && token.isWord("stream")) { |
| 1501 | readStream(object, og, offset); | 1501 | readStream(object, og, offset); |
| 1502 | - token = readToken(m->file); | 1502 | + token = readToken(*m->file); |
| 1503 | } | 1503 | } |
| 1504 | if (!token.isWord("endobj")) { | 1504 | if (!token.isWord("endobj")) { |
| 1505 | QTC::TC("qpdf", "QPDF err expected endobj"); | 1505 | QTC::TC("qpdf", "QPDF err expected endobj"); |
| @@ -1535,7 +1535,7 @@ QPDF::readStream(QPDFObjectHandle& object, QPDFObjGen og, qpdf_offset_t offset) | @@ -1535,7 +1535,7 @@ QPDF::readStream(QPDFObjectHandle& object, QPDFObjGen og, qpdf_offset_t offset) | ||
| 1535 | // Seek in two steps to avoid potential integer overflow | 1535 | // Seek in two steps to avoid potential integer overflow |
| 1536 | m->file->seek(stream_offset, SEEK_SET); | 1536 | m->file->seek(stream_offset, SEEK_SET); |
| 1537 | m->file->seek(toO(length), SEEK_CUR); | 1537 | m->file->seek(toO(length), SEEK_CUR); |
| 1538 | - if (!readToken(m->file).isWord("endstream")) { | 1538 | + if (!readToken(*m->file).isWord("endstream")) { |
| 1539 | QTC::TC("qpdf", "QPDF missing endstream"); | 1539 | QTC::TC("qpdf", "QPDF missing endstream"); |
| 1540 | throw damagedPDF("expected endstream"); | 1540 | throw damagedPDF("expected endstream"); |
| 1541 | } | 1541 | } |
| @@ -1622,7 +1622,7 @@ bool | @@ -1622,7 +1622,7 @@ bool | ||
| 1622 | QPDF::findEndstream() | 1622 | QPDF::findEndstream() |
| 1623 | { | 1623 | { |
| 1624 | // Find endstream or endobj. Position the input at that token. | 1624 | // Find endstream or endobj. Position the input at that token. |
| 1625 | - auto t = readToken(m->file, 20); | 1625 | + auto t = readToken(*m->file, 20); |
| 1626 | if (t.isWord("endobj") || t.isWord("endstream")) { | 1626 | if (t.isWord("endobj") || t.isWord("endstream")) { |
| 1627 | m->file->seek(m->file->getLastOffset(), SEEK_SET); | 1627 | m->file->seek(m->file->getLastOffset(), SEEK_SET); |
| 1628 | return true; | 1628 | return true; |
| @@ -1642,7 +1642,7 @@ QPDF::recoverStreamLength( | @@ -1642,7 +1642,7 @@ QPDF::recoverStreamLength( | ||
| 1642 | if (m->file->findFirst("end", stream_offset, 0, ef)) { | 1642 | if (m->file->findFirst("end", stream_offset, 0, ef)) { |
| 1643 | length = toS(m->file->tell() - stream_offset); | 1643 | length = toS(m->file->tell() - stream_offset); |
| 1644 | // Reread endstream but, if it was endobj, don't skip that. | 1644 | // Reread endstream but, if it was endobj, don't skip that. |
| 1645 | - QPDFTokenizer::Token t = readToken(m->file); | 1645 | + QPDFTokenizer::Token t = readToken(*m->file); |
| 1646 | if (t.getValue() == "endobj") { | 1646 | if (t.getValue() == "endobj") { |
| 1647 | m->file->seek(m->file->getLastOffset(), SEEK_SET); | 1647 | m->file->seek(m->file->getLastOffset(), SEEK_SET); |
| 1648 | } | 1648 | } |
| @@ -1685,7 +1685,7 @@ QPDF::recoverStreamLength( | @@ -1685,7 +1685,7 @@ QPDF::recoverStreamLength( | ||
| 1685 | } | 1685 | } |
| 1686 | 1686 | ||
| 1687 | QPDFTokenizer::Token | 1687 | QPDFTokenizer::Token |
| 1688 | -QPDF::readToken(std::shared_ptr<InputSource> input, size_t max_len) | 1688 | +QPDF::readToken(InputSource& input, size_t max_len) |
| 1689 | { | 1689 | { |
| 1690 | return m->tokenizer.readToken(input, m->last_object_description, true, max_len); | 1690 | return m->tokenizer.readToken(input, m->last_object_description, true, max_len); |
| 1691 | } | 1691 | } |
| @@ -1728,20 +1728,20 @@ QPDF::readObjectAtOffset( | @@ -1728,20 +1728,20 @@ QPDF::readObjectAtOffset( | ||
| 1728 | 1728 | ||
| 1729 | m->file->seek(offset, SEEK_SET); | 1729 | m->file->seek(offset, SEEK_SET); |
| 1730 | try { | 1730 | try { |
| 1731 | - QPDFTokenizer::Token tobjid = readToken(m->file); | 1731 | + QPDFTokenizer::Token tobjid = readToken(*m->file); |
| 1732 | bool objidok = tobjid.isInteger(); | 1732 | bool objidok = tobjid.isInteger(); |
| 1733 | QTC::TC("qpdf", "QPDF check objid", objidok ? 1 : 0); | 1733 | QTC::TC("qpdf", "QPDF check objid", objidok ? 1 : 0); |
| 1734 | if (!objidok) { | 1734 | if (!objidok) { |
| 1735 | QTC::TC("qpdf", "QPDF expected n n obj"); | 1735 | QTC::TC("qpdf", "QPDF expected n n obj"); |
| 1736 | throw damagedPDF(offset, "expected n n obj"); | 1736 | throw damagedPDF(offset, "expected n n obj"); |
| 1737 | } | 1737 | } |
| 1738 | - QPDFTokenizer::Token tgen = readToken(m->file); | 1738 | + QPDFTokenizer::Token tgen = readToken(*m->file); |
| 1739 | bool genok = tgen.isInteger(); | 1739 | bool genok = tgen.isInteger(); |
| 1740 | QTC::TC("qpdf", "QPDF check generation", genok ? 1 : 0); | 1740 | QTC::TC("qpdf", "QPDF check generation", genok ? 1 : 0); |
| 1741 | if (!genok) { | 1741 | if (!genok) { |
| 1742 | throw damagedPDF(offset, "expected n n obj"); | 1742 | throw damagedPDF(offset, "expected n n obj"); |
| 1743 | } | 1743 | } |
| 1744 | - QPDFTokenizer::Token tobj = readToken(m->file); | 1744 | + QPDFTokenizer::Token tobj = readToken(*m->file); |
| 1745 | 1745 | ||
| 1746 | bool objok = tobj.isWord("obj"); | 1746 | bool objok = tobj.isWord("obj"); |
| 1747 | QTC::TC("qpdf", "QPDF check obj", objok ? 1 : 0); | 1747 | QTC::TC("qpdf", "QPDF check obj", objok ? 1 : 0); |
| @@ -1954,8 +1954,8 @@ QPDF::resolveObjectsInStream(int obj_stream_number) | @@ -1954,8 +1954,8 @@ QPDF::resolveObjectsInStream(int obj_stream_number) | ||
| 1954 | bp.get())); | 1954 | bp.get())); |
| 1955 | 1955 | ||
| 1956 | for (int i = 0; i < n; ++i) { | 1956 | for (int i = 0; i < n; ++i) { |
| 1957 | - QPDFTokenizer::Token tnum = readToken(input); | ||
| 1958 | - QPDFTokenizer::Token toffset = readToken(input); | 1957 | + QPDFTokenizer::Token tnum = readToken(*input); |
| 1958 | + QPDFTokenizer::Token toffset = readToken(*input); | ||
| 1959 | if (!(tnum.isInteger() && toffset.isInteger())) { | 1959 | if (!(tnum.isInteger() && toffset.isInteger())) { |
| 1960 | throw damagedPDF( | 1960 | throw damagedPDF( |
| 1961 | *input, | 1961 | *input, |
libqpdf/QPDF_linearization.cc
| @@ -118,9 +118,10 @@ QPDF::isLinearized() | @@ -118,9 +118,10 @@ QPDF::isLinearized() | ||
| 118 | ++p; | 118 | ++p; |
| 119 | } | 119 | } |
| 120 | 120 | ||
| 121 | - QPDFTokenizer::Token t1 = readToken(m->file); | ||
| 122 | - if (t1.isInteger() && readToken(m->file).isInteger() && readToken(m->file).isWord("obj") && | ||
| 123 | - (readToken(m->file).getType() == QPDFTokenizer::tt_dict_open)) { | 121 | + QPDFTokenizer::Token t1 = readToken(*m->file); |
| 122 | + if (t1.isInteger() && readToken(*m->file).isInteger() && | ||
| 123 | + readToken(*m->file).isWord("obj") && | ||
| 124 | + readToken(*m->file).getType() == QPDFTokenizer::tt_dict_open) { | ||
| 124 | lindict_obj = toI(QUtil::string_to_ll(t1.getValue().c_str())); | 125 | lindict_obj = toI(QUtil::string_to_ll(t1.getValue().c_str())); |
| 125 | } | 126 | } |
| 126 | } | 127 | } |