From 5996d608af75755f0c1964e62fe69482761efd24 Mon Sep 17 00:00:00 2001 From: Chan Wang Date: Thu, 14 Nov 2024 13:25:37 +0000 Subject: [PATCH] Use the new 'partition' field in 'ApexInfo' to identify vendor apexes A new field 'partition' was added to `ApexInfo` recently which stores pre-installed partition information as string (e.g. 'SYSTEM') in aosp/3335753. Using 'partition' field for Subcontext vendor apex initialization because the existing field `preinstalledModulePath` won't be populated for brand-new apex (a new type we introduced recently). Bug: 377111286 Test: atest CtsInitTestCases Change-Id: I8970b3cb5884bdb949035f5bdc5b2e18618cc9cc --- init/init.cpp | 3 +-- init/subcontext.cpp | 11 ++++++++--- init/subcontext.h | 6 +++++- init/subcontext_benchmark.cpp | 2 +- init/subcontext_test.cpp | 15 ++++++++++++++- 5 files changed, 29 insertions(+), 8 deletions(-) diff --git a/init/init.cpp b/init/init.cpp index 17498da6d..5b0b0ddee 100644 --- a/init/init.cpp +++ b/init/init.cpp @@ -315,8 +315,7 @@ Parser CreateApexConfigParser(ActionManager& action_manager, ServiceList& servic if (apex_info_list.has_value()) { std::vector subcontext_apexes; for (const auto& info : apex_info_list->getApexInfo()) { - if (info.hasPreinstalledModulePath() && - subcontext->PathMatchesSubcontext(info.getPreinstalledModulePath())) { + if (subcontext->PartitionMatchesSubcontext(info.getPartition())) { subcontext_apexes.push_back(info.getModuleName()); } } diff --git a/init/subcontext.cpp b/init/subcontext.cpp index 6a095fb7b..3fe448fe3 100644 --- a/init/subcontext.cpp +++ b/init/subcontext.cpp @@ -263,6 +263,10 @@ bool Subcontext::PathMatchesSubcontext(const std::string& path) const { return false; } +bool Subcontext::PartitionMatchesSubcontext(const std::string& partition) const { + return std::find(partitions_.begin(), partitions_.end(), partition) != partitions_.end(); +} + void Subcontext::SetApexList(std::vector&& apex_list) { apex_list_ = std::move(apex_list); } @@ -352,12 +356,13 @@ void InitializeSubcontext() { } if (SelinuxGetVendorAndroidVersion() >= __ANDROID_API_P__) { - subcontext.reset( - new Subcontext(std::vector{"/vendor", "/odm"}, kVendorContext)); + subcontext.reset(new Subcontext(std::vector{"/vendor", "/odm"}, + std::vector{"VENDOR", "ODM"}, kVendorContext)); } } + void InitializeHostSubcontext(std::vector vendor_prefixes) { - subcontext.reset(new Subcontext(vendor_prefixes, kVendorContext, /*host=*/true)); + subcontext.reset(new Subcontext(vendor_prefixes, {}, kVendorContext, /*host=*/true)); } Subcontext* GetSubcontext() { diff --git a/init/subcontext.h b/init/subcontext.h index 93ebacea2..23c4a241c 100644 --- a/init/subcontext.h +++ b/init/subcontext.h @@ -36,8 +36,10 @@ static constexpr const char kTestContext[] = "test-test-test"; class Subcontext { public: - Subcontext(std::vector path_prefixes, std::string_view context, bool host = false) + Subcontext(std::vector path_prefixes, std::vector partitions, + std::string_view context, bool host = false) : path_prefixes_(std::move(path_prefixes)), + partitions_(std::move(partitions)), context_(context.begin(), context.end()), pid_(0) { if (!host) { @@ -49,6 +51,7 @@ class Subcontext { Result> ExpandArgs(const std::vector& args); void Restart(); bool PathMatchesSubcontext(const std::string& path) const; + bool PartitionMatchesSubcontext(const std::string& partition) const; void SetApexList(std::vector&& apex_list); const std::string& context() const { return context_; } @@ -59,6 +62,7 @@ class Subcontext { Result TransmitMessage(const SubcontextCommand& subcontext_command); std::vector path_prefixes_; + std::vector partitions_; std::vector apex_list_; std::string context_; pid_t pid_; diff --git a/init/subcontext_benchmark.cpp b/init/subcontext_benchmark.cpp index ccef2f36a..172ee3173 100644 --- a/init/subcontext_benchmark.cpp +++ b/init/subcontext_benchmark.cpp @@ -33,7 +33,7 @@ static void BenchmarkSuccess(benchmark::State& state) { return; } - auto subcontext = Subcontext({"path"}, context); + auto subcontext = Subcontext({"path"}, {"partition"}, context); free(context); while (state.KeepRunning()) { diff --git a/init/subcontext_test.cpp b/init/subcontext_test.cpp index da1f45550..85a2f2a94 100644 --- a/init/subcontext_test.cpp +++ b/init/subcontext_test.cpp @@ -41,7 +41,7 @@ namespace init { template void RunTest(F&& test_function) { - auto subcontext = Subcontext({"dummy_path"}, kTestContext); + auto subcontext = Subcontext({"dummy_path"}, {"dummy_partition"}, kTestContext); ASSERT_NE(0, subcontext.pid()); test_function(subcontext); @@ -177,6 +177,19 @@ TEST(subcontext, ExpandArgsFailure) { }); } +TEST(subcontext, PartitionMatchesSubcontext) { + RunTest([](auto& subcontext) { + static auto& existent_partition = "dummy_partition"; + static auto& non_existent_partition = "not_dummy_partition"; + + auto existent_result = subcontext.PartitionMatchesSubcontext(existent_partition); + auto non_existent_result = subcontext.PartitionMatchesSubcontext(non_existent_partition); + + ASSERT_TRUE(existent_result); + ASSERT_FALSE(non_existent_result); + }); +} + BuiltinFunctionMap BuildTestFunctionMap() { // For CheckDifferentPid auto do_return_pids_as_error = [](const BuiltinArguments& args) -> Result {