From b7f937b7f92648547ee416b3b3acc80e53f0e565 Mon Sep 17 00:00:00 2001 From: weishu Date: Mon, 13 Nov 2023 15:06:25 +0800 Subject: [PATCH] kernel: fix su not working in shell for 6.1 kernel --- kernel/sucompat.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/kernel/sucompat.c b/kernel/sucompat.c index ef08cabd..f4430f8e 100644 --- a/kernel/sucompat.c +++ b/kernel/sucompat.c @@ -75,12 +75,26 @@ int ksu_handle_stat(int *dfd, const char __user **filename_user, int *flags) char path[sizeof(su) + 1]; memset(path, 0, sizeof(path)); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0) + // it becomes a `struct filename *` after 5.18 + // https://elixir.bootlin.com/linux/v5.18/source/fs/stat.c#L216 + const char sh[] = SH_PATH; + struct filename *filename = * ((struct filename **) filename_user); + if (IS_ERR(filename)) { + return 0; + } + if (likely(memcmp(filename->name, su, sizeof(su)))) + return 0; + pr_info("vfs_statx su->sh!\n"); + memcpy((void *)filename->name, sh, sizeof(sh)); +#else ksu_strncpy_from_user_nofault(path, *filename_user, sizeof(path)); if (unlikely(!memcmp(path, su, sizeof(su)))) { pr_info("newfstatat su->sh!\n"); *filename_user = sh_user_path(); } +#endif return 0; }