diff options
-rw-r--r-- | fs/proc/fd.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/fs/proc/fd.c b/fs/proc/fd.c index 6e5fcd00733e..3c2a915c695a 100644 --- a/fs/proc/fd.c +++ b/fs/proc/fd.c | |||
@@ -291,11 +291,19 @@ static struct dentry *proc_lookupfd(struct inode *dir, struct dentry *dentry, | |||
291 | */ | 291 | */ |
292 | int proc_fd_permission(struct inode *inode, int mask) | 292 | int proc_fd_permission(struct inode *inode, int mask) |
293 | { | 293 | { |
294 | int rv = generic_permission(inode, mask); | 294 | struct task_struct *p; |
295 | int rv; | ||
296 | |||
297 | rv = generic_permission(inode, mask); | ||
295 | if (rv == 0) | 298 | if (rv == 0) |
296 | return 0; | 299 | return rv; |
297 | if (task_tgid(current) == proc_pid(inode)) | 300 | |
301 | rcu_read_lock(); | ||
302 | p = pid_task(proc_pid(inode), PIDTYPE_PID); | ||
303 | if (p && same_thread_group(p, current)) | ||
298 | rv = 0; | 304 | rv = 0; |
305 | rcu_read_unlock(); | ||
306 | |||
299 | return rv; | 307 | return rv; |
300 | } | 308 | } |
301 | 309 | ||