Commit ef49291682037eebde9de28ae893f6c9361577b4

Authored by m-holger
1 parent 0b3debaf

In QPDF::readObjectAtOffset fail early on 'expect n n obj'

Showing 1 changed file with 18 additions and 14 deletions
libqpdf/QPDF.cc
@@ -1727,24 +1727,28 @@ QPDF::readObjectAtOffset( @@ -1727,24 +1727,28 @@ QPDF::readObjectAtOffset(
1727 } 1727 }
1728 1728
1729 m->file->seek(offset, SEEK_SET); 1729 m->file->seek(offset, SEEK_SET);
1730 -  
1731 - QPDFTokenizer::Token tobjid = readToken(m->file);  
1732 - QPDFTokenizer::Token tgen = readToken(m->file);  
1733 - QPDFTokenizer::Token tobj = readToken(m->file);  
1734 -  
1735 - bool objidok = tobjid.isInteger();  
1736 - bool genok = tgen.isInteger();  
1737 - bool objok = tobj.isWord("obj");  
1738 -  
1739 - QTC::TC("qpdf", "QPDF check objid", objidok ? 1 : 0);  
1740 - QTC::TC("qpdf", "QPDF check generation", genok ? 1 : 0);  
1741 - QTC::TC("qpdf", "QPDF check obj", objok ? 1 : 0);  
1742 -  
1743 try { 1730 try {
1744 - if (!(objidok && genok && objok)) { 1731 + QPDFTokenizer::Token tobjid = readToken(m->file);
  1732 + bool objidok = tobjid.isInteger();
  1733 + QTC::TC("qpdf", "QPDF check objid", objidok ? 1 : 0);
  1734 + if (!objidok) {
1745 QTC::TC("qpdf", "QPDF expected n n obj"); 1735 QTC::TC("qpdf", "QPDF expected n n obj");
1746 throw damagedPDF(offset, "expected n n obj"); 1736 throw damagedPDF(offset, "expected n n obj");
1747 } 1737 }
  1738 + QPDFTokenizer::Token tgen = readToken(m->file);
  1739 + bool genok = tgen.isInteger();
  1740 + QTC::TC("qpdf", "QPDF check generation", genok ? 1 : 0);
  1741 + if (!genok) {
  1742 + throw damagedPDF(offset, "expected n n obj");
  1743 + }
  1744 + QPDFTokenizer::Token tobj = readToken(m->file);
  1745 +
  1746 + bool objok = tobj.isWord("obj");
  1747 + QTC::TC("qpdf", "QPDF check obj", objok ? 1 : 0);
  1748 +
  1749 + if (!objok) {
  1750 + throw damagedPDF(offset, "expected n n obj");
  1751 + }
1748 int objid = QUtil::string_to_int(tobjid.getValue().c_str()); 1752 int objid = QUtil::string_to_int(tobjid.getValue().c_str());
1749 int generation = QUtil::string_to_int(tgen.getValue().c_str()); 1753 int generation = QUtil::string_to_int(tgen.getValue().c_str());
1750 og = QPDFObjGen(objid, generation); 1754 og = QPDFObjGen(objid, generation);