forked from luck/tmp_suning_uos_patched
xfs: XFS_IOCTL_SETXATTR can run in user namespaces
Currently XFS_IOCTL_SETXATTR will fail if run in a user namespace as it it not allowed to change project IDs. The current code, however, also prevents any other change being made as well, so things like extent size hints cannot be set in user namespaces. This is wrong, so only disallow access to project IDs and related flags from inside the init namespace. Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Brian Foster <bfoster@redhat.com> Signed-off-by: Dave Chinner <david@fromorbit.com>
This commit is contained in:
parent
fd179b9c3b
commit
41c145271d
|
@ -1119,6 +1119,19 @@ xfs_ioctl_setattr(
|
||||||
!xfs_sb_version_hasprojid32bit(&ip->i_mount->m_sb))
|
!xfs_sb_version_hasprojid32bit(&ip->i_mount->m_sb))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Project Quota ID state is only allowed to change from within the init
|
||||||
|
* namespace. Enforce that restriction only if we are trying to change
|
||||||
|
* the quota ID state. Everything else is allowed in user namespaces.
|
||||||
|
*/
|
||||||
|
if (current_user_ns() != &init_user_ns) {
|
||||||
|
if (xfs_get_projid(ip) != fa->fsx_projid)
|
||||||
|
return -EINVAL;
|
||||||
|
if ((fa->fsx_xflags & XFS_XFLAG_PROJINHERIT) !=
|
||||||
|
(ip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT))
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If disk quotas is on, we make sure that the dquots do exist on disk,
|
* If disk quotas is on, we make sure that the dquots do exist on disk,
|
||||||
* before we start any other transactions. Trying to do this later
|
* before we start any other transactions. Trying to do this later
|
||||||
|
@ -1141,15 +1154,6 @@ xfs_ioctl_setattr(
|
||||||
goto error_free_dquots;
|
goto error_free_dquots;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Do a quota reservation only if projid is actually going to change.
|
|
||||||
* Only allow changing of projid from init_user_ns since it is a
|
|
||||||
* non user namespace aware identifier.
|
|
||||||
*/
|
|
||||||
if (current_user_ns() != &init_user_ns) {
|
|
||||||
code = -EINVAL;
|
|
||||||
goto error_return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (XFS_IS_QUOTA_RUNNING(mp) && XFS_IS_PQUOTA_ON(mp) &&
|
if (XFS_IS_QUOTA_RUNNING(mp) && XFS_IS_PQUOTA_ON(mp) &&
|
||||||
xfs_get_projid(ip) != fa->fsx_projid) {
|
xfs_get_projid(ip) != fa->fsx_projid) {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user