From 163531fcd287e1d4cc9a7b6ad0343e81abe8ba70 Mon Sep 17 00:00:00 2001 From: ShirkNeko <109797057+ShirkNeko@users.noreply.github.com> Date: Sun, 9 Nov 2025 14:07:40 +0800 Subject: [PATCH] kernel: Simplify state management logic --- kernel/Makefile | 3 +-- kernel/sucompat.c | 22 +++++++++++----------- kernel/supercalls.c | 17 +++++++++++------ kernel/syscall_hook_manager.c | 2 +- 4 files changed, 24 insertions(+), 20 deletions(-) diff --git a/kernel/Makefile b/kernel/Makefile index 5da3b089..d4d4ed4b 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -129,9 +129,8 @@ ifeq ($(CONFIG_KSU_MANUAL_HOOK), y) ccflags-y += -DKSU_MANUAL_HOOK $(info -- SukiSU: KSU_MANUAL_HOOK) else -ccflags-y += -DKSU_HAVE_SYSCALL_TRACEPOINTS_HOOK -ccflags-y += -DKSU_LKM_MODE ccflags-y += -DKSU_KPROBES_HOOK +ccflags-y += -DKSU_TP_HOOK $(info -- SukiSU: KSU_TRACEPOINT_HOOK) endif diff --git a/kernel/sucompat.c b/kernel/sucompat.c index 5aa0fe6c..0aca8f76 100644 --- a/kernel/sucompat.c +++ b/kernel/sucompat.c @@ -74,7 +74,7 @@ int ksu_handle_faccessat(int *dfd, const char __user **filename_user, int *mode, { const char su[] = SU_PATH; -#ifndef KSU_HAVE_SYSCALL_TRACEPOINTS_HOOK +#ifdef KSU_MANUAL_HOOK if (!ksu_su_compat_enabled) { return 0; } @@ -104,10 +104,10 @@ int ksu_handle_stat(int *dfd, const char __user **filename_user, int *flags) // const char sh[] = SH_PATH; const char su[] = SU_PATH; -#ifndef KSU_HAVE_SYSCALL_TRACEPOINTS_HOOK +#ifdef KSU_MANUAL_HOOK if (!ksu_su_compat_enabled) { - return 0; - } + return 0; + } #endif if (!ksu_is_allow_uid_for_current(current_uid().val)) { return 0; @@ -156,10 +156,10 @@ int ksu_handle_execveat_sucompat(int *fd, struct filename **filename_ptr, const char sh[] = KSUD_PATH; const char su[] = SU_PATH; -#ifndef KSU_HAVE_SYSCALL_TRACEPOINTS_HOOK +#ifdef KSU_MANUAL_HOOK if (!ksu_su_compat_enabled) { - return 0; - } + return 0; + } #endif if (unlikely(!filename_ptr)) return 0; @@ -208,10 +208,10 @@ int ksu_handle_execve_sucompat(int *fd, const char __user **filename_user, const char su[] = SU_PATH; char path[sizeof(su) + 1]; -#ifndef KSU_HAVE_SYSCALL_TRACEPOINTS_HOOK +#ifdef KSU_MANUAL_HOOK if (!ksu_su_compat_enabled){ - return 0; - } + return 0; + } #endif if (unlikely(!filename_user)) return 0; @@ -247,7 +247,7 @@ int ksu_handle_execve_sucompat(int *fd, const char __user **filename_user, int __ksu_handle_devpts(struct inode *inode) { -#ifndef KSU_HAVE_SYSCALL_TRACEPOINTS_HOOK +#ifdef KSU_MANUAL_HOOK if (!ksu_su_compat_enabled) return 0; #endif diff --git a/kernel/supercalls.c b/kernel/supercalls.c index 1698bf57..d6ee1063 100644 --- a/kernel/supercalls.c +++ b/kernel/supercalls.c @@ -9,6 +9,7 @@ #include #include #include +#include #include "arch.h" #include "allowlist.h" @@ -498,13 +499,12 @@ static int do_get_full_version(void __user *arg) static int do_get_hook_type(void __user *arg) { struct ksu_hook_type_cmd cmd = {0}; - const char *type = "Unknown"; + const char *type = "Tracepoint"; -#if defined(KSU_HAVE_SYSCALL_TRACEPOINTS_HOOK) - type = "Tracepoint"; -#elif defined(KSU_MANUAL_HOOK) +#if defined(KSU_MANUAL_HOOK) type = "Manual"; #endif + #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 13, 0) strscpy(cmd.hook_type, type, sizeof(cmd.hook_type)); #else @@ -768,6 +768,7 @@ int ksu_handle_sys_reboot(int magic1, int magic2, unsigned int cmd, void __user return 0; } +#ifdef KSU_KPROBES_HOOK // Reboot hook for installing fd static int reboot_handler_pre(struct kprobe *p, struct pt_regs *regs) { @@ -784,6 +785,7 @@ static struct kprobe reboot_kp = { .symbol_name = REBOOT_SYMBOL, .pre_handler = reboot_handler_pre, }; +#endif void ksu_supercalls_init(void) { @@ -793,17 +795,20 @@ void ksu_supercalls_init(void) for (i = 0; ksu_ioctl_handlers[i].handler; i++) { pr_info(" %-18s = 0x%08x\n", ksu_ioctl_handlers[i].name, ksu_ioctl_handlers[i].cmd); } - +#ifdef KSU_KPROBES_HOOK int rc = register_kprobe(&reboot_kp); if (rc) { pr_err("reboot kprobe failed: %d\n", rc); } else { pr_info("reboot kprobe registered successfully\n"); } +#endif } -void ksu_supercalls_exit(void){ +void ksu_supercalls_exit(void) { +#ifdef KSU_KPROBES_HOOK unregister_kprobe(&reboot_kp); +#endif } static inline void ksu_ioctl_audit(unsigned int cmd, const char *cmd_name, uid_t uid, int ret) diff --git a/kernel/syscall_hook_manager.c b/kernel/syscall_hook_manager.c index 979bd44e..7c4bd9fd 100644 --- a/kernel/syscall_hook_manager.c +++ b/kernel/syscall_hook_manager.c @@ -320,7 +320,7 @@ static inline void ksu_handle_task_alloc(struct pt_regs *regs) static void ksu_sys_enter_handler(void *data, struct pt_regs *regs, long id) { if (unlikely(check_syscall_fastpath(id))) { -#ifdef KSU_LKM_MODE +#ifdef KSU_TP_HOOK if (ksu_su_compat_enabled) { // Handle newfstatat if (id == __NR_newfstatat) {