diff --git a/include/linux/uidgid.h b/include/linux/uidgid.h index b0542cd11aeb09f5d0c979e1acf31ad8d550bb6d..c92d96360ae776176ff06b642e09548387542bae 100644 --- a/include/linux/uidgid.h +++ b/include/linux/uidgid.h @@ -55,6 +55,10 @@ static inline gid_t __kgid_val(kgid_t gid) #define GLOBAL_ROOT_UID KUIDT_INIT(0) #define GLOBAL_ROOT_GID KGIDT_INIT(0) +#ifdef CONFIG_HYPERHOLD +#define MEMMGR_UID KUIDT_INIT(1111) +#endif + #define INVALID_UID KUIDT_INIT(-1) #define INVALID_GID KGIDT_INIT(-1) diff --git a/kernel/cgroup/cgroup-v1.c b/kernel/cgroup/cgroup-v1.c index 9f5221653f80c979ac77dfd57801c5b8ac4fb2f7..4f973d851092692d5aeb71d496790aab6a13df58 100644 --- a/kernel/cgroup/cgroup-v1.c +++ b/kernel/cgroup/cgroup-v1.c @@ -511,7 +511,12 @@ static ssize_t __cgroup1_procs_write(struct kernfs_open_file *of, */ cred = of->file->f_cred; tcred = get_task_cred(task); +#ifdef CONFIG_HYPERHOLD + if (!uid_eq(cred->euid, MEMMGR_UID)) && + !uid_eq(cred->euid, GLOBAL_ROOT_UID) && +#else if (!uid_eq(cred->euid, GLOBAL_ROOT_UID) && +#endif !uid_eq(cred->euid, tcred->uid) && !uid_eq(cred->euid, tcred->suid)) ret = -EACCES;