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,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&amp; e) @@ -575,12 +575,12 @@ QPDF::reconstruct_xref(QPDFExc&amp; 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&amp; description, QPDFObjGen og) @@ -1496,10 +1496,10 @@ QPDF::readObject(std::string const&amp; 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&amp; object, QPDFObjGen og, qpdf_offset_t offset) @@ -1535,7 +1535,7 @@ QPDF::readStream(QPDFObjectHandle&amp; 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 }