Skip to content

Commit c0ca3d7

Browse files
rhvgoyalMiklos Szeredi
authored andcommitted
ovl: modify ovl_permission() to do checks on two inodes
Right now ovl_permission() calls __inode_permission(realinode), to do permission checks on real inode and no checks are done on overlay inode. Modify it to do checks both on overlay inode as well as underlying inode. Checks on overlay inode will be done with the creds of calling task while checks on underlying inode will be done with the creds of mounter. Signed-off-by: Vivek Goyal <[email protected]> Signed-off-by: Miklos Szeredi <[email protected]>
1 parent 39a25b2 commit c0ca3d7

File tree

1 file changed

+14
-4
lines changed

1 file changed

+14
-4
lines changed

fs/overlayfs/inode.c

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ int ovl_permission(struct inode *inode, int mask)
113113
bool is_upper;
114114
struct dentry *realdentry = ovl_entry_real(oe, &is_upper);
115115
struct inode *realinode;
116+
const struct cred *old_cred;
116117
int err;
117118

118119
if (ovl_is_default_permissions(inode)) {
@@ -166,7 +167,19 @@ int ovl_permission(struct inode *inode, int mask)
166167
return -EROFS;
167168
}
168169

169-
return __inode_permission(realinode, mask);
170+
/*
171+
* Check overlay inode with the creds of task and underlying inode
172+
* with creds of mounter
173+
*/
174+
err = generic_permission(inode, mask);
175+
if (err)
176+
return err;
177+
178+
old_cred = ovl_override_creds(inode->i_sb);
179+
err = __inode_permission(realinode, mask);
180+
revert_creds(old_cred);
181+
182+
return err;
170183
}
171184

172185
static const char *ovl_get_link(struct dentry *dentry,
@@ -314,9 +327,6 @@ struct posix_acl *ovl_get_acl(struct inode *inode, int type)
314327
{
315328
struct inode *realinode = ovl_inode_real(inode);
316329

317-
if (!realinode)
318-
return ERR_PTR(-ENOENT);
319-
320330
if (!IS_POSIXACL(realinode))
321331
return NULL;
322332

0 commit comments

Comments
 (0)