Blame SOURCES/qpdf-CVE-2018-9918.patch

3c9f4d
diff -up qpdf-7.1.1/libqpdf/QPDFObjectHandle.cc.CVE-2018-9918 qpdf-7.1.1/libqpdf/QPDFObjectHandle.cc
3c9f4d
--- qpdf-7.1.1/libqpdf/QPDFObjectHandle.cc.CVE-2018-9918	2018-02-05 00:31:42.000000000 +0100
3c9f4d
+++ qpdf-7.1.1/libqpdf/QPDFObjectHandle.cc	2018-04-16 15:35:36.378343714 +0200
3c9f4d
@@ -1054,12 +1054,26 @@ QPDFObjectHandle::parseInternal(PointerH
3c9f4d
 
3c9f4d
 	  case QPDFTokenizer::tt_array_open:
3c9f4d
 	  case QPDFTokenizer::tt_dict_open:
3c9f4d
-            olist_stack.push_back(std::vector<QPDFObjectHandle>());
3c9f4d
-            state = st_start;
3c9f4d
-            offset_stack.push_back(input->tell());
3c9f4d
-            state_stack.push_back(
3c9f4d
-                (token.getType() == QPDFTokenizer::tt_array_open) ?
3c9f4d
-                st_array : st_dictionary);
3c9f4d
+            if (olist_stack.size() > 500)
3c9f4d
+            {
3c9f4d
+		QTC::TC("qpdf", "QPDFObjectHandle too deep");
3c9f4d
+                warn(context,
3c9f4d
+                     QPDFExc(qpdf_e_damaged_pdf, input->getName(),
3c9f4d
+                             object_description,
3c9f4d
+                             input->getLastOffset(),
3c9f4d
+                             "ignoring excessively deeply nested data structure"));
3c9f4d
+                object = newNull();
3c9f4d
+                state = st_top;
3c9f4d
+            }
3c9f4d
+            else
3c9f4d
+            {
3c9f4d
+                olist_stack.push_back(std::vector<QPDFObjectHandle>());
3c9f4d
+                state = st_start;
3c9f4d
+                offset_stack.push_back(input->tell());
3c9f4d
+                state_stack.push_back(
3c9f4d
+                    (token.getType() == QPDFTokenizer::tt_array_open) ?
3c9f4d
+                    st_array : st_dictionary);
3c9f4d
+            }
3c9f4d
 	    break;
3c9f4d
 
3c9f4d
 	  case QPDFTokenizer::tt_bool:
3c9f4d
diff -up qpdf-7.1.1/qpdf/qpdf.testcov.CVE-2018-9918 qpdf-7.1.1/qpdf/qpdf.testcov
3c9f4d
--- qpdf-7.1.1/qpdf/qpdf.testcov.CVE-2018-9918	2018-02-05 00:31:42.000000000 +0100
3c9f4d
+++ qpdf-7.1.1/qpdf/qpdf.testcov	2018-04-16 15:35:36.379343705 +0200
3c9f4d
@@ -302,3 +302,4 @@ qpdf-c called qpdf_set_compress_streams
3c9f4d
 qpdf-c called qpdf_set_preserve_unreferenced_objects 0
3c9f4d
 qpdf-c called qpdf_set_newline_before_endstream 0
3c9f4d
 QPDF_Stream TIFF predictor 0
3c9f4d
+QPDFObjectHandle too deep 0
3c9f4d
diff -up qpdf-7.1.1/qpdf/qtest/qpdf/issue-146.out.CVE-2018-9918 qpdf-7.1.1/qpdf/qtest/qpdf/issue-146.out
3c9f4d
--- qpdf-7.1.1/qpdf/qtest/qpdf/issue-146.out.CVE-2018-9918	2018-02-05 00:31:42.000000000 +0100
3c9f4d
+++ qpdf-7.1.1/qpdf/qtest/qpdf/issue-146.out	2018-04-16 15:53:17.499476948 +0200
3c9f4d
@@ -1,5 +1,5 @@
3c9f4d
 WARNING: issue-146.pdf: file is damaged
3c9f4d
 WARNING: issue-146.pdf: can't find startxref
3c9f4d
 WARNING: issue-146.pdf: Attempting to reconstruct cross-reference table
3c9f4d
-WARNING: issue-146.pdf (trailer, file position 20728): unknown token while reading object; treating as string
3c9f4d
-issue-146.pdf (trailer, file position 20732): EOF while reading token
3c9f4d
+WARNING: issue-146.pdf (trailer, file position 695): ignoring excessively deeply nested data structure
3c9f4d
+issue-146.pdf: unable to find trailer dictionary while recovering damaged file