diff options
Diffstat (limited to 'fs/proc/base.c')
-rw-r--r-- | fs/proc/base.c | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/fs/proc/base.c b/fs/proc/base.c index 2cf5d7e37375..e665097c1da5 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
@@ -403,7 +403,7 @@ static const struct file_operations proc_pid_cmdline_ops = { | |||
403 | static int proc_pid_auxv(struct seq_file *m, struct pid_namespace *ns, | 403 | static int proc_pid_auxv(struct seq_file *m, struct pid_namespace *ns, |
404 | struct pid *pid, struct task_struct *task) | 404 | struct pid *pid, struct task_struct *task) |
405 | { | 405 | { |
406 | struct mm_struct *mm = mm_access(task, PTRACE_MODE_READ); | 406 | struct mm_struct *mm = mm_access(task, PTRACE_MODE_READ_FSCREDS); |
407 | if (mm && !IS_ERR(mm)) { | 407 | if (mm && !IS_ERR(mm)) { |
408 | unsigned int nwords = 0; | 408 | unsigned int nwords = 0; |
409 | do { | 409 | do { |
@@ -430,7 +430,8 @@ static int proc_pid_wchan(struct seq_file *m, struct pid_namespace *ns, | |||
430 | 430 | ||
431 | wchan = get_wchan(task); | 431 | wchan = get_wchan(task); |
432 | 432 | ||
433 | if (wchan && ptrace_may_access(task, PTRACE_MODE_READ) && !lookup_symbol_name(wchan, symname)) | 433 | if (wchan && ptrace_may_access(task, PTRACE_MODE_READ_FSCREDS) |
434 | && !lookup_symbol_name(wchan, symname)) | ||
434 | seq_printf(m, "%s", symname); | 435 | seq_printf(m, "%s", symname); |
435 | else | 436 | else |
436 | seq_putc(m, '0'); | 437 | seq_putc(m, '0'); |
@@ -444,7 +445,7 @@ static int lock_trace(struct task_struct *task) | |||
444 | int err = mutex_lock_killable(&task->signal->cred_guard_mutex); | 445 | int err = mutex_lock_killable(&task->signal->cred_guard_mutex); |
445 | if (err) | 446 | if (err) |
446 | return err; | 447 | return err; |
447 | if (!ptrace_may_access(task, PTRACE_MODE_ATTACH)) { | 448 | if (!ptrace_may_access(task, PTRACE_MODE_ATTACH_FSCREDS)) { |
448 | mutex_unlock(&task->signal->cred_guard_mutex); | 449 | mutex_unlock(&task->signal->cred_guard_mutex); |
449 | return -EPERM; | 450 | return -EPERM; |
450 | } | 451 | } |
@@ -697,7 +698,7 @@ static int proc_fd_access_allowed(struct inode *inode) | |||
697 | */ | 698 | */ |
698 | task = get_proc_task(inode); | 699 | task = get_proc_task(inode); |
699 | if (task) { | 700 | if (task) { |
700 | allowed = ptrace_may_access(task, PTRACE_MODE_READ); | 701 | allowed = ptrace_may_access(task, PTRACE_MODE_READ_FSCREDS); |
701 | put_task_struct(task); | 702 | put_task_struct(task); |
702 | } | 703 | } |
703 | return allowed; | 704 | return allowed; |
@@ -732,7 +733,7 @@ static bool has_pid_permissions(struct pid_namespace *pid, | |||
732 | return true; | 733 | return true; |
733 | if (in_group_p(pid->pid_gid)) | 734 | if (in_group_p(pid->pid_gid)) |
734 | return true; | 735 | return true; |
735 | return ptrace_may_access(task, PTRACE_MODE_READ); | 736 | return ptrace_may_access(task, PTRACE_MODE_READ_FSCREDS); |
736 | } | 737 | } |
737 | 738 | ||
738 | 739 | ||
@@ -809,7 +810,7 @@ struct mm_struct *proc_mem_open(struct inode *inode, unsigned int mode) | |||
809 | struct mm_struct *mm = ERR_PTR(-ESRCH); | 810 | struct mm_struct *mm = ERR_PTR(-ESRCH); |
810 | 811 | ||
811 | if (task) { | 812 | if (task) { |
812 | mm = mm_access(task, mode); | 813 | mm = mm_access(task, mode | PTRACE_MODE_FSCREDS); |
813 | put_task_struct(task); | 814 | put_task_struct(task); |
814 | 815 | ||
815 | if (!IS_ERR_OR_NULL(mm)) { | 816 | if (!IS_ERR_OR_NULL(mm)) { |
@@ -1860,7 +1861,7 @@ static int map_files_d_revalidate(struct dentry *dentry, unsigned int flags) | |||
1860 | if (!task) | 1861 | if (!task) |
1861 | goto out_notask; | 1862 | goto out_notask; |
1862 | 1863 | ||
1863 | mm = mm_access(task, PTRACE_MODE_READ); | 1864 | mm = mm_access(task, PTRACE_MODE_READ_FSCREDS); |
1864 | if (IS_ERR_OR_NULL(mm)) | 1865 | if (IS_ERR_OR_NULL(mm)) |
1865 | goto out; | 1866 | goto out; |
1866 | 1867 | ||
@@ -2013,7 +2014,7 @@ static struct dentry *proc_map_files_lookup(struct inode *dir, | |||
2013 | goto out; | 2014 | goto out; |
2014 | 2015 | ||
2015 | result = -EACCES; | 2016 | result = -EACCES; |
2016 | if (!ptrace_may_access(task, PTRACE_MODE_READ)) | 2017 | if (!ptrace_may_access(task, PTRACE_MODE_READ_FSCREDS)) |
2017 | goto out_put_task; | 2018 | goto out_put_task; |
2018 | 2019 | ||
2019 | result = -ENOENT; | 2020 | result = -ENOENT; |
@@ -2066,7 +2067,7 @@ proc_map_files_readdir(struct file *file, struct dir_context *ctx) | |||
2066 | goto out; | 2067 | goto out; |
2067 | 2068 | ||
2068 | ret = -EACCES; | 2069 | ret = -EACCES; |
2069 | if (!ptrace_may_access(task, PTRACE_MODE_READ)) | 2070 | if (!ptrace_may_access(task, PTRACE_MODE_READ_FSCREDS)) |
2070 | goto out_put_task; | 2071 | goto out_put_task; |
2071 | 2072 | ||
2072 | ret = 0; | 2073 | ret = 0; |
@@ -2533,7 +2534,7 @@ static int do_io_accounting(struct task_struct *task, struct seq_file *m, int wh | |||
2533 | if (result) | 2534 | if (result) |
2534 | return result; | 2535 | return result; |
2535 | 2536 | ||
2536 | if (!ptrace_may_access(task, PTRACE_MODE_READ)) { | 2537 | if (!ptrace_may_access(task, PTRACE_MODE_READ_FSCREDS)) { |
2537 | result = -EACCES; | 2538 | result = -EACCES; |
2538 | goto out_unlock; | 2539 | goto out_unlock; |
2539 | } | 2540 | } |