Fix duplicate verity bug

When generating an incremental OTA, we automatically enable verity for
all partitions. But if some of these partitions are missing source
partition(e.g. , one partition is newly added in target build), we will
also cary verity data in the OTA. During OTA installation, we will write
verity twice. Once during DownloadAction, once during filesystem
verifier action. This causes cow size estimation to be incorrect. To fix
it, disable verity for partitions that are missing source.

Test: partner verification
Bug: 237362269
Change-Id: I6cecf77b00a59f30f24945dcdb8171424601e9bb
diff --git a/payload_generator/generate_delta_main.cc b/payload_generator/generate_delta_main.cc
index ef36a6d..49c1e9c 100644
--- a/payload_generator/generate_delta_main.cc
+++ b/payload_generator/generate_delta_main.cc
@@ -726,8 +726,20 @@
 
   if (payload_config.is_delta &&
       payload_config.version.minor >= kVerityMinorPayloadVersion &&
-      !FLAGS_disable_verity_computation)
+      !FLAGS_disable_verity_computation) {
     CHECK(payload_config.target.LoadVerityConfig());
+    for (size_t i = 0; i < payload_config.target.partitions.size(); ++i) {
+      if (payload_config.source.partitions[i].fs_interface != nullptr) {
+        continue;
+      }
+      if (!payload_config.target.partitions[i].verity.IsEmpty()) {
+        LOG(INFO) << "Partition " << payload_config.target.partitions[i].name
+                  << " is installed in full OTA, disaling verity for this "
+                     "specific partition.";
+        payload_config.target.partitions[i].verity.Clear();
+      }
+    }
+  }
 
   LOG(INFO) << "Generating " << (payload_config.is_delta ? "delta" : "full")
             << " update";
diff --git a/payload_generator/payload_generation_config.cc b/payload_generator/payload_generation_config.cc
index d520123..387cc3a 100644
--- a/payload_generator/payload_generation_config.cc
+++ b/payload_generator/payload_generation_config.cc
@@ -29,7 +29,6 @@
 #include "bsdiff/constants.h"
 #include "payload_consumer/payload_constants.h"
 #include "update_engine/common/utils.h"
-#include "update_engine/payload_consumer/delta_performer.h"
 #include "update_engine/payload_generator/boot_img_filesystem.h"
 #include "update_engine/payload_generator/delta_diff_generator.h"
 #include "update_engine/payload_generator/delta_diff_utils.h"
@@ -54,6 +53,16 @@
          fec_extent.num_blocks() == 0 && fec_roots == 0;
 }
 
+void VerityConfig::Clear() {
+  hash_tree_data_extent.Clear();
+  hash_tree_extent.Clear();
+  hash_tree_algorithm.clear();
+  hash_tree_salt.clear();
+  fec_data_extent.Clear();
+  fec_extent.Clear();
+  fec_roots = 0;
+}
+
 bool PartitionConfig::ValidateExists() const {
   TEST_AND_RETURN_FALSE(!path.empty());
   TEST_AND_RETURN_FALSE(utils::FileExists(path.c_str()));
diff --git a/payload_generator/payload_generation_config.h b/payload_generator/payload_generation_config.h
index 7124cb0..1e8794b 100644
--- a/payload_generator/payload_generation_config.h
+++ b/payload_generator/payload_generation_config.h
@@ -59,6 +59,9 @@
   // Whether the verity config is empty.
   bool IsEmpty() const;
 
+  // Clears this config, subsequent calls to "IsEmpty" will return true.
+  void Clear();
+
   // The extent for data covered by verity hash tree.
   Extent hash_tree_data_extent;