hfsplus: honor setgid flag on directories
Subsystems (2)
PATCH 1/1 hfsplus: honor setgid flag on directories
When creating a file inside a directory that has the setgid flag set, give the new file the group ID of the parent, and also the setgid flag if it is a directory itself.
--- fs/hfsplus/dir.c | 4 ++-- fs/hfsplus/hfsplus_fs.h | 3 ++- fs/hfsplus/inode.c | 7 +++---- fs/hfsplus/super.c | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-)
fs/hfsplus/dir.c +2 -2
@@ -443,7 +443,7 @@ static int hfsplus_symlink(struct inode *dir, struct dentry *dentry,int res = -ENOMEM ;mutex_lock (&sbi->vh_mutex); - inode =hfsplus_new_inode (dir->i_sb,S_IFLNK |S_IRWXUGO ); + inode =hfsplus_new_inode (dir->i_sb, dir,S_IFLNK |S_IRWXUGO );if (!inode) goto out;
@@ -485,7 +485,7 @@ static int hfsplus_mknod(struct inode *dir, struct dentry *dentry,int res = -ENOMEM ;mutex_lock (&sbi->vh_mutex); - inode =hfsplus_new_inode (dir->i_sb, mode); + inode =hfsplus_new_inode (dir->i_sb, dir, mode);if (!inode) goto out;
fs/hfsplus/hfsplus_fs.h +2 -1
@@ -477,7 +477,8 @@ extern const struct address_space_operations hfsplus_aops;extern const struct address_space_operations hfsplus_btree_aops;extern const struct dentry_operations hfsplus_dentry_operations; -struct inode *hfsplus_new_inode (struct super_block *sb,umode_t mode); +struct inode *hfsplus_new_inode (struct super_block *sb,struct inode *dir, +umode_t mode);void hfsplus_delete_inode (struct inode *inode);void hfsplus_inode_read_fork (struct inode *inode,struct hfsplus_fork_raw *fork);
fs/hfsplus/inode.c +3 -4
@@ -343,7 +343,8 @@ static const struct file_operations hfsplus_file_operations = { .unlocked_ioctl = hfsplus_ioctl, }; -struct inode *hfsplus_new_inode (struct super_block *sb,umode_t mode) +struct inode *hfsplus_new_inode (struct super_block *sb,struct inode *dir, +umode_t mode) {struct hfsplus_sb_info *sbi =HFSPLUS_SB (sb);struct inode *inode =new_inode (sb);
@@ -353,9 +354,7 @@ struct inode *hfsplus_new_inode(struct super_block *sb, umode_t mode)return NULL ; inode->i_ino = sbi->next_cnid++; - inode->i_mode = mode; - inode->i_uid =current_fsuid (); - inode->i_gid =current_fsgid (); +inode_init_owner (inode, dir, mode);set_nlink (inode,1 ); inode->i_mtime = inode->i_atime = inode->i_ctime =current_time (inode);
fs/hfsplus/super.c +1 -1
@@ -549,7 +549,7 @@ static int hfsplus_fill_super(struct super_block *sb, void *data, int silent)if (!sbi->hidden_dir) {mutex_lock (&sbi->vh_mutex); - sbi->hidden_dir =hfsplus_new_inode (sb,S_IFDIR ); + sbi->hidden_dir =hfsplus_new_inode (sb, root,S_IFDIR );if (!sbi->hidden_dir) {mutex_unlock (&sbi->vh_mutex); err = -ENOMEM ;
Signature · 1 line
2.1.4
Quoted 5 lines · Ernesto A. Fernández
When creating a file inside a directory that has the setgid flag set, give the new file the group ID of the parent, and also the setgid flag
if it is a directory itself.
Looks really good. I have no remarks.
Thanks,
Vyacheslav Dubeyko.
Quoted 96 lines
Signed-off-by Ernesto A. Fernández <[email protected]>---
fs/hfsplus/dir.c | 4 ++--
fs/hfsplus/hfsplus_fs.h | 3 ++-
fs/hfsplus/inode.c | 7 +++----
fs/hfsplus/super.c | 2 +-4 files changed, 8 insertions(+), 8 deletions(-)fs/hfsplus/dir.c +0
-0@@ -443,7 +443,7 @@ static int hfsplus_symlink(struct inode *dir,struct dentry *dentry, int res = -ENOMEM;
mutex_lock(&sbi->vh_mutex);fs/hfsplus/dir.c +1
-1- inode =hfsplus_new_inode (dir->i_sb,S_IFLNK |S_IRWXUGO ); + inode = hfsplus_new_inode(dir->i_sb, dir, S_IFLNK |
S_IRWXUGO);
if (!inode)
goto out;fs/hfsplus/dir.c +0
-0@@ -485,7 +485,7 @@ static int hfsplus_mknod(struct inode *dir,struct dentry *dentry, int res = -ENOMEM;
mutex_lock(&sbi->vh_mutex);fs/hfsplus/dir.c +1
-1- inode =hfsplus_new_inode (dir->i_sb, mode); + inode =hfsplus_new_inode (dir->i_sb, dir, mode);if (!inode)
goto out;fs/hfsplus/hfsplus_fs.h +0
-0@@ -477,7 +477,8 @@ extern const struct address_space_operations hfsplus_aops; extern const struct address_space_operations hfsplus_btree_aops; extern const struct dentry_operations hfsplus_dentry_operations;
-struct inode *hfsplus_new_inode(structsuper_block*sb,umode_tmode);
+struct inode *hfsplus_new_inode(structsuper_block*sb, struct inode *dir,fs/hfsplus/hfsplus_fs.h +1
-0+ umode_t mode);void
hfsplus_delete_inode(struct inode *inode); voidhfsplus_inode_read_fork(struct inode *inode, struct hfsplus_fork_raw *fork);fs/hfsplus/inode.c +0
-0@@ -343,7 +343,8 @@ static const struct file_operations hfsplus_file_operations = { .unlocked_ioctl = hfsplus_ioctl, };
-struct inode *hfsplus_new_inode(structsuper_block*sb,umode_tmode)
+struct inode *hfsplus_new_inode(structsuper_block*sb, struct inode *dir,fs/hfsplus/inode.c +1
-0+ umode_t mode){
structhfsplus_sb_info*sbi =HFSPLUS_SB(sb); struct inode *inode =new_inode(sb);fs/hfsplus/inode.c +0
-0@@ -353,9 +354,7 @@ struct inode *hfsplus_new_inode(struct super_block *sb, umode_t mode) return NULL;
inode->i_ino= sbi->next_cnid++;fs/hfsplus/inode.c +1
-3- inode->i_mode = mode; - inode->i_uid =current_fsuid (); - inode->i_gid =current_fsgid (); +inode_init_owner (inode, dir, mode);
set_nlink(inode, 1);
inode->i_mtime=inode->i_atime=inode->i_ctime=current_time(inode);fs/hfsplus/super.c +0
-0@@ -549,7 +549,7 @@ static int hfsplus_fill_super(struct super_block *sb, void *data, int silent)
if (!sbi->hidden_dir) {mutex_lock(&sbi->vh_mutex);fs/hfsplus/super.c +0
-1- sbi->hidden_dir = hfsplus_new_inode(sb,
S_IFDIR);fs/hfsplus/super.c +1
-0+ sbi->hidden_dir = hfsplus_new_inode(sb,root,
S_IFDIR);
if (!sbi->hidden_dir) {mutex_unlock(&sbi->vh_mutex); err =-ENOMEM;