Only dlopen valid fd

This commit is contained in:
LoveSy 2022-03-22 12:06:59 +08:00 committed by John Wu
parent 3f660a3963
commit 9e8218089b
2 changed files with 16 additions and 8 deletions

View File

@ -359,6 +359,11 @@ void HookContext::run_modules_pre(const vector<int> &fds) {
modules.reserve(fds.size()); modules.reserve(fds.size());
for (int i = 0; i < fds.size(); ++i) { 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 { android_dlextinfo info {
.flags = ANDROID_DLEXT_USE_LIBRARY_FD, .flags = ANDROID_DLEXT_USE_LIBRARY_FD,
.library_fd = fds[i], .library_fd = fds[i],

View File

@ -114,14 +114,17 @@ static void zygiskd(int socket) {
vector<int> module_fds = recv_fds(socket); vector<int> module_fds = recv_fds(socket);
for (int fd : module_fds) { for (int fd : module_fds) {
comp_entry entry = nullptr; comp_entry entry = nullptr;
android_dlextinfo info { struct stat s{};
.flags = ANDROID_DLEXT_USE_LIBRARY_FD, if (fstat(fd, &s) == 0 && S_ISREG(s.st_mode)) {
.library_fd = fd, android_dlextinfo info {
}; .flags = ANDROID_DLEXT_USE_LIBRARY_FD,
if (void *h = android_dlopen_ext("/jit-cache", RTLD_LAZY, &info)) { .library_fd = fd,
*(void **) &entry = dlsym(h, "zygisk_companion_entry"); };
} else { if (void *h = android_dlopen_ext("/jit-cache", RTLD_LAZY, &info)) {
LOGW("Failed to dlopen zygisk module: %s\n", dlerror()); *(void **) &entry = dlsym(h, "zygisk_companion_entry");
} else {
LOGW("Failed to dlopen zygisk module: %s\n", dlerror());
}
} }
modules.push_back(entry); modules.push_back(entry);
close(fd); close(fd);