From 0d8b704726047f4ce6323c491295ebee8223b275 Mon Sep 17 00:00:00 2001 From: "Eric W. Biederman" Date: Mon, 26 Jun 2006 00:25:57 -0700 Subject: [PATCH] --- yaml --- r: 30255 b: refs/heads/master c: 5b0c1dd38b66e2dd0cf655aa845e341b50b93ddd h: refs/heads/master i: 30253: 39a4db7ad80c1fac86f6c9d8d2ebe7a8513d8ff0 30251: bfe8c3e996d68aced951e55d88632aa4654756f6 30247: 10a741ff3ef323add1b3e62d3a98f994ffd31604 30239: 980766f129510d4268fca5eaab8cb6071094d439 v: v3 --- [refs] | 2 +- trunk/fs/proc/base.c | 29 ++++++++++++++++------------- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/[refs] b/[refs] index 59bae5ed27a1..3ceb5377f99a 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 13b41b09491e5d75e8027dca1ee78f5e073bc4c0 +refs/heads/master: 5b0c1dd38b66e2dd0cf655aa845e341b50b93ddd diff --git a/trunk/fs/proc/base.c b/trunk/fs/proc/base.c index c7f855441573..f0db7f616ac3 100644 --- a/trunk/fs/proc/base.c +++ b/trunk/fs/proc/base.c @@ -1074,24 +1074,27 @@ static int proc_check_dentry_visible(struct inode *inode, * namespace, or are simply process local (like pipes). */ struct task_struct *task; - struct files_struct *task_files, *files; int error = -EACCES; /* See if the the two tasks share a commone set of * file descriptors. If so everything is visible. */ - task = get_proc_task(inode); - if (!task) - goto out; - files = get_files_struct(current); - task_files = get_files_struct(task); - if (files && task_files && (files == task_files)) - error = 0; - if (task_files) - put_files_struct(task_files); - if (files) - put_files_struct(files); - put_task_struct(task); + rcu_read_lock(); + task = tref_task(proc_tref(inode)); + if (task) { + struct files_struct *task_files, *files; + /* This test answeres the question: + * Is there a point in time since we looked up the + * file descriptor where the two tasks share the + * same files struct? + */ + rmb(); + files = current->files; + task_files = task->files; + if (files && (files == task_files)) + error = 0; + } + rcu_read_unlock(); if (!error) goto out;