diff options
| author | Eric W. Biederman <ebiederm@xmission.com> | 2013-03-09 00:14:45 -0800 | 
|---|---|---|
| committer | Eric W. Biederman <ebiederm@xmission.com> | 2013-03-09 00:14:45 -0800 | 
| commit | db04dc679bcc780ad6907943afe24a30de974a1b (patch) | |
| tree | b90e13dc98a5217968a3035470d34744bf72d1c2 | |
| parent | 9141770548d529b9d32d5b08d59b65ee65afe0d4 (diff) | |
| download | olio-linux-3.10-db04dc679bcc780ad6907943afe24a30de974a1b.tar.xz olio-linux-3.10-db04dc679bcc780ad6907943afe24a30de974a1b.zip  | |
proc: Use nd_jump_link in proc_ns_follow_link
Update proc_ns_follow_link to use nd_jump_link instead of just
manually updating nd.path.dentry.
This fixes the BUG_ON(nd->inode != parent->d_inode) reported by Dave
Jones and reproduced trivially with mkdir /proc/self/ns/uts/a.
Sigh it looks like the VFS change to require use of nd_jump_link
happend while proc_ns_follow_link was baking and since the common case
of proc_ns_follow_link continued to work without problems the need for
making this change was overlooked.
Cc: stable@vger.kernel.org
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
| -rw-r--r-- | fs/proc/namespaces.c | 12 | 
1 files changed, 6 insertions, 6 deletions
diff --git a/fs/proc/namespaces.c b/fs/proc/namespaces.c index b7a47196c8c..66b51c0383d 100644 --- a/fs/proc/namespaces.c +++ b/fs/proc/namespaces.c @@ -118,7 +118,7 @@ static void *proc_ns_follow_link(struct dentry *dentry, struct nameidata *nd)  	struct super_block *sb = inode->i_sb;  	struct proc_inode *ei = PROC_I(inode);  	struct task_struct *task; -	struct dentry *ns_dentry; +	struct path ns_path;  	void *error = ERR_PTR(-EACCES);  	task = get_proc_task(inode); @@ -128,14 +128,14 @@ static void *proc_ns_follow_link(struct dentry *dentry, struct nameidata *nd)  	if (!ptrace_may_access(task, PTRACE_MODE_READ))  		goto out_put_task; -	ns_dentry = proc_ns_get_dentry(sb, task, ei->ns_ops); -	if (IS_ERR(ns_dentry)) { -		error = ERR_CAST(ns_dentry); +	ns_path.dentry = proc_ns_get_dentry(sb, task, ei->ns_ops); +	if (IS_ERR(ns_path.dentry)) { +		error = ERR_CAST(ns_path.dentry);  		goto out_put_task;  	} -	dput(nd->path.dentry); -	nd->path.dentry = ns_dentry; +	ns_path.mnt = mntget(nd->path.mnt); +	nd_jump_link(nd, &ns_path);  	error = NULL;  out_put_task:  |