diff options
author | Wei Li <weili@chromium.org> | 2015-12-06 20:08:46 -0800 |
---|---|---|
committer | Wei Li <weili@chromium.org> | 2015-12-06 20:08:46 -0800 |
commit | 0ff66089c87ab6e3adaaff0ec69728ce7a8d8299 (patch) | |
tree | a2862ec312c9424b8e3e61f6b34fb7dae2b6fad5 | |
parent | 2d16308298f236ae81aa11a53f2d4e25b502dfac (diff) | |
download | pdfium-0ff66089c87ab6e3adaaff0ec69728ce7a8d8299.tar.xz |
fix for stream object reading
Loosen a check for earlier version of PDF files. When the bytes with
specified length are followed by 'endstream' keyword, even if there is
no EOL marker before the keyword, it signals the end of stream.
BUG=551258
R=jun_fang@foxitsoftware.com, tsepez@chromium.org
Review URL: https://codereview.chromium.org/1499433002 .
-rw-r--r-- | core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp | 8 | ||||
-rw-r--r-- | testing/resources/pixel/bug_551258_1.in | 60 | ||||
-rw-r--r-- | testing/resources/pixel/bug_551258_1_expected.pdf.0.png | bin | 0 -> 5433 bytes | |||
-rw-r--r-- | testing/resources/pixel/bug_551258_1_expected_mac.pdf.0.png | bin | 0 -> 4365 bytes |
4 files changed, 64 insertions, 4 deletions
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp index b28bbf169b..04aca91082 100644 --- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp +++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp @@ -2352,11 +2352,11 @@ CPDF_Stream* CPDF_SyntaxParser::ReadStream(CPDF_Dictionary* pDict, m_Pos += ReadEOLMarkers(m_Pos); FXSYS_memset(m_WordBuffer, 0, ENDSTREAM_LEN + 1); GetNextWord(); - if (FXSYS_memcmp(m_WordBuffer, "endstream", ENDSTREAM_LEN) == 0 && - IsWholeWord(m_Pos - ENDSTREAM_LEN, m_FileLen, - FX_BSTRC("endstream").GetPtr(), ENDSTREAM_LEN, TRUE)) { + // Earlier version of PDF specification doesn't require EOL marker before + // 'endstream' keyword. If keyword 'endstream' follows the bytes in + // specified length, it signals the end of stream. + if (FXSYS_memcmp(m_WordBuffer, "endstream", ENDSTREAM_LEN) == 0) bSearchForKeyword = FALSE; - } } if (bSearchForKeyword) { // If len is not available, len needs to be calculated diff --git a/testing/resources/pixel/bug_551258_1.in b/testing/resources/pixel/bug_551258_1.in new file mode 100644 index 0000000000..f254f2d43d --- /dev/null +++ b/testing/resources/pixel/bug_551258_1.in @@ -0,0 +1,60 @@ +{{header}} +{{object 1 0}} << + /Type /Catalog + /Pages 2 0 R +>> +{{object 2 0}} << + /Type /Pages + /MediaBox [ 0 0 200 200 ] + /Count 1 + /Kids [ 3 0 R ] +>> +endobj +{{object 3 0}} << + /Type /Page + /Parent 2 0 R + /Resources << + /Font << + /F1 4 0 R + /F2 5 0 R + >> + >> + /Contents 6 0 R +>> +endobj +{{object 4 0}} << + /Type /Font + /Subtype /Type1 + /BaseFont /Times-Roman +>> +endobj +{{object 5 0}} << + /Type /Font + /Subtype /Type1 + /BaseFont /Helvetica +>> +endobj +% Case 1: +% Earlier version of PDF doesn't require EOL before 'endstream'. If the length +% of bytes end before 'endstream', we should take it. +{{object 6 0}} << + /Length 107 +>> +stream +BT +20 50 Td +/F1 12 Tf +(endobj is text) Tj +endstream +0 50 Td +/F2 13 Tf +(endstream is text per /Length) Tj +ETendstream +endobj +{{xref}} +trailer << + /Size 6 + /Root 1 0 R +>> +{{startxref}} +%%EOF diff --git a/testing/resources/pixel/bug_551258_1_expected.pdf.0.png b/testing/resources/pixel/bug_551258_1_expected.pdf.0.png Binary files differnew file mode 100644 index 0000000000..a044bb0c37 --- /dev/null +++ b/testing/resources/pixel/bug_551258_1_expected.pdf.0.png diff --git a/testing/resources/pixel/bug_551258_1_expected_mac.pdf.0.png b/testing/resources/pixel/bug_551258_1_expected_mac.pdf.0.png Binary files differnew file mode 100644 index 0000000000..e4d57103ef --- /dev/null +++ b/testing/resources/pixel/bug_551258_1_expected_mac.pdf.0.png |