kernel: ksud: commonize handle_execve_ksud and add support for compat_execve_ksud (#109)

* This is only for 32bit userspace, 64bit kernel
* Adapt from backslashxx KernelSU repository (our fork still using struct)
* Sync-up with baskslashxx's scope minimized hook.

Signed-off-by: rsuntk <90097027+rsuntk@users.noreply.github.com>
Co-authored-by: backslashxx <118538522+backslashxx@users.noreply.github.com>
This commit is contained in:
rsuntk
2025-06-12 07:30:03 +07:00
committed by ShirkNeko
parent dc0026c10b
commit 80678a4475

View File

@@ -601,35 +601,46 @@ static void do_stop_input_hook(struct work_struct *work)
unregister_kprobe(&input_event_kp); unregister_kprobe(&input_event_kp);
} }
#else #else
/* static int ksu_common_execve_ksud(const char __user *filename_user,
* ksu_handle_execve_ksud, execve_ksud handler for non kprobe struct user_arg_ptr *argv)
* adapted from sys_execve_handler_pre {
* https://github.com/tiann/KernelSU/commit/2027ac3 struct filename filename_in, *filename_p;
*/ char path[32];
__maybe_unused int ksu_handle_execve_ksud(const char __user *filename_user,
const char __user *const __user *__argv) // return early if disabled.
{ if (!ksu_execveat_hook) {
struct user_arg_ptr argv = { .ptr.native = __argv }; return 0;
struct filename filename_in, *filename_p; }
char path[32];
if (!filename_user)
// return early if disabled. return 0;
if (!ksu_execveat_hook) {
return 0; memset(path, 0, sizeof(path));
} ksu_strncpy_from_user_nofault(path, filename_user, 32);
if (!filename_user) // this is because ksu_handle_execveat_ksud calls it filename->name
return 0; filename_in.name = path;
filename_p = &filename_in;
memset(path, 0, sizeof(path));
ksu_strncpy_from_user_nofault(path, filename_user, 32); return ksu_handle_execveat_ksud(AT_FDCWD, &filename_p, argv, NULL, NULL);
}
// this is because ksu_handle_execveat_ksud calls it filename->name
filename_in.name = path; int __maybe_unused ksu_handle_execve_ksud(const char __user *filename_user,
filename_p = &filename_in; const char __user *const __user *__argv)
{
return ksu_handle_execveat_ksud(AT_FDCWD, &filename_p, &argv, NULL, NULL); struct user_arg_ptr argv = { .ptr.native = __argv };
} return ksu_common_execve_ksud(filename_user, &argv);
}
#if defined(CONFIG_COMPAT) && defined(CONFIG_64BIT)
int __maybe_unused ksu_handle_compat_execve_ksud(const char __user *filename_user,
const compat_uptr_t __user *__argv)
{
struct user_arg_ptr argv = { .ptr.compat = __argv };
return ksu_common_execve_ksud(filename_user, &argv);
}
#endif /* COMPAT & 64BIT */
#endif #endif
static void stop_vfs_read_hook() static void stop_vfs_read_hook()