Skip svc for ro properties

ro properties' triggers should only be triggered once, otherwise it
may undefined behaviour.
This patch avoids triggering ro properties' actions again when using
resetprop to modify them.

Co-authored-by: 5ec1cff <ewtqyqyewtqyqy@gmail.com>
This commit is contained in:
LoveSy 2023-12-17 03:12:08 +08:00 committed by topjohnwu
parent a003336497
commit f41994cb52
3 changed files with 16 additions and 12 deletions

View File

@ -313,12 +313,12 @@ void load_modules() {
native_bridge_orig = "0"; native_bridge_orig = "0";
} }
native_bridge = native_bridge_orig != "0" ? ZYGISKLDR + native_bridge_orig : ZYGISKLDR; native_bridge = native_bridge_orig != "0" ? ZYGISKLDR + native_bridge_orig : ZYGISKLDR;
set_prop(NBPROP, native_bridge.data(), true); set_prop(NBPROP, native_bridge.data());
// Weather Huawei's Maple compiler is enabled. // Weather Huawei's Maple compiler is enabled.
// If so, system server will be created by a special Zygote which ignores the native bridge // If so, system server will be created by a special Zygote which ignores the native bridge
// and make system server out of our control. Avoid it by disabling. // and make system server out of our control. Avoid it by disabling.
if (get_prop("ro.maple.enable") == "1") { if (get_prop("ro.maple.enable") == "1") {
set_prop("ro.maple.enable", "0", true); set_prop("ro.maple.enable", "0");
} }
inject_zygisk_libs(system); inject_zygisk_libs(system);
} }

View File

@ -9,6 +9,7 @@
#define _REALLY_INCLUDE_SYS__SYSTEM_PROPERTIES_H_ #define _REALLY_INCLUDE_SYS__SYSTEM_PROPERTIES_H_
#include <api/_system_properties.h> #include <api/_system_properties.h>
#include <system_properties/prop_info.h>
using namespace std; using namespace std;
@ -134,18 +135,21 @@ static int set_prop(const char *name, const char *value, PropFlags flags) {
if (!check_legal_property_name(name)) if (!check_legal_property_name(name))
return 1; return 1;
const char *msg = flags.isSkipSvc() ? "direct modification" : "property_service";
auto pi = const_cast<prop_info *>(__system_property_find(name)); auto pi = const_cast<prop_info *>(__system_property_find(name));
// Always delete existing read-only properties, because they could be // Delete existing read-only properties if they are or will be long properties,
// long properties and cannot directly go through __system_property_update // which cannot directly go through __system_property_update
if (pi != nullptr && str_starts(name, "ro.")) { if (str_starts(name, "ro.")) {
// Skip pruning nodes as we will add it back ASAP if (pi != nullptr && (pi->is_long() || strlen(value) >= PROP_VALUE_MAX)) {
__system_property_delete(name, false); // Skip pruning nodes as we will add it back ASAP
pi = nullptr; __system_property_delete(name, false);
pi = nullptr;
}
flags.setSkipSvc();
} }
const char *msg = flags.isSkipSvc() ? "direct modification" : "property_service";
int ret; int ret;
if (pi != nullptr) { if (pi != nullptr) {
if (flags.isSkipSvc()) { if (flags.isSkipSvc()) {

View File

@ -245,8 +245,8 @@ void reset_zygisk(bool restore) {
if (native_bridge.length() > strlen(ZYGISKLDR)) { if (native_bridge.length() > strlen(ZYGISKLDR)) {
native_bridge_orig = native_bridge.substr(strlen(ZYGISKLDR)); native_bridge_orig = native_bridge.substr(strlen(ZYGISKLDR));
} }
set_prop(NBPROP, native_bridge_orig.data(), true); set_prop(NBPROP, native_bridge_orig.data());
} else { } else {
set_prop(NBPROP, native_bridge.data(), true); set_prop(NBPROP, native_bridge.data());
} }
} }