diff --git a/kernel/allowlist.c b/kernel/allowlist.c index afe17510..e462880d 100644 --- a/kernel/allowlist.c +++ b/kernel/allowlist.c @@ -38,7 +38,6 @@ static struct list_head allow_list; #define KERNEL_SU_ALLOWLIST "/data/adb/.ksu_allowlist" -static struct workqueue_struct *ksu_workqueue; static struct work_struct ksu_save_work; static struct work_struct ksu_load_work; @@ -171,7 +170,7 @@ void do_load_allow_list(struct work_struct *work) pr_err("load_allow_list open '/data/adb': %d\n", PTR_ERR(fp)); if (errno == -ENOENT) { msleep(2000); - queue_work(ksu_workqueue, &ksu_load_work); + ksu_queue_work(&ksu_load_work); return; } else { pr_info("load_allow list dir exist now!"); @@ -259,7 +258,6 @@ void ksu_prune_allowlist(bool (*is_uid_exist)(uid_t, void *), void *data) static int init_work(void) { - ksu_workqueue = alloc_workqueue("kernelsu_work_queue", 0, 0); INIT_WORK(&ksu_save_work, do_persistent_allow_list); INIT_WORK(&ksu_load_work, do_load_allow_list); return 0; @@ -268,13 +266,13 @@ static int init_work(void) // make sure allow list works cross boot bool persistent_allow_list(void) { - queue_work(ksu_workqueue, &ksu_save_work); + ksu_queue_work(&ksu_save_work); return true; } bool ksu_load_allow_list(void) { - queue_work(ksu_workqueue, &ksu_load_work); + ksu_queue_work(&ksu_load_work); return true; } @@ -292,7 +290,5 @@ bool ksu_allowlist_init(void) bool ksu_allowlist_exit(void) { - destroy_workqueue(ksu_workqueue); - return true; } \ No newline at end of file diff --git a/kernel/ksu.c b/kernel/ksu.c index fa1b48c5..84f63f3b 100644 --- a/kernel/ksu.c +++ b/kernel/ksu.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -32,8 +33,14 @@ static struct group_info root_groups = { .usage = ATOMIC_INIT(2) }; +static struct workqueue_struct *ksu_workqueue; + uid_t ksu_manager_uid = INVALID_UID; +void ksu_queue_work(struct work_struct *work) { + queue_work(ksu_workqueue, work); +} + void escape_to_root() { struct cred *cred; @@ -315,6 +322,8 @@ int kernelsu_init(void) pr_alert("You are running DEBUG version of KernelSU"); #endif + ksu_workqueue = alloc_workqueue("kernelsu_work_queue", 0, 0); + ksu_allowlist_init(); rc = register_kprobe(&kp); @@ -337,6 +346,8 @@ void kernelsu_exit(void) unregister_kprobe(&kp); ksu_allowlist_exit(); + + destroy_workqueue(ksu_workqueue); } module_init(kernelsu_init); diff --git a/kernel/ksu.h b/kernel/ksu.h index c402ad9e..44751da5 100644 --- a/kernel/ksu.h +++ b/kernel/ksu.h @@ -1,7 +1,9 @@ #ifndef __KSU_H_KSU #define __KSU_H_KSU -#include "linux/uidgid.h" +#include +#include + #define KERNEL_SU_VERSION 9 #define KERNEL_SU_OPTION 0xDEADBEEF @@ -35,4 +37,6 @@ static inline void ksu_invalidate_manager_uid() { ksu_manager_uid = INVALID_UID; } +void ksu_queue_work(struct work_struct *work); + #endif \ No newline at end of file diff --git a/kernel/uid_observer.c b/kernel/uid_observer.c index 2eb6a8ca..393bda65 100644 --- a/kernel/uid_observer.c +++ b/kernel/uid_observer.c @@ -123,7 +123,7 @@ out: static void update_uid() { - schedule_work(&ksu_update_uid_work); + ksu_queuework(&ksu_update_uid_work); } static int renameat_handler_pre(struct kprobe *p, struct pt_regs *regs)