diff options
| author | Thomas Gleixner <[email protected]> | 2022-07-28 12:36:35 +0200 | 
|---|---|---|
| committer | Thomas Gleixner <[email protected]> | 2022-07-28 12:36:35 +0200 | 
| commit | 779fda86bdeb86bad6daa4f0ecf37788dfc26f6c (patch) | |
| tree | 6445c0ba43c460765b27e62d9d3bec13c2cde674 /fs/attr.c | |
| parent | ac165aab469895de059a4a191a2e04ddb5421d0e (diff) | |
| parent | 2bd1753e8c431fc7475c04ac8d14a4e9930f47f6 (diff) | |
Merge tag 'irqchip-5.20' of git://git.kernel.org/pub/scm/linux/kernel/git/maz/arm-platforms into irq/core
Pull irqchip/genirq updates from Marc Zyngier:
 * Core code update:
  - Non-SMP IRQ affinity fixes, allowing UP kernel to behave similarly
    to SMP ones for the purpose of interrupt affinity
  - Let irq_set_chip_handler_name_locked() take a const struct irq_chip *
  - Tidy-up the NOMAP irqdomain API variant
  - Teach action_show() to use for_each_action_of_desc()
  - Make irq_chip_request_resources_parent() allow the parent callback
    to be optional
  - Remove dynamic allocations from populate_parent_alloc_arg()
 * New drivers:
  - Merge the long awaited IRQ support for the LoongArch architecture,
    with the provisional ACPICA update (to be reverted once the official
    support lands)
  - New Renesas RZ/G2L IRQC driver, equipped with its companion GPIO
    driver
 * Driver updates
  - Optimise the hot path operations for the SiFive PLIC, trading the
    locking for per-CPU priority masking masking operations which are
    apparently faster
  - Work around broken PLIC implementations that deal pretty badly with
    edge-triggered interrupts. Flag two implementations as affected.
  - Simplify the irq-stm32-exti driver, particularly the table that
    remaps the interrupts from exti to the GIC, reducing the memory usage
  - Convert the ocelot irq_chip to being immutable
  - Check ioremap() return value in the MIPS GIC driver
  - Move MMP driver init function declarations into the common .h
  - The obligatory typo fixes
Link: https://lore.kernel.org/all/[email protected]
Diffstat (limited to 'fs/attr.c')
| -rw-r--r-- | fs/attr.c | 26 | 
1 files changed, 20 insertions, 6 deletions
| diff --git a/fs/attr.c b/fs/attr.c index 66899b6e9bd8..dbe996b0dedf 100644 --- a/fs/attr.c +++ b/fs/attr.c @@ -61,9 +61,15 @@ static bool chgrp_ok(struct user_namespace *mnt_userns,  		     const struct inode *inode, kgid_t gid)  {  	kgid_t kgid = i_gid_into_mnt(mnt_userns, inode); -	if (uid_eq(current_fsuid(), i_uid_into_mnt(mnt_userns, inode)) && -	    (in_group_p(gid) || gid_eq(gid, inode->i_gid))) -		return true; +	if (uid_eq(current_fsuid(), i_uid_into_mnt(mnt_userns, inode))) { +		kgid_t mapped_gid; + +		if (gid_eq(gid, inode->i_gid)) +			return true; +		mapped_gid = mapped_kgid_fs(mnt_userns, i_user_ns(inode), gid); +		if (in_group_p(mapped_gid)) +			return true; +	}  	if (capable_wrt_inode_uidgid(mnt_userns, inode, CAP_CHOWN))  		return true;  	if (gid_eq(kgid, INVALID_GID) && @@ -123,12 +129,20 @@ int setattr_prepare(struct user_namespace *mnt_userns, struct dentry *dentry,  	/* Make sure a caller can chmod. */  	if (ia_valid & ATTR_MODE) { +		kgid_t mapped_gid; +  		if (!inode_owner_or_capable(mnt_userns, inode))  			return -EPERM; + +		if (ia_valid & ATTR_GID) +			mapped_gid = mapped_kgid_fs(mnt_userns, +						i_user_ns(inode), attr->ia_gid); +		else +			mapped_gid = i_gid_into_mnt(mnt_userns, inode); +  		/* Also check the setgid bit! */ -               if (!in_group_p((ia_valid & ATTR_GID) ? attr->ia_gid : -                                i_gid_into_mnt(mnt_userns, inode)) && -                    !capable_wrt_inode_uidgid(mnt_userns, inode, CAP_FSETID)) +		if (!in_group_p(mapped_gid) && +		    !capable_wrt_inode_uidgid(mnt_userns, inode, CAP_FSETID))  			attr->ia_mode &= ~S_ISGID;  	} |