diff options
author | Lei Zhang <thestig@chromium.org> | 2018-09-19 17:26:34 +0000 |
---|---|---|
committer | Chromium commit bot <commit-bot@chromium.org> | 2018-09-19 17:26:34 +0000 |
commit | 5f2ea0f6ef587f9f7a2fec9f80dbc82b94c97400 (patch) | |
tree | e8a88e10a99a4bfdd7ffd7eab96583dbc27a756c /core/fpdfapi/parser/fpdf_parser_decode_unittest.cpp | |
parent | c3099d1c694251a654edc6cb72df8adb5e2268ab (diff) | |
download | pdfium-5f2ea0f6ef587f9f7a2fec9f80dbc82b94c97400.tar.xz |
Validate decoder pipelines.
PDF decoders, AKA filters, can be chained together. There can be
an arbitrary number of decoding / decompressing filters in the pipeline,
but there should be at most 1 image decoder, and the image decoder
should only be at the end of the chain.
BUG=chromium:880675
Change-Id: Iffa27c70ec1ed7574e38e0de23413840ee900959
Reviewed-on: https://pdfium-review.googlesource.com/42711
Reviewed-by: Ryan Harrison <rharrison@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
Diffstat (limited to 'core/fpdfapi/parser/fpdf_parser_decode_unittest.cpp')
-rw-r--r-- | core/fpdfapi/parser/fpdf_parser_decode_unittest.cpp | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/core/fpdfapi/parser/fpdf_parser_decode_unittest.cpp b/core/fpdfapi/parser/fpdf_parser_decode_unittest.cpp index b6d7679ef5..a4572396e6 100644 --- a/core/fpdfapi/parser/fpdf_parser_decode_unittest.cpp +++ b/core/fpdfapi/parser/fpdf_parser_decode_unittest.cpp @@ -4,9 +4,89 @@ #include "core/fpdfapi/parser/fpdf_parser_decode.h" +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_name.h" #include "testing/gtest/include/gtest/gtest.h" #include "testing/test_support.h" +TEST(fpdf_parser_decode, ValidateDecoderPipeline) { + { + // Empty decoder list is always valid. + CPDF_Array decoders; + EXPECT_TRUE(ValidateDecoderPipeline(&decoders)); + } + { + // 1 decoder is always valid. + CPDF_Array decoders; + decoders.AddNew<CPDF_Name>("FlateEncode"); + EXPECT_TRUE(ValidateDecoderPipeline(&decoders)); + } + { + // 1 decoder is always valid, even with an unknown decoder. + CPDF_Array decoders; + decoders.AddNew<CPDF_Name>("FooBar"); + EXPECT_TRUE(ValidateDecoderPipeline(&decoders)); + } + { + // Valid 2 decoder pipeline. + CPDF_Array decoders; + decoders.AddNew<CPDF_Name>("AHx"); + decoders.AddNew<CPDF_Name>("LZWDecode"); + EXPECT_TRUE(ValidateDecoderPipeline(&decoders)); + } + { + // Valid 2 decoder pipeline. + CPDF_Array decoders; + decoders.AddNew<CPDF_Name>("ASCII85Decode"); + decoders.AddNew<CPDF_Name>("ASCII85Decode"); + EXPECT_TRUE(ValidateDecoderPipeline(&decoders)); + } + { + // Valid 5 decoder pipeline. + CPDF_Array decoders; + decoders.AddNew<CPDF_Name>("ASCII85Decode"); + decoders.AddNew<CPDF_Name>("A85"); + decoders.AddNew<CPDF_Name>("RunLengthDecode"); + decoders.AddNew<CPDF_Name>("FlateDecode"); + decoders.AddNew<CPDF_Name>("RL"); + EXPECT_TRUE(ValidateDecoderPipeline(&decoders)); + } + { + // Valid 5 decoder pipeline, with an image decoder at the end. + CPDF_Array decoders; + decoders.AddNew<CPDF_Name>("RunLengthDecode"); + decoders.AddNew<CPDF_Name>("ASCII85Decode"); + decoders.AddNew<CPDF_Name>("FlateDecode"); + decoders.AddNew<CPDF_Name>("LZW"); + decoders.AddNew<CPDF_Name>("DCTDecode"); + EXPECT_TRUE(ValidateDecoderPipeline(&decoders)); + } + { + // Invalid 2 decoder pipeline, with 2 image decoders. + CPDF_Array decoders; + decoders.AddNew<CPDF_Name>("DCTDecode"); + decoders.AddNew<CPDF_Name>("CCITTFaxDecode"); + EXPECT_FALSE(ValidateDecoderPipeline(&decoders)); + } + { + // Invalid 2 decoder pipeline, with 1 image decoder at the start. + CPDF_Array decoders; + decoders.AddNew<CPDF_Name>("DCTDecode"); + decoders.AddNew<CPDF_Name>("FlateDecode"); + EXPECT_FALSE(ValidateDecoderPipeline(&decoders)); + } + { + // Invalid 5 decoder pipeline. + CPDF_Array decoders; + decoders.AddNew<CPDF_Name>("FlateDecode"); + decoders.AddNew<CPDF_Name>("FlateDecode"); + decoders.AddNew<CPDF_Name>("DCTDecode"); + decoders.AddNew<CPDF_Name>("FlateDecode"); + decoders.AddNew<CPDF_Name>("FlateDecode"); + EXPECT_FALSE(ValidateDecoderPipeline(&decoders)); + } +} + TEST(fpdf_parser_decode, A85Decode) { const pdfium::DecodeTestData test_data[] = { // Empty src string. |