From 92b29e192520e993e98d834ab9d8d2bff7f732ed Mon Sep 17 00:00:00 2001 From: David Anderson Date: Fri, 10 Nov 2023 16:21:28 -0800 Subject: [PATCH] libsnapshot: Add a test case for recent decompress regression. The attached test data is a 4096 length byte run that gz compresses to exactly 4096 bytes. This exposes an edge case in CowReader::ReadData with v2 snapshot files. Bug: 310191184 Test: cow_api_test Change-Id: I35e8d7e939d607d1dc118285ebc2f636c2291a20 --- fs_mgr/libsnapshot/Android.bp | 1 + .../libsnapshot/libsnapshot_cow/test_v2.cpp | 31 ++++++++++++++++++ .../tools/testdata/incompressible_block | Bin 0 -> 4096 bytes 3 files changed, 32 insertions(+) create mode 100644 fs_mgr/libsnapshot/tools/testdata/incompressible_block diff --git a/fs_mgr/libsnapshot/Android.bp b/fs_mgr/libsnapshot/Android.bp index ac58ba08f..a8a7716aa 100644 --- a/fs_mgr/libsnapshot/Android.bp +++ b/fs_mgr/libsnapshot/Android.bp @@ -420,6 +420,7 @@ cc_test { }, data: [ "tools/testdata/cow_v2", + "tools/testdata/incompressible_block", ], auto_gen_config: true, require_root: false, diff --git a/fs_mgr/libsnapshot/libsnapshot_cow/test_v2.cpp b/fs_mgr/libsnapshot/libsnapshot_cow/test_v2.cpp index 35d74bac0..2709059dd 100644 --- a/fs_mgr/libsnapshot/libsnapshot_cow/test_v2.cpp +++ b/fs_mgr/libsnapshot/libsnapshot_cow/test_v2.cpp @@ -1522,6 +1522,37 @@ TEST_F(CowTest, CompatibilityTest) { ASSERT_TRUE(reader.GetFooter(&footer)); } +TEST_F(CowTest, DecompressIncompressibleBlock) { + auto fd = OpenTestFile("incompressible_block", O_RDONLY); + ASSERT_GE(fd, 0); + + std::string original; + ASSERT_TRUE(android::base::ReadFdToString(fd, &original)) << strerror(errno); + ASSERT_EQ(original.size(), 4096); + + CowOptions options; + options.compression = "gz"; + auto writer = CreateCowWriter(2, options, GetCowFd()); + ASSERT_NE(writer, nullptr); + ASSERT_TRUE(writer->AddRawBlocks(0, original.data(), original.size())); + ASSERT_TRUE(writer->Finalize()); + + CowReader reader; + ASSERT_TRUE(reader.Parse(cow_->fd)); + + auto iter = reader.GetOpIter(); + ASSERT_NE(iter, nullptr); + ASSERT_FALSE(iter->AtEnd()); + + std::string block(original.size(), '\0'); + ASSERT_EQ(iter->Get()->data_length, 4096); + ASSERT_TRUE(ReadData(reader, iter->Get(), block.data(), block.size())); + + for (size_t i = 0; i < block.size(); i++) { + ASSERT_EQ(block[i], original[i]) << "mismatch at byte " << i; + } +} + } // namespace snapshot } // namespace android diff --git a/fs_mgr/libsnapshot/tools/testdata/incompressible_block b/fs_mgr/libsnapshot/tools/testdata/incompressible_block new file mode 100644 index 0000000000000000000000000000000000000000..cc45cd04e62bf5e9bc25fb044006cfb3db1c04a0 GIT binary patch literal 4096 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 literal 0 HcmV?d00001