Add a regression test for a CPDF_Parser bug.
BUG=chromium:945624
Change-Id: I8673c3193063637a70ad1c3f833c98d2829a7ceb
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/52450
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/parser/cpdf_parser_unittest.cpp b/core/fpdfapi/parser/cpdf_parser_unittest.cpp
index 4aae19f..f5f170e 100644
--- a/core/fpdfapi/parser/cpdf_parser_unittest.cpp
+++ b/core/fpdfapi/parser/cpdf_parser_unittest.cpp
@@ -238,6 +238,30 @@
EXPECT_EQ(kTypes[i], GetObjInfo(parser, i).type);
}
}
+ {
+ // Regression test for https://crbug.com/945624 - Make sure the parser
+ // can correctly handle table sizes that are multiples of the read size,
+ // which is 1024.
+ std::string xref_table = "xref \n 0 2048 \n";
+ xref_table.reserve(41000);
+ for (int i = 0; i < 2048; ++i) {
+ char buffer[21];
+ snprintf(buffer, sizeof(buffer), "%010d 00000 n \n", i + 1);
+ xref_table += buffer;
+ }
+ xref_table += "trail"; // Needed to end cross ref table reading.
+ CPDF_TestParser parser;
+ ASSERT_TRUE(parser.InitTestFromBuffer(
+ pdfium::make_span(reinterpret_cast<const uint8_t*>(xref_table.c_str()),
+ xref_table.size())));
+
+ ASSERT_TRUE(parser.LoadCrossRefV4(0, false));
+ for (size_t i = 0; i < 2048; ++i) {
+ EXPECT_EQ(static_cast<int>(i) + 1, GetObjInfo(parser, i).pos);
+ EXPECT_EQ(CPDF_TestParser::ObjectType::kNotCompressed,
+ GetObjInfo(parser, i).type);
+ }
+ }
}
TEST(cpdf_parser, ParseStartXRef) {