summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWei Li <weili@chromium.org>2015-12-06 20:24:25 -0800
committerWei Li <weili@chromium.org>2015-12-06 20:24:25 -0800
commit63da7474adf5b585d5fd10729a99a2c50c20a626 (patch)
tree4f67595de1b66c52d8c8081084b48e15d6959397
parentc73a1442aeea509847e3232f3a38baa823692542 (diff)
downloadpdfium-63da7474adf5b585d5fd10729a99a2c50c20a626.tar.xz
Merge to XFA: 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 TBR=jun_fang@foxitsoftware.com Review URL: https://codereview.chromium.org/1499433002 . (cherry picked from commit 0ff66089c87ab6e3adaaff0ec69728ce7a8d8299) Review URL: https://codereview.chromium.org/1504723002 .
-rw-r--r--core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp8
-rw-r--r--testing/resources/pixel/bug_551258_1.in60
-rw-r--r--testing/resources/pixel/bug_551258_1_expected.pdf.0.pngbin0 -> 5433 bytes
-rw-r--r--testing/resources/pixel/bug_551258_1_expected_mac.pdf.0.pngbin0 -> 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
new file mode 100644
index 0000000000..a044bb0c37
--- /dev/null
+++ b/testing/resources/pixel/bug_551258_1_expected.pdf.0.png
Binary files differ
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
new file mode 100644
index 0000000000..e4d57103ef
--- /dev/null
+++ b/testing/resources/pixel/bug_551258_1_expected_mac.pdf.0.png
Binary files differ