Linux 5.10.243
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.10.243 kernel.
All users of the 5.10 kernel series must upgrade.
The updated 5.10.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-5.10.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Makefile | 2 arch/arm64/boot/dts/marvell/armada-3720-uDPU.dts | 9 ++-- arch/arm64/boot/dts/rockchip/rk3399-pinebook-pro.dts | 1 arch/x86/kvm/x86.c | 18 ++++++-- drivers/clk/qcom/gdsc.c | 21 ++++----- drivers/dma/mediatek/mtk-cqdma.c | 10 +--- drivers/gpio/gpio-pca953x.c | 5 ++ drivers/gpu/drm/amd/amdgpu/dce_v10_0.c | 5 -- drivers/gpu/drm/amd/amdgpu/dce_v11_0.c | 5 -- drivers/gpu/drm/amd/amdgpu/dce_v6_0.c | 5 -- drivers/gpu/drm/amd/amdgpu/dce_v8_0.c | 5 -- drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c | 8 +-- drivers/iio/chemical/pms7003.c | 5 +- drivers/iio/light/opt3001.c | 5 +- drivers/isdn/mISDN/dsp_hwec.c | 6 +- drivers/net/ethernet/cavium/thunder/thunder_bgx.c | 20 +++++---- drivers/net/ethernet/intel/e1000e/ethtool.c | 10 +++- drivers/net/ethernet/intel/i40e/i40e_client.c | 4 - drivers/net/ethernet/mediatek/mtk_eth_soc.c | 10 ++++ drivers/net/ethernet/xircom/xirc2ps_cs.c | 2 drivers/net/phy/microchip.c | 30 +------------ drivers/net/phy/microchip_t1.c | 28 +++++++++--- drivers/net/ppp/ppp_generic.c | 6 +- drivers/net/vmxnet3/vmxnet3_drv.c | 5 +- drivers/net/wireless/marvell/libertas/cfg.c | 9 ++-- drivers/net/wireless/marvell/mwifiex/cfg80211.c | 5 +- drivers/net/wireless/marvell/mwifiex/main.c | 4 - drivers/net/wireless/st/cw1200/sta.c | 2 drivers/pcmcia/rsrc_iodyn.c | 3 + drivers/pcmcia/rsrc_nonstatic.c | 4 + drivers/scsi/lpfc/lpfc_nvmet.c | 10 ++-- drivers/spi/spi-fsl-lpspi.c | 15 +++--- drivers/tee/tee_shm.c | 6 ++ fs/cifs/connect.c | 5 ++ kernel/sched/cpufreq_schedutil.c | 28 ++++++++++-- mm/khugepaged.c | 15 ++++++ mm/slub.c | 7 ++- net/atm/resources.c | 6 +- net/ax25/ax25_in.c | 4 + net/batman-adv/network-coding.c | 7 ++- net/bluetooth/l2cap_sock.c | 3 + net/dsa/tag_ksz.c | 22 +++++++-- net/ipv4/devinet.c | 7 +-- net/ipv4/icmp.c | 6 +- net/ipv6/ip6_icmp.c | 6 +- net/netfilter/nf_conntrack_helper.c | 4 - net/wireless/scan.c | 3 - scripts/gcc-plugins/gcc-common.h | 32 ++++++++++++++ scripts/gcc-plugins/randomize_layout_plugin.c | 40 +++++------------- sound/pci/hda/patch_hdmi.c | 1 sound/pci/hda/patch_realtek.c | 1 sound/usb/mixer_quirks.c | 2 52 files changed, 301 insertions(+), 181 deletions(-)
Alex Deucher (1):
drm/amdgpu: drop hw access in non-DC audio fini
Alok Tiwari (1):
xirc2ps_cs: fix register access when enabling FullDuplex
Chris Chiu (1):
ALSA: hda/realtek - Add new HP ZBook laptop with micmute led fixup
Cryolitia PukNgae (1):
ALSA: usb-audio: Add mute TLV for playback volumes on some devices
Dan Carpenter (3):
wifi: cw1200: cap SSID length in cw1200_do_join()
wifi: libertas: cap SSID len in lbs_associate()
ipv4: Fix NULL vs error pointer check in inet_blackhole_dev_init()
David Lechner (1):
iio: chemical: pms7003: use aligned_s64 for timestamp
Dmitry Antipov (1):
wifi: cfg80211: fix use-after-free in cmp_bss()
Emanuele Ghidoli (1):
gpio: pca953x: fix IRQ storm on system wake up
Eric Dumazet (1):
ax25: properly unshare skbs in ax25_kiss_rcv()
Fabian Bläse (1):
icmp: fix icmp_ndo_send address translation for reply direction
Felix Fietkau (1):
net: ethernet: mtk_eth_soc: fix tx vlan tag for llc packets
Fiona Klute (1):
net: phy: microchip: force IRQ polling mode for lan88xx
Gabor Juhos (1):
arm64: dts: marvell: uDPU: define pinctrl state for alarm LEDs
Greg Kroah-Hartman (1):
Linux 5.10.243
Ioana Ciornei (2):
net: phy: microchip: implement generic .handle_interrupt() callback
net: phy: microchip: remove the use of .ack_interrupt()
Jakob Unterwurzacher (1):
net: dsa: microchip: linearize skb for tail-tagging switches
Jann Horn (1):
mm/khugepaged: fix ->anon_vma race
John Evans (1):
scsi: lpfc: Fix buffer free/clear order in deferred receive path
Kees Cook (2):
randstruct: gcc-plugin: Remove bogus void member
randstruct: gcc-plugin: Fix attribute addition
Kuniyuki Iwashima (1):
Bluetooth: Fix use-after-free in l2cap_sock_cleanup_listen()
Larisa Grigore (3):
spi: spi-fsl-lpspi: Fix transmissions when using CONT
spi: spi-fsl-lpspi: Set correct chip-select polarity bit
spi: spi-fsl-lpspi: Reset FIFO and disable module on transfer abort
Li Qiong (1):
mm/slub: avoid accessing metadata when pointer is invalid in object_err()
Luca Ceresoli (1):
iio: light: opt3001: fix deadlock due to concurrent flag access
Ma Ke (1):
pcmcia: Fix a NULL pointer dereference in __iodyn_find_io_region()
Miaoqian Lin (1):
mISDN: Fix memory leak in dsp_hwec_enable()
Pei Xiao (1):
tee: fix NULL pointer dereference in tee_shm_put
Peter Robinson (1):
arm64: dts: rockchip: Add vcc-supply to SPI flash on rk3399-pinebook-pro
Phil Sutter (1):
netfilter: conntrack: helper: Replace -EEXIST by -EBUSY
Pieter Van Trappen (1):
net: dsa: microchip: update tag_ksz masks for KSZ9477 family
Qianfeng Rong (1):
wifi: mwifiex: Initialize the chan_stats array to zero
Qingfang Deng (1):
ppp: fix memory leak in pad_compress_skb
Qiu-ji Chen (2):
dmaengine: mediatek: Fix a possible deadlock error in mtk_cqdma_tx_status()
dmaengine: mediatek: Fix a flag reuse error in mtk_cqdma_tx_status()
Rafael J. Wysocki (1):
cpufreq/sched: Explicitly synchronize limits_changed flag handling
Roman Smirnov (1):
cifs: fix integer overflow in match_server()
Ronak Doshi (1):
vmxnet3: update MTU after device quiesce
Rosen Penev (2):
net: thunder_bgx: add a missing of_node_put
net: thunder_bgx: decrement cleanup index before use
Sean Christopherson (1):
KVM: x86: Take irqfds.lock when adding/deleting IRQ bypass producer
Stanislav Fort (1):
batman-adv: fix OOB read/write in network-coding decode
Takashi Iwai (1):
ALSA: hda/hdmi: Add pin fix for another HP EliteDesk 800 G4 model
Taniya Das (1):
clk: qcom: gdsc: Set retain_ff before moving to HW CTRL
Timur Kristóf (1):
drm/amd/display: Don't warn when missing DCE encoder caps
Vitaly Lifshits (1):
e1000e: fix heap overflow in e1000_set_eeprom
Wang Liang (1):
net: atm: fix memory leak in atm_register_sysfs when device_register fail
Wentao Liang (1):
pcmcia: Add error handling for add_interval() in do_validate_mem()
Zhen Ni (1):
i40e: Fix potential invalid access when MAC list is empty
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 10 -SUBLEVEL = 242 +SUBLEVEL = 243 EXTRAVERSION = NAME = Dare mighty things
arch/arm64/boot/dts/marvell/armada-3720-uDPU.dts +6 -3
@@ -28,8 +28,9 @@ memory@0 { }; leds { - pinctrl-names = "default"; compatible = "gpio-leds"; + pinctrl-names = "default"; + pinctrl-0 = <&spi_quad_pins>; power1 { label = "udpu:green:power";
@@ -96,8 +97,6 @@ &sdhci0 { &spi0 { status = "okay"; - pinctrl-names = "default"; - pinctrl-0 = <&spi_quad_pins>; m25p80@0 { compatible = "jedec,spi-nor";
@@ -117,6 +116,10 @@ partition@0 { }; }; +&spi_quad_pins { + function = "gpio"; +}; + &pinctrl_nb { i2c1_recovery_pins: i2c1-recovery-pins { groups = "i2c1";
arch/arm64/boot/dts/rockchip/rk3399-pinebook-pro.dts +1 -0
@@ -972,6 +972,7 @@ spiflash: flash@0 { reg = <0>; m25p,fast-read; spi-max-frequency = <10000000>; + vcc-supply = <&vcc_3v0>; }; };
arch/x86/kvm/x86.c +15 -3
@@ -11417,16 +11417,22 @@ int kvm_arch_irq_bypass_add_producer(struct irq_bypass_consumer *cons, {struct kvm_kernel_irqfd *irqfd = container_of(cons, struct kvm_kernel_irqfd, consumer); +struct kvm *kvm = irqfd->kvm;int ret; - irqfd->producer = prod;kvm_arch_start_assignment (irqfd->kvm); + +spin_lock_irq (&kvm->irqfds.lock); + irqfd->producer = prod; + ret = kvm_x86_ops.update_pi_irte (irqfd->kvm, prod->irq, irqfd->gsi,1 ); -if (ret)kvm_arch_end_assignment (irqfd->kvm); +spin_unlock_irq (&kvm->irqfds.lock); + +return ret; }
@@ -11436,9 +11442,9 @@ void kvm_arch_irq_bypass_del_producer(struct irq_bypass_consumer *cons,int ret;struct kvm_kernel_irqfd *irqfd = container_of(cons, struct kvm_kernel_irqfd, consumer); +struct kvm *kvm = irqfd->kvm;WARN_ON (irqfd->producer != prod); - irqfd->producer =NULL ;/* * When producer of consumer is unregistered, we change back to
@@ -11446,11 +11452,17 @@ void kvm_arch_irq_bypass_del_producer(struct irq_bypass_consumer *cons,* when the irq is masked/disabled or the consumer side (KVM * int this case doesn't want to receive the interrupts. */ +spin_lock_irq (&kvm->irqfds.lock); + irqfd->producer =NULL ; + ret = kvm_x86_ops.update_pi_irte (irqfd->kvm, prod->irq, irqfd->gsi,0 );if (ret)printk (KERN_INFO "irq bypass consumer (token %p) unregistration" " fails: %d\n" , irqfd->consumer.token, ret); +spin_unlock_irq (&kvm->irqfds.lock); + +kvm_arch_end_assignment (irqfd->kvm); }
drivers/clk/qcom/gdsc.c +11 -10
@@ -273,6 +273,9 @@ static int gdsc_enable(struct generic_pm_domain *domain)*/ udelay (1 ); +if (sc->flags &RETAIN_FF_ENABLE ) +gdsc_retain_ff_on (sc); +/* Turn on HW trigger mode if supported */ if (sc->flags &HW_CTRL ) { ret =gdsc_hwctrl (sc, true);
@@ -289,9 +292,6 @@ static int gdsc_enable(struct generic_pm_domain *domain)udelay (1 ); } -if (sc->flags &RETAIN_FF_ENABLE ) -gdsc_retain_ff_on (sc); -return 0 ; }
@@ -392,13 +392,6 @@ static int gdsc_init(struct gdsc *sc)return ret; } -/* Turn on HW trigger mode if supported */ -if (sc->flags &HW_CTRL ) { - ret =gdsc_hwctrl (sc, true); -if (ret <0 ) -return ret; - } -/* * Make sure the retain bit is set if the GDSC is already on, * otherwise we end up turning off the GDSC and destroying all
@@ -406,6 +399,14 @@ static int gdsc_init(struct gdsc *sc)*/ if (sc->flags &RETAIN_FF_ENABLE )gdsc_retain_ff_on (sc); + +/* Turn on HW trigger mode if supported */ +if (sc->flags &HW_CTRL ) { + ret =gdsc_hwctrl (sc, true); +if (ret <0 ) +return ret; + } + }else if (sc->flags &ALWAYS_ON ) {/* If ALWAYS_ON GDSCs are not ON, turn them ON */ gdsc_enable (&sc->pd);
drivers/dma/mediatek/mtk-cqdma.c +4 -6
@@ -421,15 +421,11 @@ static struct virt_dma_desc *mtk_cqdma_find_active_desc(struct dma_chan *c, {struct mtk_cqdma_vchan *cvc =to_cqdma_vchan (c);struct virt_dma_desc *vd; -unsigned long flags; -spin_lock_irqsave (&cvc->pc->lock, flags);list_for_each_entry (vd, &cvc->pc->queue, node)if (vd->tx.cookie == cookie) { -spin_unlock_irqrestore (&cvc->pc->lock, flags);return vd; } -spin_unlock_irqrestore (&cvc->pc->lock, flags);list_for_each_entry (vd, &cvc->vc.desc_issued, node)if (vd->tx.cookie == cookie)
@@ -453,9 +449,11 @@ static enum dma_status mtk_cqdma_tx_status(struct dma_chan *c,if (ret ==DMA_COMPLETE || !txstate)return ret; -spin_lock_irqsave (&cvc->vc.lock, flags); +spin_lock_irqsave (&cvc->pc->lock, flags); +spin_lock (&cvc->vc.lock); vd =mtk_cqdma_find_active_desc (c, cookie); -spin_unlock_irqrestore (&cvc->vc.lock, flags); +spin_unlock (&cvc->vc.lock); +spin_unlock_irqrestore (&cvc->pc->lock, flags);if (vd) { cvd =to_cqdma_vdesc (vd);
drivers/gpio/gpio-pca953x.c +5 -0
@@ -1144,6 +1144,9 @@ static int pca953x_suspend(struct device *dev)struct pca953x_chip *chip =dev_get_drvdata (dev);mutex_lock (&chip->i2c_lock); +/* Disable IRQ to prevent early triggering while regmap "cache only" is on */ +if (chip->client->irq >0 ) +disable_irq (chip->client->irq);regcache_cache_only (chip->regmap, true);mutex_unlock (&chip->i2c_lock);
@@ -1169,6 +1172,8 @@ static int pca953x_resume(struct device *dev) }mutex_lock (&chip->i2c_lock); +if (chip->client->irq >0 ) +enable_irq (chip->client->irq);regcache_cache_only (chip->regmap, false);regcache_mark_dirty (chip->regmap); ret =pca953x_regcache_sync (dev);
drivers/gpu/drm/amd/amdgpu/dce_v10_0.c +0 -5
@@ -1463,17 +1463,12 @@ static int dce_v10_0_audio_init(struct amdgpu_device *adev)static void dce_v10_0_audio_fini (struct amdgpu_device *adev) { -int i; -if (!amdgpu_audio)return ;if (!adev->mode_info.audio.enabled)return ; -for (i =0 ; i < adev->mode_info.audio.num_pins; i++) -dce_v10_0_audio_enable (adev, &adev->mode_info.audio.pin[i], false); - adev->mode_info.audio.enabled = false; }
drivers/gpu/drm/amd/amdgpu/dce_v11_0.c +0 -5
@@ -1505,17 +1505,12 @@ static int dce_v11_0_audio_init(struct amdgpu_device *adev)static void dce_v11_0_audio_fini (struct amdgpu_device *adev) { -int i; -if (!amdgpu_audio)return ;if (!adev->mode_info.audio.enabled)return ; -for (i =0 ; i < adev->mode_info.audio.num_pins; i++) -dce_v11_0_audio_enable (adev, &adev->mode_info.audio.pin[i], false); - adev->mode_info.audio.enabled = false; }
drivers/gpu/drm/amd/amdgpu/dce_v6_0.c +0 -5
@@ -1375,17 +1375,12 @@ static int dce_v6_0_audio_init(struct amdgpu_device *adev)static void dce_v6_0_audio_fini (struct amdgpu_device *adev) { -int i; -if (!amdgpu_audio)return ;if (!adev->mode_info.audio.enabled)return ; -for (i =0 ; i < adev->mode_info.audio.num_pins; i++) -dce_v6_0_audio_enable (adev, &adev->mode_info.audio.pin[i], false); - adev->mode_info.audio.enabled = false; }
drivers/gpu/drm/amd/amdgpu/dce_v8_0.c +0 -5
@@ -1426,17 +1426,12 @@ static int dce_v8_0_audio_init(struct amdgpu_device *adev)static void dce_v8_0_audio_fini (struct amdgpu_device *adev) { -int i; -if (!amdgpu_audio)return ;if (!adev->mode_info.audio.enabled)return ; -for (i =0 ; i < adev->mode_info.audio.num_pins; i++) -dce_v8_0_audio_enable (adev, &adev->mode_info.audio.pin[i], false); - adev->mode_info.audio.enabled = false; }
drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c +4 -4
@@ -899,13 +899,13 @@ void dce110_link_encoder_construct( enc110->base.id, &bp_cap_info);/* Override features with DCE-specific values */ -if (BP_RESULT_OK == result) { +if (result ==BP_RESULT_OK ) { enc110->base.features.flags.bits.IS_HBR2_CAPABLE = bp_cap_info.DP_HBR2_EN; enc110->base.features.flags.bits.IS_HBR3_CAPABLE = bp_cap_info.DP_HBR3_EN; enc110->base.features.flags.bits.HDMI_6GB_EN = bp_cap_info.HDMI_6GB_EN; - }else { + }else if (result !=BP_RESULT_NORECORD ) {DC_LOG_WARNING ("%s: Failed to get encoder_cap_info from VBIOS with error code %d!\n" , __func__, result);
@@ -1800,13 +1800,13 @@ void dce60_link_encoder_construct( enc110->base.id, &bp_cap_info);/* Override features with DCE-specific values */ -if (BP_RESULT_OK == result) { +if (result ==BP_RESULT_OK ) { enc110->base.features.flags.bits.IS_HBR2_CAPABLE = bp_cap_info.DP_HBR2_EN; enc110->base.features.flags.bits.IS_HBR3_CAPABLE = bp_cap_info.DP_HBR3_EN; enc110->base.features.flags.bits.HDMI_6GB_EN = bp_cap_info.HDMI_6GB_EN; - }else { + }else if (result !=BP_RESULT_NORECORD ) {DC_LOG_WARNING ("%s: Failed to get encoder_cap_info from VBIOS with error code %d!\n" , __func__, result);
drivers/iio/chemical/pms7003.c +3 -2
@@ -5,7 +5,6 @@* Copyright (c) Tomasz Duszynski <[email protected]> */ -#include <asm/unaligned.h> #include <linux/completion.h> #include <linux/device.h> #include <linux/errno.h>
@@ -19,6 +18,8 @@#include <linux/module.h> #include <linux/mutex.h> #include <linux/serdev.h> +#include <linux/types.h> +#include <asm/unaligned.h> #define PMS7003_DRIVER_NAME "pms7003"
@@ -76,7 +77,7 @@ struct pms7003_state {/* Used to construct scan to push to the IIO buffer */ struct {u16 data[3 ];/* PM1, PM2P5, PM10 */ -s64 ts; +aligned_s64 ts; } scan; };
drivers/iio/light/opt3001.c +3 -2
@@ -692,8 +692,9 @@ static irqreturn_t opt3001_irq(int irq, void *_iio)struct opt3001 *opt =iio_priv (iio);int ret;bool wake_result_ready_queue = false; +bool ok_to_ignore_lock = opt->ok_to_ignore_lock; -if (!opt->ok_to_ignore_lock) +if (!ok_to_ignore_lock)mutex_lock (&opt->lock); ret =i2c_smbus_read_word_swapped (opt->client,OPT3001_CONFIGURATION );
@@ -730,7 +731,7 @@ static irqreturn_t opt3001_irq(int irq, void *_iio) } out: -if (!opt->ok_to_ignore_lock) +if (!ok_to_ignore_lock)mutex_unlock (&opt->lock);if (wake_result_ready_queue)
drivers/isdn/mISDN/dsp_hwec.c +3 -3
@@ -51,14 +51,14 @@ void dsp_hwec_enable(struct dsp *dsp, const char *arg) goto _do; { -char *dup, *tok, *name, *val; +char *dup, *next, *tok, *name, *val;int tmp; - dup =kstrdup (arg,GFP_ATOMIC ); + dup = next =kstrdup (arg,GFP_ATOMIC );if (!dup)return ; -while ((tok =strsep (&dup,"," ))) { +while ((tok =strsep (&next,"," ))) {if (!strlen (tok))continue ; name =strsep (&tok,"=" );
drivers/net/ethernet/cavium/thunder/thunder_bgx.c +12 -8
@@ -1497,13 +1497,17 @@ static int bgx_init_of_phy(struct bgx *bgx)* this cortina phy, for which there is no driver * support, ignore it. */ -if (phy_np && - !of_device_is_compatible (phy_np,"cortina,cs4223-slice" )) { -/* Wait until the phy drivers are available */ - pd =of_phy_find_device (phy_np); -if (!pd) - goto defer; - bgx->lmac[lmac].phydev = pd; +if (phy_np) { +if (!of_device_is_compatible (phy_np,"cortina,cs4223-slice" )) { +/* Wait until the phy drivers are available */ + pd =of_phy_find_device (phy_np); +if (!pd) { +of_node_put (phy_np); + goto defer; + } + bgx->lmac[lmac].phydev = pd; + } +of_node_put (phy_np); } lmac++;
@@ -1519,11 +1523,11 @@ static int bgx_init_of_phy(struct bgx *bgx)* for phy devices we may have already found. */ while (lmac) { + lmac--;if (bgx->lmac[lmac].phydev) {put_device (&bgx->lmac[lmac].phydev->mdio.dev); bgx->lmac[lmac].phydev =NULL ; } - lmac--; }of_node_put (node);return -EPROBE_DEFER ;
drivers/net/ethernet/intel/e1000e/ethtool.c +7 -3
@@ -559,12 +559,12 @@ static int e1000_set_eeprom(struct net_device *netdev, {struct e1000_adapter *adapter =netdev_priv (netdev);struct e1000_hw *hw = &adapter->hw; +size_t total_len, max_len;u16 *eeprom_buff; -void *ptr; -int max_len; +int ret_val =0 ;int first_word;int last_word; -int ret_val =0 ; +void *ptr;u16 i;if (eeprom->len ==0 )
@@ -579,6 +579,10 @@ static int e1000_set_eeprom(struct net_device *netdev, max_len = hw->nvm.word_size *2 ; +if (check_add_overflow (eeprom->offset, eeprom->len, &total_len) || + total_len > max_len) +return -EFBIG ; + first_word = eeprom->offset >>1 ; last_word = (eeprom->offset + eeprom->len -1 ) >>1 ; eeprom_buff =kmalloc (max_len,GFP_KERNEL );
drivers/net/ethernet/intel/i40e/i40e_client.c +2 -2
@@ -318,8 +318,8 @@ static void i40e_client_add_instance(struct i40e_pf *pf)return ; } - mac =list_first_entry (&cdev->lan_info.netdev->dev_addrs.list, - struct netdev_hw_addr, list); + mac =list_first_entry_or_null (&cdev->lan_info.netdev->dev_addrs.list, + struct netdev_hw_addr, list);if (mac)ether_addr_copy (cdev->lan_info.lanmac, mac->addr);else
drivers/net/ethernet/mediatek/mtk_eth_soc.c +9 -1
@@ -1178,6 +1178,13 @@ static netdev_tx_t mtk_start_xmit(struct sk_buff *skb, struct net_device *dev)bool gso = false;int tx_num; +if (skb_vlan_tag_present (skb) && + !eth_proto_is_802_3 (eth_hdr (skb)->h_proto)) { + skb =__vlan_hwaccel_push_inside (skb); +if (!skb) + goto dropped; + } +/* normally we can rely on the stack not calling this more than once, * however we have 2 queues running on the same ring so we need to lock * the ring access
@@ -1223,8 +1230,9 @@ static netdev_tx_t mtk_start_xmit(struct sk_buff *skb, struct net_device *dev) drop:spin_unlock (ð->page_lock); - stats->tx_dropped++;dev_kfree_skb_any (skb); +dropped: + stats->tx_dropped++;return NETDEV_TX_OK ; }
drivers/net/ethernet/xircom/xirc2ps_cs.c +1 -1
@@ -1584,7 +1584,7 @@ do_reset(struct net_device *dev, int full)msleep (40 );/* wait 40 msec to let it complete */ }if (full_duplex) -PutByte (XIRCREG1_ECR ,GetByte (XIRCREG1_ECR | FullDuplex)); +PutByte (XIRCREG1_ECR ,GetByte (XIRCREG1_ECR ) | FullDuplex); }else {/* No MII */ SelectPage (0 ); value =GetByte (XIRCREG_ESR );/* read the ESR */
drivers/net/phy/microchip.c +3 -27
@@ -31,31 +31,6 @@ static int lan88xx_write_page(struct phy_device *phydev, int page)return __phy_write (phydev,LAN88XX_EXT_PAGE_ACCESS , page); } -static int lan88xx_phy_config_intr (struct phy_device *phydev) -{ -int rc; - -if (phydev->interrupts ==PHY_INTERRUPT_ENABLED ) { -/* unmask all source and clear them before enable */ - rc =phy_write (phydev,LAN88XX_INT_MASK ,0x7FFF ); - rc =phy_read (phydev,LAN88XX_INT_STS ); - rc =phy_write (phydev,LAN88XX_INT_MASK , -LAN88XX_INT_MASK_MDINTPIN_EN_ | -LAN88XX_INT_MASK_LINK_CHANGE_ ); - }else { - rc =phy_write (phydev,LAN88XX_INT_MASK ,0 ); - } - -return rc <0 ? rc :0 ; -} - -static int lan88xx_phy_ack_interrupt (struct phy_device *phydev) -{ -int rc =phy_read (phydev,LAN88XX_INT_STS ); - -return rc <0 ? rc :0 ; -} -static int lan88xx_suspend (struct phy_device *phydev) {struct lan88xx_priv *priv = phydev->priv;
@@ -372,8 +347,9 @@ static struct phy_driver microchip_phy_driver[] = { .config_aneg = lan88xx_config_aneg, .link_change_notify = lan88xx_link_change_notify, - .ack_interrupt = lan88xx_phy_ack_interrupt, - .config_intr = lan88xx_phy_config_intr, +/* Interrupt handling is broken, do not define related +* functions to force polling. +*/ .suspend = lan88xx_suspend, .resume = genphy_resume,
drivers/net/phy/microchip_t1.c +22 -6
@@ -189,18 +189,34 @@ static int lan87xx_phy_config_intr(struct phy_device *phydev) rc =phy_write (phydev,LAN87XX_INTERRUPT_MASK ,0x7FFF ); rc =phy_read (phydev,LAN87XX_INTERRUPT_SOURCE ); val =LAN87XX_MASK_LINK_UP |LAN87XX_MASK_LINK_DOWN ; - } + rc =phy_write (phydev,LAN87XX_INTERRUPT_MASK , val); + }else { + rc =phy_write (phydev,LAN87XX_INTERRUPT_MASK , val); +if (rc) +return rc; - rc =phy_write (phydev,LAN87XX_INTERRUPT_MASK , val); + rc =phy_read (phydev,LAN87XX_INTERRUPT_SOURCE ); + }return rc <0 ? rc :0 ; } -static int lan87xx_phy_ack_interrupt (struct phy_device *phydev) +static irqreturn_t lan87xx_handle_interrupt (struct phy_device *phydev) { -int rc =phy_read (phydev,LAN87XX_INTERRUPT_SOURCE ); +int irq_status; -return rc <0 ? rc :0 ; + irq_status =phy_read (phydev,LAN87XX_INTERRUPT_SOURCE ); +if (irq_status <0 ) { +phy_error (phydev); +return IRQ_NONE ; + } + +if (irq_status ==0 ) +return IRQ_NONE ; + +phy_trigger_machine (phydev); + +return IRQ_HANDLED ; }static int lan87xx_config_init (struct phy_device *phydev)
@@ -221,8 +237,8 @@ static struct phy_driver microchip_t1_phy_driver[] = { .config_init = lan87xx_config_init, .config_aneg = genphy_config_aneg, - .ack_interrupt = lan87xx_phy_ack_interrupt, .config_intr = lan87xx_phy_config_intr, + .handle_interrupt = lan87xx_handle_interrupt, .suspend = genphy_suspend, .resume = genphy_resume,
drivers/net/ppp/ppp_generic.c +3 -3
@@ -1616,7 +1616,6 @@ pad_compress_skb(struct ppp *ppp, struct sk_buff *skb)*/ if (net_ratelimit ())netdev_err (ppp->dev,"ppp: compressor dropped pkt\n" ); -kfree_skb (skb);consume_skb (new_skb); new_skb =NULL ; }
@@ -1718,9 +1717,10 @@ ppp_send_frame(struct ppp *ppp, struct sk_buff *skb) "down - pkt dropped.\n"); goto drop; } - skb =pad_compress_skb (ppp, skb); -if (!skb) + new_skb =pad_compress_skb (ppp, skb); +if (!new_skb) goto drop; + skb = new_skb; }/*
drivers/net/vmxnet3/vmxnet3_drv.c +3 -2
@@ -3147,8 +3147,6 @@ vmxnet3_change_mtu(struct net_device *netdev, int new_mtu)struct vmxnet3_adapter *adapter =netdev_priv (netdev);int err =0 ; - netdev->mtu = new_mtu; -/* * Reset_work may be in the middle of resetting the device, wait for its * completion.
@@ -3162,6 +3160,7 @@ vmxnet3_change_mtu(struct net_device *netdev, int new_mtu)/* we need to re-create the rx queue based on the new mtu */ vmxnet3_rq_destroy_all (adapter); + netdev->mtu = new_mtu;vmxnet3_adjust_rx_ring_size (adapter); err =vmxnet3_rq_create_all (adapter);if (err) {
@@ -3178,6 +3177,8 @@ vmxnet3_change_mtu(struct net_device *netdev, int new_mtu) "Closing it\n", err); goto out; } + }else { + netdev->mtu = new_mtu; } out:
drivers/net/wireless/marvell/libertas/cfg.c +6 -3
@@ -1102,10 +1102,13 @@ static int lbs_associate(struct lbs_private *priv,/* add SSID TLV */ rcu_read_lock (); ssid_eid =ieee80211_bss_get_ie (bss,WLAN_EID_SSID ); -if (ssid_eid) - pos +=lbs_add_ssid_tlv (pos, ssid_eid +2 , ssid_eid[1 ]); -else +if (ssid_eid) { +u32 ssid_len =min (ssid_eid[1 ],IEEE80211_MAX_SSID_LEN ); + + pos +=lbs_add_ssid_tlv (pos, ssid_eid +2 , ssid_len); + }else {lbs_deb_assoc ("no SSID\n" ); + }rcu_read_unlock ();/* add DS param TLV */
drivers/net/wireless/marvell/mwifiex/cfg80211.c +3 -2
@@ -4268,8 +4268,9 @@ int mwifiex_init_channel_scan_gap(struct mwifiex_adapter *adapter)* additional active scan request for hidden SSIDs on passive channels. */ adapter->num_in_chan_stats =2 * (n_channels_bg + n_channels_a); - adapter->chan_stats =vmalloc (array_size (sizeof (*adapter->chan_stats), - adapter->num_in_chan_stats)); + adapter->chan_stats =kcalloc (adapter->num_in_chan_stats, +sizeof (*adapter->chan_stats), +GFP_KERNEL );if (!adapter->chan_stats)return -ENOMEM ;
drivers/net/wireless/marvell/mwifiex/main.c +2 -2
@@ -635,7 +635,7 @@ static int _mwifiex_fw_dpc(const struct firmware *firmware, void *context) goto done; err_add_intf: -vfree (adapter->chan_stats); +kfree (adapter->chan_stats); err_init_chan_scan:wiphy_unregister (adapter->wiphy);wiphy_free (adapter->wiphy);
@@ -1448,7 +1448,7 @@ static void mwifiex_uninit_sw(struct mwifiex_adapter *adapter)wiphy_free (adapter->wiphy); adapter->wiphy =NULL ; -vfree (adapter->chan_stats); +kfree (adapter->chan_stats);mwifiex_free_cmd_buffers (adapter); }
drivers/net/wireless/st/cw1200/sta.c +1 -1
@@ -1289,7 +1289,7 @@ static void cw1200_do_join(struct cw1200_common *priv)rcu_read_lock (); ssidie =ieee80211_bss_get_ie (bss,WLAN_EID_SSID );if (ssidie) { - join.ssid_len = ssidie[1 ]; + join.ssid_len =min (ssidie[1 ],IEEE80211_MAX_SSID_LEN );memcpy (join.ssid, &ssidie[2 ], join.ssid_len); }rcu_read_unlock ();
drivers/pcmcia/rsrc_iodyn.c +3 -0
@@ -62,6 +62,9 @@ static struct resource *__iodyn_find_io_region(struct pcmcia_socket *s,unsigned long min = base;int ret; +if (!res) +return NULL ; + data.mask = align -1 ; data.offset = base & data.mask;
drivers/pcmcia/rsrc_nonstatic.c +3 -1
@@ -375,7 +375,9 @@ static int do_validate_mem(struct pcmcia_socket *s,if (validate && !s->fake_cis) {/* move it to the validated data set */ -add_interval (&s_data->mem_db_valid, base, size); + ret =add_interval (&s_data->mem_db_valid, base, size); +if (ret) +return ret;sub_interval (&s_data->mem_db, base, size); }
drivers/scsi/lpfc/lpfc_nvmet.c +6 -4
@@ -1245,7 +1245,7 @@ lpfc_nvmet_defer_rcv(struct nvmet_fc_target_port *tgtport,struct lpfc_nvmet_tgtport *tgtp;struct lpfc_async_xchg_ctx *ctxp = container_of(rsp, struct lpfc_async_xchg_ctx, hdlrctx.fcp_req); -struct rqb_dmabuf *nvmebuf = ctxp->rqb_buffer; +struct rqb_dmabuf *nvmebuf;struct lpfc_hba *phba = ctxp->phba;unsigned long iflag;
@@ -1253,13 +1253,18 @@ lpfc_nvmet_defer_rcv(struct nvmet_fc_target_port *tgtport,lpfc_nvmeio_data (phba,"NVMET DEFERRCV: xri x%x sz %d CPU %02x\n" , ctxp->oxid, ctxp->size,raw_smp_processor_id ()); +spin_lock_irqsave (&ctxp->ctxlock, iflag); + nvmebuf = ctxp->rqb_buffer;if (!nvmebuf) { +spin_unlock_irqrestore (&ctxp->ctxlock, iflag);lpfc_printf_log (phba,KERN_INFO ,LOG_NVME_IOERR ,"6425 Defer rcv: no buffer oxid x%x: " "flg %x ste %x\n" , ctxp->oxid, ctxp->flag, ctxp->state);return ; } + ctxp->rqb_buffer =NULL ; +spin_unlock_irqrestore (&ctxp->ctxlock, iflag); tgtp = phba->targetport->private;if (tgtp)
@@ -1267,9 +1272,6 @@ lpfc_nvmet_defer_rcv(struct nvmet_fc_target_port *tgtport,/* Free the nvmebuf since a new buffer already replaced it */ nvmebuf->hrq->rqbp->rqb_free_buffer (phba, nvmebuf); -spin_lock_irqsave (&ctxp->ctxlock, iflag); - ctxp->rqb_buffer =NULL ; -spin_unlock_irqrestore (&ctxp->ctxlock, iflag); }/**
drivers/spi/spi-fsl-lpspi.c +8 -7
@@ -3,8 +3,9 @@// Freescale i.MX7ULP LPSPI driver // // Copyright 2016 Freescale Semiconductor, Inc. -// Copyright 2018 NXP Semiconductors +// Copyright 2018, 2023, 2025 NXP +#include <linux/bitfield.h> #include <linux/clk.h> #include <linux/completion.h> #include <linux/delay.h>
@@ -71,7 +72,7 @@#define DER_TDDE BIT(0)#define CFGR1_PCSCFG BIT(27)#define CFGR1_PINCFG (BIT(24)|BIT(25)) -#define CFGR1_PCSPOL BIT(8) +#define CFGR1_PCSPOL_MASK GENMASK(11, 8)#define CFGR1_NOSTALL BIT(3)#define CFGR1_MASTER BIT(0)#define FSR_TXCOUNT (0xFF)
@@ -395,7 +396,9 @@ static int fsl_lpspi_config(struct fsl_lpspi_data *fsl_lpspi)else temp =CFGR1_PINCFG ;if (fsl_lpspi->config.mode &SPI_CS_HIGH ) - temp |=CFGR1_PCSPOL ; + temp |=FIELD_PREP (CFGR1_PCSPOL_MASK , +BIT (fsl_lpspi->config.chip_select)); +writel (temp, fsl_lpspi->base +IMX7ULP_CFGR1 ); temp =readl (fsl_lpspi->base +IMX7ULP_CR );
@@ -702,12 +705,10 @@ static int fsl_lpspi_pio_transfer(struct spi_controller *controller,fsl_lpspi_write_tx_fifo (fsl_lpspi); ret =fsl_lpspi_wait_for_completion (controller); -if (ret) -return ret;fsl_lpspi_reset (fsl_lpspi); -return 0 ; +return ret; } static int fsl_lpspi_transfer_one(struct spi_controller *controller,
@@ -755,7 +756,7 @@ static irqreturn_t fsl_lpspi_isr(int irq, void *dev_id)if (temp_SR &SR_MBF ||readl (fsl_lpspi->base +IMX7ULP_FSR ) &FSR_TXCOUNT ) {writel (SR_FCF , fsl_lpspi->base +IMX7ULP_SR ); -fsl_lpspi_intctrl (fsl_lpspi,IER_FCIE ); +fsl_lpspi_intctrl (fsl_lpspi,IER_FCIE | (temp_IER &IER_TDIE ));return IRQ_HANDLED ; }
drivers/tee/tee_shm.c +5 -1
@@ -438,9 +438,13 @@ EXPORT_SYMBOL_GPL(tee_shm_get_from_id);*/ void tee_shm_put (struct tee_shm *shm) { -struct tee_device *teedev = shm->ctx->teedev; +struct tee_device *teedev;bool do_release = false; +if (!shm || !shm->ctx || !shm->ctx->teedev) +return ; + + teedev = shm->ctx->teedev;mutex_lock (&teedev->mutex);if (refcount_dec_and_test (&shm->refcount)) {/*
fs/cifs/connect.c +5 -0
@@ -1915,6 +1915,11 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, __func__); goto cifs_parse_mount_err; } +if (option <SMB_ECHO_INTERVAL_MIN || + option >SMB_ECHO_INTERVAL_MAX ) { +cifs_dbg (VFS ,"echo interval is out of bounds\n" ); + goto cifs_parse_mount_err; + } vol->echo_interval = option;break ;case Opt_snapshot:
kernel/sched/cpufreq_schedutil.c +24 -4
@@ -88,9 +88,20 @@ static bool sugov_should_update_freq(struct sugov_policy *sg_policy, u64 time)if (!cpufreq_this_cpu_can_update (sg_policy->policy))return false; -if (unlikely (sg_policy->limits_changed)) { - sg_policy->limits_changed = false; +if (unlikely (READ_ONCE (sg_policy->limits_changed))) { +WRITE_ONCE (sg_policy->limits_changed, false); sg_policy->need_freq_update = true; + +/* +* The above limits_changed update must occur before the reads +* of policy limits in cpufreq_driver_resolve_freq() or a policy +* limits update might be missed, so use a memory barrier to +* ensure it. +* +* This pairs with the write memory barrier in sugov_limits(). +*/ +smp_mb (); +return true; }
@@ -443,7 +454,7 @@ static inline bool sugov_cpu_is_busy(struct sugov_cpu *sg_cpu) { return false; }static inline void ignore_dl_rate_limit (struct sugov_cpu *sg_cpu,struct sugov_policy *sg_policy) {if (cpu_bw_dl (cpu_rq (sg_cpu->cpu)) > sg_cpu->bw_dl) - sg_policy->limits_changed = true; +WRITE_ONCE (sg_policy->limits_changed, true); } static void sugov_update_single(struct update_util_data *hook, u64 time,
@@ -891,7 +902,16 @@ static void sugov_limits(struct cpufreq_policy *policy)mutex_unlock (&sg_policy->work_lock); } - sg_policy->limits_changed = true; +/* +* The limits_changed update below must take place before the updates +* of policy limits in cpufreq_set_policy() or a policy limits update +* might be missed, so use a memory barrier to ensure it. +* +* This pairs with the memory barrier in sugov_should_update_freq(). +*/ +smp_wmb (); + +WRITE_ONCE (sg_policy->limits_changed, true); }struct cpufreq_governor schedutil_gov = {
mm/khugepaged.c +14 -1
@@ -1611,7 +1611,7 @@ static void retract_page_tables(struct address_space *mapping, pgoff_t pgoff)* has higher cost too. It would also probably require locking * the anon_vma. */ -if (vma->anon_vma) +if (READ_ONCE (vma->anon_vma))continue ; addr = vma->vm_start + ((pgoff - vma->vm_pgoff) <<PAGE_SHIFT );if (addr & ~HPAGE_PMD_MASK )
@@ -1633,6 +1633,19 @@ static void retract_page_tables(struct address_space *mapping, pgoff_t pgoff)if (!khugepaged_test_exit (mm)) {struct mmu_notifier_range range; +/* +* Re-check whether we have an ->anon_vma, because +* collapse_and_free_pmd() requires that either no +* ->anon_vma exists or the anon_vma is locked. +* We already checked ->anon_vma above, but that check +* is racy because ->anon_vma can be populated under the +* mmap lock in read mode. +*/ +if (vma->anon_vma) { +mmap_write_unlock (mm); +continue ; + } + mmu_notifier_range_init(&range, MMU_NOTIFY_CLEAR, 0, NULL, mm, addr,
mm/slub.c +6 -1
@@ -729,7 +729,12 @@ void object_err(struct kmem_cache *s, struct page *page, u8 *object, char *reason) {slab_bug (s,"%s" , reason); -print_trailer (s, page, object); +if (!object || !check_valid_pointer (s, page, object)) { +print_page_info (page); +pr_err ("Invalid pointer 0x%p\n" , object); + }else { +print_trailer (s, page, object); + } } static __printf(3, 4) void slab_err(struct kmem_cache *s, struct page *page,
net/atm/resources.c +4 -2
@@ -114,7 +114,9 @@ struct atm_dev *atm_dev_register(const char *type, struct device *parent,if (atm_proc_dev_register (dev) <0 ) {pr_err ("atm_proc_dev_register failed for dev %s\n" , type); - goto out_fail; +mutex_unlock (&atm_dev_mutex); +kfree (dev); +return NULL ; }if (atm_register_sysfs (dev, parent) <0 ) {
@@ -130,7 +132,7 @@ struct atm_dev *atm_dev_register(const char *type, struct device *parent,return dev; out_fail: -kfree (dev); +put_device (&dev->class_dev); dev =NULL ; goto out; }
net/ax25/ax25_in.c +4 -0
@@ -433,6 +433,10 @@ static int ax25_rcv(struct sk_buff *skb, struct net_device *dev,int ax25_kiss_rcv (struct sk_buff *skb,struct net_device *dev,struct packet_type *ptype,struct net_device *orig_dev) { + skb =skb_share_check (skb,GFP_ATOMIC ); +if (!skb) +return NET_RX_DROP ; +skb_orphan (skb);if (!net_eq (dev_net (dev), &init_net)) {
net/batman-adv/network-coding.c +6 -1
@@ -1700,7 +1700,12 @@ batadv_nc_skb_decode_packet(struct batadv_priv *bat_priv, struct sk_buff *skb, coding_len =ntohs (coded_packet_tmp.coded_len); -if (coding_len > skb->len) +/* ensure dst buffer is large enough (payload only) */ +if (coding_len + h_size > skb->len) +return NULL ; + +/* ensure src buffer is large enough (payload only) */ +if (coding_len + h_size > nc_packet->skb->len)return NULL ;/* Here the magic is reversed:
net/bluetooth/l2cap_sock.c +3 -0
@@ -1404,7 +1404,10 @@ static int l2cap_sock_release(struct socket *sock)if (!sk)return 0 ; +lock_sock_nested (sk,L2CAP_NESTING_PARENT );l2cap_sock_cleanup_listen (sk); +release_sock (sk); +bt_sock_unlink (&l2cap_sk_list, sk); err =l2cap_sock_shutdown (sock,SHUT_RDWR );
net/dsa/tag_ksz.c +17 -5
@@ -68,7 +68,12 @@ static struct sk_buff *ksz8795_xmit(struct sk_buff *skb, struct net_device *dev)static struct sk_buff *ksz8795_rcv (struct sk_buff *skb,struct net_device *dev,struct packet_type *pt) { -u8 *tag =skb_tail_pointer (skb) -KSZ_EGRESS_TAG_LEN ; +u8 *tag; + +if (skb_linearize (skb)) +return NULL ; + + tag =skb_tail_pointer (skb) -KSZ_EGRESS_TAG_LEN ;return ksz_common_rcv (skb, dev, tag[0 ] &7 ,KSZ_EGRESS_TAG_LEN ); }
@@ -103,8 +108,9 @@ MODULE_ALIAS_DSA_TAG_DRIVER(DSA_TAG_PROTO_KSZ8795);#define KSZ9477_INGRESS_TAG_LEN 2#define KSZ9477_PTP_TAG_LEN 4 -#define KSZ9477_PTP_TAG_INDICATION 0x80 +#define KSZ9477_PTP_TAG_INDICATION BIT(7) +#define KSZ9477_TAIL_TAG_EG_PORT_M GENMASK(2, 0)#define KSZ9477_TAIL_TAG_OVERRIDE BIT(9)#define KSZ9477_TAIL_TAG_LOOKUP BIT(10)
@@ -133,10 +139,16 @@ static struct sk_buff *ksz9477_xmit(struct sk_buff *skb,static struct sk_buff *ksz9477_rcv (struct sk_buff *skb,struct net_device *dev,struct packet_type *pt) { -/* Tag decoding */ -u8 *tag =skb_tail_pointer (skb) -KSZ_EGRESS_TAG_LEN ; -unsigned int port = tag[0 ] &7 ;unsigned int len =KSZ_EGRESS_TAG_LEN ; +unsigned int port; +u8 *tag; + +if (skb_linearize (skb)) +return NULL ; + +/* Tag decoding */ + tag =skb_tail_pointer (skb) -KSZ_EGRESS_TAG_LEN ; + port = tag[0 ] &KSZ9477_TAIL_TAG_EG_PORT_M ;/* Extra 4-bytes PTP timestamp */ if (tag[0 ] &KSZ9477_PTP_TAG_INDICATION )
net/ipv4/devinet.c +3 -4
@@ -332,14 +332,13 @@ static void inetdev_destroy(struct in_device *in_dev)static int __init inet_blackhole_dev_init (void ) { -int err =0 ; +struct in_device *in_dev;rtnl_lock (); -if (!inetdev_init (blackhole_netdev)) - err = -ENOMEM ; + in_dev =inetdev_init (blackhole_netdev);rtnl_unlock (); -return err; +return PTR_ERR_OR_ZERO (in_dev); }late_initcall (inet_blackhole_dev_init);
net/ipv4/icmp.c +4 -2
@@ -791,11 +791,12 @@ void icmp_ndo_send(struct sk_buff *skb_in, int type, int code, __be32 info)struct sk_buff *cloned_skb =NULL ;struct ip_options opts = {0 };enum ip_conntrack_info ctinfo; +enum ip_conntrack_dir dir;struct nf_conn *ct;__be32 orig_ip; ct =nf_ct_get (skb_in, &ctinfo); -if (!ct || !(ct->status &IPS_SRC_NAT )) { +if (!ct || !(READ_ONCE (ct->status) &IPS_NAT_MASK )) {__icmp_send (skb_in, type, code, info, &opts);return ; }
@@ -810,7 +811,8 @@ void icmp_ndo_send(struct sk_buff *skb_in, int type, int code, __be32 info) goto out; orig_ip =ip_hdr (skb_in)->saddr; -ip_hdr (skb_in)->saddr = ct->tuplehash[0 ].tuple.src.u3.ip; + dir =CTINFO2DIR (ctinfo); +ip_hdr (skb_in)->saddr = ct->tuplehash[dir].tuple.src.u3.ip;__icmp_send (skb_in, type, code, info, &opts);ip_hdr (skb_in)->saddr = orig_ip; out:
net/ipv6/ip6_icmp.c +4 -2
@@ -54,11 +54,12 @@ void icmpv6_ndo_send(struct sk_buff *skb_in, u8 type, u8 code, __u32 info)struct inet6_skb_parm parm = {0 };struct sk_buff *cloned_skb =NULL ;enum ip_conntrack_info ctinfo; +enum ip_conntrack_dir dir;struct in6_addr orig_ip;struct nf_conn *ct; ct =nf_ct_get (skb_in, &ctinfo); -if (!ct || !(ct->status &IPS_SRC_NAT )) { +if (!ct || !(READ_ONCE (ct->status) &IPS_NAT_MASK )) {__icmpv6_send (skb_in, type, code, info, &parm);return ; }
@@ -73,7 +74,8 @@ void icmpv6_ndo_send(struct sk_buff *skb_in, u8 type, u8 code, __u32 info) goto out; orig_ip =ipv6_hdr (skb_in)->saddr; -ipv6_hdr (skb_in)->saddr = ct->tuplehash[0 ].tuple.src.u3.in6; + dir =CTINFO2DIR (ctinfo); +ipv6_hdr (skb_in)->saddr = ct->tuplehash[dir].tuple.src.u3.in6;__icmpv6_send (skb_in, type, code, info, &parm);ipv6_hdr (skb_in)->saddr = orig_ip; out:
net/netfilter/nf_conntrack_helper.c +2 -2
@@ -417,7 +417,7 @@ int nf_conntrack_helper_register(struct nf_conntrack_helper *me) (cur->tuple.src.l3num == NFPROTO_UNSPEC || cur->tuple.src.l3num == me->tuple.src.l3num) && cur->tuple.dst.protonum == me->tuple.dst.protonum) { - ret = -EEXIST ; + ret = -EBUSY ; goto out; } }
@@ -428,7 +428,7 @@ int nf_conntrack_helper_register(struct nf_conntrack_helper *me)hlist_for_each_entry (cur, &nf_ct_helper_hash[h], hnode) {if (nf_ct_tuple_src_mask_cmp (&cur->tuple, &me->tuple, &mask)) { - ret = -EEXIST ; + ret = -EBUSY ; goto out; } }
net/wireless/scan.c +2 -1
@@ -1761,7 +1761,8 @@ cfg80211_update_known_bss(struct cfg80211_registered_device *rdev,*/ f =rcu_access_pointer (new->pub.beacon_ies); -kfree_rcu ((struct cfg80211_bss_ies *)f, rcu_head); +if (!new->pub.hidden_beacon_bss) +kfree_rcu ((struct cfg80211_bss_ies *)f, rcu_head);return false; }
scripts/gcc-plugins/gcc-common.h +32 -0
@@ -185,6 +185,38 @@ static inline tree build_const_char_string(int len, const char *str)return cstr; } +static inline void __add_type_attr (tree type,const char *attr,tree args) +{ +tree oldattr; + +if (type ==NULL_TREE ) +return ; + oldattr =lookup_attribute (attr,TYPE_ATTRIBUTES (type)); +if (oldattr !=NULL_TREE ) { +gcc_assert (TREE_VALUE (oldattr) == args ||TREE_VALUE (TREE_VALUE (oldattr)) ==TREE_VALUE (args)); +return ; + } + +TYPE_ATTRIBUTES (type) =copy_list (TYPE_ATTRIBUTES (type)); +TYPE_ATTRIBUTES (type) =tree_cons (get_identifier (attr), args,TYPE_ATTRIBUTES (type)); +} + +static inline void add_type_attr (tree type,const char *attr,tree args) +{ +tree main_variant =TYPE_MAIN_VARIANT (type); + +__add_type_attr (TYPE_CANONICAL (type), attr, args); +__add_type_attr (TYPE_CANONICAL (main_variant), attr, args); +__add_type_attr (main_variant, attr, args); + +for (type =TYPE_NEXT_VARIANT (main_variant); type; type =TYPE_NEXT_VARIANT (type)) { +if (!lookup_attribute (attr,TYPE_ATTRIBUTES (type))) +TYPE_ATTRIBUTES (type) =TYPE_ATTRIBUTES (main_variant); + +__add_type_attr (TYPE_CANONICAL (type), attr, args); + } +} +#define PASS_INFO (NAME ,REF ,ID ,POS ) \ struct register_pass_info NAME##_pass_info = { \ .pass = make_##NAME##_pass(), \
scripts/gcc-plugins/randomize_layout_plugin.c +12 -28
@@ -95,6 +95,9 @@ static tree handle_randomize_layout_attr(tree *node, tree name, tree args, int fif (TYPE_P (*node)) { type = *node; + }else if (TREE_CODE (*node) ==FIELD_DECL ) { + *no_add_attrs = false; +return NULL_TREE ; }else {gcc_assert (TREE_CODE (*node) ==TYPE_DECL ); type =TREE_TYPE (*node);
@@ -377,35 +380,18 @@ static int relayout_struct(tree type)shuffle (type, (tree *)newtree, shuffle_length); -/* -* set up a bogus anonymous struct field designed to error out on unnamed struct initializers -* as gcc provides no other way to detect such code -*/ - list =make_node (FIELD_DECL ); -TREE_CHAIN (list) = newtree[0 ]; -TREE_TYPE (list) = void_type_node; -DECL_SIZE (list) = bitsize_zero_node; -DECL_NONADDRESSABLE_P (list) =1 ; -DECL_FIELD_BIT_OFFSET (list) = bitsize_zero_node; -DECL_SIZE_UNIT (list) = size_zero_node; -DECL_FIELD_OFFSET (list) = size_zero_node; -DECL_CONTEXT (list) = type; -// to satisfy the constify plugin -TREE_READONLY (list) =1 ; -for (i =0 ; i < num_fields -1 ; i++)TREE_CHAIN (newtree[i]) = newtree[i+1 ];TREE_CHAIN (newtree[num_fields -1 ]) =NULL_TREE ; +add_type_attr (type,"randomize_performed" ,NULL_TREE ); +add_type_attr (type,"designated_init" ,NULL_TREE ); +if (has_flexarray) +add_type_attr (type,"has_flexarray" ,NULL_TREE ); + main_variant =TYPE_MAIN_VARIANT (type); -for (variant = main_variant; variant; variant =TYPE_NEXT_VARIANT (variant)) { -TYPE_FIELDS (variant) = list; -TYPE_ATTRIBUTES (variant) =copy_list (TYPE_ATTRIBUTES (variant)); -TYPE_ATTRIBUTES (variant) =tree_cons (get_identifier ("randomize_performed" ),NULL_TREE ,TYPE_ATTRIBUTES (variant)); -TYPE_ATTRIBUTES (variant) =tree_cons (get_identifier ("designated_init" ),NULL_TREE ,TYPE_ATTRIBUTES (variant)); -if (has_flexarray) -TYPE_ATTRIBUTES (type) =tree_cons (get_identifier ("has_flexarray" ),NULL_TREE ,TYPE_ATTRIBUTES (type)); - } +for (variant = main_variant; variant; variant =TYPE_NEXT_VARIANT (variant)) +TYPE_FIELDS (variant) = newtree[0 ];/* * force a re-layout of the main variant
@@ -473,10 +459,8 @@ static void randomize_type(tree type)if (lookup_attribute ("randomize_layout" ,TYPE_ATTRIBUTES (TYPE_MAIN_VARIANT (type))) ||is_pure_ops_struct (type))relayout_struct (type); -for (variant =TYPE_MAIN_VARIANT (type); variant; variant =TYPE_NEXT_VARIANT (variant)) { -TYPE_ATTRIBUTES (type) =copy_list (TYPE_ATTRIBUTES (type)); -TYPE_ATTRIBUTES (type) =tree_cons (get_identifier ("randomize_considered" ),NULL_TREE ,TYPE_ATTRIBUTES (type)); - } +add_type_attr (type,"randomize_considered" ,NULL_TREE ); +#ifdef __DEBUG_PLUGINfprintf (stderr,"Marking randomize_considered on struct %s\n" ,ORIG_TYPE_NAME (type));#ifdef __DEBUG_VERBOSE
sound/pci/hda/patch_hdmi.c +1 -0
@@ -1965,6 +1965,7 @@ static int hdmi_add_cvt(struct hda_codec *codec, hda_nid_t cvt_nid)static const struct snd_pci_quirk force_connect_list[] = {SND_PCI_QUIRK (0x103c ,0x83e2 ,"HP EliteDesk 800 G4" ,1 ),SND_PCI_QUIRK (0x103c ,0x83ef ,"HP MP9 G4 Retail System AMS" ,1 ), +SND_PCI_QUIRK (0x103c ,0x845a ,"HP EliteDesk 800 G4 DM 65W" ,1 ),SND_PCI_QUIRK (0x103c ,0x870f ,"HP" ,1 ),SND_PCI_QUIRK (0x103c ,0x871a ,"HP" ,1 ),SND_PCI_QUIRK (0x103c ,0x8711 ,"HP" ,1 ),
sound/pci/hda/patch_realtek.c +1 -0
@@ -9322,6 +9322,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {SND_PCI_QUIRK (0x103c ,0x8895 ,"HP EliteBook 855 G8 Notebook PC" ,ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED ),SND_PCI_QUIRK (0x103c ,0x8896 ,"HP EliteBook 855 G8 Notebook PC" ,ALC285_FIXUP_HP_MUTE_LED ),SND_PCI_QUIRK (0x103c ,0x89aa ,"HP EliteBook 630 G9" ,ALC236_FIXUP_HP_GPIO_LED ), +SND_PCI_QUIRK (0x103c ,0x8e1d ,"HP ZBook X Gli 16 G12" ,ALC236_FIXUP_HP_GPIO_LED ),SND_PCI_QUIRK (0x1043 ,0x103e ,"ASUS X540SA" ,ALC256_FIXUP_ASUS_MIC ),SND_PCI_QUIRK (0x1043 ,0x103f ,"ASUS TX300" ,ALC282_FIXUP_ASUS_TX300 ), SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
sound/usb/mixer_quirks.c +2 -0
@@ -3352,9 +3352,11 @@ void snd_usb_mixer_fu_apply_quirk(struct usb_mixer_interface *mixer,snd_dragonfly_quirk_db_scale (mixer, cval, kctl);break ;/* lowest playback value is muted on some devices */ +case USB_ID (0x0572 ,0x1b09 ):/* Conexant Systems (Rockwell), Inc. */ case USB_ID (0x0d8c ,0x000c ):/* C-Media */ case USB_ID (0x0d8c ,0x0014 ):/* C-Media */ case USB_ID (0x19f7 ,0x0003 ):/* RODE NT-USB */ +case USB_ID (0x2d99 ,0x0026 ):/* HECATE G2 GAMING HEADSET */ if (strstr (kctl->id.name,"Playback" )) cval->min_mute =1 ;break ;