Loading fs_mgr/fs_mgr.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -1031,7 +1031,7 @@ int fs_mgr_mount_all(fstab* fstab, int mount_mode) { if (fstab->recs[i].fs_mgr_flags & MF_AVB) { if (!avb_handle) { avb_handle = FsManagerAvbHandle::Open(*fstab); avb_handle = FsManagerAvbHandle::Open(); if (!avb_handle) { LERROR << "Failed to open FsManagerAvbHandle"; return FS_MGR_MNTALL_FAIL; Loading Loading @@ -1275,7 +1275,7 @@ static int fs_mgr_do_mount_helper(fstab* fstab, const char* n_name, char* n_blk_ if (fstab->recs[i].fs_mgr_flags & MF_AVB) { if (!avb_handle) { avb_handle = FsManagerAvbHandle::Open(*fstab); avb_handle = FsManagerAvbHandle::Open(); if (!avb_handle) { LERROR << "Failed to open FsManagerAvbHandle"; return FS_MGR_DOMNT_FAILED; Loading fs_mgr/fs_mgr_avb.cpp +3 −16 Original line number Diff line number Diff line Loading @@ -361,21 +361,7 @@ static bool get_hashtree_descriptor(const std::string& partition_name, return true; } FsManagerAvbUniquePtr FsManagerAvbHandle::Open(const fstab& fstab) { FsManagerAvbOps avb_ops(fstab); return DoOpen(&avb_ops); } FsManagerAvbUniquePtr FsManagerAvbHandle::Open(ByNameSymlinkMap&& by_name_symlink_map) { if (by_name_symlink_map.empty()) { LERROR << "Empty by_name_symlink_map when opening FsManagerAvbHandle"; return nullptr; } FsManagerAvbOps avb_ops(std::move(by_name_symlink_map)); return DoOpen(&avb_ops); } FsManagerAvbUniquePtr FsManagerAvbHandle::DoOpen(FsManagerAvbOps* avb_ops) { FsManagerAvbUniquePtr FsManagerAvbHandle::Open() { bool is_device_unlocked = fs_mgr_is_device_unlocked(); FsManagerAvbUniquePtr avb_handle(new FsManagerAvbHandle()); Loading @@ -384,10 +370,11 @@ FsManagerAvbUniquePtr FsManagerAvbHandle::DoOpen(FsManagerAvbOps* avb_ops) { return nullptr; } FsManagerAvbOps avb_ops; AvbSlotVerifyFlags flags = is_device_unlocked ? AVB_SLOT_VERIFY_FLAGS_ALLOW_VERIFICATION_ERROR : AVB_SLOT_VERIFY_FLAGS_NONE; AvbSlotVerifyResult verify_result = avb_ops->AvbSlotVerify(fs_mgr_get_slot_suffix(), flags, &avb_handle->avb_slot_data_); avb_ops.AvbSlotVerify(fs_mgr_get_slot_suffix(), flags, &avb_handle->avb_slot_data_); // Only allow two verify results: // - AVB_SLOT_VERIFY_RESULT_OK. Loading fs_mgr/fs_mgr_avb_ops.cpp +4 −23 Original line number Diff line number Diff line Loading @@ -40,6 +40,8 @@ #include "fs_mgr.h" #include "fs_mgr_priv.h" using namespace std::literals; static AvbIOResult read_from_partition(AvbOps* ops, const char* partition, int64_t offset, size_t num_bytes, void* buffer, size_t* out_num_read) { return FsManagerAvbOps::GetInstanceFromAvbOps(ops)->ReadFromPartition( Loading Loading @@ -98,7 +100,7 @@ static AvbIOResult dummy_get_size_of_partition(AvbOps* ops ATTRIBUTE_UNUSED, return AVB_IO_RESULT_OK; } void FsManagerAvbOps::InitializeAvbOps() { FsManagerAvbOps::FsManagerAvbOps() { // We only need to provide the implementation of read_from_partition() // operation since that's all what is being used by the avb_slot_verify(). // Other I/O operations are only required in bootloader but not in Loading @@ -116,31 +118,10 @@ void FsManagerAvbOps::InitializeAvbOps() { avb_ops_.user_data = this; } FsManagerAvbOps::FsManagerAvbOps(std::map<std::string, std::string>&& by_name_symlink_map) : by_name_symlink_map_(std::move(by_name_symlink_map)) { InitializeAvbOps(); } FsManagerAvbOps::FsManagerAvbOps(const fstab& fstab) { // Constructs the by-name symlink map for each fstab record. // /dev/block/platform/soc.0/7824900.sdhci/by-name/system_a => // by_name_symlink_map_["system_a"] = "/dev/block/platform/soc.0/7824900.sdhci/by-name/system_a" for (int i = 0; i < fstab.num_entries; i++) { std::string partition_name = basename(fstab.recs[i].blk_device); by_name_symlink_map_[partition_name] = fstab.recs[i].blk_device; } InitializeAvbOps(); } AvbIOResult FsManagerAvbOps::ReadFromPartition(const char* partition, int64_t offset, size_t num_bytes, void* buffer, size_t* out_num_read) { const auto iter = by_name_symlink_map_.find(partition); if (iter == by_name_symlink_map_.end()) { LERROR << "by-name symlink not found for partition: '" << partition << "'"; return AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION; } std::string path = iter->second; const std::string path = "/dev/block/by-name/"s + partition; // Ensures the device path (a symlink created by init) is ready to access. if (!fs_mgr_wait_for_file(path, 1s)) { Loading fs_mgr/fs_mgr_priv_avb_ops.h +1 −4 Original line number Diff line number Diff line Loading @@ -46,8 +46,7 @@ // class FsManagerAvbOps { public: FsManagerAvbOps(const fstab& fstab); FsManagerAvbOps(std::map<std::string, std::string>&& by_name_symlink_map); FsManagerAvbOps(); static FsManagerAvbOps* GetInstanceFromAvbOps(AvbOps* ops) { return reinterpret_cast<FsManagerAvbOps*>(ops->user_data); Loading @@ -60,8 +59,6 @@ class FsManagerAvbOps { AvbSlotVerifyData** out_data); private: void InitializeAvbOps(); AvbOps avb_ops_; std::map<std::string, std::string> by_name_symlink_map_; }; Loading fs_mgr/include/fs_mgr_avb.h +1 −10 Original line number Diff line number Diff line Loading @@ -53,13 +53,6 @@ class FsManagerAvbHandle { // A typical usage will be: // - FsManagerAvbUniquePtr handle = FsManagerAvbHandle::Open(); // // There are two overloaded Open() functions with a single parameter. // The argument can be a ByNameSymlinkMap describing the mapping from partition // name to by-name symlink, or a fstab file to which the ByNameSymlinkMap is // constructed from. e.g., // - /dev/block/platform/soc.0/7824900.sdhci/by-name/system_a -> // - ByNameSymlinkMap["system_a"] = "/dev/block/platform/soc.0/7824900.sdhci/by-name/system_a" // // Possible return values: // - nullptr: any error when reading and verifying the metadata, // e.g., I/O error, digest value mismatch, size mismatch, etc. Loading @@ -82,8 +75,7 @@ class FsManagerAvbHandle { // - a valid unique_ptr with status kAvbHandleSuccess: the metadata // is verified and can be trusted. // static FsManagerAvbUniquePtr Open(const fstab& fstab); static FsManagerAvbUniquePtr Open(ByNameSymlinkMap&& by_name_symlink_map); static FsManagerAvbUniquePtr Open(); // Sets up dm-verity on the given fstab entry. // The 'wait_for_verity_dev' parameter makes this function wait for the Loading Loading @@ -121,7 +113,6 @@ class FsManagerAvbHandle { }; FsManagerAvbHandle() : avb_slot_data_(nullptr), status_(kAvbHandleUninitialized) {} static FsManagerAvbUniquePtr DoOpen(FsManagerAvbOps* avb_ops); AvbSlotVerifyData* avb_slot_data_; AvbHandleStatus status_; Loading Loading
fs_mgr/fs_mgr.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -1031,7 +1031,7 @@ int fs_mgr_mount_all(fstab* fstab, int mount_mode) { if (fstab->recs[i].fs_mgr_flags & MF_AVB) { if (!avb_handle) { avb_handle = FsManagerAvbHandle::Open(*fstab); avb_handle = FsManagerAvbHandle::Open(); if (!avb_handle) { LERROR << "Failed to open FsManagerAvbHandle"; return FS_MGR_MNTALL_FAIL; Loading Loading @@ -1275,7 +1275,7 @@ static int fs_mgr_do_mount_helper(fstab* fstab, const char* n_name, char* n_blk_ if (fstab->recs[i].fs_mgr_flags & MF_AVB) { if (!avb_handle) { avb_handle = FsManagerAvbHandle::Open(*fstab); avb_handle = FsManagerAvbHandle::Open(); if (!avb_handle) { LERROR << "Failed to open FsManagerAvbHandle"; return FS_MGR_DOMNT_FAILED; Loading
fs_mgr/fs_mgr_avb.cpp +3 −16 Original line number Diff line number Diff line Loading @@ -361,21 +361,7 @@ static bool get_hashtree_descriptor(const std::string& partition_name, return true; } FsManagerAvbUniquePtr FsManagerAvbHandle::Open(const fstab& fstab) { FsManagerAvbOps avb_ops(fstab); return DoOpen(&avb_ops); } FsManagerAvbUniquePtr FsManagerAvbHandle::Open(ByNameSymlinkMap&& by_name_symlink_map) { if (by_name_symlink_map.empty()) { LERROR << "Empty by_name_symlink_map when opening FsManagerAvbHandle"; return nullptr; } FsManagerAvbOps avb_ops(std::move(by_name_symlink_map)); return DoOpen(&avb_ops); } FsManagerAvbUniquePtr FsManagerAvbHandle::DoOpen(FsManagerAvbOps* avb_ops) { FsManagerAvbUniquePtr FsManagerAvbHandle::Open() { bool is_device_unlocked = fs_mgr_is_device_unlocked(); FsManagerAvbUniquePtr avb_handle(new FsManagerAvbHandle()); Loading @@ -384,10 +370,11 @@ FsManagerAvbUniquePtr FsManagerAvbHandle::DoOpen(FsManagerAvbOps* avb_ops) { return nullptr; } FsManagerAvbOps avb_ops; AvbSlotVerifyFlags flags = is_device_unlocked ? AVB_SLOT_VERIFY_FLAGS_ALLOW_VERIFICATION_ERROR : AVB_SLOT_VERIFY_FLAGS_NONE; AvbSlotVerifyResult verify_result = avb_ops->AvbSlotVerify(fs_mgr_get_slot_suffix(), flags, &avb_handle->avb_slot_data_); avb_ops.AvbSlotVerify(fs_mgr_get_slot_suffix(), flags, &avb_handle->avb_slot_data_); // Only allow two verify results: // - AVB_SLOT_VERIFY_RESULT_OK. Loading
fs_mgr/fs_mgr_avb_ops.cpp +4 −23 Original line number Diff line number Diff line Loading @@ -40,6 +40,8 @@ #include "fs_mgr.h" #include "fs_mgr_priv.h" using namespace std::literals; static AvbIOResult read_from_partition(AvbOps* ops, const char* partition, int64_t offset, size_t num_bytes, void* buffer, size_t* out_num_read) { return FsManagerAvbOps::GetInstanceFromAvbOps(ops)->ReadFromPartition( Loading Loading @@ -98,7 +100,7 @@ static AvbIOResult dummy_get_size_of_partition(AvbOps* ops ATTRIBUTE_UNUSED, return AVB_IO_RESULT_OK; } void FsManagerAvbOps::InitializeAvbOps() { FsManagerAvbOps::FsManagerAvbOps() { // We only need to provide the implementation of read_from_partition() // operation since that's all what is being used by the avb_slot_verify(). // Other I/O operations are only required in bootloader but not in Loading @@ -116,31 +118,10 @@ void FsManagerAvbOps::InitializeAvbOps() { avb_ops_.user_data = this; } FsManagerAvbOps::FsManagerAvbOps(std::map<std::string, std::string>&& by_name_symlink_map) : by_name_symlink_map_(std::move(by_name_symlink_map)) { InitializeAvbOps(); } FsManagerAvbOps::FsManagerAvbOps(const fstab& fstab) { // Constructs the by-name symlink map for each fstab record. // /dev/block/platform/soc.0/7824900.sdhci/by-name/system_a => // by_name_symlink_map_["system_a"] = "/dev/block/platform/soc.0/7824900.sdhci/by-name/system_a" for (int i = 0; i < fstab.num_entries; i++) { std::string partition_name = basename(fstab.recs[i].blk_device); by_name_symlink_map_[partition_name] = fstab.recs[i].blk_device; } InitializeAvbOps(); } AvbIOResult FsManagerAvbOps::ReadFromPartition(const char* partition, int64_t offset, size_t num_bytes, void* buffer, size_t* out_num_read) { const auto iter = by_name_symlink_map_.find(partition); if (iter == by_name_symlink_map_.end()) { LERROR << "by-name symlink not found for partition: '" << partition << "'"; return AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION; } std::string path = iter->second; const std::string path = "/dev/block/by-name/"s + partition; // Ensures the device path (a symlink created by init) is ready to access. if (!fs_mgr_wait_for_file(path, 1s)) { Loading
fs_mgr/fs_mgr_priv_avb_ops.h +1 −4 Original line number Diff line number Diff line Loading @@ -46,8 +46,7 @@ // class FsManagerAvbOps { public: FsManagerAvbOps(const fstab& fstab); FsManagerAvbOps(std::map<std::string, std::string>&& by_name_symlink_map); FsManagerAvbOps(); static FsManagerAvbOps* GetInstanceFromAvbOps(AvbOps* ops) { return reinterpret_cast<FsManagerAvbOps*>(ops->user_data); Loading @@ -60,8 +59,6 @@ class FsManagerAvbOps { AvbSlotVerifyData** out_data); private: void InitializeAvbOps(); AvbOps avb_ops_; std::map<std::string, std::string> by_name_symlink_map_; }; Loading
fs_mgr/include/fs_mgr_avb.h +1 −10 Original line number Diff line number Diff line Loading @@ -53,13 +53,6 @@ class FsManagerAvbHandle { // A typical usage will be: // - FsManagerAvbUniquePtr handle = FsManagerAvbHandle::Open(); // // There are two overloaded Open() functions with a single parameter. // The argument can be a ByNameSymlinkMap describing the mapping from partition // name to by-name symlink, or a fstab file to which the ByNameSymlinkMap is // constructed from. e.g., // - /dev/block/platform/soc.0/7824900.sdhci/by-name/system_a -> // - ByNameSymlinkMap["system_a"] = "/dev/block/platform/soc.0/7824900.sdhci/by-name/system_a" // // Possible return values: // - nullptr: any error when reading and verifying the metadata, // e.g., I/O error, digest value mismatch, size mismatch, etc. Loading @@ -82,8 +75,7 @@ class FsManagerAvbHandle { // - a valid unique_ptr with status kAvbHandleSuccess: the metadata // is verified and can be trusted. // static FsManagerAvbUniquePtr Open(const fstab& fstab); static FsManagerAvbUniquePtr Open(ByNameSymlinkMap&& by_name_symlink_map); static FsManagerAvbUniquePtr Open(); // Sets up dm-verity on the given fstab entry. // The 'wait_for_verity_dev' parameter makes this function wait for the Loading Loading @@ -121,7 +113,6 @@ class FsManagerAvbHandle { }; FsManagerAvbHandle() : avb_slot_data_(nullptr), status_(kAvbHandleUninitialized) {} static FsManagerAvbUniquePtr DoOpen(FsManagerAvbOps* avb_ops); AvbSlotVerifyData* avb_slot_data_; AvbHandleStatus status_; Loading