diff --git a/fs_mgr/fs_mgr_avb.cpp b/fs_mgr/fs_mgr_avb.cpp index 7c82bb1e6..83bf8a778 100644 --- a/fs_mgr/fs_mgr_avb.cpp +++ b/fs_mgr/fs_mgr_avb.cpp @@ -493,6 +493,10 @@ FsManagerAvbUniquePtr FsManagerAvbHandle::Open(const std::string& device_file_by return nullptr; } + // Sets the MAJOR.MINOR for init to set it into "ro.boot.avb_version". + avb_handle->avb_version_ = + android::base::StringPrintf("%d.%d", AVB_VERSION_MAJOR, AVB_VERSION_MINOR); + // Verifies vbmeta images against the digest passed from bootloader. if (!avb_verifier->VerifyVbmetaImages(*avb_handle->avb_slot_data_)) { LERROR << "VerifyVbmetaImages failed"; diff --git a/fs_mgr/include/fs_mgr_avb.h b/fs_mgr/include/fs_mgr_avb.h index 526a5ce06..a66ff42cc 100644 --- a/fs_mgr/include/fs_mgr_avb.h +++ b/fs_mgr/include/fs_mgr_avb.h @@ -72,7 +72,8 @@ class FsManagerAvbHandle { // Otherwise, returns false. bool SetUpAvb(fstab_rec* fstab_entry, bool wait_for_verity_dev); - bool AvbHashtreeDisabled() { return status_ == kFsManagerAvbHandleHashtreeDisabled; } + bool hashtree_disabled() const { return status_ == kFsManagerAvbHandleHashtreeDisabled; } + const std::string& avb_version() const { return avb_version_; } FsManagerAvbHandle(const FsManagerAvbHandle&) = delete; // no copy FsManagerAvbHandle& operator=(const FsManagerAvbHandle&) = delete; // no assignment @@ -92,6 +93,7 @@ class FsManagerAvbHandle { private: AvbSlotVerifyData* avb_slot_data_; FsManagerAvbHandleStatus status_; + std::string avb_version_; }; #endif /* __CORE_FS_MGR_AVB_H */ diff --git a/init/init.cpp b/init/init.cpp index 6c1c54128..181b18d0b 100644 --- a/init/init.cpp +++ b/init/init.cpp @@ -1010,10 +1010,11 @@ static bool vboot_2_0_mount_partitions(const std::vector& fstab_recs return false; } + setenv("INIT_AVB_VERSION", avb_handle->avb_version().c_str(), 1); for (auto rec : fstab_recs) { bool need_create_dm_device = false; if (fs_mgr_is_avb(rec)) { - if (avb_handle->AvbHashtreeDisabled()) { + if (avb_handle->hashtree_disabled()) { LOG(INFO) << "avb hashtree disabled for '" << rec->mount_point << "'"; } else if (avb_handle->SetUpAvb(rec, false /* wait_for_verity_dev */)) { need_create_dm_device = true; @@ -1362,12 +1363,14 @@ int main(int argc, char** argv) { property_set("ro.boottime.init.selinux", getenv("INIT_SELINUX_TOOK")); // Set libavb version for Framework-only OTA match in Treble build. - property_set("ro.boot.init.avb_version", std::to_string(AVB_MAJOR_VERSION).c_str()); + const char* avb_version = getenv("INIT_AVB_VERSION"); + if (avb_version) property_set("ro.boot.avb_version", avb_version); // Clean up our environment. unsetenv("INIT_SECOND_STAGE"); unsetenv("INIT_STARTED_AT"); unsetenv("INIT_SELINUX_TOOK"); + unsetenv("INIT_AVB_VERSION"); // Now set up SELinux for second stage. selinux_initialize(false);