diff --git a/native/src/core/zygisk/hook.cpp b/native/src/core/zygisk/hook.cpp index 63abef377..ea7ef321c 100644 --- a/native/src/core/zygisk/hook.cpp +++ b/native/src/core/zygisk/hook.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -217,6 +218,7 @@ DCL_HOOK_FUNC(static int, pthread_attr_destroy, void *target) { ZygiskContext::ZygiskContext(JNIEnv *env, void *args) : env(env), args{args}, process(nullptr), pid(-1), flags(0), info_flags(0), + allowed_fds([] static { rlimit r{32768, 32768}; getrlimit(RLIMIT_NOFILE, &r); return r.rlim_max; }()), hook_info_lock(PTHREAD_MUTEX_INITIALIZER) { g_ctx = this; } ZygiskContext::~ZygiskContext() { diff --git a/native/src/core/zygisk/module.cpp b/native/src/core/zygisk/module.cpp index 058611655..5e26204f9 100644 --- a/native/src/core/zygisk/module.cpp +++ b/native/src/core/zygisk/module.cpp @@ -226,7 +226,7 @@ void ZygiskContext::sanitize_fds() { env->SetIntArrayRegion( array, old_len, static_cast(exempted_fds.size()), exempted_fds.data()); for (int fd : exempted_fds) { - if (fd >= 0 && fd < MAX_FD_SIZE) { + if (fd >= 0 && fd < allowed_fds.size()) { allowed_fds[fd] = true; } } @@ -239,7 +239,7 @@ void ZygiskContext::sanitize_fds() { int len = env->GetArrayLength(fdsToIgnore); for (int i = 0; i < len; ++i) { int fd = arr[i]; - if (fd >= 0 && fd < MAX_FD_SIZE) { + if (fd >= 0 && fd < allowed_fds.size()) { allowed_fds[fd] = true; } } @@ -257,7 +257,7 @@ void ZygiskContext::sanitize_fds() { int dfd = dirfd(dir.get()); for (dirent *entry; (entry = xreaddir(dir.get()));) { int fd = parse_int(entry->d_name); - if ((fd < 0 || fd >= MAX_FD_SIZE || !allowed_fds[fd]) && fd != dfd) { + if ((fd < 0 || fd >= allowed_fds.size() || !allowed_fds[fd]) && fd != dfd) { close(fd); } } @@ -296,7 +296,7 @@ void ZygiskContext::fork_pre() { auto dir = xopen_dir("/proc/self/fd"); for (dirent *entry; (entry = xreaddir(dir.get()));) { int fd = parse_int(entry->d_name); - if (fd < 0 || fd >= MAX_FD_SIZE) { + if (fd < 0 || fd >= allowed_fds.size()) { close(fd); continue; } diff --git a/native/src/core/zygisk/module.hpp b/native/src/core/zygisk/module.hpp index fe8e684c8..fcc292abe 100644 --- a/native/src/core/zygisk/module.hpp +++ b/native/src/core/zygisk/module.hpp @@ -224,8 +224,6 @@ enum : uint32_t { SKIP_CLOSE_LOG_PIPE = (1u << 5), }; -#define MAX_FD_SIZE 1024 - #define DCL_PRE_POST(name) \ void name##_pre(); \ void name##_post(); @@ -244,7 +242,7 @@ struct ZygiskContext { int pid; uint32_t flags; uint32_t info_flags; - std::bitset allowed_fds; + std::vector allowed_fds; std::vector exempted_fds; struct RegisterInfo {