diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-07-20 12:12:03 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-07-20 12:12:03 +0000 |
commit | 89cacbf115a2a4b52a01688fbe1d022e5cff0260 (patch) | |
tree | 3cc178b85f704669f84f7155b15ff9a74508b3c9 | |
parent | 52462c07d7ce1d748a7e45be5bc02469c33a7443 (diff) | |
parent | 38dd1561063de13d4f121ec5127ed077d744cb8c (diff) | |
download | core-89cacbf115a2a4b52a01688fbe1d022e5cff0260.tar.gz |
Snap for 10531979 from 38dd1561063de13d4f121ec5127ed077d744cb8c to mainline-media-releaseaml_med_341011000aml_med_340922010
Change-Id: I4e7abaa37a2bbc1fadc733c9fa0d0f64830b17d7
-rw-r--r-- | init/property_service.cpp | 99 |
1 files changed, 42 insertions, 57 deletions
diff --git a/init/property_service.cpp b/init/property_service.cpp index 4242912ed..8da69822c 100644 --- a/init/property_service.cpp +++ b/init/property_service.cpp @@ -57,12 +57,12 @@ #include <android-base/result.h> #include <android-base/stringprintf.h> #include <android-base/strings.h> -#include <private/android_filesystem_config.h> #include <property_info_parser/property_info_parser.h> #include <property_info_serializer/property_info_serializer.h> #include <selinux/android.h> #include <selinux/label.h> #include <selinux/selinux.h> + #include "debug_ramdisk.h" #include "epoll.h" #include "init.h" @@ -111,12 +111,12 @@ constexpr auto API_LEVEL_CURRENT = 10000; static bool persistent_properties_loaded = false; +static int property_set_fd = -1; static int from_init_socket = -1; static int init_socket = -1; static bool accept_messages = false; static std::mutex accept_messages_lock; static std::thread property_service_thread; -static std::thread property_service_for_system_thread; static std::unique_ptr<PersistWriteThread> persist_write_thread; @@ -394,37 +394,31 @@ static std::optional<uint32_t> PropertySet(const std::string& name, const std::s return {PROP_ERROR_INVALID_VALUE}; } - if (name == "sys.powerctl") { - // No action here - NotifyPropertyChange will trigger the appropriate action, and since this - // can come to the second thread, we mustn't call out to the __system_property_* functions - // which support multiple readers but only one mutator. - } else { - prop_info* pi = (prop_info*)__system_property_find(name.c_str()); - if (pi != nullptr) { - // ro.* properties are actually "write-once". - if (StartsWith(name, "ro.")) { - *error = "Read-only property was already set"; - return {PROP_ERROR_READ_ONLY_PROPERTY}; - } + prop_info* pi = (prop_info*)__system_property_find(name.c_str()); + if (pi != nullptr) { + // ro.* properties are actually "write-once". + if (StartsWith(name, "ro.")) { + *error = "Read-only property was already set"; + return {PROP_ERROR_READ_ONLY_PROPERTY}; + } - __system_property_update(pi, value.c_str(), valuelen); - } else { - int rc = __system_property_add(name.c_str(), name.size(), value.c_str(), valuelen); - if (rc < 0) { - *error = "__system_property_add failed"; - return {PROP_ERROR_SET_FAILED}; - } + __system_property_update(pi, value.c_str(), valuelen); + } else { + int rc = __system_property_add(name.c_str(), name.size(), value.c_str(), valuelen); + if (rc < 0) { + *error = "__system_property_add failed"; + return {PROP_ERROR_SET_FAILED}; } + } - // Don't write properties to disk until after we have read all default - // properties to prevent them from being overwritten by default values. - if (socket && persistent_properties_loaded && StartsWith(name, "persist.")) { - if (persist_write_thread) { - persist_write_thread->Write(name, value, std::move(*socket)); - return {}; - } - WritePersistentProperty(name, value); + // Don't write properties to disk until after we have read all default + // properties to prevent them from being overwritten by default values. + if (socket && persistent_properties_loaded && StartsWith(name, "persist.")) { + if (persist_write_thread) { + persist_write_thread->Write(name, value, std::move(*socket)); + return {}; } + WritePersistentProperty(name, value); } NotifyPropertyChange(name, value); @@ -585,10 +579,10 @@ uint32_t HandlePropertySetNoSocket(const std::string& name, const std::string& v return *ret; } -static void handle_property_set_fd(int fd) { +static void handle_property_set_fd() { static constexpr uint32_t kDefaultSocketTimeout = 2000; /* ms */ - int s = accept4(fd, nullptr, nullptr, SOCK_CLOEXEC); + int s = accept4(property_set_fd, nullptr, nullptr, SOCK_CLOEXEC); if (s == -1) { return; } @@ -1425,21 +1419,19 @@ static void HandleInitSocket() { } } -static void PropertyServiceThread(int fd, bool listen_init) { +static void PropertyServiceThread() { Epoll epoll; if (auto result = epoll.Open(); !result.ok()) { LOG(FATAL) << result.error(); } - if (auto result = epoll.RegisterHandler(fd, std::bind(handle_property_set_fd, fd)); + if (auto result = epoll.RegisterHandler(property_set_fd, handle_property_set_fd); !result.ok()) { LOG(FATAL) << result.error(); } - if (listen_init) { - if (auto result = epoll.RegisterHandler(init_socket, HandleInitSocket); !result.ok()) { - LOG(FATAL) << result.error(); - } + if (auto result = epoll.RegisterHandler(init_socket, HandleInitSocket); !result.ok()) { + LOG(FATAL) << result.error(); } while (true) { @@ -1490,23 +1482,6 @@ void PersistWriteThread::Write(std::string name, std::string value, SocketConnec cv_.notify_all(); } -void StartThread(const char* name, int mode, int gid, std::thread& t, bool listen_init) { - int fd = -1; - if (auto result = CreateSocket(name, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, - /*passcred=*/false, /*should_listen=*/false, mode, /*uid=*/0, - /*gid=*/gid, /*socketcon=*/{}); - result.ok()) { - fd = *result; - } else { - LOG(FATAL) << "start_property_service socket creation failed: " << result.error(); - } - - listen(fd, 8); - - auto new_thread = std::thread(PropertyServiceThread, fd, listen_init); - t.swap(new_thread); -} - void StartPropertyService(int* epoll_socket) { InitPropertySet("ro.property_service.version", "2"); @@ -1518,9 +1493,19 @@ void StartPropertyService(int* epoll_socket) { init_socket = sockets[1]; StartSendingMessages(); - StartThread(PROP_SERVICE_FOR_SYSTEM_NAME, 0660, AID_SYSTEM, property_service_for_system_thread, - true); - StartThread(PROP_SERVICE_NAME, 0666, 0, property_service_thread, false); + if (auto result = CreateSocket(PROP_SERVICE_NAME, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, + /*passcred=*/false, /*should_listen=*/false, 0666, /*uid=*/0, + /*gid=*/0, /*socketcon=*/{}); + result.ok()) { + property_set_fd = *result; + } else { + LOG(FATAL) << "start_property_service socket creation failed: " << result.error(); + } + + listen(property_set_fd, 8); + + auto new_thread = std::thread{PropertyServiceThread}; + property_service_thread.swap(new_thread); auto async_persist_writes = android::base::GetBoolProperty("ro.property_service.async_persist_writes", false); |