@@ -5189,8 +5189,8 @@ static void finish_mount_kattr(struct mount_kattr *kattr)
51895189 mnt_idmap_put (kattr -> mnt_idmap );
51905190}
51915191
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 )
51945194{
51955195 int ret ;
51965196 struct mount_attr attr ;
@@ -5213,9 +5213,13 @@ static int copy_mount_setattr(struct mount_attr __user *uattr, size_t usize,
52135213 if (attr .attr_set == 0 &&
52145214 attr .attr_clr == 0 &&
52155215 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 ;
52175221
5218- return build_mount_kattr ( & attr , usize , kattr ) ;
5222+ return 1 ;
52195223}
52205224
52215225SYSCALL_DEFINE5 (mount_setattr , int , dfd , const char __user * , path ,
@@ -5247,8 +5251,8 @@ SYSCALL_DEFINE5(mount_setattr, int, dfd, const char __user *, path,
52475251 if (flags & AT_RECURSIVE )
52485252 kattr .kflags |= MOUNT_KATTR_RECURSE ;
52495253
5250- err = copy_mount_setattr (uattr , usize , & kattr );
5251- if (err )
5254+ err = wants_mount_setattr (uattr , usize , & kattr );
5255+ if (err <= 0 )
52525256 return err ;
52535257
52545258 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,
52825286 if (flags & AT_RECURSIVE )
52835287 kattr .kflags |= MOUNT_KATTR_RECURSE ;
52845288
5285- ret = copy_mount_setattr (uattr , usize , & kattr );
5286- if (ret )
5289+ ret = wants_mount_setattr (uattr , usize , & kattr );
5290+ if (ret < 0 )
52875291 return ret ;
52885292
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 ;
52925297
5293- finish_mount_kattr (& kattr );
5298+ finish_mount_kattr (& kattr );
5299+ }
52945300 }
52955301
52965302 fd = get_unused_fd_flags (flags & O_CLOEXEC );
0 commit comments