Loading fs_mgr/libsnapshot/Android.bp +5 −5 Original line number Diff line number Diff line Loading @@ -266,7 +266,7 @@ cc_defaults { "android.hardware.boot@1.1", "libbrotli", "libc++fs", "libfs_mgr", "libfs_mgr_binder", "libgsi", "libgmock", "liblp", Loading fs_mgr/libsnapshot/corpus/avoid-io-in-fuzzer.txt 0 → 100644 +41 −0 Original line number Diff line number Diff line device_info_data { allow_set_slot_as_unbootable: true is_recovery: true } is_super_metadata_valid: true super_data { partitions { partition_name: "sys_a" new_partition_info { size: 3145728 } } partitions { partition_name: "vnnd_" new_partition_info { size: 3145728 } } partitions { partition_name: "prd_a" new_partition_info { } } dynamic_partition_metadata { groups { name: "group_google_dp_a" size: 34375467008 partition_names: "sys_a" partition_names: "vnd_a" partition_names: "prd_a" } } } has_metadata_snapshots_dir: true actions { handle_imminent_data_wipe: true } actions { begin_update { } } fs_mgr/libsnapshot/device_info.cpp +23 −4 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ #include <android-base/logging.h> #include <fs_mgr.h> #include <fs_mgr_overlayfs.h> #include <libfiemap/image_manager.h> namespace android { namespace snapshot { Loading @@ -26,6 +27,7 @@ using android::hardware::boot::V1_0::BoolResult; using android::hardware::boot::V1_0::CommandResult; #endif using namespace std::chrono_literals; using namespace std::string_literals; #ifdef __ANDROID_RECOVERY__ Loading @@ -34,10 +36,6 @@ constexpr bool kIsRecovery = true; constexpr bool kIsRecovery = false; #endif std::string DeviceInfo::GetGsidDir() const { return "ota"s; } std::string DeviceInfo::GetMetadataDir() const { return "/metadata/ota"s; } Loading Loading @@ -100,6 +98,10 @@ bool DeviceInfo::IsRecovery() const { return kIsRecovery; } bool DeviceInfo::IsFirstStageInit() const { return first_stage_init_; } bool DeviceInfo::SetSlotAsUnbootable([[maybe_unused]] unsigned int slot) { #ifdef LIBSNAPSHOT_USE_HAL if (!EnsureBootHal()) { Loading @@ -120,5 +122,22 @@ bool DeviceInfo::SetSlotAsUnbootable([[maybe_unused]] unsigned int slot) { #endif } std::unique_ptr<android::fiemap::IImageManager> DeviceInfo::OpenImageManager() const { return IDeviceInfo::OpenImageManager("ota"); } std::unique_ptr<android::fiemap::IImageManager> ISnapshotManager::IDeviceInfo::OpenImageManager( const std::string& gsid_dir) const { if (IsRecovery() || IsFirstStageInit()) { android::fiemap::ImageManager::DeviceInfo device_info = { .is_recovery = {IsRecovery()}, }; return android::fiemap::ImageManager::Open(gsid_dir, device_info); } else { // For now, use a preset timeout. return android::fiemap::IImageManager::Open(gsid_dir, 15000ms); } } } // namespace snapshot } // namespace android fs_mgr/libsnapshot/device_info.h +5 −1 Original line number Diff line number Diff line Loading @@ -29,7 +29,6 @@ class DeviceInfo final : public SnapshotManager::IDeviceInfo { using MergeStatus = android::hardware::boot::V1_1::MergeStatus; public: std::string GetGsidDir() const override; std::string GetMetadataDir() const override; std::string GetSlotSuffix() const override; std::string GetOtherSlotSuffix() const override; Loading @@ -39,11 +38,16 @@ class DeviceInfo final : public SnapshotManager::IDeviceInfo { bool SetBootControlMergeStatus(MergeStatus status) override; bool SetSlotAsUnbootable(unsigned int slot) override; bool IsRecovery() const override; std::unique_ptr<IImageManager> OpenImageManager() const override; bool IsFirstStageInit() const override; void set_first_stage_init(bool value) { first_stage_init_ = value; } private: bool EnsureBootHal(); android::fs_mgr::PartitionOpener opener_; bool first_stage_init_ = false; #ifdef LIBSNAPSHOT_USE_HAL android::sp<android::hardware::boot::V1_1::IBootControl> boot_control_; #endif Loading fs_mgr/libsnapshot/include/libsnapshot/mock_device_info.h +3 −1 Original line number Diff line number Diff line Loading @@ -22,7 +22,6 @@ namespace android::snapshot { class MockDeviceInfo : public SnapshotManager::IDeviceInfo { public: MOCK_METHOD(std::string, GetGsidDir, (), (const, override)); MOCK_METHOD(std::string, GetMetadataDir, (), (const, override)); MOCK_METHOD(std::string, GetSlotSuffix, (), (const, override)); MOCK_METHOD(std::string, GetOtherSlotSuffix, (), (const, override)); Loading @@ -32,6 +31,9 @@ class MockDeviceInfo : public SnapshotManager::IDeviceInfo { MOCK_METHOD(bool, SetBootControlMergeStatus, (MergeStatus status), (override)); MOCK_METHOD(bool, SetSlotAsUnbootable, (unsigned int slot), (override)); MOCK_METHOD(bool, IsRecovery, (), (const, override)); MOCK_METHOD(bool, IsFirstStageInit, (), (const, override)); MOCK_METHOD(std::unique_ptr<android::fiemap::IImageManager>, OpenImageManager, (), (const, override)); }; } // namespace android::snapshot Loading
fs_mgr/libsnapshot/Android.bp +5 −5 Original line number Diff line number Diff line Loading @@ -266,7 +266,7 @@ cc_defaults { "android.hardware.boot@1.1", "libbrotli", "libc++fs", "libfs_mgr", "libfs_mgr_binder", "libgsi", "libgmock", "liblp", Loading
fs_mgr/libsnapshot/corpus/avoid-io-in-fuzzer.txt 0 → 100644 +41 −0 Original line number Diff line number Diff line device_info_data { allow_set_slot_as_unbootable: true is_recovery: true } is_super_metadata_valid: true super_data { partitions { partition_name: "sys_a" new_partition_info { size: 3145728 } } partitions { partition_name: "vnnd_" new_partition_info { size: 3145728 } } partitions { partition_name: "prd_a" new_partition_info { } } dynamic_partition_metadata { groups { name: "group_google_dp_a" size: 34375467008 partition_names: "sys_a" partition_names: "vnd_a" partition_names: "prd_a" } } } has_metadata_snapshots_dir: true actions { handle_imminent_data_wipe: true } actions { begin_update { } }
fs_mgr/libsnapshot/device_info.cpp +23 −4 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ #include <android-base/logging.h> #include <fs_mgr.h> #include <fs_mgr_overlayfs.h> #include <libfiemap/image_manager.h> namespace android { namespace snapshot { Loading @@ -26,6 +27,7 @@ using android::hardware::boot::V1_0::BoolResult; using android::hardware::boot::V1_0::CommandResult; #endif using namespace std::chrono_literals; using namespace std::string_literals; #ifdef __ANDROID_RECOVERY__ Loading @@ -34,10 +36,6 @@ constexpr bool kIsRecovery = true; constexpr bool kIsRecovery = false; #endif std::string DeviceInfo::GetGsidDir() const { return "ota"s; } std::string DeviceInfo::GetMetadataDir() const { return "/metadata/ota"s; } Loading Loading @@ -100,6 +98,10 @@ bool DeviceInfo::IsRecovery() const { return kIsRecovery; } bool DeviceInfo::IsFirstStageInit() const { return first_stage_init_; } bool DeviceInfo::SetSlotAsUnbootable([[maybe_unused]] unsigned int slot) { #ifdef LIBSNAPSHOT_USE_HAL if (!EnsureBootHal()) { Loading @@ -120,5 +122,22 @@ bool DeviceInfo::SetSlotAsUnbootable([[maybe_unused]] unsigned int slot) { #endif } std::unique_ptr<android::fiemap::IImageManager> DeviceInfo::OpenImageManager() const { return IDeviceInfo::OpenImageManager("ota"); } std::unique_ptr<android::fiemap::IImageManager> ISnapshotManager::IDeviceInfo::OpenImageManager( const std::string& gsid_dir) const { if (IsRecovery() || IsFirstStageInit()) { android::fiemap::ImageManager::DeviceInfo device_info = { .is_recovery = {IsRecovery()}, }; return android::fiemap::ImageManager::Open(gsid_dir, device_info); } else { // For now, use a preset timeout. return android::fiemap::IImageManager::Open(gsid_dir, 15000ms); } } } // namespace snapshot } // namespace android
fs_mgr/libsnapshot/device_info.h +5 −1 Original line number Diff line number Diff line Loading @@ -29,7 +29,6 @@ class DeviceInfo final : public SnapshotManager::IDeviceInfo { using MergeStatus = android::hardware::boot::V1_1::MergeStatus; public: std::string GetGsidDir() const override; std::string GetMetadataDir() const override; std::string GetSlotSuffix() const override; std::string GetOtherSlotSuffix() const override; Loading @@ -39,11 +38,16 @@ class DeviceInfo final : public SnapshotManager::IDeviceInfo { bool SetBootControlMergeStatus(MergeStatus status) override; bool SetSlotAsUnbootable(unsigned int slot) override; bool IsRecovery() const override; std::unique_ptr<IImageManager> OpenImageManager() const override; bool IsFirstStageInit() const override; void set_first_stage_init(bool value) { first_stage_init_ = value; } private: bool EnsureBootHal(); android::fs_mgr::PartitionOpener opener_; bool first_stage_init_ = false; #ifdef LIBSNAPSHOT_USE_HAL android::sp<android::hardware::boot::V1_1::IBootControl> boot_control_; #endif Loading
fs_mgr/libsnapshot/include/libsnapshot/mock_device_info.h +3 −1 Original line number Diff line number Diff line Loading @@ -22,7 +22,6 @@ namespace android::snapshot { class MockDeviceInfo : public SnapshotManager::IDeviceInfo { public: MOCK_METHOD(std::string, GetGsidDir, (), (const, override)); MOCK_METHOD(std::string, GetMetadataDir, (), (const, override)); MOCK_METHOD(std::string, GetSlotSuffix, (), (const, override)); MOCK_METHOD(std::string, GetOtherSlotSuffix, (), (const, override)); Loading @@ -32,6 +31,9 @@ class MockDeviceInfo : public SnapshotManager::IDeviceInfo { MOCK_METHOD(bool, SetBootControlMergeStatus, (MergeStatus status), (override)); MOCK_METHOD(bool, SetSlotAsUnbootable, (unsigned int slot), (override)); MOCK_METHOD(bool, IsRecovery, (), (const, override)); MOCK_METHOD(bool, IsFirstStageInit, (), (const, override)); MOCK_METHOD(std::unique_ptr<android::fiemap::IImageManager>, OpenImageManager, (), (const, override)); }; } // namespace android::snapshot