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 | 1061 | QPDFObjectHandle readObjectInStream(std::shared_ptr<InputSource>& input, int obj); |
| 1062 | 1062 | size_t recoverStreamLength( |
| 1063 | 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 | 1066 | QPDFObjectHandle readObjectAtOffset( |
| 1067 | 1067 | bool attempt_recovery, | ... | ... |
libqpdf/QPDF.cc
| ... | ... | @@ -419,7 +419,7 @@ QPDF::findHeader() |
| 419 | 419 | bool |
| 420 | 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 | 423 | // Position in front of offset token |
| 424 | 424 | m->file->seek(m->file->getLastOffset(), SEEK_SET); |
| 425 | 425 | return true; |
| ... | ... | @@ -457,7 +457,7 @@ QPDF::parse(char const* password) |
| 457 | 457 | PatternFinder sf(*this, &QPDF::findStartxref); |
| 458 | 458 | qpdf_offset_t xref_offset = 0; |
| 459 | 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 | 463 | try { |
| ... | ... | @@ -575,12 +575,12 @@ QPDF::reconstruct_xref(QPDFExc& e) |
| 575 | 575 | // Don't allow very long tokens here during recovery. All the interesting tokens are covered. |
| 576 | 576 | static size_t const MAX_LEN = 10; |
| 577 | 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 | 579 | qpdf_offset_t token_start = m->file->tell() - toO(t1.getValue().length()); |
| 580 | 580 | if (t1.isInteger()) { |
| 581 | 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 | 584 | int obj = QUtil::string_to_int(t1.getValue().c_str()); |
| 585 | 585 | int gen = QUtil::string_to_int(t2.getValue().c_str()); |
| 586 | 586 | if (obj <= m->xref_table_max_id) { |
| ... | ... | @@ -989,7 +989,7 @@ QPDF::read_xrefTable(qpdf_offset_t xref_offset) |
| 989 | 989 | } |
| 990 | 990 | } |
| 991 | 991 | qpdf_offset_t pos = m->file->tell(); |
| 992 | - if (readToken(m->file).isWord("trailer")) { | |
| 992 | + if (readToken(*m->file).isWord("trailer")) { | |
| 993 | 993 | break; |
| 994 | 994 | } else { |
| 995 | 995 | m->file->seek(pos, SEEK_SET); |
| ... | ... | @@ -1470,7 +1470,7 @@ QPDF::readTrailer() |
| 1470 | 1470 | // Nothing in the PDF spec appears to allow empty objects, but they have been encountered in |
| 1471 | 1471 | // actual PDF files and Adobe Reader appears to ignore them. |
| 1472 | 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 | 1474 | warn(damagedPDF("trailer", m->file->tell(), "stream keyword found in trailer")); |
| 1475 | 1475 | } |
| 1476 | 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 | 1496 | warn(damagedPDF(*m->file, m->file->getLastOffset(), "empty object treated as null")); |
| 1497 | 1497 | return object; |
| 1498 | 1498 | } |
| 1499 | - auto token = readToken(m->file); | |
| 1499 | + auto token = readToken(*m->file); | |
| 1500 | 1500 | if (object.isDictionary() && token.isWord("stream")) { |
| 1501 | 1501 | readStream(object, og, offset); |
| 1502 | - token = readToken(m->file); | |
| 1502 | + token = readToken(*m->file); | |
| 1503 | 1503 | } |
| 1504 | 1504 | if (!token.isWord("endobj")) { |
| 1505 | 1505 | QTC::TC("qpdf", "QPDF err expected endobj"); |
| ... | ... | @@ -1535,7 +1535,7 @@ QPDF::readStream(QPDFObjectHandle& object, QPDFObjGen og, qpdf_offset_t offset) |
| 1535 | 1535 | // Seek in two steps to avoid potential integer overflow |
| 1536 | 1536 | m->file->seek(stream_offset, SEEK_SET); |
| 1537 | 1537 | m->file->seek(toO(length), SEEK_CUR); |
| 1538 | - if (!readToken(m->file).isWord("endstream")) { | |
| 1538 | + if (!readToken(*m->file).isWord("endstream")) { | |
| 1539 | 1539 | QTC::TC("qpdf", "QPDF missing endstream"); |
| 1540 | 1540 | throw damagedPDF("expected endstream"); |
| 1541 | 1541 | } |
| ... | ... | @@ -1622,7 +1622,7 @@ bool |
| 1622 | 1622 | QPDF::findEndstream() |
| 1623 | 1623 | { |
| 1624 | 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 | 1626 | if (t.isWord("endobj") || t.isWord("endstream")) { |
| 1627 | 1627 | m->file->seek(m->file->getLastOffset(), SEEK_SET); |
| 1628 | 1628 | return true; |
| ... | ... | @@ -1642,7 +1642,7 @@ QPDF::recoverStreamLength( |
| 1642 | 1642 | if (m->file->findFirst("end", stream_offset, 0, ef)) { |
| 1643 | 1643 | length = toS(m->file->tell() - stream_offset); |
| 1644 | 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 | 1646 | if (t.getValue() == "endobj") { |
| 1647 | 1647 | m->file->seek(m->file->getLastOffset(), SEEK_SET); |
| 1648 | 1648 | } |
| ... | ... | @@ -1685,7 +1685,7 @@ QPDF::recoverStreamLength( |
| 1685 | 1685 | } |
| 1686 | 1686 | |
| 1687 | 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 | 1690 | return m->tokenizer.readToken(input, m->last_object_description, true, max_len); |
| 1691 | 1691 | } |
| ... | ... | @@ -1728,20 +1728,20 @@ QPDF::readObjectAtOffset( |
| 1728 | 1728 | |
| 1729 | 1729 | m->file->seek(offset, SEEK_SET); |
| 1730 | 1730 | try { |
| 1731 | - QPDFTokenizer::Token tobjid = readToken(m->file); | |
| 1731 | + QPDFTokenizer::Token tobjid = readToken(*m->file); | |
| 1732 | 1732 | bool objidok = tobjid.isInteger(); |
| 1733 | 1733 | QTC::TC("qpdf", "QPDF check objid", objidok ? 1 : 0); |
| 1734 | 1734 | if (!objidok) { |
| 1735 | 1735 | QTC::TC("qpdf", "QPDF expected n n obj"); |
| 1736 | 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 | 1739 | bool genok = tgen.isInteger(); |
| 1740 | 1740 | QTC::TC("qpdf", "QPDF check generation", genok ? 1 : 0); |
| 1741 | 1741 | if (!genok) { |
| 1742 | 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 | 1746 | bool objok = tobj.isWord("obj"); |
| 1747 | 1747 | QTC::TC("qpdf", "QPDF check obj", objok ? 1 : 0); |
| ... | ... | @@ -1954,8 +1954,8 @@ QPDF::resolveObjectsInStream(int obj_stream_number) |
| 1954 | 1954 | bp.get())); |
| 1955 | 1955 | |
| 1956 | 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 | 1959 | if (!(tnum.isInteger() && toffset.isInteger())) { |
| 1960 | 1960 | throw damagedPDF( |
| 1961 | 1961 | *input, | ... | ... |
libqpdf/QPDF_linearization.cc
| ... | ... | @@ -118,9 +118,10 @@ QPDF::isLinearized() |
| 118 | 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 | 125 | lindict_obj = toI(QUtil::string_to_ll(t1.getValue().c_str())); |
| 125 | 126 | } |
| 126 | 127 | } | ... | ... |