diff --git a/native/jni/zygisk/hook.cpp b/native/jni/zygisk/hook.cpp index 2ce384084..c1c459db7 100644 --- a/native/jni/zygisk/hook.cpp +++ b/native/jni/zygisk/hook.cpp @@ -359,6 +359,11 @@ void HookContext::run_modules_pre(const vector &fds) { modules.reserve(fds.size()); for (int i = 0; i < fds.size(); ++i) { + struct stat s{}; + if (fstat(fds[i], &s) != 0 || !S_ISREG(s.st_mode)) { + close(fds[i]); + continue; + } android_dlextinfo info { .flags = ANDROID_DLEXT_USE_LIBRARY_FD, .library_fd = fds[i], diff --git a/native/jni/zygisk/main.cpp b/native/jni/zygisk/main.cpp index 29a8e1106..adf2849b8 100644 --- a/native/jni/zygisk/main.cpp +++ b/native/jni/zygisk/main.cpp @@ -114,14 +114,17 @@ static void zygiskd(int socket) { vector module_fds = recv_fds(socket); for (int fd : module_fds) { comp_entry entry = nullptr; - android_dlextinfo info { - .flags = ANDROID_DLEXT_USE_LIBRARY_FD, - .library_fd = fd, - }; - if (void *h = android_dlopen_ext("/jit-cache", RTLD_LAZY, &info)) { - *(void **) &entry = dlsym(h, "zygisk_companion_entry"); - } else { - LOGW("Failed to dlopen zygisk module: %s\n", dlerror()); + struct stat s{}; + if (fstat(fd, &s) == 0 && S_ISREG(s.st_mode)) { + android_dlextinfo info { + .flags = ANDROID_DLEXT_USE_LIBRARY_FD, + .library_fd = fd, + }; + if (void *h = android_dlopen_ext("/jit-cache", RTLD_LAZY, &info)) { + *(void **) &entry = dlsym(h, "zygisk_companion_entry"); + } else { + LOGW("Failed to dlopen zygisk module: %s\n", dlerror()); + } } modules.push_back(entry); close(fd);