Re: [REVIEW][PATCH 1/3] vfs: In d_path don't call d_dname on a mount point

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Quoting Eric W. Biederman (ebiederm@xxxxxxxxxxxx):
> 
> Aditya Kali (adityakali@xxxxxxxxxx) wrote:
> > Commit bf056bfa80596a5d14b26b17276a56a0dcb080e5:
> > "proc: Fix the namespace inode permission checks." converted
> > the namespace files into symlinks. The same commit changed
> > the way namespace bind mounts appear in /proc/mounts:
> >   $ mount --bind /proc/self/ns/ipc /mnt/ipc
> > Originally:
> >   $ cat /proc/mounts | grep ipc
> >   proc /mnt/ipc proc rw,nosuid,nodev,noexec 0 0
> >
> > After commit bf056bfa80596a5d14b26b17276a56a0dcb080e5:
> >   $ cat /proc/mounts | grep ipc
> >   proc ipc:[4026531839] proc rw,nosuid,nodev,noexec 0 0
> >
> > This breaks userspace which expects the 2nd field in
> > /proc/mounts to be a valid path.
> 
> The symlink /proc/<pid>/ns/{ipc,mnt,net,pid,user,uts} point to
> dentries allocated with d_alloc_pseudo that we can mount, and
> that have interesting names printed out with d_dname.
> 
> When these files are bind mounted /proc/mounts is not currently
> displaying the mount point correctly because d_dname is called instead
> of just displaying the path where the file is mounted.
> 
> Solve this by adding an explicit check to distinguish mounted pseudo
> inodes and unmounted pseudo inodes.  Unmounted pseudo inodes always
> use mount of their filesstem as the mnt_root  in their path making
> these two cases easy to distinguish.
> 
> CC: stable@xxxxxxxxxxxxxxx
> Reported-by: Aditya Kali <adityakali@xxxxxxxxxx>
> Signed-off-by: "Eric W. Biederman" <ebiederm@xxxxxxxxxxxx>

Acked-by: Serge Hallyn <serge.hallyn@xxxxxxxxxxxxx>

> ---
>  fs/dcache.c |    7 ++++++-
>  1 files changed, 6 insertions(+), 1 deletions(-)
> 
> diff --git a/fs/dcache.c b/fs/dcache.c
> index 4bdb300b16e2..f7282ebf1a37 100644
> --- a/fs/dcache.c
> +++ b/fs/dcache.c
> @@ -3061,8 +3061,13 @@ char *d_path(const struct path *path, char *buf, int buflen)
>  	 * thus don't need to be hashed.  They also don't need a name until a
>  	 * user wants to identify the object in /proc/pid/fd/.  The little hack
>  	 * below allows us to generate a name for these objects on demand:
> +	 *
> +	 * Some pseudo inodes are mountable.  When they are mounted
> +	 * path->dentry == path->mnt->mnt_root.  In that case don't call d_dname
> +	 * and instead have d_path return the mounted path.
>  	 */
> -	if (path->dentry->d_op && path->dentry->d_op->d_dname)
> +	if (path->dentry->d_op && path->dentry->d_op->d_dname &&
> +	    (!IS_ROOT(path->dentry) || path->dentry != path->mnt->mnt_root))
>  		return path->dentry->d_op->d_dname(path->dentry, buf, buflen);
>  
>  	rcu_read_lock();
> -- 
> 1.7.5.4
_______________________________________________
Containers mailing list
Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx
https://lists.linuxfoundation.org/mailman/listinfo/containers




[Index of Archives]     [Cgroups]     [Netdev]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux