Skip to content

Commit 4b7791b

Browse files
braunerMiklos Szeredi
authored andcommitted
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: 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 2878dff commit 4b7791b

1 file changed

Lines changed: 6 additions & 3 deletions

File tree

fs/overlayfs/inode.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -280,12 +280,14 @@ int ovl_permission(struct user_namespace *mnt_userns,
280280
struct inode *inode, int mask)
281281
{
282282
struct inode *upperinode = ovl_inode_upper(inode);
283-
struct inode *realinode = upperinode ?: ovl_inode_lower(inode);
283+
struct inode *realinode;
284+
struct path realpath;
284285
const struct cred *old_cred;
285286
int err;
286287

287288
/* Careful in RCU walk mode */
288-
if (!realinode) {
289+
ovl_i_path_real(inode, &realpath);
290+
if (!realpath.dentry) {
289291
WARN_ON(!(mask & MAY_NOT_BLOCK));
290292
return -ECHILD;
291293
}
@@ -298,14 +300,15 @@ int ovl_permission(struct user_namespace *mnt_userns,
298300
if (err)
299301
return err;
300302

303+
realinode = d_inode(realpath.dentry);
301304
old_cred = ovl_override_creds(inode->i_sb);
302305
if (!upperinode &&
303306
!special_file(realinode->i_mode) && mask & MAY_WRITE) {
304307
mask &= ~(MAY_WRITE | MAY_APPEND);
305308
/* Make sure mounter can read file for copy up later */
306309
mask |= MAY_READ;
307310
}
308-
err = inode_permission(&init_user_ns, realinode, mask);
311+
err = inode_permission(mnt_user_ns(realpath.mnt), realinode, mask);
309312
revert_creds(old_cred);
310313

311314
return err;

0 commit comments

Comments
 (0)