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;