Switch to prepare_creds/commit_creds (#2631)

Update API as per kernel doc recommends, also fix setup_groups refcount
leak while at it.
This commit is contained in:
Wang Han
2025-06-12 14:26:53 +08:00
committed by Rifat Azad
parent c91f9c18ec
commit 85f4e6ac27

View File

@@ -118,6 +118,7 @@ static void setup_groups(struct root_profile *profile, struct cred *cred)
groups_sort(group_info); groups_sort(group_info);
set_groups(cred, group_info); set_groups(cred, group_info);
put_group_info(group_info);
} }
static void disable_seccomp(void) static void disable_seccomp(void)
@@ -142,27 +143,17 @@ void escape_to_root(void)
{ {
struct cred *cred; struct cred *cred;
#ifdef KSU_GET_CRED_RCU cred = prepare_creds();
rcu_read_lock(); if (!cred) {
pr_warn("prepare_creds failed!\n");
do { return;
cred = (struct cred *)__task_cred((current)); }
BUG_ON(!cred);
} while (!get_cred_rcu(cred));
if (cred->euid.val == 0) { if (cred->euid.val == 0) {
pr_warn("Already root, don't escape!\n"); pr_warn("Already root, don't escape!\n");
rcu_read_unlock(); abort_creds(cred);
return; return;
} }
#else
cred = (struct cred *)__task_cred(current);
if (cred->euid.val == 0) {
pr_warn("Already root, don't escape!\n");
return;
}
#endif
struct root_profile *profile = ksu_get_root_profile(cred->uid.val); struct root_profile *profile = ksu_get_root_profile(cred->uid.val);
@@ -198,9 +189,7 @@ void escape_to_root(void)
setup_groups(profile, cred); setup_groups(profile, cred);
#ifdef KSU_GET_CRED_RCU commit_creds(cred);
rcu_read_unlock();
#endif
// Refer to kernel/seccomp.c: seccomp_set_mode_strict // Refer to kernel/seccomp.c: seccomp_set_mode_strict
// When disabling Seccomp, ensure that current->sighand->siglock is held during the operation. // When disabling Seccomp, ensure that current->sighand->siglock is held during the operation.
@@ -267,7 +256,7 @@ static void nuke_ext4_sysfs() {
} }
ext4_unregister_sysfs(sb); ext4_unregister_sysfs(sb);
path_put(&path); path_put(&path);
} }
int ksu_handle_prctl(int option, unsigned long arg2, unsigned long arg3, int ksu_handle_prctl(int option, unsigned long arg2, unsigned long arg3,