Fix crash when hash tree isn't enabled but verity is
Test: th
Bug: 223110157
Change-Id: Idd254fb484ffabb3162e1f3232739cc29e00d51e
diff --git a/payload_consumer/verity_writer_android.cc b/payload_consumer/verity_writer_android.cc
index b669b4d..ffa2944 100644
--- a/payload_consumer/verity_writer_android.cc
+++ b/payload_consumer/verity_writer_android.cc
@@ -117,16 +117,18 @@
}
// All hash tree data blocks has been hashed, write hash tree to disk.
LOG(INFO) << "Writing verity hash tree to " << partition_->target_path;
- TEST_AND_RETURN_FALSE(hash_tree_builder_->BuildHashTree());
- TEST_AND_RETURN_FALSE_ERRNO(
- write_fd->Seek(partition_->hash_tree_offset, SEEK_SET));
- auto success =
- hash_tree_builder_->WriteHashTree([write_fd](auto data, auto size) {
- return utils::WriteAll(write_fd, data, size);
- });
- // hashtree builder already prints error messages.
- TEST_AND_RETURN_FALSE(success);
- hash_tree_builder_.reset();
+ if (hash_tree_builder_) {
+ TEST_AND_RETURN_FALSE(hash_tree_builder_->BuildHashTree());
+ TEST_AND_RETURN_FALSE_ERRNO(
+ write_fd->Seek(partition_->hash_tree_offset, SEEK_SET));
+ auto success =
+ hash_tree_builder_->WriteHashTree([write_fd](auto data, auto size) {
+ return utils::WriteAll(write_fd, data, size);
+ });
+ // hashtree builder already prints error messages.
+ TEST_AND_RETURN_FALSE(success);
+ hash_tree_builder_.reset();
+ }
if (partition_->fec_size != 0) {
LOG(INFO) << "Writing verity FEC to " << partition_->target_path;
TEST_AND_RETURN_FALSE(EncodeFEC(read_fd,
diff --git a/payload_consumer/verity_writer_android_unittest.cc b/payload_consumer/verity_writer_android_unittest.cc
index 693bcda..5ff0189 100644
--- a/payload_consumer/verity_writer_android_unittest.cc
+++ b/payload_consumer/verity_writer_android_unittest.cc
@@ -165,4 +165,22 @@
ASSERT_EQ(part_data, actual_part);
}
+TEST_F(VerityWriterAndroidTest, HashTreeDisabled) {
+ partition_.hash_tree_size = 0;
+ partition_.hash_tree_data_size = 0;
+ partition_.hash_tree_offset = 0;
+ partition_.hash_tree_data_offset = 0;
+
+ partition_.fec_data_offset = 0;
+ partition_.fec_data_size = 4096;
+ partition_.fec_offset = 4096;
+ partition_.fec_size = 2 * 4096;
+ brillo::Blob part_data(3 * 4096, 0x1);
+ test_utils::WriteFileVector(partition_.target_path, part_data);
+ ASSERT_TRUE(verity_writer_.Init(partition_));
+ ASSERT_TRUE(verity_writer_.Update(0, part_data.data(), part_data.size()));
+ ASSERT_TRUE(
+ verity_writer_.Finalize(partition_fd_.get(), partition_fd_.get()));
+}
+
} // namespace chromeos_update_engine