OSDN Git Service

Grants system server access to /proc/<pid>/oom_adj for Android applications.
authorMike Chan <mikechan@google.com>
Thu, 24 Apr 2008 17:22:26 +0000 (10:22 -0700)
committerChih-Wei Huang <cwhuang@linux.org.tw>
Mon, 13 Apr 2015 16:42:53 +0000 (00:42 +0800)
Signed-off-by: Brian Swetland <swetland@google.com>
fs/proc/base.c

index 3f3d7ae..08b4351 100644 (file)
@@ -135,6 +135,12 @@ struct pid_entry {
                NULL, &proc_single_file_operations,     \
                { .proc_show = show } )
 
+/* ANDROID is for special files in /proc. */
+#define ANDROID(NAME, MODE, OTYPE)                     \
+       NOD(NAME, (S_IFREG|(MODE)),                     \
+               &proc_##OTYPE##_inode_operations,       \
+               &proc_##OTYPE##_operations, {})
+
 /*
  * Count the number of hardlinks for the pid_entry table, excluding the .
  * and .. links.
@@ -908,6 +914,37 @@ out:
        return err < 0 ? err : count;
 }
 
+static int oom_adjust_permission(struct inode *inode, int mask)
+{
+       kuid_t uid;
+       kuid_t system_server_uid = KUIDT_INIT(1000);
+       struct task_struct *p;
+
+       p = get_proc_task(inode);
+       if (p) {
+               uid = task_uid(p);
+               put_task_struct(p);
+       }
+
+       /*
+        * System Server (uid == 1000) is granted access to oom_adj of all
+        * android applications (uid > 10000) as and services (uid >= 1000)
+        */
+       if (p && (uid_eq(current_fsuid(), system_server_uid) &&
+                       uid_gt(uid, system_server_uid))) {
+               if (inode->i_mode >> 6 & mask) {
+                       return 0;
+               }
+       }
+
+       /* Fall back to default. */
+       return generic_permission(inode, mask);
+}
+
+static const struct inode_operations proc_oom_adj_inode_operations = {
+       .permission     = oom_adjust_permission,
+};
+
 static const struct file_operations proc_oom_adj_operations = {
        .read           = oom_adj_read,
        .write          = oom_adj_write,
@@ -2601,7 +2638,7 @@ static const struct pid_entry tgid_base_stuff[] = {
        ONE("cgroup",  S_IRUGO, proc_cgroup_show),
 #endif
        ONE("oom_score",  S_IRUGO, proc_oom_score),
-       REG("oom_adj",    S_IRUGO|S_IWUSR, proc_oom_adj_operations),
+       ANDROID("oom_adj", S_IRUGO|S_IWUSR, oom_adj),
        REG("oom_score_adj", S_IRUGO|S_IWUSR, proc_oom_score_adj_operations),
 #ifdef CONFIG_AUDITSYSCALL
        REG("loginuid",   S_IWUSR|S_IRUGO, proc_loginuid_operations),