@@ -4814,7 +4814,7 @@ static int do_mount_setattr(struct path *path, struct mount_kattr *kattr)
4814
4814
}
4815
4815
4816
4816
static int build_mount_idmapped (const struct mount_attr * attr , size_t usize ,
4817
- struct mount_kattr * kattr , unsigned int flags )
4817
+ struct mount_kattr * kattr )
4818
4818
{
4819
4819
struct ns_common * ns ;
4820
4820
struct user_namespace * mnt_userns ;
@@ -4865,22 +4865,8 @@ static int build_mount_idmapped(const struct mount_attr *attr, size_t usize,
4865
4865
}
4866
4866
4867
4867
static int build_mount_kattr (const struct mount_attr * attr , size_t usize ,
4868
- struct mount_kattr * kattr , unsigned int flags )
4868
+ struct mount_kattr * kattr )
4869
4869
{
4870
- unsigned int lookup_flags = LOOKUP_AUTOMOUNT | LOOKUP_FOLLOW ;
4871
-
4872
- if (flags & AT_NO_AUTOMOUNT )
4873
- lookup_flags &= ~LOOKUP_AUTOMOUNT ;
4874
- if (flags & AT_SYMLINK_NOFOLLOW )
4875
- lookup_flags &= ~LOOKUP_FOLLOW ;
4876
- if (flags & AT_EMPTY_PATH )
4877
- lookup_flags |= LOOKUP_EMPTY ;
4878
-
4879
- * kattr = (struct mount_kattr ) {
4880
- .lookup_flags = lookup_flags ,
4881
- .recurse = !!(flags & AT_RECURSIVE ),
4882
- };
4883
-
4884
4870
if (attr -> propagation & ~MOUNT_SETATTR_PROPAGATION_FLAGS )
4885
4871
return - EINVAL ;
4886
4872
if (hweight32 (attr -> propagation & MOUNT_SETATTR_PROPAGATION_FLAGS ) > 1 )
@@ -4928,7 +4914,7 @@ static int build_mount_kattr(const struct mount_attr *attr, size_t usize,
4928
4914
return - EINVAL ;
4929
4915
}
4930
4916
4931
- return build_mount_idmapped (attr , usize , kattr , flags );
4917
+ return build_mount_idmapped (attr , usize , kattr );
4932
4918
}
4933
4919
4934
4920
static void finish_mount_kattr (struct mount_kattr * kattr )
@@ -4940,23 +4926,14 @@ static void finish_mount_kattr(struct mount_kattr *kattr)
4940
4926
mnt_idmap_put (kattr -> mnt_idmap );
4941
4927
}
4942
4928
4943
- SYSCALL_DEFINE5 (mount_setattr , int , dfd , const char __user * , path ,
4944
- unsigned int , flags , struct mount_attr __user * , uattr ,
4945
- size_t , usize )
4929
+ static int copy_mount_setattr (struct mount_attr __user * uattr , size_t usize ,
4930
+ struct mount_kattr * kattr )
4946
4931
{
4947
- int err ;
4948
- struct path target ;
4932
+ int ret ;
4949
4933
struct mount_attr attr ;
4950
- struct mount_kattr kattr ;
4951
4934
4952
4935
BUILD_BUG_ON (sizeof (struct mount_attr ) != MOUNT_ATTR_SIZE_VER0 );
4953
4936
4954
- if (flags & ~(AT_EMPTY_PATH |
4955
- AT_RECURSIVE |
4956
- AT_SYMLINK_NOFOLLOW |
4957
- AT_NO_AUTOMOUNT ))
4958
- return - EINVAL ;
4959
-
4960
4937
if (unlikely (usize > PAGE_SIZE ))
4961
4938
return - E2BIG ;
4962
4939
if (unlikely (usize < MOUNT_ATTR_SIZE_VER0 ))
@@ -4965,17 +4942,47 @@ SYSCALL_DEFINE5(mount_setattr, int, dfd, const char __user *, path,
4965
4942
if (!may_mount ())
4966
4943
return - EPERM ;
4967
4944
4968
- err = copy_struct_from_user (& attr , sizeof (attr ), uattr , usize );
4969
- if (err )
4970
- return err ;
4945
+ ret = copy_struct_from_user (& attr , sizeof (attr ), uattr , usize );
4946
+ if (ret )
4947
+ return ret ;
4971
4948
4972
4949
/* Don't bother walking through the mounts if this is a nop. */
4973
4950
if (attr .attr_set == 0 &&
4974
4951
attr .attr_clr == 0 &&
4975
4952
attr .propagation == 0 )
4976
4953
return 0 ;
4977
4954
4978
- err = build_mount_kattr (& attr , usize , & kattr , flags );
4955
+ return build_mount_kattr (& attr , usize , kattr );
4956
+ }
4957
+
4958
+ SYSCALL_DEFINE5 (mount_setattr , int , dfd , const char __user * , path ,
4959
+ unsigned int , flags , struct mount_attr __user * , uattr ,
4960
+ size_t , usize )
4961
+ {
4962
+ int err ;
4963
+ struct path target ;
4964
+ struct mount_kattr kattr ;
4965
+ unsigned int lookup_flags = LOOKUP_AUTOMOUNT | LOOKUP_FOLLOW ;
4966
+
4967
+ if (flags & ~(AT_EMPTY_PATH |
4968
+ AT_RECURSIVE |
4969
+ AT_SYMLINK_NOFOLLOW |
4970
+ AT_NO_AUTOMOUNT ))
4971
+ return - EINVAL ;
4972
+
4973
+ if (flags & AT_NO_AUTOMOUNT )
4974
+ lookup_flags &= ~LOOKUP_AUTOMOUNT ;
4975
+ if (flags & AT_SYMLINK_NOFOLLOW )
4976
+ lookup_flags &= ~LOOKUP_FOLLOW ;
4977
+ if (flags & AT_EMPTY_PATH )
4978
+ lookup_flags |= LOOKUP_EMPTY ;
4979
+
4980
+ kattr = (struct mount_kattr ) {
4981
+ .lookup_flags = lookup_flags ,
4982
+ .recurse = !!(flags & AT_RECURSIVE ),
4983
+ };
4984
+
4985
+ err = copy_mount_setattr (uattr , usize , & kattr );
4979
4986
if (err )
4980
4987
return err ;
4981
4988
0 commit comments