Commit 258343fcc97ce0e39f8f6f34f2c702999732beb6

Authored by m-holger
1 parent 20edfb3f

In QPDF::readToken change input parameter to InputSource&

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&amp; 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&amp; 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&amp; 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 }
... ...