提交 4b7791b2 编写于 作者: C Christian Brauner 提交者: Miklos Szeredi

ovl: handle idmappings in ovl_permission()

Use the previously introduced ovl_i_path_real() helper to retrieve the
relevant upper or lower path and take the mount's idmapping into account
for the lower layer permission check. This is needed to support idmapped
base layers with overlay.

Cc: <linux-unionfs@vger.kernel.org>
Tested-by: NGiuseppe Scrivano <gscrivan@redhat.com>
Reviewed-by: NAmir Goldstein <amir73il@gmail.com>
Signed-off-by: NChristian Brauner (Microsoft) <brauner@kernel.org>
Signed-off-by: NMiklos Szeredi <mszeredi@redhat.com>
上级 2878dffc
...@@ -280,12 +280,14 @@ int ovl_permission(struct user_namespace *mnt_userns, ...@@ -280,12 +280,14 @@ int ovl_permission(struct user_namespace *mnt_userns,
struct inode *inode, int mask) struct inode *inode, int mask)
{ {
struct inode *upperinode = ovl_inode_upper(inode); struct inode *upperinode = ovl_inode_upper(inode);
struct inode *realinode = upperinode ?: ovl_inode_lower(inode); struct inode *realinode;
struct path realpath;
const struct cred *old_cred; const struct cred *old_cred;
int err; int err;
/* Careful in RCU walk mode */ /* Careful in RCU walk mode */
if (!realinode) { ovl_i_path_real(inode, &realpath);
if (!realpath.dentry) {
WARN_ON(!(mask & MAY_NOT_BLOCK)); WARN_ON(!(mask & MAY_NOT_BLOCK));
return -ECHILD; return -ECHILD;
} }
...@@ -298,6 +300,7 @@ int ovl_permission(struct user_namespace *mnt_userns, ...@@ -298,6 +300,7 @@ int ovl_permission(struct user_namespace *mnt_userns,
if (err) if (err)
return err; return err;
realinode = d_inode(realpath.dentry);
old_cred = ovl_override_creds(inode->i_sb); old_cred = ovl_override_creds(inode->i_sb);
if (!upperinode && if (!upperinode &&
!special_file(realinode->i_mode) && mask & MAY_WRITE) { !special_file(realinode->i_mode) && mask & MAY_WRITE) {
...@@ -305,7 +308,7 @@ int ovl_permission(struct user_namespace *mnt_userns, ...@@ -305,7 +308,7 @@ int ovl_permission(struct user_namespace *mnt_userns,
/* Make sure mounter can read file for copy up later */ /* Make sure mounter can read file for copy up later */
mask |= MAY_READ; mask |= MAY_READ;
} }
err = inode_permission(&init_user_ns, realinode, mask); err = inode_permission(mnt_user_ns(realpath.mnt), realinode, mask);
revert_creds(old_cred); revert_creds(old_cred);
return err; return err;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册