Commit ddfa3a24f04606b7c46fc41bd9cfe8c3f0876bc8
Committed by
GitHub
Merge pull request #1281 from m-holger/input
Replace some std::shared_ptr parameters with reference parameters
Showing
6 changed files
with
59 additions
and
65 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, |
| @@ -1088,14 +1088,11 @@ class QPDF | @@ -1088,14 +1088,11 @@ class QPDF | ||
| 1088 | qpdf_offset_t end_before_space, | 1088 | qpdf_offset_t end_before_space, |
| 1089 | qpdf_offset_t end_after_space); | 1089 | qpdf_offset_t end_after_space); |
| 1090 | static QPDFExc damagedPDF( | 1090 | static QPDFExc damagedPDF( |
| 1091 | - std::shared_ptr<InputSource> const& input, | 1091 | + InputSource& input, |
| 1092 | std::string const& object, | 1092 | std::string const& object, |
| 1093 | qpdf_offset_t offset, | 1093 | qpdf_offset_t offset, |
| 1094 | std::string const& message); | 1094 | std::string const& message); |
| 1095 | - QPDFExc damagedPDF( | ||
| 1096 | - std::shared_ptr<InputSource> const& input, | ||
| 1097 | - qpdf_offset_t offset, | ||
| 1098 | - std::string const& message); | 1095 | + QPDFExc damagedPDF(InputSource& input, qpdf_offset_t offset, std::string const& message); |
| 1099 | QPDFExc damagedPDF(std::string const& object, qpdf_offset_t offset, std::string const& message); | 1096 | QPDFExc damagedPDF(std::string const& object, qpdf_offset_t offset, std::string const& message); |
| 1100 | QPDFExc damagedPDF(std::string const& object, std::string const& message); | 1097 | QPDFExc damagedPDF(std::string const& object, std::string const& message); |
| 1101 | QPDFExc damagedPDF(qpdf_offset_t offset, std::string const& message); | 1098 | QPDFExc damagedPDF(qpdf_offset_t offset, std::string const& message); |
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); |
| @@ -1465,12 +1465,12 @@ QPDF::readTrailer() | @@ -1465,12 +1465,12 @@ QPDF::readTrailer() | ||
| 1465 | qpdf_offset_t offset = m->file->tell(); | 1465 | qpdf_offset_t offset = m->file->tell(); |
| 1466 | bool empty = false; | 1466 | bool empty = false; |
| 1467 | auto object = | 1467 | auto object = |
| 1468 | - QPDFParser(m->file, "trailer", m->tokenizer, nullptr, this, true).parse(empty, false); | 1468 | + QPDFParser(*m->file, "trailer", m->tokenizer, nullptr, this, true).parse(empty, false); |
| 1469 | if (empty) { | 1469 | if (empty) { |
| 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 |
| @@ -1488,18 +1488,18 @@ QPDF::readObject(std::string const& description, QPDFObjGen og) | @@ -1488,18 +1488,18 @@ QPDF::readObject(std::string const& description, QPDFObjGen og) | ||
| 1488 | StringDecrypter decrypter{this, og}; | 1488 | StringDecrypter decrypter{this, og}; |
| 1489 | StringDecrypter* decrypter_ptr = m->encp->encrypted ? &decrypter : nullptr; | 1489 | StringDecrypter* decrypter_ptr = m->encp->encrypted ? &decrypter : nullptr; |
| 1490 | auto object = | 1490 | auto object = |
| 1491 | - QPDFParser(m->file, m->last_object_description, m->tokenizer, decrypter_ptr, this, true) | 1491 | + QPDFParser(*m->file, m->last_object_description, m->tokenizer, decrypter_ptr, this, true) |
| 1492 | .parse(empty, false); | 1492 | .parse(empty, false); |
| 1493 | if (empty) { | 1493 | if (empty) { |
| 1494 | // Nothing in the PDF spec appears to allow empty objects, but they have been encountered in | 1494 | // Nothing in the PDF spec appears to allow empty objects, but they have been encountered in |
| 1495 | // actual PDF files and Adobe Reader appears to ignore them. | 1495 | // actual PDF files and Adobe Reader appears to ignore them. |
| 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 | } |
| @@ -1608,12 +1608,12 @@ QPDF::readObjectInStream(std::shared_ptr<InputSource>& input, int obj) | @@ -1608,12 +1608,12 @@ QPDF::readObjectInStream(std::shared_ptr<InputSource>& input, int obj) | ||
| 1608 | m->last_object_description += " 0"; | 1608 | m->last_object_description += " 0"; |
| 1609 | 1609 | ||
| 1610 | bool empty = false; | 1610 | bool empty = false; |
| 1611 | - auto object = QPDFParser(input, m->last_object_description, m->tokenizer, nullptr, this, true) | 1611 | + auto object = QPDFParser(*input, m->last_object_description, m->tokenizer, nullptr, this, true) |
| 1612 | .parse(empty, false); | 1612 | .parse(empty, false); |
| 1613 | if (empty) { | 1613 | if (empty) { |
| 1614 | // Nothing in the PDF spec appears to allow empty objects, but they have been encountered in | 1614 | // Nothing in the PDF spec appears to allow empty objects, but they have been encountered in |
| 1615 | // actual PDF files and Adobe Reader appears to ignore them. | 1615 | // actual PDF files and Adobe Reader appears to ignore them. |
| 1616 | - warn(damagedPDF(input, input->getLastOffset(), "empty object treated as null")); | 1616 | + warn(damagedPDF(*input, input->getLastOffset(), "empty object treated as null")); |
| 1617 | } | 1617 | } |
| 1618 | return object; | 1618 | return object; |
| 1619 | } | 1619 | } |
| @@ -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; |
| @@ -1635,14 +1635,14 @@ QPDF::recoverStreamLength( | @@ -1635,14 +1635,14 @@ QPDF::recoverStreamLength( | ||
| 1635 | std::shared_ptr<InputSource> input, QPDFObjGen const& og, qpdf_offset_t stream_offset) | 1635 | std::shared_ptr<InputSource> input, QPDFObjGen const& og, qpdf_offset_t stream_offset) |
| 1636 | { | 1636 | { |
| 1637 | // Try to reconstruct stream length by looking for endstream or endobj | 1637 | // Try to reconstruct stream length by looking for endstream or endobj |
| 1638 | - warn(damagedPDF(input, stream_offset, "attempting to recover stream length")); | 1638 | + warn(damagedPDF(*input, stream_offset, "attempting to recover stream length")); |
| 1639 | 1639 | ||
| 1640 | PatternFinder ef(*this, &QPDF::findEndstream); | 1640 | PatternFinder ef(*this, &QPDF::findEndstream); |
| 1641 | size_t length = 0; | 1641 | size_t length = 0; |
| 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 | } |
| @@ -1674,10 +1674,10 @@ QPDF::recoverStreamLength( | @@ -1674,10 +1674,10 @@ QPDF::recoverStreamLength( | ||
| 1674 | 1674 | ||
| 1675 | if (length == 0) { | 1675 | if (length == 0) { |
| 1676 | warn(damagedPDF( | 1676 | warn(damagedPDF( |
| 1677 | - input, stream_offset, "unable to recover stream data; treating stream as empty")); | 1677 | + *input, stream_offset, "unable to recover stream data; treating stream as empty")); |
| 1678 | } else { | 1678 | } else { |
| 1679 | - warn( | ||
| 1680 | - damagedPDF(input, stream_offset, "recovered stream length: " + std::to_string(length))); | 1679 | + warn(damagedPDF( |
| 1680 | + *input, stream_offset, "recovered stream length: " + std::to_string(length))); | ||
| 1681 | } | 1681 | } |
| 1682 | 1682 | ||
| 1683 | QTC::TC("qpdf", "QPDF recovered stream length"); | 1683 | QTC::TC("qpdf", "QPDF recovered stream length"); |
| @@ -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,11 +1954,11 @@ QPDF::resolveObjectsInStream(int obj_stream_number) | @@ -1954,11 +1954,11 @@ 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, |
| 1962 | m->last_object_description, | 1962 | m->last_object_description, |
| 1963 | input->getLastOffset(), | 1963 | input->getLastOffset(), |
| 1964 | "expected integer in object stream header"); | 1964 | "expected integer in object stream header"); |
| @@ -1972,7 +1972,7 @@ QPDF::resolveObjectsInStream(int obj_stream_number) | @@ -1972,7 +1972,7 @@ QPDF::resolveObjectsInStream(int obj_stream_number) | ||
| 1972 | if (num == obj_stream_number) { | 1972 | if (num == obj_stream_number) { |
| 1973 | QTC::TC("qpdf", "QPDF ignore self-referential object stream"); | 1973 | QTC::TC("qpdf", "QPDF ignore self-referential object stream"); |
| 1974 | warn(damagedPDF( | 1974 | warn(damagedPDF( |
| 1975 | - input, | 1975 | + *input, |
| 1976 | m->last_object_description, | 1976 | m->last_object_description, |
| 1977 | input->getLastOffset(), | 1977 | input->getLastOffset(), |
| 1978 | "object stream claims to contain itself")); | 1978 | "object stream claims to contain itself")); |
| @@ -2726,7 +2726,7 @@ QPDF::pipeStreamData( | @@ -2726,7 +2726,7 @@ QPDF::pipeStreamData( | ||
| 2726 | file->seek(offset, SEEK_SET); | 2726 | file->seek(offset, SEEK_SET); |
| 2727 | auto buf = std::make_unique<char[]>(length); | 2727 | auto buf = std::make_unique<char[]>(length); |
| 2728 | if (auto read = file->read(buf.get(), length); read != length) { | 2728 | if (auto read = file->read(buf.get(), length); read != length) { |
| 2729 | - throw damagedPDF(file, "", offset + toO(read), "unexpected EOF reading stream data"); | 2729 | + throw damagedPDF(*file, "", offset + toO(read), "unexpected EOF reading stream data"); |
| 2730 | } | 2730 | } |
| 2731 | pipeline->write(buf.get(), length); | 2731 | pipeline->write(buf.get(), length); |
| 2732 | attempted_finish = true; | 2732 | attempted_finish = true; |
| @@ -2742,7 +2742,7 @@ QPDF::pipeStreamData( | @@ -2742,7 +2742,7 @@ QPDF::pipeStreamData( | ||
| 2742 | qpdf_for_warning.warn( | 2742 | qpdf_for_warning.warn( |
| 2743 | // line-break | 2743 | // line-break |
| 2744 | damagedPDF( | 2744 | damagedPDF( |
| 2745 | - file, | 2745 | + *file, |
| 2746 | "", | 2746 | "", |
| 2747 | file->getLastOffset(), | 2747 | file->getLastOffset(), |
| 2748 | ("error decoding stream data for object " + og.unparse(' ') + ": " + | 2748 | ("error decoding stream data for object " + og.unparse(' ') + ": " + |
| @@ -2751,7 +2751,7 @@ QPDF::pipeStreamData( | @@ -2751,7 +2751,7 @@ QPDF::pipeStreamData( | ||
| 2751 | qpdf_for_warning.warn( | 2751 | qpdf_for_warning.warn( |
| 2752 | // line-break | 2752 | // line-break |
| 2753 | damagedPDF( | 2753 | damagedPDF( |
| 2754 | - file, | 2754 | + *file, |
| 2755 | "", | 2755 | "", |
| 2756 | file->getLastOffset(), | 2756 | file->getLastOffset(), |
| 2757 | "stream will be re-processed without filtering to avoid data loss")); | 2757 | "stream will be re-processed without filtering to avoid data loss")); |
| @@ -2825,19 +2825,15 @@ QPDF::stopOnError(std::string const& message) | @@ -2825,19 +2825,15 @@ QPDF::stopOnError(std::string const& message) | ||
| 2825 | // Return an exception of type qpdf_e_damaged_pdf. | 2825 | // Return an exception of type qpdf_e_damaged_pdf. |
| 2826 | QPDFExc | 2826 | QPDFExc |
| 2827 | QPDF::damagedPDF( | 2827 | QPDF::damagedPDF( |
| 2828 | - std::shared_ptr<InputSource> const& input, | ||
| 2829 | - std::string const& object, | ||
| 2830 | - qpdf_offset_t offset, | ||
| 2831 | - std::string const& message) | 2828 | + InputSource& input, std::string const& object, qpdf_offset_t offset, std::string const& message) |
| 2832 | { | 2829 | { |
| 2833 | - return {qpdf_e_damaged_pdf, input->getName(), object, offset, message}; | 2830 | + return {qpdf_e_damaged_pdf, input.getName(), object, offset, message}; |
| 2834 | } | 2831 | } |
| 2835 | 2832 | ||
| 2836 | // Return an exception of type qpdf_e_damaged_pdf. The object is taken from | 2833 | // Return an exception of type qpdf_e_damaged_pdf. The object is taken from |
| 2837 | // m->last_object_description. | 2834 | // m->last_object_description. |
| 2838 | QPDFExc | 2835 | QPDFExc |
| 2839 | -QPDF::damagedPDF( | ||
| 2840 | - std::shared_ptr<InputSource> const& input, qpdf_offset_t offset, std::string const& message) | 2836 | +QPDF::damagedPDF(InputSource& input, qpdf_offset_t offset, std::string const& message) |
| 2841 | { | 2837 | { |
| 2842 | return damagedPDF(input, m->last_object_description, offset, message); | 2838 | return damagedPDF(input, m->last_object_description, offset, message); |
| 2843 | } | 2839 | } |
libqpdf/QPDFObjectHandle.cc
| @@ -2164,7 +2164,7 @@ QPDFObjectHandle::parseContentStream_data( | @@ -2164,7 +2164,7 @@ QPDFObjectHandle::parseContentStream_data( | ||
| 2164 | qpdf_offset_t offset = input->getLastOffset(); | 2164 | qpdf_offset_t offset = input->getLastOffset(); |
| 2165 | input->seek(offset, SEEK_SET); | 2165 | input->seek(offset, SEEK_SET); |
| 2166 | auto obj = | 2166 | auto obj = |
| 2167 | - QPDFParser(input, "content", tokenizer, nullptr, context, false).parse(empty, true); | 2167 | + QPDFParser(*input, "content", tokenizer, nullptr, context, false).parse(empty, true); |
| 2168 | if (!obj.isInitialized()) { | 2168 | if (!obj.isInitialized()) { |
| 2169 | // EOF | 2169 | // EOF |
| 2170 | break; | 2170 | break; |
| @@ -2223,7 +2223,7 @@ QPDFObjectHandle::parse( | @@ -2223,7 +2223,7 @@ QPDFObjectHandle::parse( | ||
| 2223 | StringDecrypter* decrypter, | 2223 | StringDecrypter* decrypter, |
| 2224 | QPDF* context) | 2224 | QPDF* context) |
| 2225 | { | 2225 | { |
| 2226 | - return QPDFParser(input, object_description, tokenizer, decrypter, context, false) | 2226 | + return QPDFParser(*input, object_description, tokenizer, decrypter, context, false) |
| 2227 | .parse(empty, false); | 2227 | .parse(empty, false); |
| 2228 | } | 2228 | } |
| 2229 | 2229 |
libqpdf/QPDFParser.cc
| @@ -33,9 +33,9 @@ QPDFParser::parse(bool& empty, bool content_stream) | @@ -33,9 +33,9 @@ QPDFParser::parse(bool& empty, bool content_stream) | ||
| 33 | 33 | ||
| 34 | QPDF::ParseGuard pg(context); | 34 | QPDF::ParseGuard pg(context); |
| 35 | empty = false; | 35 | empty = false; |
| 36 | - start = input->tell(); | 36 | + start = input.tell(); |
| 37 | 37 | ||
| 38 | - if (!tokenizer.nextToken(*input, object_description)) { | 38 | + if (!tokenizer.nextToken(input, object_description)) { |
| 39 | warn(tokenizer.getErrorMessage()); | 39 | warn(tokenizer.getErrorMessage()); |
| 40 | } | 40 | } |
| 41 | 41 | ||
| @@ -101,7 +101,7 @@ QPDFParser::parse(bool& empty, bool content_stream) | @@ -101,7 +101,7 @@ QPDFParser::parse(bool& empty, bool content_stream) | ||
| 101 | } else if (value == "endobj") { | 101 | } else if (value == "endobj") { |
| 102 | // We just saw endobj without having read anything. Treat this as a null and do | 102 | // We just saw endobj without having read anything. Treat this as a null and do |
| 103 | // not move the input source's offset. | 103 | // not move the input source's offset. |
| 104 | - input->seek(input->getLastOffset(), SEEK_SET); | 104 | + input.seek(input.getLastOffset(), SEEK_SET); |
| 105 | empty = true; | 105 | empty = true; |
| 106 | return {QPDF_Null::create()}; | 106 | return {QPDF_Null::create()}; |
| 107 | } else { | 107 | } else { |
| @@ -138,7 +138,7 @@ QPDFParser::parseRemainder(bool content_stream) | @@ -138,7 +138,7 @@ QPDFParser::parseRemainder(bool content_stream) | ||
| 138 | bool b_contents = false; | 138 | bool b_contents = false; |
| 139 | 139 | ||
| 140 | while (true) { | 140 | while (true) { |
| 141 | - if (!tokenizer.nextToken(*input, object_description)) { | 141 | + if (!tokenizer.nextToken(input, object_description)) { |
| 142 | warn(tokenizer.getErrorMessage()); | 142 | warn(tokenizer.getErrorMessage()); |
| 143 | } | 143 | } |
| 144 | ++good_count; // optimistically | 144 | ++good_count; // optimistically |
| @@ -151,7 +151,7 @@ QPDFParser::parseRemainder(bool content_stream) | @@ -151,7 +151,7 @@ QPDFParser::parseRemainder(bool content_stream) | ||
| 151 | // Process the oldest buffered integer. | 151 | // Process the oldest buffered integer. |
| 152 | addInt(int_count); | 152 | addInt(int_count); |
| 153 | } | 153 | } |
| 154 | - last_offset_buffer[int_count % 2] = input->getLastOffset(); | 154 | + last_offset_buffer[int_count % 2] = input.getLastOffset(); |
| 155 | int_buffer[int_count % 2] = QUtil::string_to_ll(tokenizer.getValue().c_str()); | 155 | int_buffer[int_count % 2] = QUtil::string_to_ll(tokenizer.getValue().c_str()); |
| 156 | continue; | 156 | continue; |
| 157 | 157 | ||
| @@ -309,7 +309,7 @@ QPDFParser::parseRemainder(bool content_stream) | @@ -309,7 +309,7 @@ QPDFParser::parseRemainder(bool content_stream) | ||
| 309 | case QPDFTokenizer::tt_integer: | 309 | case QPDFTokenizer::tt_integer: |
| 310 | if (!content_stream) { | 310 | if (!content_stream) { |
| 311 | // Buffer token in case it is part of an indirect reference. | 311 | // Buffer token in case it is part of an indirect reference. |
| 312 | - last_offset_buffer[1] = input->getLastOffset(); | 312 | + last_offset_buffer[1] = input.getLastOffset(); |
| 313 | int_buffer[1] = QUtil::string_to_ll(tokenizer.getValue().c_str()); | 313 | int_buffer[1] = QUtil::string_to_ll(tokenizer.getValue().c_str()); |
| 314 | int_count = 1; | 314 | int_count = 1; |
| 315 | } else { | 315 | } else { |
| @@ -351,7 +351,7 @@ QPDFParser::parseRemainder(bool content_stream) | @@ -351,7 +351,7 @@ QPDFParser::parseRemainder(bool content_stream) | ||
| 351 | if (decrypter) { | 351 | if (decrypter) { |
| 352 | if (b_contents) { | 352 | if (b_contents) { |
| 353 | frame->contents_string = val; | 353 | frame->contents_string = val; |
| 354 | - frame->contents_offset = input->getLastOffset(); | 354 | + frame->contents_offset = input.getLastOffset(); |
| 355 | b_contents = false; | 355 | b_contents = false; |
| 356 | } | 356 | } |
| 357 | std::string s{val}; | 357 | std::string s{val}; |
| @@ -419,7 +419,7 @@ void | @@ -419,7 +419,7 @@ void | ||
| 419 | QPDFParser::addScalar(Args&&... args) | 419 | QPDFParser::addScalar(Args&&... args) |
| 420 | { | 420 | { |
| 421 | auto obj = T::create(args...); | 421 | auto obj = T::create(args...); |
| 422 | - obj->setDescription(context, description, input->getLastOffset()); | 422 | + obj->setDescription(context, description, input.getLastOffset()); |
| 423 | add(std::move(obj)); | 423 | add(std::move(obj)); |
| 424 | } | 424 | } |
| 425 | 425 | ||
| @@ -506,11 +506,11 @@ QPDFParser::warnDuplicateKey() | @@ -506,11 +506,11 @@ QPDFParser::warnDuplicateKey() | ||
| 506 | void | 506 | void |
| 507 | QPDFParser::warn(qpdf_offset_t offset, std::string const& msg) const | 507 | QPDFParser::warn(qpdf_offset_t offset, std::string const& msg) const |
| 508 | { | 508 | { |
| 509 | - warn(QPDFExc(qpdf_e_damaged_pdf, input->getName(), object_description, offset, msg)); | 509 | + warn(QPDFExc(qpdf_e_damaged_pdf, input.getName(), object_description, offset, msg)); |
| 510 | } | 510 | } |
| 511 | 511 | ||
| 512 | void | 512 | void |
| 513 | QPDFParser::warn(std::string const& msg) const | 513 | QPDFParser::warn(std::string const& msg) const |
| 514 | { | 514 | { |
| 515 | - warn(input->getLastOffset(), msg); | 515 | + warn(input.getLastOffset(), msg); |
| 516 | } | 516 | } |
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 | } |
libqpdf/qpdf/QPDFParser.hh
| @@ -12,7 +12,7 @@ class QPDFParser | @@ -12,7 +12,7 @@ class QPDFParser | ||
| 12 | public: | 12 | public: |
| 13 | QPDFParser() = delete; | 13 | QPDFParser() = delete; |
| 14 | QPDFParser( | 14 | QPDFParser( |
| 15 | - std::shared_ptr<InputSource> input, | 15 | + InputSource& input, |
| 16 | std::string const& object_description, | 16 | std::string const& object_description, |
| 17 | QPDFTokenizer& tokenizer, | 17 | QPDFTokenizer& tokenizer, |
| 18 | QPDFObjectHandle::StringDecrypter* decrypter, | 18 | QPDFObjectHandle::StringDecrypter* decrypter, |
| @@ -24,7 +24,7 @@ class QPDFParser | @@ -24,7 +24,7 @@ class QPDFParser | ||
| 24 | decrypter(decrypter), | 24 | decrypter(decrypter), |
| 25 | context(context), | 25 | context(context), |
| 26 | description(std::make_shared<QPDFValue::Description>( | 26 | description(std::make_shared<QPDFValue::Description>( |
| 27 | - std::string(input->getName() + ", " + object_description + " at offset $PO"))), | 27 | + std::string(input.getName() + ", " + object_description + " at offset $PO"))), |
| 28 | parse_pdf(parse_pdf) | 28 | parse_pdf(parse_pdf) |
| 29 | { | 29 | { |
| 30 | } | 30 | } |
| @@ -39,9 +39,9 @@ class QPDFParser | @@ -39,9 +39,9 @@ class QPDFParser | ||
| 39 | 39 | ||
| 40 | struct StackFrame | 40 | struct StackFrame |
| 41 | { | 41 | { |
| 42 | - StackFrame(std::shared_ptr<InputSource> const& input, parser_state_e state) : | 42 | + StackFrame(InputSource& input, parser_state_e state) : |
| 43 | state(state), | 43 | state(state), |
| 44 | - offset(input->tell()) | 44 | + offset(input.tell()) |
| 45 | { | 45 | { |
| 46 | } | 46 | } |
| 47 | 47 | ||
| @@ -72,7 +72,7 @@ class QPDFParser | @@ -72,7 +72,7 @@ class QPDFParser | ||
| 72 | // NB the offset includes any leading whitespace. | 72 | // NB the offset includes any leading whitespace. |
| 73 | QPDFObjectHandle withDescription(Args&&... args); | 73 | QPDFObjectHandle withDescription(Args&&... args); |
| 74 | void setDescription(std::shared_ptr<QPDFObject>& obj, qpdf_offset_t parsed_offset); | 74 | void setDescription(std::shared_ptr<QPDFObject>& obj, qpdf_offset_t parsed_offset); |
| 75 | - std::shared_ptr<InputSource> input; | 75 | + InputSource& input; |
| 76 | std::string const& object_description; | 76 | std::string const& object_description; |
| 77 | QPDFTokenizer& tokenizer; | 77 | QPDFTokenizer& tokenizer; |
| 78 | QPDFObjectHandle::StringDecrypter* decrypter; | 78 | QPDFObjectHandle::StringDecrypter* decrypter; |