diff options
Diffstat (limited to 'fs/proc/base.c')
-rw-r--r-- | fs/proc/base.c | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/fs/proc/base.c b/fs/proc/base.c index 1b6c84cbdb73..acd1960c28a2 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
@@ -1089,7 +1089,8 @@ static ssize_t proc_loginuid_read(struct file * file, char __user * buf, | |||
1089 | if (!task) | 1089 | if (!task) |
1090 | return -ESRCH; | 1090 | return -ESRCH; |
1091 | length = scnprintf(tmpbuf, TMPBUFLEN, "%u", | 1091 | length = scnprintf(tmpbuf, TMPBUFLEN, "%u", |
1092 | audit_get_loginuid(task)); | 1092 | from_kuid(file->f_cred->user_ns, |
1093 | audit_get_loginuid(task))); | ||
1093 | put_task_struct(task); | 1094 | put_task_struct(task); |
1094 | return simple_read_from_buffer(buf, count, ppos, tmpbuf, length); | 1095 | return simple_read_from_buffer(buf, count, ppos, tmpbuf, length); |
1095 | } | 1096 | } |
@@ -1101,6 +1102,7 @@ static ssize_t proc_loginuid_write(struct file * file, const char __user * buf, | |||
1101 | char *page, *tmp; | 1102 | char *page, *tmp; |
1102 | ssize_t length; | 1103 | ssize_t length; |
1103 | uid_t loginuid; | 1104 | uid_t loginuid; |
1105 | kuid_t kloginuid; | ||
1104 | 1106 | ||
1105 | rcu_read_lock(); | 1107 | rcu_read_lock(); |
1106 | if (current != pid_task(proc_pid(inode), PIDTYPE_PID)) { | 1108 | if (current != pid_task(proc_pid(inode), PIDTYPE_PID)) { |
@@ -1130,7 +1132,13 @@ static ssize_t proc_loginuid_write(struct file * file, const char __user * buf, | |||
1130 | goto out_free_page; | 1132 | goto out_free_page; |
1131 | 1133 | ||
1132 | } | 1134 | } |
1133 | length = audit_set_loginuid(loginuid); | 1135 | kloginuid = make_kuid(file->f_cred->user_ns, loginuid); |
1136 | if (!uid_valid(kloginuid)) { | ||
1137 | length = -EINVAL; | ||
1138 | goto out_free_page; | ||
1139 | } | ||
1140 | |||
1141 | length = audit_set_loginuid(kloginuid); | ||
1134 | if (likely(length == 0)) | 1142 | if (likely(length == 0)) |
1135 | length = count; | 1143 | length = count; |
1136 | 1144 | ||
@@ -2983,6 +2991,11 @@ static int proc_gid_map_open(struct inode *inode, struct file *file) | |||
2983 | return proc_id_map_open(inode, file, &proc_gid_seq_operations); | 2991 | return proc_id_map_open(inode, file, &proc_gid_seq_operations); |
2984 | } | 2992 | } |
2985 | 2993 | ||
2994 | static int proc_projid_map_open(struct inode *inode, struct file *file) | ||
2995 | { | ||
2996 | return proc_id_map_open(inode, file, &proc_projid_seq_operations); | ||
2997 | } | ||
2998 | |||
2986 | static const struct file_operations proc_uid_map_operations = { | 2999 | static const struct file_operations proc_uid_map_operations = { |
2987 | .open = proc_uid_map_open, | 3000 | .open = proc_uid_map_open, |
2988 | .write = proc_uid_map_write, | 3001 | .write = proc_uid_map_write, |
@@ -2998,6 +3011,14 @@ static const struct file_operations proc_gid_map_operations = { | |||
2998 | .llseek = seq_lseek, | 3011 | .llseek = seq_lseek, |
2999 | .release = proc_id_map_release, | 3012 | .release = proc_id_map_release, |
3000 | }; | 3013 | }; |
3014 | |||
3015 | static const struct file_operations proc_projid_map_operations = { | ||
3016 | .open = proc_projid_map_open, | ||
3017 | .write = proc_projid_map_write, | ||
3018 | .read = seq_read, | ||
3019 | .llseek = seq_lseek, | ||
3020 | .release = proc_id_map_release, | ||
3021 | }; | ||
3001 | #endif /* CONFIG_USER_NS */ | 3022 | #endif /* CONFIG_USER_NS */ |
3002 | 3023 | ||
3003 | static int proc_pid_personality(struct seq_file *m, struct pid_namespace *ns, | 3024 | static int proc_pid_personality(struct seq_file *m, struct pid_namespace *ns, |
@@ -3105,6 +3126,7 @@ static const struct pid_entry tgid_base_stuff[] = { | |||
3105 | #ifdef CONFIG_USER_NS | 3126 | #ifdef CONFIG_USER_NS |
3106 | REG("uid_map", S_IRUGO|S_IWUSR, proc_uid_map_operations), | 3127 | REG("uid_map", S_IRUGO|S_IWUSR, proc_uid_map_operations), |
3107 | REG("gid_map", S_IRUGO|S_IWUSR, proc_gid_map_operations), | 3128 | REG("gid_map", S_IRUGO|S_IWUSR, proc_gid_map_operations), |
3129 | REG("projid_map", S_IRUGO|S_IWUSR, proc_projid_map_operations), | ||
3108 | #endif | 3130 | #endif |
3109 | }; | 3131 | }; |
3110 | 3132 | ||
@@ -3468,6 +3490,7 @@ static const struct pid_entry tid_base_stuff[] = { | |||
3468 | #ifdef CONFIG_USER_NS | 3490 | #ifdef CONFIG_USER_NS |
3469 | REG("uid_map", S_IRUGO|S_IWUSR, proc_uid_map_operations), | 3491 | REG("uid_map", S_IRUGO|S_IWUSR, proc_uid_map_operations), |
3470 | REG("gid_map", S_IRUGO|S_IWUSR, proc_gid_map_operations), | 3492 | REG("gid_map", S_IRUGO|S_IWUSR, proc_gid_map_operations), |
3493 | REG("projid_map", S_IRUGO|S_IWUSR, proc_projid_map_operations), | ||
3471 | #endif | 3494 | #endif |
3472 | }; | 3495 | }; |
3473 | 3496 | ||