From 6fe3bcb88ed29415e20fea3885e0422cb7516ac3 Mon Sep 17 00:00:00 2001 From: bmax Date: Fri, 8 Mar 2024 16:02:01 +0800 Subject: [PATCH] To ensure compatibility with Termux's su, we commented out some code that enhances robustness. --- kernel/patch/android/sucompat.c | 30 +++++++++++++++++------------- kernel/patch/include/uapi/scdefs.h | 1 + version | 2 +- 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/kernel/patch/android/sucompat.c b/kernel/patch/android/sucompat.c index 668bb73f..173fa534 100644 --- a/kernel/patch/android/sucompat.c +++ b/kernel/patch/android/sucompat.c @@ -253,7 +253,7 @@ static uid_t current_uid() return uid; } -#define TRY_DIRECT_MODIFY_USER +// #define TRY_DIRECT_MODIFY_USER static void handle_before_execve(hook_local_t *hook_local, char **__user u_filename_p, char **__user uargv, void *udata) { @@ -312,21 +312,25 @@ static void handle_before_execve(hook_local_t *hook_local, char **__user u_filen } } - // args0 + // change args[0] to ANDROID_SU_PATH or ANDROID_LEGACY_SU_PATH if it's not + // check filename instead of args[0] for convenient int argv_cplen = 0; + if (strcmp(ANDROID_SU_PATH, filename) && strcmp(ANDROID_LEGACY_SU_PATH, filename)) { #ifdef TRY_DIRECT_MODIFY_USER - const char __user *p1 = get_user_arg_ptr(0, *uargv, 0); - argv_cplen = compat_copy_to_user((void *__user)p1, default_su_path, sizeof(default_su_path)); + const char __user *p1 = get_user_arg_ptr(0, *uargv, 0); + argv_cplen = compat_copy_to_user((void *__user)p1, default_su_path, sizeof(default_su_path)); #endif - if (argv_cplen <= 0) { - sp = sp ?: current_user_stack_pointer(); - sp -= sizeof(default_su_path); - sp &= 0xFFFFFFFFFFFFFFF8; - argv_cplen = compat_copy_to_user((void *)sp, default_su_path, sizeof(default_su_path)); - if (argv_cplen > 0) { - int rc = set_user_arg_ptr(0, *uargv, 0, sp); - if (rc < 0) { // todo: modify entire argv - logkfi("call apd argv error, uid: %d, to_uid: %d, sctx: %s, rc: %d\n", uid, to_uid, sctx, rc); + if (argv_cplen <= 0) { + sp = sp ?: current_user_stack_pointer(); + sp -= sizeof(default_su_path); + sp &= 0xFFFFFFFFFFFFFFF8; + argv_cplen = compat_copy_to_user((void *)sp, default_su_path, sizeof(default_su_path)); + if (argv_cplen > 0) { + int rc = set_user_arg_ptr(0, *uargv, 0, sp); + if (rc < 0) { // todo: modify entire argv + logkfi("call apd argv error, uid: %d, to_uid: %d, sctx: %s, rc: %d\n", uid, to_uid, sctx, + rc); + } } } } diff --git a/kernel/patch/include/uapi/scdefs.h b/kernel/patch/include/uapi/scdefs.h index af41d3eb..e3f873b4 100644 --- a/kernel/patch/include/uapi/scdefs.h +++ b/kernel/patch/include/uapi/scdefs.h @@ -64,6 +64,7 @@ struct su_profile #define SU_PATH_MAX_LEN 128 #define ANDROID_SU_PATH "/system/bin/kp" +#define ANDROID_LEGACY_SU_PATH "/system/bin/su" #define KPATCH_DATA_PATH "/data/adb/kpatch" #define KPATCH_DEV_PATH "/dev/kpatch" #define KPATCH_DEV_WORK_DIR "/dev/kpatch_work/" diff --git a/version b/version index 5f8ff8d9..20b53d0c 100644 --- a/version +++ b/version @@ -1,3 +1,3 @@ #define MAJOR 0 #define MINOR 10 -#define PATCH 2 +#define PATCH 3