diff options
author | Mike Chan <mikechan@google.com> | 2008-04-24 10:22:26 -0700 |
---|---|---|
committer | mgross <mark.gross@intel.com> | 2011-11-09 12:02:00 -0800 |
commit | 00d9cf605350e5f6397a4667ce05837fe79ee600 (patch) | |
tree | 5762a929684372dff3ce8084985a41da4a138f52 | |
parent | 109f68da1bbcae5e8d0a11bbbbbf9508251aab16 (diff) | |
download | kernel-mfld-blackbay-00d9cf605350e5f6397a4667ce05837fe79ee600.tar.gz kernel-mfld-blackbay-00d9cf605350e5f6397a4667ce05837fe79ee600.tar.bz2 kernel-mfld-blackbay-00d9cf605350e5f6397a4667ce05837fe79ee600.zip |
Grants system server access to /proc/<pid>/oom_adj for Android applications.
Signed-off-by: Brian Swetland <swetland@google.com>
-rw-r--r-- | fs/proc/base.c | 41 |
1 files changed, 40 insertions, 1 deletions
diff --git a/fs/proc/base.c b/fs/proc/base.c index 5bff4c6b831..e8e84b688d4 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -133,6 +133,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. @@ -1141,6 +1147,39 @@ out: return err < 0 ? err : count; } +static int oom_adjust_permission(struct inode *inode, int mask, + unsigned int flags) +{ + uid_t uid; + struct task_struct *p; + + if (flags & IPERM_FLAG_RCU) + return -ECHILD; + + 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 && (current_fsuid() == 1000) && (uid >= 1000)) { + if (inode->i_mode >> 6 & mask) { + return 0; + } + } + + /* Fall back to default. */ + return generic_permission(inode, mask, flags, NULL); +} + +static const struct inode_operations proc_oom_adjust_inode_operations = { + .permission = oom_adjust_permission, +}; + static const struct file_operations proc_oom_adjust_operations = { .read = oom_adjust_read, .write = oom_adjust_write, @@ -2839,7 +2878,7 @@ static const struct pid_entry tgid_base_stuff[] = { REG("cgroup", S_IRUGO, proc_cgroup_operations), #endif INF("oom_score", S_IRUGO, proc_oom_score), - REG("oom_adj", S_IRUGO|S_IWUSR, proc_oom_adjust_operations), + ANDROID("oom_adj",S_IRUGO|S_IWUSR, oom_adjust), 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), |