Skip to content

Commit 007ea44

Browse files
author
Miklos Szeredi
committed
ovl: relax permission checking on underlying layers
Make permission checking more consistent: - special files don't need any access check on underling fs - exec permission check doesn't need to be performed on underlying fs Reported-by: "J. Bruce Fields" <bfields@fieldses.org> Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
1 parent 6cd0787 commit 007ea44

File tree

1 file changed

+13
-4
lines changed

1 file changed

+13
-4
lines changed

fs/overlayfs/inode.c

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -286,13 +286,22 @@ int ovl_permission(struct inode *inode, int mask)
286286
if (err)
287287
return err;
288288

289-
old_cred = ovl_override_creds(inode->i_sb);
290-
if (!upperinode &&
291-
!special_file(realinode->i_mode) && mask & MAY_WRITE) {
289+
/* No need to do any access on underlying for special files */
290+
if (special_file(realinode->i_mode))
291+
return 0;
292+
293+
/* No need to access underlying for execute */
294+
mask &= ~MAY_EXEC;
295+
if ((mask & (MAY_READ | MAY_WRITE)) == 0)
296+
return 0;
297+
298+
/* Lower files get copied up, so turn write access into read */
299+
if (!upperinode && mask & MAY_WRITE) {
292300
mask &= ~(MAY_WRITE | MAY_APPEND);
293-
/* Make sure mounter can read file for copy up later */
294301
mask |= MAY_READ;
295302
}
303+
304+
old_cred = ovl_override_creds(inode->i_sb);
296305
err = inode_permission(realinode, mask);
297306
revert_creds(old_cred);
298307

0 commit comments

Comments
 (0)