mirror of
https://github.com/topjohnwu/Magisk.git
synced 2024-12-23 00:17:42 +00:00
Fix zygiskd not restart when zygote restarts
This commit is contained in:
parent
d47e70cfaa
commit
d49b02b274
@ -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);
|
||||||
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user