From 6a3c94b3aa9545b6a955caf558e5120ef4c12ee5 Mon Sep 17 00:00:00 2001 From: Nikita Ioffe Date: Thu, 30 Apr 2020 19:40:39 +0100 Subject: [PATCH] Reject services that are both critical and oneshot Test: atest CtsInitTestCases Test: builds Test: device boots Bug: 155275196 Change-Id: I1bb9099371bd1a3f339396ef343c49b054fcef66 --- init/init_test.cpp | 22 ++++++++++++++++++++++ init/service_parser.cpp | 7 +++++++ 2 files changed, 29 insertions(+) diff --git a/init/init_test.cpp b/init/init_test.cpp index caf3e0343..07b472455 100644 --- a/init/init_test.cpp +++ b/init/init_test.cpp @@ -239,6 +239,28 @@ TEST(init, EventTriggerOrderMultipleFiles) { EXPECT_EQ(6, num_executed); } +TEST(init, RejectsCriticalAndOneshotService) { + std::string init_script = + R"init( +service A something + class first + critical + oneshot +)init"; + + TemporaryFile tf; + ASSERT_TRUE(tf.fd != -1); + ASSERT_TRUE(android::base::WriteStringToFd(init_script, tf.fd)); + + ServiceList service_list; + Parser parser; + parser.AddSectionParser("service", + std::make_unique(&service_list, nullptr, std::nullopt)); + + ASSERT_TRUE(parser.ParseConfig(tf.path)); + ASSERT_EQ(1u, parser.parse_error_count()); +} + } // namespace init } // namespace android diff --git a/init/service_parser.cpp b/init/service_parser.cpp index 560f693f9..c54ed71d4 100644 --- a/init/service_parser.cpp +++ b/init/service_parser.cpp @@ -598,6 +598,13 @@ Result ServiceParser::EndSection() { } } + if (SelinuxGetVendorAndroidVersion() >= __ANDROID_API_R__) { + if ((service_->flags() & SVC_CRITICAL) != 0 && (service_->flags() & SVC_ONESHOT) != 0) { + return Error() << "service '" << service_->name() + << "' can't be both critical and oneshot"; + } + } + Service* old_service = service_list_->FindService(service_->name()); if (old_service) { if (!service_->is_override()) {