From ad7bb5f61195bea3622db652bea66b5cc56c4fe3 Mon Sep 17 00:00:00 2001 From: Yiannis Pericleous Date: Sat, 5 May 2007 16:33:52 -0400 Subject: [PATCH] permission related bugfixes --- fs/unionfs/odf.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/fs/unionfs/odf.c b/fs/unionfs/odf.c index 21b2d91abc..741e32efc1 100644 --- a/fs/unionfs/odf.c +++ b/fs/unionfs/odf.c @@ -349,6 +349,8 @@ int odf_rename(struct dentry *old_dentry, struct dentry *new_dentry) struct dentry *old_dir, *new_dir; struct dentry *old_odfdentry, *new_odfdentry; int err = 0; + uid_t olduid = current->fsuid; + gid_t oldgid = current->fsgid; err = odf_lookup(old_dentry->d_parent, old_dentry, 0); if (err) @@ -387,10 +389,14 @@ int odf_rename(struct dentry *old_dentry, struct dentry *new_dentry) BUG_ON(new_odfdentry->d_inode); lock_rename(old_dir, new_dir); + current->fsuid = 0; + current->fsgid = 0; err = vfs_rename(old_dir->d_inode, old_odfdentry, new_dir->d_inode, new_odfdentry); unlock_rename(old_dir, new_dir); + current->fsuid = olduid; + current->fsgid = oldgid; dput(new_odfdentry); out_unlock: @@ -407,6 +413,8 @@ int odf_link(struct dentry *old_dentry, struct dentry *new_dentry) struct dentry *old_dir, *new_dir; struct dentry *old_odfdentry, *new_odfdentry; int err = 0; + uid_t olduid = current->fsuid; + gid_t oldgid = current->fsgid; err = odf_lookup(old_dentry->d_parent, old_dentry, 0); if (err) @@ -438,7 +446,11 @@ int odf_link(struct dentry *old_dentry, struct dentry *new_dentry) /* this should never happen */ BUG_ON(new_odfdentry->d_inode); + current->fsuid = 0; + current->fsgid = 0; err = vfs_link(old_odfdentry, old_dir->d_inode, new_odfdentry); + current->fsuid = olduid; + current->fsgid = oldgid; dput(new_odfdentry); out_unlock: @@ -1246,6 +1258,8 @@ int odf_purge_dir_cache(struct dentry *dentry) { int err = 0; struct odf_dentry_info *odi = NULL; + uid_t olduid = current->fsuid; + gid_t oldgid = current->fsgid; odi = odf_ic_cache_dentry(dentry); if (IS_ERR(odi)){ @@ -1253,7 +1267,12 @@ int odf_purge_dir_cache(struct dentry *dentry) odi = NULL; goto out; } + + current->fsuid = 0; + current->fsgid = 0; err = vfs_unlink(odi->dentry->d_parent->d_inode, odi->dentry); + current->fsuid = olduid; + current->fsgid = oldgid; out: odf_put_info(odi); return err; @@ -1299,6 +1318,11 @@ int odf_remove(struct dentry *dentry, int flags) struct odf_dentry_info *odf_dir; struct odf_dentry_info *odi = NULL; int err = 0, rmv = 0; + uid_t olduid = current->fsuid; + gid_t oldgid = current->fsgid; + + olduid = current->fsuid; + oldgid = current->fsgid; /* refresh odi */ err = odf_lookup(dentry->d_parent, dentry, 0); @@ -1327,10 +1351,14 @@ int odf_remove(struct dentry *dentry, int flags) odf_lock(odf_dir); /* remove */ + current->fsuid = 0; + current->fsgid = 0; if (S_ISDIR(odi->dentry->d_inode->i_mode)) err = odf_reclaim(dentry); else err = vfs_unlink(odi->dentry->d_parent->d_inode, odi->dentry); + current->fsuid = olduid; + current->fsgid = oldgid; if (err) goto out_unlock; -- 2.43.0