Add checks before writing hashtree/verity
Verity that we read everything in hashtree_data_extent before writing
hash tree.
Bug: 173432386
Test: th
Change-Id: I00ab8053de71b13991adaa243b6cb6c7efd6e60f
diff --git a/payload_consumer/verity_writer_android.cc b/payload_consumer/verity_writer_android.cc
index 01d8977..4b23b83 100644
--- a/payload_consumer/verity_writer_android.cc
+++ b/payload_consumer/verity_writer_android.cc
@@ -67,12 +67,18 @@
return false;
}
}
+ total_offset_ = 0;
return true;
}
-bool VerityWriterAndroid::Update(uint64_t offset,
+bool VerityWriterAndroid::Update(const uint64_t offset,
const uint8_t* buffer,
size_t size) {
+ if (offset != total_offset_) {
+ LOG(ERROR) << "Sequential read expected, expected to read at: "
+ << total_offset_ << " actual read occurs at: " << offset;
+ return false;
+ }
if (partition_->hash_tree_size != 0) {
const uint64_t hash_tree_data_end =
partition_->hash_tree_data_offset + partition_->hash_tree_data_size;
@@ -96,12 +102,22 @@
}
}
}
+ total_offset_ += size;
return true;
}
bool VerityWriterAndroid::Finalize(FileDescriptorPtr read_fd,
FileDescriptorPtr write_fd) {
+ const auto hash_tree_data_end =
+ partition_->hash_tree_data_offset + partition_->hash_tree_data_size;
+ if (total_offset_ < hash_tree_data_end) {
+ LOG(ERROR) << "Read up to " << total_offset_
+ << " when we are expecting to read everything "
+ "before "
+ << hash_tree_data_end;
+ return false;
+ }
// 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());