diff options
author | Wei Li <weili@chromium.org> | 2016-01-14 14:46:04 -0800 |
---|---|---|
committer | Wei Li <weili@chromium.org> | 2016-01-14 14:46:04 -0800 |
commit | 34291b900ad0472eef582215cfce0d942a40fd16 (patch) | |
tree | 1deaf6e1ec330a1c2e869dd3c3348b73e4b7808c | |
parent | 1a82d5c28be2ebdb7524a7249e43026546d0ebf0 (diff) | |
download | pdfium-34291b900ad0472eef582215cfce0d942a40fd16.tar.xz |
Loose checking for trailer's size field
Although trailer's size value is required by spec, other readers such as
Acrobat or libpoppler can handle without it. Loose up the check to be
more tolerant.
BUG=pdfium:213
R=thestig@chromium.org
Review URL: https://codereview.chromium.org/1582193002 .
-rw-r--r-- | core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp | 8 | ||||
-rw-r--r-- | fpdfsdk/src/fpdfview_embeddertest.cpp | 8 | ||||
-rw-r--r-- | testing/resources/bug_213.pdf | 64 |
3 files changed, 75 insertions, 5 deletions
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp index 03bc9aec58..cd22b31238 100644 --- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp +++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp @@ -378,11 +378,11 @@ FX_BOOL CPDF_Parser::LoadAllCrossRefV4(FX_FILESIZE xrefpos) { } int32_t xrefsize = GetDirectInteger(m_pTrailer, "Size"); - if (xrefsize <= 0 || xrefsize > kMaxXRefSize) { - return FALSE; + if (xrefsize > 0 && xrefsize <= kMaxXRefSize) { + ShrinkObjectMap(xrefsize); + m_V5Type.SetSize(xrefsize); } - ShrinkObjectMap(xrefsize); - m_V5Type.SetSize(xrefsize); + CFX_FileSizeArray CrossRefList; CFX_FileSizeArray XRefStreamList; CrossRefList.Add(xrefpos); diff --git a/fpdfsdk/src/fpdfview_embeddertest.cpp b/fpdfsdk/src/fpdfview_embeddertest.cpp index 670c640668..09d1f07e82 100644 --- a/fpdfsdk/src/fpdfview_embeddertest.cpp +++ b/fpdfsdk/src/fpdfview_embeddertest.cpp @@ -204,6 +204,12 @@ TEST_F(FPDFViewEmbeddertest, Crasher_572871) { EXPECT_TRUE(OpenDocument("bug_572871.pdf")); } +// It tests that document can still be loaded even the trailer has no 'Size' +// field if other information is right. +TEST_F(FPDFViewEmbeddertest, Failed_213) { + EXPECT_TRUE(OpenDocument("bug_213.pdf")); +} + // The following tests pass if the document opens without infinite looping. TEST_F(FPDFViewEmbeddertest, Hang_298) { EXPECT_FALSE(OpenDocument("bug_298.pdf")); @@ -232,4 +238,4 @@ TEST_F(FPDFViewEmbeddertest, Hang_344) { // The test should pass even when the file has circular references to pages. TEST_F(FPDFViewEmbeddertest, Hang_360) { EXPECT_FALSE(OpenDocument("bug_360.pdf")); -}
\ No newline at end of file +} diff --git a/testing/resources/bug_213.pdf b/testing/resources/bug_213.pdf new file mode 100644 index 0000000000..d0e251406b --- /dev/null +++ b/testing/resources/bug_213.pdf @@ -0,0 +1,64 @@ +%PDF-1.7 +% ò¤ô|1 0 obj << + /Type /Catalog + /Pages 2 0 R +>> +2 0 obj << + /Type /Pages + /MediaBox [ 0 0 200 200 ] + /Count 1 + /Kids [ 3 0 R ] +>> +endobj +3 0 obj << + /Type /Page + /Parent 2 0 R + /Resources << + /Font << + /F1 4 0 R + /F2 5 0 R + >> + >> + /Contents 6 0 R +>> +endobj +4 0 obj << + /Type /Font + /Subtype /Type1 + /BaseFont /Times-Roman +>> +endobj +5 0 obj << + /Type /Font + /Subtype /Type1 + /BaseFont /Helvetica +>> +endobj +6 0 obj << +>> +stream +BT +20 50 Td +/F1 12 Tf +(Hello, world!) Tj +0 50 Td +/F2 16 Tf +(Goodbye, world!) Tj +ET +endstream +endobj +xref +0 7 +0000000000 65535 f +0000000015 00000 n +0000000061 00000 n +0000000154 00000 n +0000000296 00000 n +0000000374 00000 n +0000000450 00000 n +trailer << + /Root 1 0 R +>> +startxref +571 +%%EOF |