diff options
Diffstat (limited to 'fs/proc/array.c')
| -rw-r--r-- | fs/proc/array.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/fs/proc/array.c b/fs/proc/array.c index f9bd395b3473..dc4c5a7b9ece 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c | |||
| @@ -81,6 +81,7 @@ | |||
| 81 | #include <linux/pid_namespace.h> | 81 | #include <linux/pid_namespace.h> |
| 82 | #include <linux/ptrace.h> | 82 | #include <linux/ptrace.h> |
| 83 | #include <linux/tracehook.h> | 83 | #include <linux/tracehook.h> |
| 84 | #include <linux/user_namespace.h> | ||
| 84 | 85 | ||
| 85 | #include <asm/pgtable.h> | 86 | #include <asm/pgtable.h> |
| 86 | #include <asm/processor.h> | 87 | #include <asm/processor.h> |
| @@ -161,6 +162,7 @@ static inline const char *get_task_state(struct task_struct *tsk) | |||
| 161 | static inline void task_state(struct seq_file *m, struct pid_namespace *ns, | 162 | static inline void task_state(struct seq_file *m, struct pid_namespace *ns, |
| 162 | struct pid *pid, struct task_struct *p) | 163 | struct pid *pid, struct task_struct *p) |
| 163 | { | 164 | { |
| 165 | struct user_namespace *user_ns = current_user_ns(); | ||
| 164 | struct group_info *group_info; | 166 | struct group_info *group_info; |
| 165 | int g; | 167 | int g; |
| 166 | struct fdtable *fdt = NULL; | 168 | struct fdtable *fdt = NULL; |
| @@ -189,8 +191,14 @@ static inline void task_state(struct seq_file *m, struct pid_namespace *ns, | |||
| 189 | task_tgid_nr_ns(p, ns), | 191 | task_tgid_nr_ns(p, ns), |
| 190 | pid_nr_ns(pid, ns), | 192 | pid_nr_ns(pid, ns), |
| 191 | ppid, tpid, | 193 | ppid, tpid, |
| 192 | cred->uid, cred->euid, cred->suid, cred->fsuid, | 194 | from_kuid_munged(user_ns, cred->uid), |
| 193 | cred->gid, cred->egid, cred->sgid, cred->fsgid); | 195 | from_kuid_munged(user_ns, cred->euid), |
| 196 | from_kuid_munged(user_ns, cred->suid), | ||
| 197 | from_kuid_munged(user_ns, cred->fsuid), | ||
| 198 | from_kgid_munged(user_ns, cred->gid), | ||
| 199 | from_kgid_munged(user_ns, cred->egid), | ||
| 200 | from_kgid_munged(user_ns, cred->sgid), | ||
| 201 | from_kgid_munged(user_ns, cred->fsgid)); | ||
| 194 | 202 | ||
| 195 | task_lock(p); | 203 | task_lock(p); |
| 196 | if (p->files) | 204 | if (p->files) |
| @@ -205,7 +213,8 @@ static inline void task_state(struct seq_file *m, struct pid_namespace *ns, | |||
| 205 | task_unlock(p); | 213 | task_unlock(p); |
| 206 | 214 | ||
| 207 | for (g = 0; g < min(group_info->ngroups, NGROUPS_SMALL); g++) | 215 | for (g = 0; g < min(group_info->ngroups, NGROUPS_SMALL); g++) |
| 208 | seq_printf(m, "%d ", GROUP_AT(group_info, g)); | 216 | seq_printf(m, "%d ", |
| 217 | from_kgid_munged(user_ns, GROUP_AT(group_info, g))); | ||
| 209 | put_cred(cred); | 218 | put_cred(cred); |
| 210 | 219 | ||
| 211 | seq_putc(m, '\n'); | 220 | seq_putc(m, '\n'); |
