@@ -545,17 +545,21 @@ static u32 fuse_ext_size(size_t size)
545
545
/*
546
546
* This adds just a single supplementary group that matches the parent's group.
547
547
*/
548
- static int get_create_supp_group (struct inode * dir , struct fuse_in_arg * ext )
548
+ static int get_create_supp_group (struct mnt_idmap * idmap ,
549
+ struct inode * dir ,
550
+ struct fuse_in_arg * ext )
549
551
{
550
552
struct fuse_conn * fc = get_fuse_conn (dir );
551
553
struct fuse_ext_header * xh ;
552
554
struct fuse_supp_groups * sg ;
553
555
kgid_t kgid = dir -> i_gid ;
556
+ vfsgid_t vfsgid = make_vfsgid (idmap , fc -> user_ns , kgid );
554
557
gid_t parent_gid = from_kgid (fc -> user_ns , kgid );
558
+
555
559
u32 sg_len = fuse_ext_size (sizeof (* sg ) + sizeof (sg -> groups [0 ]));
556
560
557
- if (parent_gid == (gid_t ) - 1 || gid_eq ( kgid , current_fsgid ()) ||
558
- !in_group_p ( kgid ))
561
+ if (parent_gid == (gid_t ) - 1 || vfsgid_eq_kgid ( vfsgid , current_fsgid ()) ||
562
+ !vfsgid_in_group_p ( vfsgid ))
559
563
return 0 ;
560
564
561
565
xh = extend_arg (ext , sg_len );
@@ -572,7 +576,8 @@ static int get_create_supp_group(struct inode *dir, struct fuse_in_arg *ext)
572
576
return 0 ;
573
577
}
574
578
575
- static int get_create_ext (struct fuse_args * args ,
579
+ static int get_create_ext (struct mnt_idmap * idmap ,
580
+ struct fuse_args * args ,
576
581
struct inode * dir , struct dentry * dentry ,
577
582
umode_t mode )
578
583
{
@@ -583,7 +588,7 @@ static int get_create_ext(struct fuse_args *args,
583
588
if (fc -> init_security )
584
589
err = get_security_context (dentry , mode , & ext );
585
590
if (!err && fc -> create_supp_group )
586
- err = get_create_supp_group (dir , & ext );
591
+ err = get_create_supp_group (idmap , dir , & ext );
587
592
588
593
if (!err && ext .size ) {
589
594
WARN_ON (args -> in_numargs >= ARRAY_SIZE (args -> in_args ));
@@ -668,7 +673,7 @@ static int fuse_create_open(struct inode *dir, struct dentry *entry,
668
673
args .out_args [1 ].size = sizeof (* outopenp );
669
674
args .out_args [1 ].value = outopenp ;
670
675
671
- err = get_create_ext (& args , dir , entry , mode );
676
+ err = get_create_ext (& nop_mnt_idmap , & args , dir , entry , mode );
672
677
if (err )
673
678
goto out_free_ff ;
674
679
@@ -798,7 +803,7 @@ static int create_new_entry(struct fuse_mount *fm, struct fuse_args *args,
798
803
args -> out_args [0 ].value = & outarg ;
799
804
800
805
if (args -> opcode != FUSE_LINK ) {
801
- err = get_create_ext (args , dir , entry , mode );
806
+ err = get_create_ext (& nop_mnt_idmap , args , dir , entry , mode );
802
807
if (err )
803
808
goto out_put_forget_req ;
804
809
}
0 commit comments