diff --git a/fs_mgr/libfiemap/fiemap_writer.cpp b/fs_mgr/libfiemap/fiemap_writer.cpp index 71dadd001..275388ed9 100644 --- a/fs_mgr/libfiemap/fiemap_writer.cpp +++ b/fs_mgr/libfiemap/fiemap_writer.cpp @@ -514,6 +514,10 @@ static bool IsLastExtent(const fiemap_extent* extent) { static bool FiemapToExtents(struct fiemap* fiemap, std::vector* extents, std::string_view file_path) { uint32_t num_extents = fiemap->fm_mapped_extents; + if (num_extents == 0) { + LOG(ERROR) << "File " << file_path << " has zero extent"; + return false; + } const struct fiemap_extent* last_extent = &fiemap->fm_extents[num_extents - 1]; if (!IsLastExtent(last_extent)) { LOG(ERROR) << "FIEMAP did not return a final extent for file: " << file_path diff --git a/fs_mgr/libfiemap/fiemap_writer_test.cpp b/fs_mgr/libfiemap/fiemap_writer_test.cpp index b31c78dd1..c65481b78 100644 --- a/fs_mgr/libfiemap/fiemap_writer_test.cpp +++ b/fs_mgr/libfiemap/fiemap_writer_test.cpp @@ -258,6 +258,13 @@ TEST_F(FiemapWriterTest, FibmapBlockAddressing) { EXPECT_EQ(memcmp(actual.data(), data.data(), data.size()), 0); } +TEST_F(FiemapWriterTest, CheckEmptyFile) { + // Can't get any fiemap_extent out of a zero-sized file. + FiemapUniquePtr fptr = FiemapWriter::Open(testfile, 0); + EXPECT_EQ(fptr, nullptr); + EXPECT_EQ(access(testfile.c_str(), F_OK), -1); +} + TEST_F(SplitFiemapTest, Create) { auto ptr = SplitFiemap::Create(testfile, 1024 * 768, 1024 * 32); ASSERT_NE(ptr, nullptr);