xfs: ioctl check for capabilities in the current user namespace
Subsystems (2)
PATCH v8 3/7 xfs: ioctl check for capabilities in the current user namespace
Use inode_capable() to check if SUID|SGID bits should be cleared to match similar check in inode_change_ok().
The check for CAP_LINUX_IMMUTABLE was not modified since all other file systems also check against init_user_ns rather than current_user_ns.
Only allow changing of projid from init_user_ns.
--- fs/xfs/xfs_ioctl.c | 11 +++++++++-- kernel/capability.c | 1 + 2 files changed, 10 insertions(+), 2 deletions(-)
fs/xfs/xfs_ioctl.c +9 -2
@@ -981,15 +981,22 @@ xfs_ioctl_setattr(* to the file owner ID, except in cases where the * CAP_FSETID capability is applicable. */ -if (current_fsuid () != ip->i_d.di_uid && !capable (CAP_FOWNER )) { +if (!inode_owner_or_capable (VFS_I (ip))) { code =XFS_ERROR (EPERM ); goto error_return; }/* * 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 (mask &FSX_PROJID ) { +if (current_user_ns () != &init_user_ns) { + code =XFS_ERROR (EINVAL ); + goto error_return; + } +if (XFS_IS_QUOTA_RUNNING (mp) &&XFS_IS_PQUOTA_ON (mp) &&xfs_get_projid (ip) != fa->fsx_projid) {
@@ -1103,7 +1110,7 @@ xfs_ioctl_setattr(* cleared upon successful return from chown() */ if ((ip->i_d.di_mode & (S_ISUID |S_ISGID )) && - !capable (CAP_FSETID )) + !inode_capable (VFS_I (ip),CAP_FSETID )) ip->i_d.di_mode &= ~(S_ISUID |S_ISGID );/*
kernel/capability.c +1 -0
@@ -464,3 +464,4 @@ bool inode_capable(const struct inode *inode, int cap)return ns_capable (ns, cap) &&kuid_has_mapping (ns, inode->i_uid); } +EXPORT_SYMBOL (inode_capable);
Signature · 6 lines
1.8.1.4 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
Quoted 9 lines · Dwight Engen
Use
inode_capable()to check if SUID|SGID bits should be cleared to match similar check ininode_change_ok().The check for
CAP_LINUX_IMMUTABLEwas not modified since all other file systems also check againstinit_user_nsrather thancurrent_user_ns.Only allow changing of projid from
init_user_ns.Signed-off-by Dwight Engen <[email protected]>
looks good.
Signature · 7 lines
Dave Chinner [email protected] _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
Quoted 10 lines · Dwight Engen
Use
inode_capable()to check if SUID|SGID bits should be cleared to match similar check ininode_change_ok().The check for
CAP_LINUX_IMMUTABLEwas not modified since all other file systems also check againstinit_user_nsrather thancurrent_user_ns.Only allow changing of projid from
init_user_ns.Signed-off-by Dwight Engen <[email protected]>---
looks good to me, thanks
Quoted 47 lines
fs/xfs/xfs_ioctl.c | 11 +++++++++-- kernel/capability.c | 1 + 2 files changed, 10 insertions(+), 2 deletions(-)fs/xfs/xfs_ioctl.c +9
-2@@ -981,15 +981,22 @@ xfs_ioctl_setattr(* to the file owner ID, except in cases where the * CAP_FSETID capability is applicable. */ -if (current_fsuid () != ip->i_d.di_uid && !capable (CAP_FOWNER )) { +if (!inode_owner_or_capable (VFS_I (ip))) { code =XFS_ERROR (EPERM ); goto error_return; }/* * 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 (mask &FSX_PROJID ) { +if (current_user_ns () != &init_user_ns) { + code =XFS_ERROR (EINVAL ); + goto error_return; + } +if (XFS_IS_QUOTA_RUNNING (mp) &&XFS_IS_PQUOTA_ON (mp) &&xfs_get_projid (ip) != fa->fsx_projid) {@@ -1103,7 +1110,7 @@ xfs_ioctl_setattr(* cleared upon successful return from chown() */ if ((ip->i_d.di_mode & (S_ISUID |S_ISGID )) && - !capable (CAP_FSETID )) + !inode_capable (VFS_I (ip),CAP_FSETID )) ip->i_d.di_mode &= ~(S_ISUID |S_ISGID );/* kernel/capability.c +0
-0
kernel/capability.c bool inode_capable(const struct inode *inode, int cap) · line 467
Quoted 4 lines
kernel/capability.c +1
-0@@ -464,3 +464,4 @@ bool inode_capable(const struct inode *inode, int cap)return ns_capable (ns, cap) &&kuid_has_mapping (ns, inode->i_uid); } +EXPORT_SYMBOL (inode_capable);
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs