aboutsummaryrefslogtreecommitdiffstats
path: root/fs/overlayfs
diff options
context:
space:
mode:
authorVivek Goyal <vgoyal@redhat.com>2016-07-01 16:34:27 -0400
committerMiklos Szeredi <mszeredi@redhat.com>2016-07-29 06:05:23 -0400
commitc0ca3d70e8d3cf81e2255a217f7ca402f5ed0862 (patch)
tree8f1a2e9730bdd327513e31b500da20ad4f1ad36c /fs/overlayfs
parent39a25b2b37629f65e5a1eba1b353d0b47687c2ca (diff)
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 <vgoyal@redhat.com> Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Diffstat (limited to 'fs/overlayfs')
-rw-r--r--fs/overlayfs/inode.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c
index a574108f52a8..f84492ff505d 100644
--- a/fs/overlayfs/inode.c
+++ b/fs/overlayfs/inode.c
@@ -113,6 +113,7 @@ int ovl_permission(struct inode *inode, int mask)
113 bool is_upper; 113 bool is_upper;
114 struct dentry *realdentry = ovl_entry_real(oe, &is_upper); 114 struct dentry *realdentry = ovl_entry_real(oe, &is_upper);
115 struct inode *realinode; 115 struct inode *realinode;
116 const struct cred *old_cred;
116 int err; 117 int err;
117 118
118 if (ovl_is_default_permissions(inode)) { 119 if (ovl_is_default_permissions(inode)) {
@@ -166,7 +167,19 @@ int ovl_permission(struct inode *inode, int mask)
166 return -EROFS; 167 return -EROFS;
167 } 168 }
168 169
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;
170} 183}
171 184
172static const char *ovl_get_link(struct dentry *dentry, 185static const char *ovl_get_link(struct dentry *dentry,
@@ -314,9 +327,6 @@ struct posix_acl *ovl_get_acl(struct inode *inode, int type)
314{ 327{
315 struct inode *realinode = ovl_inode_real(inode); 328 struct inode *realinode = ovl_inode_real(inode);
316 329
317 if (!realinode)
318 return ERR_PTR(-ENOENT);
319
320 if (!IS_POSIXACL(realinode)) 330 if (!IS_POSIXACL(realinode))
321 return NULL; 331 return NULL;
322 332