Fix zygiskd not restart when zygote restarts

This commit is contained in:
LoveSy 2023-12-06 22:17:29 +08:00 committed by John Wu
parent d47e70cfaa
commit d49b02b274
3 changed files with 25 additions and 22 deletions

View File

@ -38,6 +38,7 @@ struct module_info {
extern bool zygisk_enabled; extern bool zygisk_enabled;
extern std::vector<module_info> *module_list; extern std::vector<module_info> *module_list;
extern std::string native_bridge;
void reset_zygisk(bool restore); void reset_zygisk(bool restore);
int connect_daemon(int req, bool create = false); int connect_daemon(int req, bool create = false);

View File

@ -15,8 +15,6 @@ using namespace std;
#define VLOGD(tag, from, to) LOGD("%-8s: %s <- %s\n", tag, to, from) #define VLOGD(tag, from, to) LOGD("%-8s: %s <- %s\n", tag, to, from)
static string native_bridge = "0";
static int bind_mount(const char *reason, const char *from, const char *to) { static int bind_mount(const char *reason, const char *from, const char *to) {
int ret = xmount(from, to, nullptr, MS_BIND | MS_REC, nullptr); int ret = xmount(from, to, nullptr, MS_BIND | MS_REC, nullptr);
if (ret == 0) if (ret == 0)
@ -517,23 +515,3 @@ void exec_module_scripts(const char *stage) {
[](const module_info &info) -> string_view { return info.name; }); [](const module_info &info) -> string_view { return info.name; });
exec_module_scripts(stage, module_names); exec_module_scripts(stage, module_names);
} }
void reset_zygisk(bool restore) {
if (!zygisk_enabled) return;
static atomic_uint zygote_start_count{1};
if (restore) {
zygote_start_count = 1;
} else if (zygote_start_count.fetch_add(1) > 3) {
LOGW("zygote crashes too many times, rolling-back\n");
restore = true;
}
if (restore) {
string native_bridge_orig = "0";
if (native_bridge.length() > strlen(ZYGISKLDR)) {
native_bridge_orig = native_bridge.substr(strlen(ZYGISKLDR));
}
set_prop(NBPROP, native_bridge_orig.data(), true);
} else {
set_prop(NBPROP, native_bridge.data(), true);
}
}

View File

@ -14,6 +14,7 @@
using namespace std; using namespace std;
void *self_handle = nullptr; void *self_handle = nullptr;
string native_bridge = "0";
extern "C" [[maybe_unused]] void zygisk_inject_entry(void *handle) { extern "C" [[maybe_unused]] void zygisk_inject_entry(void *handle) {
self_handle = handle; self_handle = handle;
@ -224,3 +225,26 @@ void zygisk_handler(int client, const sock_cred *cred) {
} }
close(client); close(client);
} }
void reset_zygisk(bool restore) {
if (!zygisk_enabled) return;
static atomic_uint zygote_start_count{1};
close(zygiskd_sockets[0]);
close(zygiskd_sockets[1]);
zygiskd_sockets[0] = zygiskd_sockets[1] = -1;
if (restore) {
zygote_start_count = 1;
} else if (zygote_start_count.fetch_add(1) > 3) {
LOGW("zygote crashes too many times, rolling-back\n");
restore = true;
}
if (restore) {
string native_bridge_orig = "0";
if (native_bridge.length() > strlen(ZYGISKLDR)) {
native_bridge_orig = native_bridge.substr(strlen(ZYGISKLDR));
}
set_prop(NBPROP, native_bridge_orig.data(), true);
} else {
set_prop(NBPROP, native_bridge.data(), true);
}
}