Skip to content

Commit 8423b3b

Browse files
braunerMiklos Szeredi
authored andcommitted
ovl: handle idmappings in layer open helpers
In earlier patches we already passed down the relevant upper or lower path to ovl_open_realfile(). Now let the open helpers actually take the idmapping of the relevant mount into account when checking permissions. This is needed to support idmapped base layers with overlay. Cc: <linux-unionfs@vger.kernel.org> Tested-by: Giuseppe Scrivano <gscrivan@redhat.com> Reviewed-by: Amir Goldstein <amir73il@gmail.com> Signed-off-by: Christian Brauner (Microsoft) <brauner@kernel.org> Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
1 parent 4b7791b commit 8423b3b

2 files changed

Lines changed: 7 additions & 4 deletions

File tree

fs/overlayfs/file.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ static struct file *ovl_open_realfile(const struct file *file,
4242
{
4343
struct inode *realinode = d_inode(realpath->dentry);
4444
struct inode *inode = file_inode(file);
45+
struct user_namespace *real_mnt_userns;
4546
struct file *realfile;
4647
const struct cred *old_cred;
4748
int flags = file->f_flags | OVL_OPEN_FLAGS;
@@ -52,11 +53,12 @@ static struct file *ovl_open_realfile(const struct file *file,
5253
acc_mode |= MAY_APPEND;
5354

5455
old_cred = ovl_override_creds(inode->i_sb);
55-
err = inode_permission(&init_user_ns, realinode, MAY_OPEN | acc_mode);
56+
real_mnt_userns = mnt_user_ns(realpath->mnt);
57+
err = inode_permission(real_mnt_userns, realinode, MAY_OPEN | acc_mode);
5658
if (err) {
5759
realfile = ERR_PTR(err);
5860
} else {
59-
if (!inode_owner_or_capable(&init_user_ns, realinode))
61+
if (!inode_owner_or_capable(real_mnt_userns, realinode))
6062
flags &= ~O_NOATIME;
6163

6264
realfile = open_with_fake_path(&file->f_path, flags, realinode,

fs/overlayfs/util.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,7 @@ bool ovl_is_whiteout(struct dentry *dentry)
493493
struct file *ovl_path_open(struct path *path, int flags)
494494
{
495495
struct inode *inode = d_inode(path->dentry);
496+
struct user_namespace *real_mnt_userns = mnt_user_ns(path->mnt);
496497
int err, acc_mode;
497498

498499
if (flags & ~(O_ACCMODE | O_LARGEFILE))
@@ -509,12 +510,12 @@ struct file *ovl_path_open(struct path *path, int flags)
509510
BUG();
510511
}
511512

512-
err = inode_permission(&init_user_ns, inode, acc_mode | MAY_OPEN);
513+
err = inode_permission(real_mnt_userns, inode, acc_mode | MAY_OPEN);
513514
if (err)
514515
return ERR_PTR(err);
515516

516517
/* O_NOATIME is an optimization, don't fail if not permitted */
517-
if (inode_owner_or_capable(&init_user_ns, inode))
518+
if (inode_owner_or_capable(real_mnt_userns, inode))
518519
flags |= O_NOATIME;
519520

520521
return dentry_open(path, flags, current_cred());

0 commit comments

Comments
 (0)