diff --git a/native/jni/core/core.hpp b/native/jni/core/core.hpp index 0620a064f..2cc5ba1ee 100644 --- a/native/jni/core/core.hpp +++ b/native/jni/core/core.hpp @@ -2,7 +2,6 @@ #include #include -#include extern bool RECOVERY_MODE; extern int DAEMON_STATE; @@ -22,9 +21,6 @@ void start_log_daemon(); void setup_logfile(bool reset); void magisk_logging(); -// Thread pool -void exec_task(std::function &&task); - // Module stuffs void handle_modules(); void magic_mount(); diff --git a/native/jni/core/thread.cpp b/native/jni/core/thread.cpp index df21bbc98..ad6030ac6 100644 --- a/native/jni/core/thread.cpp +++ b/native/jni/core/thread.cpp @@ -2,6 +2,8 @@ #include +#include + using namespace std; #define THREAD_IDLE_MAX_SEC 60 diff --git a/native/jni/include/daemon.hpp b/native/jni/include/daemon.hpp index 1dba255c2..cb88a38e1 100644 --- a/native/jni/include/daemon.hpp +++ b/native/jni/include/daemon.hpp @@ -5,6 +5,7 @@ #include #include #include +#include #include @@ -49,6 +50,10 @@ using poll_callback = void(*)(pollfd*); void register_poll(const pollfd *pfd, poll_callback callback); void unregister_poll(int fd, bool auto_close); +// Thread pool +void exec_task(std::function &&task); + +// Logging extern std::atomic logd_fd; int magisk_log(int prio, const char *fmt, va_list ap); void android_logging(); diff --git a/native/jni/zygisk/deny/utils.cpp b/native/jni/zygisk/deny/utils.cpp index 77ce1d516..7e5425215 100644 --- a/native/jni/zygisk/deny/utils.cpp +++ b/native/jni/zygisk/deny/utils.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -15,6 +16,7 @@ using namespace std; static set> *deny_set; /* set of pair */ static map> *uid_proc_map; /* uid -> list of process */ +static int inotify_fd = -1; // Locks the variables above static pthread_mutex_t data_lock = PTHREAD_MUTEX_INITIALIZER; @@ -254,6 +256,20 @@ static void update_deny_config() { db_err(err); } +static void inotify_handler(pollfd *pfd) { + union { + inotify_event event; + char buf[512]; + } u{}; + read(pfd->fd, u.buf, sizeof(u.buf)); + if (u.event.name == "packages.xml"sv) { + exec_task([] { + mutex_guard lock(data_lock); + rebuild_uid_map(); + }); + } +} + int enable_deny() { if (denylist_enabled) { return DAEMON_SUCCESS; @@ -281,6 +297,14 @@ int enable_deny() { default_new(uid_proc_map); rebuild_uid_map(); + + inotify_fd = xinotify_init1(IN_CLOEXEC); + if (inotify_fd >= 0) { + // Monitor packages.xml + inotify_add_watch(inotify_fd, "/data/system", IN_CLOSE_WRITE); + pollfd inotify_pfd = { inotify_fd, POLLIN, 0 }; + register_poll(&inotify_pfd, inotify_handler); + } } update_deny_config(); @@ -297,6 +321,8 @@ int disable_deny() { delete deny_set; uid_proc_map = nullptr; deny_set = nullptr; + unregister_poll(inotify_fd, true); + inotify_fd = -1; } update_deny_config(); return DAEMON_SUCCESS;