@@ -5189,8 +5189,8 @@ static void finish_mount_kattr(struct mount_kattr *kattr)
5189
5189
mnt_idmap_put (kattr -> mnt_idmap );
5190
5190
}
5191
5191
5192
- static int copy_mount_setattr (struct mount_attr __user * uattr , size_t usize ,
5193
- struct mount_kattr * kattr )
5192
+ static int wants_mount_setattr (struct mount_attr __user * uattr , size_t usize ,
5193
+ struct mount_kattr * kattr )
5194
5194
{
5195
5195
int ret ;
5196
5196
struct mount_attr attr ;
@@ -5213,9 +5213,13 @@ static int copy_mount_setattr(struct mount_attr __user *uattr, size_t usize,
5213
5213
if (attr .attr_set == 0 &&
5214
5214
attr .attr_clr == 0 &&
5215
5215
attr .propagation == 0 )
5216
- return 0 ;
5216
+ return 0 ; /* Tell caller to not bother. */
5217
+
5218
+ ret = build_mount_kattr (& attr , usize , kattr );
5219
+ if (ret < 0 )
5220
+ return ret ;
5217
5221
5218
- return build_mount_kattr ( & attr , usize , kattr ) ;
5222
+ return 1 ;
5219
5223
}
5220
5224
5221
5225
SYSCALL_DEFINE5 (mount_setattr , int , dfd , const char __user * , path ,
@@ -5247,8 +5251,8 @@ SYSCALL_DEFINE5(mount_setattr, int, dfd, const char __user *, path,
5247
5251
if (flags & AT_RECURSIVE )
5248
5252
kattr .kflags |= MOUNT_KATTR_RECURSE ;
5249
5253
5250
- err = copy_mount_setattr (uattr , usize , & kattr );
5251
- if (err )
5254
+ err = wants_mount_setattr (uattr , usize , & kattr );
5255
+ if (err <= 0 )
5252
5256
return err ;
5253
5257
5254
5258
err = user_path_at (dfd , path , kattr .lookup_flags , & target );
@@ -5282,15 +5286,17 @@ SYSCALL_DEFINE5(open_tree_attr, int, dfd, const char __user *, filename,
5282
5286
if (flags & AT_RECURSIVE )
5283
5287
kattr .kflags |= MOUNT_KATTR_RECURSE ;
5284
5288
5285
- ret = copy_mount_setattr (uattr , usize , & kattr );
5286
- if (ret )
5289
+ ret = wants_mount_setattr (uattr , usize , & kattr );
5290
+ if (ret < 0 )
5287
5291
return ret ;
5288
5292
5289
- ret = do_mount_setattr (& file -> f_path , & kattr );
5290
- if (ret )
5291
- return ret ;
5293
+ if (ret ) {
5294
+ ret = do_mount_setattr (& file -> f_path , & kattr );
5295
+ if (ret )
5296
+ return ret ;
5292
5297
5293
- finish_mount_kattr (& kattr );
5298
+ finish_mount_kattr (& kattr );
5299
+ }
5294
5300
}
5295
5301
5296
5302
fd = get_unused_fd_flags (flags & O_CLOEXEC );
0 commit comments