Merge branch android-tegra-2.6.36 into android-tegra-moto-2.6.36
[firefly-linux-kernel-4.4.55.git] / kernel / cgroup.c
index c9483d8f6140ed6cb4e06fa6139e2aeb907b3d47..b90316504417760433c2b6e1d76961e5d3c7e651 100644 (file)
@@ -58,6 +58,7 @@
 #include <linux/vmalloc.h> /* TODO: replace with more sophisticated array */
 #include <linux/eventfd.h>
 #include <linux/poll.h>
+#include <linux/capability.h>
 
 #include <asm/atomic.h>
 
@@ -1723,6 +1724,15 @@ int cgroup_attach_task(struct cgroup *cgrp, struct task_struct *tsk)
                                failed_ss = ss;
                                goto out;
                        }
+               } else if (!capable(CAP_SYS_ADMIN)) {
+                       const struct cred *cred = current_cred(), *tcred;
+
+                       /* No can_attach() - check perms generically */
+                       tcred = __task_cred(tsk);
+                       if (cred->euid != tcred->uid &&
+                           cred->euid != tcred->suid) {
+                               return -EACCES;
+                       }
                }
        }
 
@@ -1821,7 +1831,6 @@ EXPORT_SYMBOL_GPL(cgroup_attach_task_all);
 static int attach_task_by_pid(struct cgroup *cgrp, u64 pid)
 {
        struct task_struct *tsk;
-       const struct cred *cred = current_cred(), *tcred;
        int ret;
 
        if (pid) {
@@ -1831,14 +1840,6 @@ static int attach_task_by_pid(struct cgroup *cgrp, u64 pid)
                        rcu_read_unlock();
                        return -ESRCH;
                }
-
-               tcred = __task_cred(tsk);
-               if (cred->euid &&
-                   cred->euid != tcred->uid &&
-                   cred->euid != tcred->suid) {
-                       rcu_read_unlock();
-                       return -EACCES;
-               }
                get_task_struct(tsk);
                rcu_read_unlock();
        } else {