Loading fs_mgr/fs_mgr_overlayfs.cpp +4 −3 Original line number Original line Diff line number Diff line Loading @@ -90,7 +90,7 @@ std::vector<std::string> fs_mgr_overlayfs_required_devices(Fstab*) { return {}; return {}; } } bool fs_mgr_overlayfs_setup(const char*, const char*, bool* change) { bool fs_mgr_overlayfs_setup(const char*, const char*, bool* change, bool) { if (change) *change = false; if (change) *change = false; return false; return false; } } Loading Loading @@ -903,7 +903,8 @@ std::vector<std::string> fs_mgr_overlayfs_required_devices(Fstab* fstab) { // Returns false if setup not permitted, errno set to last error. // Returns false if setup not permitted, errno set to last error. // If something is altered, set *change. // If something is altered, set *change. bool fs_mgr_overlayfs_setup(const char* backing, const char* mount_point, bool* change) { bool fs_mgr_overlayfs_setup(const char* backing, const char* mount_point, bool* change, bool force) { if (change) *change = false; if (change) *change = false; auto ret = false; auto ret = false; if (fs_mgr_overlayfs_valid() == OverlayfsValidResult::kNotSupported) return ret; if (fs_mgr_overlayfs_valid() == OverlayfsValidResult::kNotSupported) return ret; Loading @@ -927,7 +928,7 @@ bool fs_mgr_overlayfs_setup(const char* backing, const char* mount_point, bool* continue; continue; } } save_errno = errno; save_errno = errno; auto verity_enabled = fs_mgr_is_verity_enabled(*it); auto verity_enabled = !force && fs_mgr_is_verity_enabled(*it); if (errno == ENOENT || errno == ENXIO) errno = save_errno; if (errno == ENOENT || errno == ENXIO) errno = save_errno; if (verity_enabled) { if (verity_enabled) { it = candidates.erase(it); it = candidates.erase(it); Loading fs_mgr/fs_mgr_remount.cpp +20 −31 Original line number Original line Diff line number Diff line Loading @@ -250,53 +250,42 @@ int main(int argc, char* argv[]) { // Check verity and optionally setup overlayfs backing. // Check verity and optionally setup overlayfs backing. auto reboot_later = false; auto reboot_later = false; auto user_please_reboot_later = false; auto user_please_reboot_later = false; auto uses_overlayfs = fs_mgr_overlayfs_valid() != OverlayfsValidResult::kNotSupported; auto setup_overlayfs = false; auto setup_overlayfs = false; auto just_disabled_verity = false; for (auto it = partitions.begin(); it != partitions.end();) { for (auto it = partitions.begin(); it != partitions.end();) { auto& entry = *it; auto& entry = *it; auto& mount_point = entry.mount_point; auto& mount_point = entry.mount_point; if (fs_mgr_is_verity_enabled(entry)) { if (fs_mgr_is_verity_enabled(entry)) { retval = VERITY_PARTITION; retval = VERITY_PARTITION; auto ret = false; if (android::base::GetProperty("ro.boot.vbmeta.device_state", "") != "locked") { if (android::base::GetProperty("ro.boot.vbmeta.device_state", "") != "locked") { if (AvbOps* ops = avb_ops_user_new()) { if (AvbOps* ops = avb_ops_user_new()) { auto ret = avb_user_verity_set( ret = avb_user_verity_set( ops, android::base::GetProperty("ro.boot.slot_suffix", "").c_str(), ops, android::base::GetProperty("ro.boot.slot_suffix", "").c_str(), false); false); avb_ops_user_free(ops); avb_ops_user_free(ops); if (ret) { LOG(WARNING) << "Disabling verity for " << mount_point; reboot_later = can_reboot; if (reboot_later) { // w/o overlayfs available, also check for dedupe if (!uses_overlayfs) { ++it; continue; } reboot(); } } user_please_reboot_later = true; if (!ret && fs_mgr_set_blk_ro(entry.blk_device, false)) { } else if (fs_mgr_set_blk_ro(entry.blk_device, false)) { fec::io fh(entry.blk_device.c_str(), O_RDWR); fec::io fh(entry.blk_device.c_str(), O_RDWR); if (fh && fh.set_verity_status(false)) { ret = fh && fh.set_verity_status(false); } if (ret) { LOG(WARNING) << "Disabling verity for " << mount_point; LOG(WARNING) << "Disabling verity for " << mount_point; just_disabled_verity = true; reboot_later = can_reboot; reboot_later = can_reboot; if (reboot_later && !uses_overlayfs) { ++it; continue; } user_please_reboot_later = true; user_please_reboot_later = true; } } } } } if (!ret) { } LOG(ERROR) << "Skipping " << mount_point << " for remount"; LOG(ERROR) << "Skipping " << mount_point << " for remount"; it = partitions.erase(it); it = partitions.erase(it); continue; continue; } } } auto change = false; auto change = false; errno = 0; errno = 0; if (fs_mgr_overlayfs_setup(nullptr, mount_point.c_str(), &change)) { if (fs_mgr_overlayfs_setup(nullptr, mount_point.c_str(), &change, just_disabled_verity)) { if (change) { if (change) { LOG(INFO) << "Using overlayfs for " << mount_point; LOG(INFO) << "Using overlayfs for " << mount_point; reboot_later = can_reboot; reboot_later = can_reboot; Loading @@ -312,7 +301,7 @@ int main(int argc, char* argv[]) { ++it; ++it; } } if (partitions.empty()) { if (partitions.empty() || just_disabled_verity) { if (reboot_later) reboot(setup_overlayfs); if (reboot_later) reboot(setup_overlayfs); if (user_please_reboot_later) { if (user_please_reboot_later) { LOG(INFO) << "Now reboot your device for settings to take effect"; LOG(INFO) << "Now reboot your device for settings to take effect"; Loading fs_mgr/include/fs_mgr_overlayfs.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -26,7 +26,7 @@ android::fs_mgr::Fstab fs_mgr_overlayfs_candidate_list(const android::fs_mgr::Fs bool fs_mgr_overlayfs_mount_all(android::fs_mgr::Fstab* fstab); bool fs_mgr_overlayfs_mount_all(android::fs_mgr::Fstab* fstab); std::vector<std::string> fs_mgr_overlayfs_required_devices(android::fs_mgr::Fstab* fstab); std::vector<std::string> fs_mgr_overlayfs_required_devices(android::fs_mgr::Fstab* fstab); bool fs_mgr_overlayfs_setup(const char* backing = nullptr, const char* mount_point = nullptr, bool fs_mgr_overlayfs_setup(const char* backing = nullptr, const char* mount_point = nullptr, bool* change = nullptr); bool* change = nullptr, bool force = true); bool fs_mgr_overlayfs_teardown(const char* mount_point = nullptr, bool* change = nullptr); bool fs_mgr_overlayfs_teardown(const char* mount_point = nullptr, bool* change = nullptr); bool fs_mgr_overlayfs_is_setup(); bool fs_mgr_overlayfs_is_setup(); bool fs_mgr_has_shared_blocks(const std::string& mount_point, const std::string& dev); bool fs_mgr_has_shared_blocks(const std::string& mount_point, const std::string& dev); Loading Loading
fs_mgr/fs_mgr_overlayfs.cpp +4 −3 Original line number Original line Diff line number Diff line Loading @@ -90,7 +90,7 @@ std::vector<std::string> fs_mgr_overlayfs_required_devices(Fstab*) { return {}; return {}; } } bool fs_mgr_overlayfs_setup(const char*, const char*, bool* change) { bool fs_mgr_overlayfs_setup(const char*, const char*, bool* change, bool) { if (change) *change = false; if (change) *change = false; return false; return false; } } Loading Loading @@ -903,7 +903,8 @@ std::vector<std::string> fs_mgr_overlayfs_required_devices(Fstab* fstab) { // Returns false if setup not permitted, errno set to last error. // Returns false if setup not permitted, errno set to last error. // If something is altered, set *change. // If something is altered, set *change. bool fs_mgr_overlayfs_setup(const char* backing, const char* mount_point, bool* change) { bool fs_mgr_overlayfs_setup(const char* backing, const char* mount_point, bool* change, bool force) { if (change) *change = false; if (change) *change = false; auto ret = false; auto ret = false; if (fs_mgr_overlayfs_valid() == OverlayfsValidResult::kNotSupported) return ret; if (fs_mgr_overlayfs_valid() == OverlayfsValidResult::kNotSupported) return ret; Loading @@ -927,7 +928,7 @@ bool fs_mgr_overlayfs_setup(const char* backing, const char* mount_point, bool* continue; continue; } } save_errno = errno; save_errno = errno; auto verity_enabled = fs_mgr_is_verity_enabled(*it); auto verity_enabled = !force && fs_mgr_is_verity_enabled(*it); if (errno == ENOENT || errno == ENXIO) errno = save_errno; if (errno == ENOENT || errno == ENXIO) errno = save_errno; if (verity_enabled) { if (verity_enabled) { it = candidates.erase(it); it = candidates.erase(it); Loading
fs_mgr/fs_mgr_remount.cpp +20 −31 Original line number Original line Diff line number Diff line Loading @@ -250,53 +250,42 @@ int main(int argc, char* argv[]) { // Check verity and optionally setup overlayfs backing. // Check verity and optionally setup overlayfs backing. auto reboot_later = false; auto reboot_later = false; auto user_please_reboot_later = false; auto user_please_reboot_later = false; auto uses_overlayfs = fs_mgr_overlayfs_valid() != OverlayfsValidResult::kNotSupported; auto setup_overlayfs = false; auto setup_overlayfs = false; auto just_disabled_verity = false; for (auto it = partitions.begin(); it != partitions.end();) { for (auto it = partitions.begin(); it != partitions.end();) { auto& entry = *it; auto& entry = *it; auto& mount_point = entry.mount_point; auto& mount_point = entry.mount_point; if (fs_mgr_is_verity_enabled(entry)) { if (fs_mgr_is_verity_enabled(entry)) { retval = VERITY_PARTITION; retval = VERITY_PARTITION; auto ret = false; if (android::base::GetProperty("ro.boot.vbmeta.device_state", "") != "locked") { if (android::base::GetProperty("ro.boot.vbmeta.device_state", "") != "locked") { if (AvbOps* ops = avb_ops_user_new()) { if (AvbOps* ops = avb_ops_user_new()) { auto ret = avb_user_verity_set( ret = avb_user_verity_set( ops, android::base::GetProperty("ro.boot.slot_suffix", "").c_str(), ops, android::base::GetProperty("ro.boot.slot_suffix", "").c_str(), false); false); avb_ops_user_free(ops); avb_ops_user_free(ops); if (ret) { LOG(WARNING) << "Disabling verity for " << mount_point; reboot_later = can_reboot; if (reboot_later) { // w/o overlayfs available, also check for dedupe if (!uses_overlayfs) { ++it; continue; } reboot(); } } user_please_reboot_later = true; if (!ret && fs_mgr_set_blk_ro(entry.blk_device, false)) { } else if (fs_mgr_set_blk_ro(entry.blk_device, false)) { fec::io fh(entry.blk_device.c_str(), O_RDWR); fec::io fh(entry.blk_device.c_str(), O_RDWR); if (fh && fh.set_verity_status(false)) { ret = fh && fh.set_verity_status(false); } if (ret) { LOG(WARNING) << "Disabling verity for " << mount_point; LOG(WARNING) << "Disabling verity for " << mount_point; just_disabled_verity = true; reboot_later = can_reboot; reboot_later = can_reboot; if (reboot_later && !uses_overlayfs) { ++it; continue; } user_please_reboot_later = true; user_please_reboot_later = true; } } } } } if (!ret) { } LOG(ERROR) << "Skipping " << mount_point << " for remount"; LOG(ERROR) << "Skipping " << mount_point << " for remount"; it = partitions.erase(it); it = partitions.erase(it); continue; continue; } } } auto change = false; auto change = false; errno = 0; errno = 0; if (fs_mgr_overlayfs_setup(nullptr, mount_point.c_str(), &change)) { if (fs_mgr_overlayfs_setup(nullptr, mount_point.c_str(), &change, just_disabled_verity)) { if (change) { if (change) { LOG(INFO) << "Using overlayfs for " << mount_point; LOG(INFO) << "Using overlayfs for " << mount_point; reboot_later = can_reboot; reboot_later = can_reboot; Loading @@ -312,7 +301,7 @@ int main(int argc, char* argv[]) { ++it; ++it; } } if (partitions.empty()) { if (partitions.empty() || just_disabled_verity) { if (reboot_later) reboot(setup_overlayfs); if (reboot_later) reboot(setup_overlayfs); if (user_please_reboot_later) { if (user_please_reboot_later) { LOG(INFO) << "Now reboot your device for settings to take effect"; LOG(INFO) << "Now reboot your device for settings to take effect"; Loading
fs_mgr/include/fs_mgr_overlayfs.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -26,7 +26,7 @@ android::fs_mgr::Fstab fs_mgr_overlayfs_candidate_list(const android::fs_mgr::Fs bool fs_mgr_overlayfs_mount_all(android::fs_mgr::Fstab* fstab); bool fs_mgr_overlayfs_mount_all(android::fs_mgr::Fstab* fstab); std::vector<std::string> fs_mgr_overlayfs_required_devices(android::fs_mgr::Fstab* fstab); std::vector<std::string> fs_mgr_overlayfs_required_devices(android::fs_mgr::Fstab* fstab); bool fs_mgr_overlayfs_setup(const char* backing = nullptr, const char* mount_point = nullptr, bool fs_mgr_overlayfs_setup(const char* backing = nullptr, const char* mount_point = nullptr, bool* change = nullptr); bool* change = nullptr, bool force = true); bool fs_mgr_overlayfs_teardown(const char* mount_point = nullptr, bool* change = nullptr); bool fs_mgr_overlayfs_teardown(const char* mount_point = nullptr, bool* change = nullptr); bool fs_mgr_overlayfs_is_setup(); bool fs_mgr_overlayfs_is_setup(); bool fs_mgr_has_shared_blocks(const std::string& mount_point, const std::string& dev); bool fs_mgr_has_shared_blocks(const std::string& mount_point, const std::string& dev); Loading