diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2019-12-19 08:10:17 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2019-12-19 08:10:17 +0000 |
commit | 27b5a7aa4d2b595d5bc1034a4f0f91a75b301bff (patch) | |
tree | f76e5a071e6e1e91bdfdc5b35406c70070d364ed | |
parent | ff34b18d49a0966d60181aa728ff0ffc961932ee (diff) | |
parent | a41373acd02cc04e2ffa4088eb6ee0a964fd3dec (diff) | |
download | platform_system_apex-android10-qpr2-release.tar.gz platform_system_apex-android10-qpr2-release.tar.bz2 platform_system_apex-android10-qpr2-release.zip |
Snap for 6085360 from a41373acd02cc04e2ffa4088eb6ee0a964fd3dec to qt-qpr2-releaseandroid-10.0.0_r36android-10.0.0_r35android-10.0.0_r34android-10.0.0_r33android-10.0.0_r32android-10.0.0_r31android-10.0.0_r30android10-qpr2-s4-releaseandroid10-qpr2-s3-releaseandroid10-qpr2-s2-releaseandroid10-qpr2-s1-releaseandroid10-qpr2-release
Change-Id: I65ca498018e0e7d8670183e17061266fa62d733f
-rw-r--r-- | apexd/apexd.cpp | 12 | ||||
-rw-r--r-- | apexd/apexd_session.cpp | 8 | ||||
-rw-r--r-- | apexd/apexd_session.h | 2 | ||||
-rw-r--r-- | apexd/apexservice_test.cpp | 15 | ||||
-rw-r--r-- | proto/session_state.proto | 3 |
5 files changed, 40 insertions, 0 deletions
diff --git a/apexd/apexd.cpp b/apexd/apexd.cpp index 4f5ca521..589b9621 100644 --- a/apexd/apexd.cpp +++ b/apexd/apexd.cpp @@ -93,6 +93,8 @@ static constexpr const char* kApexStatusSysprop = "apexd.status"; static constexpr const char* kApexStatusStarting = "starting"; static constexpr const char* kApexStatusReady = "ready"; +static constexpr const char* kBuildFingerprintSysprop = "ro.build.fingerprint"; + static constexpr const char* kApexVerityOnSystemProp = "persist.apexd.verity_on_system"; static bool gForceDmVerityOnSystem = @@ -1372,6 +1374,7 @@ Status scanPackagesDirAndActivate(const char* apex_package_dir) { } void scanStagedSessionsDirAndStage() { + using android::base::GetProperty; LOG(INFO) << "Scanning " << kApexSessionsDir << " looking for sessions to be activated."; @@ -1389,6 +1392,12 @@ void scanStagedSessionsDirAndStage() { }; auto scope_guard = android::base::make_scope_guard(session_failed_fn); + std::string build_fingerprint = GetProperty(kBuildFingerprintSysprop, ""); + if (session.GetBuildFingerprint().compare(build_fingerprint) != 0) { + LOG(ERROR) << "APEX build fingerprint has changed"; + continue; + } + std::vector<std::string> dirsToScan; if (session.GetChildSessionIds().empty()) { dirsToScan.push_back(std::string(kStagedSessionsDir) + "/session_" + @@ -1789,6 +1798,7 @@ void onAllPackagesReady() { StatusOr<std::vector<ApexFile>> submitStagedSession( const int session_id, const std::vector<int>& child_session_ids) { + using android::base::GetProperty; bool needsBackup = true; Status cleanup_status = ClearSessions(); if (!cleanup_status.Ok()) { @@ -1843,6 +1853,8 @@ StatusOr<std::vector<ApexFile>> submitStagedSession( return StatusOr<std::vector<ApexFile>>::MakeError(session.ErrorMessage()); } (*session).SetChildSessionIds(child_session_ids); + std::string build_fingerprint = GetProperty(kBuildFingerprintSysprop, ""); + (*session).SetBuildFingerprint(build_fingerprint); Status commit_status = (*session).UpdateStateAndCommit(SessionState::VERIFIED); if (!commit_status.Ok()) { diff --git a/apexd/apexd_session.cpp b/apexd/apexd_session.cpp index c94585f5..98180b77 100644 --- a/apexd/apexd_session.cpp +++ b/apexd/apexd_session.cpp @@ -168,6 +168,10 @@ SessionState::State ApexSession::GetState() const { return state_.state(); } int ApexSession::GetId() const { return state_.id(); } +std::string ApexSession::GetBuildFingerprint() const { + return state_.expected_build_fingerprint(); +} + bool ApexSession::IsFinalized() const { switch (GetState()) { case SessionState::SUCCESS: @@ -194,6 +198,10 @@ void ApexSession::SetChildSessionIds( child_session_ids.end()}; } +void ApexSession::SetBuildFingerprint(const std::string& fingerprint) { + *(state_.mutable_expected_build_fingerprint()) = fingerprint; +} + Status ApexSession::UpdateStateAndCommit( const SessionState::State& session_state) { state_.set_state(session_state); diff --git a/apexd/apexd_session.h b/apexd/apexd_session.h index 5f32198d..7b6b703f 100644 --- a/apexd/apexd_session.h +++ b/apexd/apexd_session.h @@ -43,9 +43,11 @@ class ApexSession { const google::protobuf::RepeatedField<int> GetChildSessionIds() const; ::apex::proto::SessionState::State GetState() const; int GetId() const; + std::string GetBuildFingerprint() const; bool IsFinalized() const; void SetChildSessionIds(const std::vector<int>& child_session_ids); + void SetBuildFingerprint(const std::string& fingerprint); Status UpdateStateAndCommit(const ::apex::proto::SessionState::State& state); Status DeleteSession() const; diff --git a/apexd/apexservice_test.cpp b/apexd/apexservice_test.cpp index cad77899..89ca62b3 100644 --- a/apexd/apexservice_test.cpp +++ b/apexd/apexservice_test.cpp @@ -565,6 +565,21 @@ TEST_F(ApexServiceTest, } } +TEST_F(ApexServiceTest, SubmitStagedSessionStoresBuildFingerprint) { + PrepareTestApexForInstall installer(GetTestFile("apex.apexd_test.apex"), + "/data/app-staging/session_1547", + "staging_data_file"); + if (!installer.Prepare()) { + return; + } + ApexInfoList list; + bool success; + ASSERT_TRUE(IsOk(service_->submitStagedSession(1547, {}, &list, &success))); + + auto session = ApexSession::GetSession(1547); + ASSERT_FALSE(session->GetBuildFingerprint().empty()); +} + TEST_F(ApexServiceTest, SubmitStagedSessionFailDoesNotLeakTempVerityDevices) { using android::dm::DeviceMapper; diff --git a/proto/session_state.proto b/proto/session_state.proto index addb7030..f0233534 100644 --- a/proto/session_state.proto +++ b/proto/session_state.proto @@ -39,4 +39,7 @@ message SessionState { // Child session ids repeated int32 child_session_ids = 3; + + // Build fingerprint before reboot + string expected_build_fingerprint = 4; } |