@@ -108,7 +108,9 @@ static void fuse_drop_waiting(struct fuse_conn *fc)
108
108
109
109
static void fuse_put_request (struct fuse_req * req );
110
110
111
- static struct fuse_req * fuse_get_req (struct fuse_mount * fm , bool for_background )
111
+ static struct fuse_req * fuse_get_req (struct mnt_idmap * idmap ,
112
+ struct fuse_mount * fm ,
113
+ bool for_background )
112
114
{
113
115
struct fuse_conn * fc = fm -> fc ;
114
116
struct fuse_req * req ;
@@ -140,19 +142,37 @@ static struct fuse_req *fuse_get_req(struct fuse_mount *fm, bool for_background)
140
142
goto out ;
141
143
}
142
144
143
- req -> in .h .uid = from_kuid (fc -> user_ns , current_fsuid ());
144
- req -> in .h .gid = from_kgid (fc -> user_ns , current_fsgid ());
145
145
req -> in .h .pid = pid_nr_ns (task_pid (current ), fc -> pid_ns );
146
146
147
147
__set_bit (FR_WAITING , & req -> flags );
148
148
if (for_background )
149
149
__set_bit (FR_BACKGROUND , & req -> flags );
150
150
151
- if (unlikely (req -> in .h .uid == ((uid_t )- 1 ) ||
152
- req -> in .h .gid == ((gid_t )- 1 ))) {
153
- fuse_put_request (req );
154
- return ERR_PTR (- EOVERFLOW );
151
+ if ((fm -> sb -> s_iflags & SB_I_NOIDMAP ) || idmap ) {
152
+ kuid_t idmapped_fsuid ;
153
+ kgid_t idmapped_fsgid ;
154
+
155
+ /*
156
+ * Note, that when
157
+ * (fm->sb->s_iflags & SB_I_NOIDMAP) is true, then
158
+ * (idmap == &nop_mnt_idmap) is always true and therefore,
159
+ * mapped_fsuid(idmap, fc->user_ns) == current_fsuid().
160
+ */
161
+ idmapped_fsuid = idmap ? mapped_fsuid (idmap , fc -> user_ns ) : current_fsuid ();
162
+ idmapped_fsgid = idmap ? mapped_fsgid (idmap , fc -> user_ns ) : current_fsgid ();
163
+ req -> in .h .uid = from_kuid (fc -> user_ns , idmapped_fsuid );
164
+ req -> in .h .gid = from_kgid (fc -> user_ns , idmapped_fsgid );
165
+
166
+ if (unlikely (req -> in .h .uid == ((uid_t )- 1 ) ||
167
+ req -> in .h .gid == ((gid_t )- 1 ))) {
168
+ fuse_put_request (req );
169
+ return ERR_PTR (- EOVERFLOW );
170
+ }
171
+ } else {
172
+ req -> in .h .uid = FUSE_INVALID_UIDGID ;
173
+ req -> in .h .gid = FUSE_INVALID_UIDGID ;
155
174
}
175
+
156
176
return req ;
157
177
158
178
out :
@@ -497,8 +517,14 @@ static void fuse_force_creds(struct fuse_req *req)
497
517
{
498
518
struct fuse_conn * fc = req -> fm -> fc ;
499
519
500
- req -> in .h .uid = from_kuid_munged (fc -> user_ns , current_fsuid ());
501
- req -> in .h .gid = from_kgid_munged (fc -> user_ns , current_fsgid ());
520
+ if (req -> fm -> sb -> s_iflags & SB_I_NOIDMAP ) {
521
+ req -> in .h .uid = from_kuid_munged (fc -> user_ns , current_fsuid ());
522
+ req -> in .h .gid = from_kgid_munged (fc -> user_ns , current_fsgid ());
523
+ } else {
524
+ req -> in .h .uid = FUSE_INVALID_UIDGID ;
525
+ req -> in .h .gid = FUSE_INVALID_UIDGID ;
526
+ }
527
+
502
528
req -> in .h .pid = pid_nr_ns (task_pid (current ), fc -> pid_ns );
503
529
}
504
530
@@ -530,7 +556,7 @@ ssize_t fuse_simple_request(struct fuse_mount *fm, struct fuse_args *args)
530
556
__set_bit (FR_FORCE , & req -> flags );
531
557
} else {
532
558
WARN_ON (args -> nocreds );
533
- req = fuse_get_req (fm , false);
559
+ req = fuse_get_req (NULL , fm , false);
534
560
if (IS_ERR (req ))
535
561
return PTR_ERR (req );
536
562
}
@@ -591,7 +617,7 @@ int fuse_simple_background(struct fuse_mount *fm, struct fuse_args *args,
591
617
__set_bit (FR_BACKGROUND , & req -> flags );
592
618
} else {
593
619
WARN_ON (args -> nocreds );
594
- req = fuse_get_req (fm , true);
620
+ req = fuse_get_req (NULL , fm , true);
595
621
if (IS_ERR (req ))
596
622
return PTR_ERR (req );
597
623
}
@@ -613,7 +639,7 @@ static int fuse_simple_notify_reply(struct fuse_mount *fm,
613
639
struct fuse_req * req ;
614
640
struct fuse_iqueue * fiq = & fm -> fc -> iq ;
615
641
616
- req = fuse_get_req (fm , false);
642
+ req = fuse_get_req (NULL , fm , false);
617
643
if (IS_ERR (req ))
618
644
return PTR_ERR (req );
619
645
0 commit comments