Gracefully return an error if cow reader failed

Invoke cow_writer->OpenReader() before constructing
CowWriterFileDescriptor, and return nullptr if OpenReader() failed.

Bug: 210474209
Test: th
Change-Id: Icbdf98c5151f4964d31315eadca2ee8eaa0e101e
diff --git a/aosp/dynamic_partition_control_android.cc b/aosp/dynamic_partition_control_android.cc
index 60936f2..825e0d6 100644
--- a/aosp/dynamic_partition_control_android.cc
+++ b/aosp/dynamic_partition_control_android.cc
@@ -1430,9 +1430,16 @@
     return nullptr;
   }
   if (!cow_writer->InitializeAppend(kEndOfInstallLabel)) {
+    LOG(ERROR) << "Failed to InitializeAppend(" << kEndOfInstallLabel << ")";
     return nullptr;
   }
-  return std::make_shared<CowWriterFileDescriptor>(std::move(cow_writer));
+  auto reader = cow_writer->OpenReader();
+  if (reader == nullptr) {
+    LOG(ERROR) << "ICowWriter::OpenReader() failed.";
+    return nullptr;
+  }
+  return std::make_shared<CowWriterFileDescriptor>(std::move(cow_writer),
+                                                   std::move(reader));
 }
 
 std::optional<base::FilePath> DynamicPartitionControlAndroid::GetSuperDevice() {
diff --git a/payload_consumer/cow_writer_file_descriptor.cc b/payload_consumer/cow_writer_file_descriptor.cc
index 2de6664..19fb545 100644
--- a/payload_consumer/cow_writer_file_descriptor.cc
+++ b/payload_consumer/cow_writer_file_descriptor.cc
@@ -33,6 +33,14 @@
   CHECK_NE(cow_reader_, nullptr);
 }
 
+CowWriterFileDescriptor::CowWriterFileDescriptor(
+    std::unique_ptr<android::snapshot::ISnapshotWriter> cow_writer,
+    std::unique_ptr<FileDescriptor> cow_reader)
+    : cow_writer_(std::move(cow_writer)), cow_reader_(std::move(cow_reader)) {
+  CHECK_NE(cow_writer_, nullptr);
+  CHECK_NE(cow_reader_, nullptr);
+}
+
 bool CowWriterFileDescriptor::Open(const char* path, int flags, mode_t mode) {
   LOG(ERROR) << "CowWriterFileDescriptor doesn't support Open()";
   return false;
diff --git a/payload_consumer/cow_writer_file_descriptor.h b/payload_consumer/cow_writer_file_descriptor.h
index 5d9ffc6..fbf0a0d 100644
--- a/payload_consumer/cow_writer_file_descriptor.h
+++ b/payload_consumer/cow_writer_file_descriptor.h
@@ -30,6 +30,11 @@
  public:
   explicit CowWriterFileDescriptor(
       std::unique_ptr<android::snapshot::ISnapshotWriter> cow_writer);
+
+  // |cow_reader| should be obtained by calling |cow_writer->OpenReader()|
+  CowWriterFileDescriptor(
+      std::unique_ptr<android::snapshot::ISnapshotWriter> cow_writer,
+      std::unique_ptr<FileDescriptor> cow_reader);
   ~CowWriterFileDescriptor();
 
   bool Open(const char* path, int flags, mode_t mode) override;