4.19.267-rc1 review
Subsystems (2)
Greg Kroah-Hartman
maintainercover 4.19.267-rc1 review
This is the start of the stable review cycle for the 4.19.267 release. There are 114 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Fri, 25 Nov 2022 08:45:20 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.19.267-rc1.gz
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-4.19.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 4.19.267-rc1
Hawkins Jiawei <[email protected]>
ntfs: check overflow when iterating ATTR_RECORDs
Hawkins Jiawei <[email protected]>
ntfs: fix out-of-bounds read in ntfs_attr_find()
Hawkins Jiawei <[email protected]>
ntfs: fix use-after-free in ntfs_attr_find()
Alexander Potapenko <[email protected]>
mm: fs: initialize fsdata passed to write_begin/write_end interface
Tetsuo Handa <[email protected]>
9p/trans_fd: always use O_NONBLOCK read/write
Andreas Gruenbacher <[email protected]>
gfs2: Switch from strlcpy to strscpy
Andrew Price <[email protected]>
gfs2: Check sb_bsize_shift after reading superblock
Dominique Martinet <[email protected]>
9p: trans_fd/p9_conn_cancel: drop client lock earlier
Cong Wang <[email protected]>
kcm: close race conditions on sk_receive_queue
Baisong Zhong <[email protected]>
bpf, test_run: Fix alignment problem in bpf_prog_test_run_skb()
Eric Dumazet <[email protected]>
kcm: avoid potential race in kcm_tx_work
Eric Dumazet <[email protected]>
tcp: cdg: allow tcp_cdg_release() to be called multiple times
Eric Dumazet <[email protected]>
macvlan: enforce a consistent minimal mtu
Ilpo Järvinen <[email protected]>
serial: 8250: Flush DMA Rx on RLSI
Chen Jun <[email protected]>
Input: i8042 - fix leaking of platform device on module removal
Yang Yingliang <[email protected]>
scsi: target: tcm_loop: Fix possible name leak in tcm_loop_setup_hba_bus()
Alexander Potapenko <[email protected]>
misc/vmw_vmci: fix an infoleak in vmci_host_do_receive_datagram()
Shuah Khan <[email protected]>
docs: update mediator contact information in CoC doc
Xiongfeng Wang <[email protected]>
mmc: sdhci-pci: Fix possible memory leak caused by missing pci_dev_put()
Yann Gautier <[email protected]>
mmc: core: properly select voltage range without power cycle
Ilpo Järvinen <[email protected]>
serial: 8250_lpss: Configure DMA also w/o DMA filter
Ilpo Järvinen <[email protected]>
serial: 8250: Fall back to non-DMA Rx if IIR_RDI occurs
Mikulas Patocka <[email protected]>
dm ioctl: fix misbehavior if list_versions races with module loading
Mitja Spes <[email protected]>
iio: pressure: ms5611: changed hardcoded SPI speed to value limited
Yang Yingliang <[email protected]>
iio: trigger: sysfs: fix possible memory leak in iio_sysfs_trig_init()
Yang Yingliang <[email protected]>
iio: adc: at91_adc: fix possible memory leak in at91_adc_allocate_trigger()
Duoming Zhou <[email protected]>
usb: chipidea: fix deadlock in ci_otg_del_timer
Nicolas Dumazet <[email protected]>
usb: add NO_LPM quirk for Realforce 87U Keyboard
Reinhard Speyerer <[email protected]>
USB: serial: option: add Fibocom FM160 0x0111 composition
Davide Tronchin <[email protected]>
USB: serial: option: add u-blox LARA-L6 modem
Davide Tronchin <[email protected]>
USB: serial: option: add u-blox LARA-R6 00B modem
Davide Tronchin <[email protected]>
USB: serial: option: remove old LARA-R6 PID
Benoît Monin <[email protected]>
USB: serial: option: add Sierra Wireless EM9191
Mushahid Hussain <[email protected]>
speakup: fix a segfault caused by switching consoles
Krzysztof Kozlowski <[email protected]>
slimbus: stream: correct presence rate frequencies
Takashi Iwai <[email protected]>
ALSA: usb-audio: Drop snd_BUG_ON() from snd_usbmidi_output_open()
Daniil Tatianin <[email protected]>
ring_buffer: Do not deactivate non-existant pages
Xiu Jianfeng <[email protected]>
ftrace: Fix null pointer dereference in ftrace_add_mod()
Wang Wensheng <[email protected]>
ftrace: Optimize the allocation for mcount entries
Wang Wensheng <[email protected]>
ftrace: Fix the possible incorrect kernel message
Yuan Can <[email protected]>
net: thunderbolt: Fix error handling in tbnet_init()
Zhang Xiaoxu <[email protected]>
cifs: Fix wrong return value checking when GETFLAGS
Wei Yongjun <[email protected]>
net/x25: Fix skb leak in x25_lapb_receive_frame()
Dan Carpenter <[email protected]>
drbd: use after free in drbd_create_device()
Yang Yingliang <[email protected]>
xen/pcpu: fix possible memory leak in register_pcpu()
Gaosheng Cui <[email protected]>
bnxt_en: Remove debugfs when pci_register_driver failed
Zhengchao Shao <[email protected]>
net: caif: fix double disconnect client in chnl_net_open()
Wang ShaoBo <[email protected]>
mISDN: fix misuse of put_device() in mISDN_register_device()
Yang Yingliang <[email protected]>
mISDN: fix possible memory leak in mISDN_dsp_element_register()
Wei Yongjun <[email protected]>
net: bgmac: Drop free_netdev() from bgmac_enet_remove()
Yang Yingliang <[email protected]>
ata: libata-transport: fix double ata_host_put() in ata_tport_add()
Zeng Heng <[email protected]>
pinctrl: devicetree: fix null pointer dereferencing in pinctrl_dt_to_map
Maciej W. Rozycki <[email protected]>
parport_pc: Avoid FIFO port location truncation
Yang Yingliang <[email protected]>
siox: fix possible memory leak in siox_device_add()
Serge Semin <[email protected]>
block: sed-opal: kmalloc the cmd/resp buffers
Chen Zhongjin <[email protected]>
ASoC: soc-utils: Remove __exit for snd_soc_util_exit()
Duoming Zhou <[email protected]>
tty: n_gsm: fix sleep-in-atomic-context bug in gsm_control_send
Shawn Guo <[email protected]>
serial: imx: Add missing .thaw_noirq hook
Tony Lindgren <[email protected]>
serial: 8250: omap: Flush PM QOS work on remove
Matthias Schiffer <[email protected]>
serial: 8250_omap: remove wait loop from Errata i202 workaround
Chen Zhongjin <[email protected]>
ASoC: core: Fix use-after-free in snd_soc_exit()
Luiz Augusto von Dentz <[email protected]>
Bluetooth: L2CAP: Fix l2cap_global_chan_by_psm
Filipe Manana <[email protected]>
btrfs: remove pointless and double ulist frees in error paths of qgroup tests
Nathan Huckleberry <[email protected]>
drm/imx: imx-tve: Fix return type of imx_tve_connector_mode_valid
Benjamin Coddington <[email protected]>
NFSv4: Retry LOCK on OLD_STATEID during delegation return
Alexandre Belloni <[email protected]>
rtc: cmos: fix build on non-ACPI platforms
Ricardo Cañuelo <[email protected]>
selftests/intel_pstate: fix build for ARCH=x86_64
Ricardo Cañuelo <[email protected]>
selftests/futex: fix build for clang
Mauro Lima <[email protected]>
spi: intel: Fix the offset to get the 64K erase opcode
Zhang Qilong <[email protected]>
ASoC: wm8997: Revert "ASoC: wm8997: Fix PM disable depth imbalance in wm8997_probe"
Zhang Qilong <[email protected]>
ASoC: wm5110: Revert "ASoC: wm5110: Fix PM disable depth imbalance in wm5110_probe"
Zhang Qilong <[email protected]>
ASoC: wm5102: Revert "ASoC: wm5102: Fix PM disable depth imbalance in wm5102_probe"
Borislav Petkov <[email protected]>
x86/cpu: Restore AMD's DE_CFG MSR after resume
Eric Dumazet <[email protected]>
net: tun: call napi_schedule_prep() to ensure we own a napi
Tudor Ambarus <[email protected]>
dmaengine: at_hdmac: Check return code of dma_async_device_register
Tudor Ambarus <[email protected]>
dmaengine: at_hdmac: Fix impossible condition
Tudor Ambarus <[email protected]>
dmaengine: at_hdmac: Don't allow CPU to reorder channel enable
Tudor Ambarus <[email protected]>
dmaengine: at_hdmac: Fix completion of unissued descriptor in case of errors
Tudor Ambarus <[email protected]>
dmaengine: at_hdmac: Don't start transactions at tx_submit level
Tudor Ambarus <[email protected]>
dmaengine: at_hdmac: Fix at_lli struct definition
Linus Torvalds <[email protected]>
cert host tools: Stop complaining about deprecated OpenSSL functions
ZhangPeng <[email protected]>
udf: Fix a slab-out-of-bounds write bug in udf_find_entry()
Zhang Xiaoxu <[email protected]>
btrfs: selftests: fix wrong error check in btrfs_free_dummy_root()
Jorge Lopez <[email protected]>
platform/x86: hp_wmi: Fix rfkill causing soft blocked wifi
Matthew Auld <[email protected]>
drm/i915/dmabuf: fix sg_table handling in map_dma_buf
Ryusuke Konishi <[email protected]>
nilfs2: fix use-after-free bug of ns_writer on remount
Ryusuke Konishi <[email protected]>
nilfs2: fix deadlock in nilfs_count_free_blocks()
Nathan Chancellor <[email protected]>
vmlinux.lds.h: Fix placement of '.data..decrypted' section
Jussi Laako <[email protected]>
ALSA: usb-audio: Add DSD support for Accuphase DAC-60
Takashi Iwai <[email protected]>
ALSA: usb-audio: Add quirk entry for M-Audio Micro
Ye Bin <[email protected]>
ALSA: hda: fix potential memleak in 'add_widget_node'
Xian Wang <[email protected]>
ALSA: hda/ca0132: add quirk for EVGA Z390 DARK
Ard Biesheuvel <[email protected]>
arm64: efi: Fix handling of misaligned runtime regions and drop warning
Jisheng Zhang <[email protected]>
riscv: process: fix kernel info leakage
Chuang Wang <[email protected]>
net: macvlan: fix memory leaks of macvlan_common_newlink
Zhengchao Shao <[email protected]>
net: mv643xx_eth: disable napi when init rxq or txq failed in mv643xx_eth_open()
Zhengchao Shao <[email protected]>
ethernet: s2io: disable napi when start nic failed in s2io_card_up()
Zhengchao Shao <[email protected]>
net: cxgb3_main: disable napi when bind qsets failed in cxgb_up()
Zhengchao Shao <[email protected]>
net: nixge: disable napi when enable interrupts failed in nixge_open()
Zhengchao Shao <[email protected]>
drivers: net: xgene: disable napi when register irq failed in xgene_enet_open()
Christophe JAILLET <[email protected]>
dmaengine: mv_xor_v2: Fix a resource leak in mv_xor_v2_remove()
Xin Long <[email protected]>
tipc: fix the msg->req tlv len check in tipc_nl_compat_name_table_dump_header
Alexander Potapenko <[email protected]>
ipv6: addrlabel: fix infoleak when sending struct ifaddrlblmsg to network
Yuan Can <[email protected]>
drm/vc4: Fix missing platform_unregister_drivers() call in vc4_drm_register()
Zhengchao Shao <[email protected]>
hamradio: fix issue of dev reference count leakage in bpq_device_event()
Zhengchao Shao <[email protected]>
net: lapbether: fix issue of dev reference count leakage in lapbeth_device_event()
Gaosheng Cui <[email protected]>
capabilities: fix undefined behavior in bit shift for CAP_TO_MASK
Sean Anderson <[email protected]>
net: fman: Unregister ethernet device on removal
Alex Barba <[email protected]>
bnxt_en: fix potentially incorrect return value for ndo_rx_flow_steer
Wang Yufen <[email protected]>
net: tun: Fix memory leaks of napi_get_frags
Jiri Benc <[email protected]>
net: gso: fix panic on frag_list with mixed head alloc types
Yang Yingliang <[email protected]>
HID: hyperv: fix possible memory leak in mousevsc_probe()
Arend van Spriel <[email protected]>
wifi: cfg80211: fix memory leak in query_regdb_file()
Dan Carpenter <[email protected]>
phy: stm32: fix an error code in probe
-------------
Diffstat:
.../process/code-of-conduct-interpretation.rst | 2 +- Makefile | 4 +- arch/arm64/kernel/efi.c | 52 +++++++++++------- arch/riscv/kernel/process.c | 2 + arch/x86/include/asm/msr-index.h | 8 +-- arch/x86/kernel/cpu/amd.c | 10 ++-- arch/x86/kvm/svm.c | 10 ++-- arch/x86/kvm/x86.c | 2 +- arch/x86/power/cpu.c | 1 + block/sed-opal.c | 32 +++++++++-- drivers/ata/libata-transport.c | 1 - drivers/block/drbd/drbd_main.c | 4 +- drivers/dma/at_hdmac.c | 34 ++++++------ drivers/dma/at_hdmac_regs.h | 10 ++-- drivers/dma/mv_xor_v2.c | 1 + drivers/gpu/drm/i915/i915_gem_dmabuf.c | 4 +- drivers/gpu/drm/imx/imx-tve.c | 5 +- drivers/gpu/drm/vc4/vc4_drv.c | 7 ++- drivers/hid/hid-hyperv.c | 2 +- drivers/iio/adc/at91_adc.c | 4 +- drivers/iio/pressure/ms5611_spi.c | 2 +- drivers/iio/trigger/iio-trig-sysfs.c | 6 ++- drivers/input/serio/i8042.c | 4 -- drivers/isdn/mISDN/core.c | 2 +- drivers/isdn/mISDN/dsp_pipeline.c | 3 +- drivers/md/dm-ioctl.c | 4 +- drivers/misc/vmw_vmci/vmci_queue_pair.c | 2 + drivers/mmc/core/core.c | 8 ++- drivers/mmc/host/sdhci-pci-core.c | 2 + drivers/mtd/spi-nor/intel-spi.c | 2 +- drivers/net/ethernet/apm/xgene/xgene_enet_main.c | 4 +- drivers/net/ethernet/broadcom/bgmac.c | 1 - drivers/net/ethernet/broadcom/bnxt/bnxt.c | 12 ++++- drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c | 1 + drivers/net/ethernet/freescale/fman/mac.c | 9 ++++ drivers/net/ethernet/marvell/mv643xx_eth.c | 1 + drivers/net/ethernet/neterion/s2io.c | 29 ++++++---- drivers/net/ethernet/ni/nixge.c | 1 + drivers/net/hamradio/bpqether.c | 2 +- drivers/net/macvlan.c | 6 ++- drivers/net/thunderbolt.c | 19 +++++-- drivers/net/tun.c | 18 +++++-- drivers/net/wan/lapbether.c | 2 +- drivers/parport/parport_pc.c | 2 +- drivers/phy/st/phy-stm32-usbphyc.c | 2 + drivers/pinctrl/devicetree.c | 2 + drivers/platform/x86/hp-wmi.c | 12 ++++- drivers/rtc/rtc-cmos.c | 3 ++ drivers/siox/siox-core.c | 2 + drivers/slimbus/stream.c | 8 +-- drivers/staging/speakup/main.c | 2 +- drivers/target/loopback/tcm_loop.c | 3 +- drivers/tty/n_gsm.c | 2 +- drivers/tty/serial/8250/8250_lpss.c | 15 ++++-- drivers/tty/serial/8250/8250_omap.c | 18 +------ drivers/tty/serial/8250/8250_port.c | 7 ++- drivers/tty/serial/imx.c | 1 + drivers/usb/chipidea/otg_fsm.c | 2 + drivers/usb/core/quirks.c | 3 ++ drivers/usb/serial/option.c | 19 ++++++- drivers/xen/pcpu.c | 2 +- fs/btrfs/tests/btrfs-tests.c | 2 +- fs/btrfs/tests/qgroup-tests.c | 16 ++---- fs/buffer.c | 4 +- fs/cifs/ioctl.c | 4 +- fs/gfs2/ops_fstype.c | 11 ++-- fs/namei.c | 2 +- fs/nfs/nfs4proc.c | 6 ++- fs/nilfs2/segment.c | 15 +++--- fs/nilfs2/super.c | 2 - fs/nilfs2/the_nilfs.c | 2 - fs/ntfs/attrib.c | 28 ++++++++-- fs/ntfs/inode.c | 7 +++ fs/udf/namei.c | 2 +- include/asm-generic/vmlinux.lds.h | 2 +- include/uapi/linux/capability.h | 2 +- kernel/trace/ftrace.c | 5 +- kernel/trace/ring_buffer.c | 4 +- mm/filemap.c | 2 +- net/9p/trans_fd.c | 6 ++- net/bluetooth/l2cap_core.c | 2 +- net/bpf/test_run.c | 1 + net/caif/chnl_net.c | 3 -- net/core/skbuff.c | 36 +++++++------ net/ipv4/tcp_cdg.c | 2 + net/ipv6/addrlabel.c | 1 + net/kcm/kcmsock.c | 62 ++++------------------ net/tipc/netlink_compat.c | 2 +- net/wireless/reg.c | 12 +++-- net/x25/x25_dev.c | 2 +- scripts/extract-cert.c | 7 +++ scripts/sign-file.c | 7 +++ sound/hda/hdac_sysfs.c | 4 +- sound/pci/hda/patch_ca0132.c | 1 + sound/soc/codecs/wm5102.c | 6 +-- sound/soc/codecs/wm5110.c | 6 +-- sound/soc/codecs/wm8997.c | 6 +-- sound/soc/soc-core.c | 17 +++++- sound/soc/soc-utils.c | 2 +- sound/usb/midi.c | 4 +- sound/usb/quirks-table.h | 4 ++ sound/usb/quirks.c | 1 + tools/testing/selftests/futex/functional/Makefile | 6 +-- tools/testing/selftests/intel_pstate/Makefile | 6 +-- tools/testing/selftests/kvm/include/x86.h | 8 +-- 105 files changed, 469 insertions(+), 301 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/114 phy: stm32: fix an error code in probe
From: Dan Carpenter <[email protected]>
[ Upstream commit ca1c73628f5bd0c1ef6e46073cc3be2450605b06 ]
If "index > usbphyc->nphys" is true then this returns success but it should return -EINVAL.
--- drivers/phy/st/phy-stm32-usbphyc.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/phy/st/phy-stm32-usbphyc.c +2 -0
@@ -393,6 +393,8 @@ static int stm32_usbphyc_probe(struct platform_device *pdev) ret =of_property_read_u32 (child,"reg" , &index);if (ret || index > usbphyc->nphys) {dev_err (&phy->dev,"invalid reg property: %d\n" , ret); +if (!ret) + ret = -EINVAL ; goto put_child; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 2/114 wifi: cfg80211: fix memory leak in query_regdb_file()
In reply to Greg Kroah-HartmanFrom: Arend van Spriel <[email protected]>
[ Upstream commit 57b962e627ec0ae53d4d16d7bd1033e27e67677a ]
In the function query_regdb_file() the alpha2 parameter is duplicated using kmemdup() and subsequently freed in regdb_fw_cb(). However, request_firmware_nowait() can fail without calling regdb_fw_cb() and thus leak memory.
--- net/wireless/reg.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)
net/wireless/reg.c +9 -3
@@ -1050,6 +1050,8 @@ static void regdb_fw_cb(const struct firmware *fw, void *context)static int query_regdb_file (const char *alpha2) { +int err; +ASSERT_RTNL ();if (regdb)
@@ -1059,9 +1061,13 @@ static int query_regdb_file(const char *alpha2)if (!alpha2)return -ENOMEM ; -return request_firmware_nowait (THIS_MODULE , true,"regulatory.db" , - ®_pdev->dev,GFP_KERNEL , - (void *)alpha2, regdb_fw_cb); + err =request_firmware_nowait (THIS_MODULE , true,"regulatory.db" , + ®_pdev->dev,GFP_KERNEL , + (void *)alpha2, regdb_fw_cb); +if (err) +kfree (alpha2); + +return err; }int reg_reload_regdb (void )
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 3/114 HID: hyperv: fix possible memory leak in mousevsc_probe()
In reply to Greg Kroah-HartmanFrom: Yang Yingliang <[email protected]>
[ Upstream commit b5bcb94b0954a026bbd671741fdb00e7141f9c91 ]
If hid_add_device() returns error, it should call hid_destroy_device() to free hid_dev which is allocated in hid_allocate_device().
--- drivers/hid/hid-hyperv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/hid/hid-hyperv.c +1 -1
@@ -500,7 +500,7 @@ static int mousevsc_probe(struct hv_device *device, ret =hid_add_device (hid_dev);if (ret) - goto probe_err1; + goto probe_err2; ret =hid_parse (hid_dev);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 4/114 net: gso: fix panic on frag_list with mixed head alloc types
In reply to Greg Kroah-HartmanFrom: Jiri Benc <[email protected]>
[ Upstream commit 9e4b7a99a03aefd37ba7bb1f022c8efab5019165 ]
Since commit 3dcbdb134f32 ("net: gso: Fix skb_segment splat when splitting gso_size mangled skb having linear-headed frag_list"), it is allowed to change gso_size of a GRO packet. However, that commit assumes that "checking the first list_skb member suffices; i.e if either of the list_skb members have non head_frag head, then the first one has too".
It turns out this assumption does not hold. We've seen BUG_ON being hit in skb_segment when skbs on the frag_list had differing head_frag with the vmxnet3 driver. This happens because __netdev_alloc_skb and __napi_alloc_skb can return a skb that is page backed or kmalloced depending on the requested size. As the result, the last small skb in the GRO packet can be kmalloced.
There are three different locations where this can be fixed:
(1) We could check head_frag in GRO and not allow GROing skbs with different head_frag. However, that would lead to performance regression on normal forward paths with unmodified gso_size, where !head_frag in the last packet is not a problem.
(2) Set a flag in bpf_skb_net_grow and bpf_skb_net_shrink indicating that NETIF_F_SG is undesirable. That would need to eat a bit in sk_buff. Furthermore, that flag can be unset when all skbs on the frag_list are page backed. To retain good performance, bpf_skb_net_grow/shrink would have to walk the frag_list.
(3) Walk the frag_list in skb_segment when determining whether NETIF_F_SG should be cleared. This of course slows things down.
This patch implements (3). To limit the performance impact in skb_segment, the list is walked only for skbs with SKB_GSO_DODGY set that have gso_size changed. Normal paths thus will not hit it.
We could check only the last skb but since we need to walk the whole list anyway, let's stay on the safe side.
--- net/core/skbuff.c | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-)
net/core/skbuff.c +19 -17
@@ -3560,23 +3560,25 @@ struct sk_buff *skb_segment(struct sk_buff *head_skb,int pos;int dummy; -if (list_skb && !list_skb->head_frag &&skb_headlen (list_skb) && - (skb_shinfo (head_skb)->gso_type &SKB_GSO_DODGY )) { -/* gso_size is untrusted, and we have a frag_list with a linear -* non head_frag head. -* -* (we assume checking the first list_skb member suffices; -* i.e if either of the list_skb members have non head_frag -* head, then the first one has too). -* -* If head_skb's headlen does not fit requested gso_size, it -* means that the frag_list members do NOT terminate on exact -* gso_size boundaries. Hence we cannot perform skb_frag_t page -* sharing. Therefore we must fallback to copying the frag_list -* skbs; we do so by disabling SG. -*/ -if (mss !=GSO_BY_FRAGS && mss !=skb_headlen (head_skb)) - features &= ~NETIF_F_SG ; +if ((skb_shinfo (head_skb)->gso_type &SKB_GSO_DODGY ) && + mss !=GSO_BY_FRAGS && mss !=skb_headlen (head_skb)) { +struct sk_buff *check_skb; + +for (check_skb = list_skb; check_skb; check_skb = check_skb->next) { +if (skb_headlen (check_skb) && !check_skb->head_frag) { +/* gso_size is untrusted, and we have a frag_list with +* a linear non head_frag item. +* +* If head_skb's headlen does not fit requested gso_size, +* it means that the frag_list members do NOT terminate +* on exact gso_size boundaries. Hence we cannot perform +* skb_frag_t page sharing. Therefore we must fallback to +* copying the frag_list skbs; we do so by disabling SG. +*/ + features &= ~NETIF_F_SG ; +break ; + } + } }__skb_push (head_skb, doffset);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 5/114 net: tun: Fix memory leaks of napi_get_frags
In reply to Greg Kroah-HartmanFrom: Wang Yufen <[email protected]>
[ Upstream commit 1118b2049d77ca0b505775fc1a8d1909cf19a7ec ]
kmemleak reports after running test_progs:
unreferenced object 0xffff8881b1672dc0 (size 232):
comm "test_progs", pid 394388, jiffies 4354712116 (age 841.975s) hex dump (first 32 bytes):
e0 84 d7 a8 81 88 ff ff 80 2c 67 b1 81 88 ff ff .........,g.....
00 40 c5 9b 81 88 ff ff 00 00 00 00 00 00 00 00 .@..............
backtrace:
[<00000000c8f01748>] napi_skb_cache_get+0xd4/0x150
[<0000000041c7fc09>] __napi_build_skb+0x15/0x50
[<00000000431c7079>] __napi_alloc_skb+0x26e/0x540
[<000000003ecfa30e>] napi_get_frags+0x59/0x140
[<0000000099b2199e>] tun_get_user+0x183d/0x3bb0 [tun]
[<000000008a5adef0>] tun_chr_write_iter+0xc0/0x1b1 [tun]
[<0000000049993ff4>] do_iter_readv_writev+0x19f/0x320
[<000000008f338ea2>] do_iter_write+0x135/0x630
[<000000008a3377a4>] vfs_writev+0x12e/0x440
[<00000000a6b5639a>] do_writev+0x104/0x280
[<00000000ccf065d8>] do_syscall_64+0x3b/0x90
[<00000000d776e329>] entry_SYSCALL_64_after_hwframe+0x63/0xcdThe issue occurs in the following scenarios:tun_get_user()
napi_gro_frags()
napi_frags_finish()
case GRO_NORMAL:
gro_normal_one()
list_add_tail(&skb->list, &napi->rx_list);
<-- While napi->rx_count < READ_ONCE(gro_normal_batch),
<-- gro_normal_list() is not called, napi->rx_list is not empty <-- not ask to complete the gro work, will cause memory leaks in <-- following tun_napi_del()
...tun_napi_del()
netif_napi_del()
__netif_napi_del()
<-- &napi->rx_list is not empty, which caused memory leaksTo fix, add napi_complete() after napi_gro_frags().
--- drivers/net/tun.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/tun.c +1 -0
@@ -1972,6 +1972,7 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,local_bh_disable ();napi_gro_frags (&tfile->napi); +napi_complete (&tfile->napi);local_bh_enable ();mutex_unlock (&tfile->napi_mutex); }else if (tfile->napi_enabled) {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 6/114 bnxt_en: fix potentially incorrect return value for ndo_rx_flow_steer
In reply to Greg Kroah-HartmanFrom: Alex Barba <[email protected]>
[ Upstream commit 02597d39145bb0aa81d04bf39b6a913ce9a9d465 ]
In the bnxt_en driver ndo_rx_flow_steer returns '0' whenever an entry that we are attempting to steer is already found. This is not the correct behavior. The return code should be the value/index that corresponds to the entry. Returning zero all the time causes the RFS records to be incorrect unless entry '0' is the correct one. As flows migrate to different cores this can create entries that are not correct.
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +1 -1
@@ -8327,8 +8327,8 @@ static int bnxt_rx_flow_steer(struct net_device *dev, const struct sk_buff *skb,rcu_read_lock ();hlist_for_each_entry_rcu (fltr, head, hash) {if (bnxt_fltr_match (fltr, new_fltr)) { + rc = fltr->sw_id;rcu_read_unlock (); - rc =0 ; goto err_free; } }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 7/114 net: fman: Unregister ethernet device on removal
In reply to Greg Kroah-HartmanFrom: Sean Anderson <[email protected]>
[ Upstream commit b7cbc6740bd6ad5d43345a2504f7e4beff0d709f ]
When the mac device gets removed, it leaves behind the ethernet device. This will result in a segfault next time the ethernet device accesses mac_dev. Remove the ethernet device when we get removed to prevent this. This is not completely reversible, since some resources aren't cleaned up properly, but that can be addressed later.
--- drivers/net/ethernet/freescale/fman/mac.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/net/ethernet/freescale/fman/mac.c +9 -0
@@ -891,12 +891,21 @@ static int mac_probe(struct platform_device *_of_dev)return err; } +static int mac_remove (struct platform_device *pdev) +{ +struct mac_device *mac_dev =platform_get_drvdata (pdev); + +platform_device_unregister (mac_dev->priv->eth_dev); +return 0 ; +} +static struct platform_driver mac_driver = { .driver = { .name =KBUILD_MODNAME , .of_match_table = mac_match, }, .probe = mac_probe, + .remove = mac_remove, };builtin_platform_driver (mac_driver);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 8/114 capabilities: fix undefined behavior in bit shift for CAP_TO_MASK
In reply to Greg Kroah-HartmanFrom: Gaosheng Cui <[email protected]>
[ Upstream commit 46653972e3ea64f79e7f8ae3aa41a4d3fdb70a13 ]
Shifting signed 32-bit value by 31 bits is undefined, so changing significant bit to unsigned. The UBSAN warning calltrace like below:
UBSAN: shift-out-of-bounds in security/commoncap.c:1252:2 left shift of 1 by 31 places cannot be represented in type 'int' Call Trace: <TASK> dump_stack_lvl+0x7d/0xa5 dump_stack+0x15/0x1b ubsan_epilogue+0xe/0x4e __ubsan_handle_shift_out_of_bounds+0x1e7/0x20c cap_task_prctl+0x561/0x6f0 security_task_prctl+0x5a/0xb0 __x64_sys_prctl+0x61/0x8f0 do_syscall_64+0x58/0x80 entry_SYSCALL_64_after_hwframe+0x63/0xcd </TASK>
--- include/uapi/linux/capability.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/uapi/linux/capability.h +1 -1
@@ -376,7 +376,7 @@ struct vfs_ns_cap_data {*/ #define CAP_TO_INDEX (x) ((x) >> 5)/* 1 << 5 == bits in __u32 */ -#define CAP_TO_MASK (x) (1 << ((x) & 31))/* mask for indexed __u32 */ +#define CAP_TO_MASK (x) (1U << ((x) & 31))/* mask for indexed __u32 */ #endif /* _UAPI_LINUX_CAPABILITY_H */
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 9/114 net: lapbether: fix issue of dev reference count leakage in lapbeth_device_event()
In reply to Greg Kroah-HartmanFrom: Zhengchao Shao <[email protected]>
[ Upstream commit 531705a765493655472c993627106e19f7e5a6d2 ]
When following tests are performed, it will cause dev reference counting leakage.
a)ip link add bond2 type bond mode balance-rr
b)ip link set bond2 up
c)ifenslave -f bond2 rose1
d)ip link del bond2
When new bond device is created, the default type of the bond device is ether. And the bond device is up, lapbeth_device_event() receives the message and creates a new lapbeth device. In this case, the reference count value of dev is hold once. But after "ifenslave -f bond2 rose1" command is executed, the type of the bond device is changed to rose. When the bond device is unregistered, lapbeth_device_event() will not put the dev reference count.
--- drivers/net/wan/lapbether.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wan/lapbether.c +1 -1
@@ -406,7 +406,7 @@ static int lapbeth_device_event(struct notifier_block *this,if (dev_net (dev) != &init_net)return NOTIFY_DONE ; -if (!dev_is_ethdev (dev)) +if (!dev_is_ethdev (dev) && !lapbeth_get_x25_dev (dev))return NOTIFY_DONE ;switch (event) {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 10/114 hamradio: fix issue of dev reference count leakage in bpq_device_event()
In reply to Greg Kroah-HartmanFrom: Zhengchao Shao <[email protected]>
[ Upstream commit 85cbaf032d3cd9f595152625eda5d4ecb1d6d78d ]
When following tests are performed, it will cause dev reference counting leakage.
a)ip link add bond2 type bond mode balance-rr
b)ip link set bond2 up
c)ifenslave -f bond2 rose1
d)ip link del bond2
When new bond device is created, the default type of the bond device is ether. And the bond device is up, bpq_device_event() receives the message and creates a new bpq device. In this case, the reference count value of dev is hold once. But after "ifenslave -f bond2 rose1" command is executed, the type of the bond device is changed to rose. When the bond device is unregistered, bpq_device_event() will not put the dev reference count.
--- drivers/net/hamradio/bpqether.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/hamradio/bpqether.c +1 -1
@@ -537,7 +537,7 @@ static int bpq_device_event(struct notifier_block *this,if (!net_eq (dev_net (dev), &init_net))return NOTIFY_DONE ; -if (!dev_is_ethdev (dev)) +if (!dev_is_ethdev (dev) && !bpq_get_ax25_dev (dev))return NOTIFY_DONE ;switch (event) {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 11/114 drm/vc4: Fix missing platform_unregister_drivers() call in vc4_drm_register()
In reply to Greg Kroah-HartmanFrom: Yuan Can <[email protected]>
[ Upstream commit cf53db768a8790fdaae2fa3a81322b080285f7e5 ]
A problem about modprobe vc4 failed is triggered with the following log given:
[ 420.327987] Error: Driver 'vc4_hvs' is already registered, aborting... [ 420.333904] failed to register platform driver vc4_hvs_driver [vc4]: -16 modprobe: ERROR: could not insert 'vc4': Device or resource busy
The reason is that vc4_drm_register() returns platform_driver_register() directly without checking its return value, if platform_driver_register() fails, it returns without unregistering all the vc4 drivers, resulting the vc4 can never be installed later.
A simple call graph is shown as below:
vc4_drm_register()
platform_register_drivers() # all vc4 drivers are registered platform_driver_register()
driver_register()
bus_add_driver()
priv = kzalloc(...) # OOM happened
# return without unregister drivers
Fixing this problem by checking the return value of platform_driver_register() and do platform_unregister_drivers() if error happened.
--- drivers/gpu/drm/vc4/vc4_drv.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/gpu/drm/vc4/vc4_drv.c +6 -1
@@ -394,7 +394,12 @@ static int __init vc4_drm_register(void)if (ret)return ret; -return platform_driver_register (&vc4_platform_driver); + ret =platform_driver_register (&vc4_platform_driver); +if (ret) +platform_unregister_drivers (component_drivers, +ARRAY_SIZE (component_drivers)); + +return ret; } static void __exit vc4_drm_unregister(void)
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 12/114 ipv6: addrlabel: fix infoleak when sending struct ifaddrlblmsg to network
In reply to Greg Kroah-HartmanFrom: Alexander Potapenko <[email protected]>
[ Upstream commit c23fb2c82267638f9d206cb96bb93e1f93ad7828 ]
When copying a struct ifaddrlblmsg to the network, __ifal_reserved remained uninitialized, resulting in a 1-byte infoleak:
BUG: KMSAN: kernel-network-infoleak in __netdev_start_xmit ./include/linux/netdevice.h:4841 __netdev_start_xmit ./include/linux/netdevice.h:4841 netdev_start_xmit ./include/linux/netdevice.h:4857 xmit_one net/core/dev.c:3590 dev_hard_start_xmit+0x1dc/0x800 net/core/dev.c:3606 __dev_queue_xmit+0x17e8/0x4350 net/core/dev.c:4256 dev_queue_xmit ./include/linux/netdevice.h:3009 __netlink_deliver_tap_skb net/netlink/af_netlink.c:307 __netlink_deliver_tap+0x728/0xad0 net/netlink/af_netlink.c:325 netlink_deliver_tap net/netlink/af_netlink.c:338 __netlink_sendskb net/netlink/af_netlink.c:1263 netlink_sendskb+0x1d9/0x200 net/netlink/af_netlink.c:1272 netlink_unicast+0x56d/0xf50 net/netlink/af_netlink.c:1360 nlmsg_unicast ./include/net/netlink.h:1061 rtnl_unicast+0x5a/0x80 net/core/rtnetlink.c:758 ip6addrlbl_get+0xfad/0x10f0 net/ipv6/addrlabel.c:628 rtnetlink_rcv_msg+0xb33/0x1570 net/core/rtnetlink.c:6082 ... Uninit was created at: slab_post_alloc_hook+0x118/0xb00 mm/slab.h:742 slab_alloc_node mm/slub.c:3398 __kmem_cache_alloc_node+0x4f2/0x930 mm/slub.c:3437 __do_kmalloc_node mm/slab_common.c:954 __kmalloc_node_track_caller+0x117/0x3d0 mm/slab_common.c:975 kmalloc_reserve net/core/skbuff.c:437 __alloc_skb+0x27a/0xab0 net/core/skbuff.c:509 alloc_skb ./include/linux/skbuff.h:1267 nlmsg_new ./include/net/netlink.h:964 ip6addrlbl_get+0x490/0x10f0 net/ipv6/addrlabel.c:608 rtnetlink_rcv_msg+0xb33/0x1570 net/core/rtnetlink.c:6082 netlink_rcv_skb+0x299/0x550 net/netlink/af_netlink.c:2540 rtnetlink_rcv+0x26/0x30 net/core/rtnetlink.c:6109 netlink_unicast_kernel net/netlink/af_netlink.c:1319 netlink_unicast+0x9ab/0xf50 net/netlink/af_netlink.c:1345 netlink_sendmsg+0xebc/0x10f0 net/netlink/af_netlink.c:1921 ...
This patch ensures that the reserved field is always initialized.
--- net/ipv6/addrlabel.c | 1 + 1 file changed, 1 insertion(+)
net/ipv6/addrlabel.c +1 -0
@@ -437,6 +437,7 @@ static void ip6addrlbl_putmsg(struct nlmsghdr *nlh, {struct ifaddrlblmsg *ifal =nlmsg_data (nlh); ifal->ifal_family =AF_INET6 ; + ifal->__ifal_reserved =0 ; ifal->ifal_prefixlen = prefixlen; ifal->ifal_flags =0 ; ifal->ifal_index = ifindex;
Signature · 1 line
2.35.1
syzbot
syzbotRe: [PATCH 4.19 012/114] ipv6: addrlabel: fix infoleak when sending struct ifaddrlblmsg to network
I see the command but can't find the corresponding bug. The email is sent to [email protected] address but the HASH does not correspond to any known bug. Please double check the…
Quoted 73 lines
From: Alexander Potapenko <[email protected]>
[ Upstream commit
c23fb2c82267638f9d206cb96bb93e1f93ad7828]When copying a
struct ifaddrlblmsgto the network,__ifal_reservedremained uninitialized, resulting in a 1-byte infoleak:BUG: KMSAN: kernel-network-infoleak in __netdev_start_xmit ./include/linux/netdevice.h:4841 __netdev_start_xmit ./include/linux/netdevice.h:4841 netdev_start_xmit ./include/linux/netdevice.h:4857 xmit_one net/core/dev.c:3590 dev_hard_start_xmit+0x1dc/0x800 net/core/dev.c:3606 __dev_queue_xmit+0x17e8/0x4350 net/core/dev.c:4256 dev_queue_xmit ./include/linux/netdevice.h:3009 __netlink_deliver_tap_skb net/netlink/af_netlink.c:307 __netlink_deliver_tap+0x728/0xad0 net/netlink/af_netlink.c:325 netlink_deliver_tap net/netlink/af_netlink.c:338 __netlink_sendskb net/netlink/af_netlink.c:1263 netlink_sendskb+0x1d9/0x200 net/netlink/af_netlink.c:1272 netlink_unicast+0x56d/0xf50 net/netlink/af_netlink.c:1360 nlmsg_unicast ./include/net/netlink.h:1061 rtnl_unicast+0x5a/0x80 net/core/rtnetlink.c:758 ip6addrlbl_get+0xfad/0x10f0 net/ipv6/addrlabel.c:628 rtnetlink_rcv_msg+0xb33/0x1570 net/core/rtnetlink.c:6082 ... Uninit was created at: slab_post_alloc_hook+0x118/0xb00 mm/slab.h:742 slab_alloc_node mm/slub.c:3398 __kmem_cache_alloc_node+0x4f2/0x930 mm/slub.c:3437 __do_kmalloc_node mm/slab_common.c:954 __kmalloc_node_track_caller+0x117/0x3d0 mm/slab_common.c:975 kmalloc_reserve net/core/skbuff.c:437 __alloc_skb+0x27a/0xab0 net/core/skbuff.c:509 alloc_skb ./include/linux/skbuff.h:1267 nlmsg_new ./include/net/netlink.h:964 ip6addrlbl_get+0x490/0x10f0 net/ipv6/addrlabel.c:608 rtnetlink_rcv_msg+0xb33/0x1570 net/core/rtnetlink.c:6082 netlink_rcv_skb+0x299/0x550 net/netlink/af_netlink.c:2540 rtnetlink_rcv+0x26/0x30 net/core/rtnetlink.c:6109 netlink_unicast_kernel net/netlink/af_netlink.c:1319 netlink_unicast+0x9ab/0xf50 net/netlink/af_netlink.c:1345 netlink_sendmsg+0xebc/0x10f0 net/netlink/af_netlink.c:1921 ...This patch ensures that the reserved field is always initialized.
Fixes 2a8cc6c89039 ("[IPV6] ADDRCONF: Support RFC3484 configurable address selection policy table.")Signed-off-by Alexander Potapenko <[email protected]>Reviewed-by David Ahern <[email protected]>Signed-off-by David S. Miller <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- net/ipv6/addrlabel.c | 1 + 1 file changed, 1 insertion(+)net/ipv6/addrlabel.c +1
-0@@ -437,6 +437,7 @@ static void ip6addrlbl_putmsg(struct nlmsghdr *nlh, {struct ifaddrlblmsg *ifal =nlmsg_data (nlh); ifal->ifal_family =AF_INET6 ; + ifal->__ifal_reserved =0 ; ifal->ifal_prefixlen = prefixlen; ifal->ifal_flags =0 ; ifal->ifal_index = ifindex;Signature · 1 line
2.35.1
I see the command but can't find the corresponding bug. The email is sent to [email protected] address but the HASH does not correspond to any known bug. Please double check the address.
Greg Kroah-Hartman
maintainerPATCH 13/114 tipc: fix the msg->req tlv len check in tipc_nl_compat_name_table_dump_header
In reply to Greg Kroah-HartmanFrom: Xin Long <[email protected]>
[ Upstream commit 1c075b192fe41030457cd4a5f7dea730412bca40 ]
This is a follow-up for commit 974cb0e3e7c9 ("tipc: fix uninit-value in tipc_nl_compat_name_table_dump") where it should have type casted sizeof(..) to int to work when TLV_GET_DATA_LEN() returns a negative value.
syzbot reported a call trace because of it:
BUG: KMSAN: uninit-value in ... tipc_nl_compat_name_table_dump+0x841/0xea0 net/tipc/netlink_compat.c:934 __tipc_nl_compat_dumpit+0xab2/0x1320 net/tipc/netlink_compat.c:238 tipc_nl_compat_dumpit+0x991/0xb50 net/tipc/netlink_compat.c:321 tipc_nl_compat_recv+0xb6e/0x1640 net/tipc/netlink_compat.c:1324 genl_family_rcv_msg_doit net/netlink/genetlink.c:731 [inline] genl_family_rcv_msg net/netlink/genetlink.c:775 [inline] genl_rcv_msg+0x103f/0x1260 net/netlink/genetlink.c:792 netlink_rcv_skb+0x3a5/0x6c0 net/netlink/af_netlink.c:2501 genl_rcv+0x3c/0x50 net/netlink/genetlink.c:803 netlink_unicast_kernel net/netlink/af_netlink.c:1319 [inline] netlink_unicast+0xf3b/0x1270 net/netlink/af_netlink.c:1345 netlink_sendmsg+0x1288/0x1440 net/netlink/af_netlink.c:1921 sock_sendmsg_nosec net/socket.c:714 [inline] sock_sendmsg net/socket.c:734 [inline]
--- net/tipc/netlink_compat.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/tipc/netlink_compat.c +1 -1
@@ -865,7 +865,7 @@ static int tipc_nl_compat_name_table_dump_header(struct tipc_nl_compat_msg *msg) }; ntq = (struct tipc_name_table_query *)TLV_DATA (msg->req); -if (TLV_GET_DATA_LEN (msg->req) <sizeof (struct tipc_name_table_query )) +if (TLV_GET_DATA_LEN (msg->req) < (int )sizeof (struct tipc_name_table_query ))return -EINVAL ; depth =ntohl (ntq->depth);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 14/114 dmaengine: mv_xor_v2: Fix a resource leak in mv_xor_v2_remove()
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit 081195d17a0c4c636da2b869bd5809d42e8cbb13 ]
A clk_prepare_enable() call in the probe is not balanced by a corresponding clk_disable_unprepare() in the remove function.
Add the missing call.
--- drivers/dma/mv_xor_v2.c | 1 + 1 file changed, 1 insertion(+)
drivers/dma/mv_xor_v2.c +1 -0
@@ -906,6 +906,7 @@ static int mv_xor_v2_remove(struct platform_device *pdev)tasklet_kill (&xor_dev->irq_tasklet);clk_disable_unprepare (xor_dev->clk); +clk_disable_unprepare (xor_dev->reg_clk);return 0 ; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 15/114 drivers: net: xgene: disable napi when register irq failed in xgene_enet_open()
In reply to Greg Kroah-HartmanFrom: Zhengchao Shao <[email protected]>
[ Upstream commit ce9e57feeed81d17d5e80ed86f516ff0d39c3867 ]
When failed to register irq in xgene_enet_open() for opening device, napi isn't disabled. When open xgene device next time, it will reports a invalid opcode issue. Fix it. Only be compiled, not be tested.
--- drivers/net/ethernet/apm/xgene/xgene_enet_main.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/ethernet/apm/xgene/xgene_enet_main.c +3 -1
@@ -1015,8 +1015,10 @@ static int xgene_enet_open(struct net_device *ndev)xgene_enet_napi_enable (pdata); ret =xgene_enet_register_irq (ndev); -if (ret) +if (ret) { +xgene_enet_napi_disable (pdata);return ret; + }if (ndev->phydev) {phy_start (ndev->phydev);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 16/114 net: nixge: disable napi when enable interrupts failed in nixge_open()
In reply to Greg Kroah-HartmanFrom: Zhengchao Shao <[email protected]>
[ Upstream commit b06334919c7a068d54ba5b219c05e919d89943f7 ]
When failed to enable interrupts in nixge_open() for opening device, napi isn't disabled. When open nixge device next time, it will reports a invalid opcode issue. Fix it. Only be compiled, not be tested.
--- drivers/net/ethernet/ni/nixge.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/ni/nixge.c +1 -0
@@ -833,6 +833,7 @@ static int nixge_open(struct net_device *ndev) err_rx_irq:free_irq (priv->tx_irq, ndev); err_tx_irq: +napi_disable (&priv->napi);phy_stop (phy);phy_disconnect (phy);tasklet_kill (&priv->dma_err_tasklet);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 17/114 net: cxgb3_main: disable napi when bind qsets failed in cxgb_up()
In reply to Greg Kroah-HartmanFrom: Zhengchao Shao <[email protected]>
[ Upstream commit d75aed1428da787cbe42bc073d76f1354f364d92 ]
When failed to bind qsets in cxgb_up() for opening device, napi isn't disabled. When open cxgb3 device next time, it will trigger a BUG_ON() in napi_enable(). Compile tested only.
--- drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c +1 -0
@@ -1304,6 +1304,7 @@ static int cxgb_up(struct adapter *adap)if (ret <0 ) {CH_ERR (adap,"failed to bind qsets, err %d\n" , ret);t3_intr_disable (adap); +quiesce_rx (adap);free_irq_resources (adap); err = ret; goto out;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 18/114 ethernet: s2io: disable napi when start nic failed in s2io_card_up()
In reply to Greg Kroah-HartmanFrom: Zhengchao Shao <[email protected]>
[ Upstream commit 0348c1ab980c1d43fb37b758d4b760990c066cb5 ]
When failed to start nic or add interrupt service routine in s2io_card_up() for opening device, napi isn't disabled. When open s2io device next time, it will trigger a BUG_ON()in napi_enable(). Compile tested only.
--- drivers/net/ethernet/neterion/s2io.c | 29 +++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-)
drivers/net/ethernet/neterion/s2io.c +20 -9
@@ -7126,9 +7126,8 @@ static int s2io_card_up(struct s2io_nic *sp)if (ret) {DBG_PRINT (ERR_DBG ,"%s: Out of memory in Open\n" , dev->name); -s2io_reset (sp); -free_rx_buffers (sp); -return -ENOMEM ; + ret = -ENOMEM ; + goto err_fill_buff; }DBG_PRINT (INFO_DBG ,"Buf in ring:%d is %d:\n" , i, ring->rx_bufs_left);
@@ -7166,18 +7165,16 @@ static int s2io_card_up(struct s2io_nic *sp)/* Enable Rx Traffic and interrupts on the NIC */ if (start_nic (sp)) {DBG_PRINT (ERR_DBG ,"%s: Starting NIC failed\n" , dev->name); -s2io_reset (sp); -free_rx_buffers (sp); -return -ENODEV ; + ret = -ENODEV ; + goto err_out; }/* Add interrupt service routine */ if (s2io_add_isr (sp) !=0 ) {if (sp->config.intr_type ==MSI_X )s2io_rem_isr (sp); -s2io_reset (sp); -free_rx_buffers (sp); -return -ENODEV ; + ret = -ENODEV ; + goto err_out; }timer_setup (&sp->alarm_timer, s2io_alarm_handle,0 );
@@ -7197,6 +7194,20 @@ static int s2io_card_up(struct s2io_nic *sp) }return 0 ; + +err_out: +if (config->napi) { +if (config->intr_type ==MSI_X ) { +for (i =0 ; i < sp->config.rx_ring_num; i++) +napi_disable (&sp->mac_control.rings[i].napi); + }else { +napi_disable (&sp->napi); + } + } +err_fill_buff: +s2io_reset (sp); +free_rx_buffers (sp); +return ret; }/**
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 19/114 net: mv643xx_eth: disable napi when init rxq or txq failed in mv643xx_eth_open()
In reply to Greg Kroah-HartmanFrom: Zhengchao Shao <[email protected]>
[ Upstream commit f111606b63ff2282428ffbac0447c871eb957b6c ]
When failed to init rxq or txq in mv643xx_eth_open() for opening device, napi isn't disabled. When open mv643xx_eth device next time, it will trigger a BUG_ON() in napi_enable(). Compile tested only.
--- drivers/net/ethernet/marvell/mv643xx_eth.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/marvell/mv643xx_eth.c +1 -0
@@ -2495,6 +2495,7 @@ static int mv643xx_eth_open(struct net_device *dev)for (i =0 ; i < mp->rxq_count; i++)rxq_deinit (mp->rxq + i); out: +napi_disable (&mp->napi);free_irq (dev->irq, dev);return err;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 20/114 net: macvlan: fix memory leaks of macvlan_common_newlink
In reply to Greg Kroah-HartmanFrom: Chuang Wang <[email protected]>
[ Upstream commit 23569b5652ee8e8e55a12f7835f59af6f3cefc30 ]
kmemleak reports memory leaks in macvlan_common_newlink, as follows:
ip link add link eth0 name .. type macvlan mode source macaddr add <MAC-ADDR>
kmemleak reports:
unreferenced object 0xffff8880109bb140 (size 64):
comm "ip", pid 284, jiffies 4294986150 (age 430.108s) hex dump (first 32 bytes):
00 00 00 00 00 00 00 00 b8 aa 5a 12 80 88 ff ff ..........Z.....
80 1b fa 0d 80 88 ff ff 1e ff ac af c7 c1 6b 6b ..............kk
backtrace:
[<ffffffff813e06a7>] kmem_cache_alloc_trace+0x1c7/0x300
[<ffffffff81b66025>] macvlan_hash_add_source+0x45/0xc0
[<ffffffff81b66a67>] macvlan_changelink_sources+0xd7/0x170
[<ffffffff81b6775c>] macvlan_common_newlink+0x38c/0x5a0
[<ffffffff81b6797e>] macvlan_newlink+0xe/0x20
[<ffffffff81d97f8f>] __rtnl_newlink+0x7af/0xa50
[<ffffffff81d98278>] rtnl_newlink+0x48/0x70
...In the scenario where the macvlan mode is configured as 'source', macvlan_changelink_sources() will be execured to reconfigure list of remote source mac addresses, at the same time, if register_netdevice() return an error, the resource generated by macvlan_changelink_sources() is not cleaned up.
Using this patch, in the case of an error, it will execute macvlan_flush_sources() to ensure that the resource is cleaned up.
--- drivers/net/macvlan.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/macvlan.c +3 -1
@@ -1471,8 +1471,10 @@ int macvlan_common_newlink(struct net *src_net, struct net_device *dev,/* the macvlan port may be freed by macvlan_uninit when fail to register. * so we destroy the macvlan port only when it's valid. */ -if (create &&macvlan_port_get_rtnl (lowerdev)) +if (create &&macvlan_port_get_rtnl (lowerdev)) { +macvlan_flush_sources (port, vlan);macvlan_port_destroy (port->dev); + }return err; }EXPORT_SYMBOL_GPL (macvlan_common_newlink);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 21/114 riscv: process: fix kernel info leakage
In reply to Greg Kroah-HartmanFrom: Jisheng Zhang <[email protected]>
[ Upstream commit 6510c78490c490a6636e48b61eeaa6fb65981f4b ]
thread_struct's s[12] may contain random kernel memory content, which may be finally leaked to userspace. This is a security hole. Fix it by clearing the s[12] array in thread_struct when fork.
As for kthread case, it's better to clear the s[12] array as well.
--- arch/riscv/kernel/process.c | 2 ++ 1 file changed, 2 insertions(+)
arch/riscv/kernel/process.c +2 -0
@@ -104,6 +104,8 @@ int copy_thread(unsigned long clone_flags, unsigned long usp, {struct pt_regs *childregs =task_pt_regs (p); +memset (&p->thread.s,0 ,sizeof (p->thread.s)); +/* p->thread holds context to be restored by __switch_to() */ if (unlikely (p->flags &PF_KTHREAD )) {/* Kernel thread */
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 22/114 arm64: efi: Fix handling of misaligned runtime regions and drop warning
In reply to Greg Kroah-HartmanFrom: Ard Biesheuvel <[email protected]>
commit 9b9eaee9828fe98b030cf43ac50065a54a2f5d52 upstream.
Currently, when mapping the EFI runtime regions in the EFI page tables, we complain about misaligned regions in a rather noisy way, using WARN().
Not only does this produce a lot of irrelevant clutter in the log, it is factually incorrect, as misaligned runtime regions are actually allowed by the EFI spec as long as they don't require conflicting memory types within the same 64k page.
So let's drop the warning, and tweak the code so that we
- take both the start and end of the region into account when checking for misalignment
- only revert to RWX mappings for non-code regions if misaligned code regions are also known to exist.
--- arch/arm64/kernel/efi.c | 52 +++++++++++++++++++++++++++++++----------------- 1 file changed, 34 insertions(+), 18 deletions(-)
arch/arm64/kernel/efi.c +34 -18
@@ -16,6 +16,14 @@#include <asm/efi.h> +static bool region_is_misaligned (const efi_memory_desc_t *md) +{ +if (PAGE_SIZE ==EFI_PAGE_SIZE ) +return false; +return !PAGE_ALIGNED (md->phys_addr) || + !PAGE_ALIGNED (md->num_pages <<EFI_PAGE_SHIFT ); +} +/* * Only regions of type EFI_RUNTIME_SERVICES_CODE need to be * executable, everything else can be mapped with the XN bits
@@ -29,14 +37,22 @@ static __init pteval_t create_mapping_prif (type ==EFI_MEMORY_MAPPED_IO )return PROT_DEVICE_nGnRE; -if (WARN_ONCE (!PAGE_ALIGNED (md->phys_addr), -"UEFI Runtime regions are not aligned to 64 KB -- buggy firmware?" )) +if (region_is_misaligned (md)) { +static bool __initdata code_is_misaligned; +/* -* If the region is not aligned to the page size of the OS, we -* can not use strict permissions, since that would also affect -* the mapping attributes of the adjacent regions. +* Regions that are not aligned to the OS page size cannot be +* mapped with strict permissions, as those might interfere +* with the permissions that are needed by the adjacent +* region's mapping. However, if we haven't encountered any +* misaligned runtime code regions so far, we can safely use +* non-executable permissions for non-code regions. */ -return pgprot_val (PAGE_KERNEL_EXEC ); + code_is_misaligned |= (type ==EFI_RUNTIME_SERVICES_CODE ); + +return code_is_misaligned ?pgprot_val (PAGE_KERNEL_EXEC ) + :pgprot_val (PAGE_KERNEL ); + }/* R-- */ if ((attr & (EFI_MEMORY_XP | EFI_MEMORY_RO)) ==
@@ -66,19 +82,16 @@ int __init efi_create_mapping(struct mm_bool page_mappings_only = (md->type ==EFI_RUNTIME_SERVICES_CODE || md->type ==EFI_RUNTIME_SERVICES_DATA ); -if (!PAGE_ALIGNED (md->phys_addr) || - !PAGE_ALIGNED (md->num_pages <<EFI_PAGE_SHIFT )) { -/* -* If the end address of this region is not aligned to page -* size, the mapping is rounded up, and may end up sharing a -* page frame with the next UEFI memory region. If we create -* a block entry now, we may need to split it again when mapping -* the next region, and support for that is going to be removed -* from the MMU routines. So avoid block mappings altogether in -* that case. -*/ +/* +* If this region is not aligned to the page size used by the OS, the +* mapping will be rounded outwards, and may end up sharing a page +* frame with an adjacent runtime memory region. Given that the page +* table descriptor covering the shared page will be rewritten when the +* adjacent region gets mapped, we must avoid block mappings here so we +* don't have to worry about splitting them when that happens. +*/ +if (region_is_misaligned (md)) page_mappings_only = true; - } create_pgd_mapping(mm, md->phys_addr, md->virt_addr, md->num_pages << EFI_PAGE_SHIFT,
@@ -106,6 +119,9 @@ int __init efi_set_mapping_permissions(sBUG_ON (md->type !=EFI_RUNTIME_SERVICES_CODE && md->type !=EFI_RUNTIME_SERVICES_DATA ); +if (region_is_misaligned (md)) +return 0 ; +/* * Calling apply_to_page_range() is only safe on regions that are * guaranteed to be mapped down to pages. Since we are only called
Greg Kroah-Hartman
maintainerPATCH 23/114 ALSA: hda/ca0132: add quirk for EVGA Z390 DARK
In reply to Greg Kroah-HartmanFrom: Xian Wang <[email protected]>
commit 0c423e2ffa7edd3f8f9bcf17ce73fa9c7509b99e upstream.
The Z390 DARK mainboard uses a CA0132 audio controller. The quirk is needed to enable surround sound and 3.5mm headphone jack handling in the front audio connector as well as in the rear of the board when in stereo mode.
Page 97 of the linked manual contains instructions to setup the controller.
--- sound/pci/hda/patch_ca0132.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_ca0132.c +1 -0
@@ -1070,6 +1070,7 @@ static const struct snd_pci_quirk ca0132SND_PCI_QUIRK (0x1458 ,0xA026 ,"Gigabyte G1.Sniper Z97" ,QUIRK_R3DI ),SND_PCI_QUIRK (0x1458 ,0xA036 ,"Gigabyte GA-Z170X-Gaming 7" ,QUIRK_R3DI ),SND_PCI_QUIRK (0x3842 ,0x1038 ,"EVGA X99 Classified" ,QUIRK_R3DI ), +SND_PCI_QUIRK (0x3842 ,0x1055 ,"EVGA Z390 DARK" ,QUIRK_R3DI ), SND_PCI_QUIRK(0x1102, 0x0013, "Recon3D", QUIRK_R3D), {} };
Greg Kroah-Hartman
maintainerPATCH 24/114 ALSA: hda: fix potential memleak in add_widget_node
In reply to Greg Kroah-HartmanFrom: Ye Bin <[email protected]>
commit 9a5523f72bd2b0d66eef3d58810c6eb7b5ffc143 upstream.
As 'kobject_add' may allocated memory for 'kobject->name' when return error. And in this function, if call 'kobject_add' failed didn't free kobject. So call 'kobject_put' to recycling resources.
--- sound/hda/hdac_sysfs.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
sound/hda/hdac_sysfs.c +3 -1
@@ -346,8 +346,10 @@ static int add_widget_node(struct kobjecreturn -ENOMEM ;kobject_init (kobj, &widget_ktype); err =kobject_add (kobj, parent,"%02x" , nid); -if (err <0 ) +if (err <0 ) { +kobject_put (kobj);return err; + } err =sysfs_create_group (kobj, group);if (err <0 ) {kobject_put (kobj);
Greg Kroah-Hartman
maintainerPATCH 25/114 ALSA: usb-audio: Add quirk entry for M-Audio Micro
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
commit 2f01a612d4758b45f775dbb88a49cf534ba47275 upstream.
M-Audio Micro (0762:201a) defines the descriptor as vendor-specific, while the content seems class-compliant. Just overriding the probe makes the device working.
--- sound/usb/quirks-table.h | 4 ++++ 1 file changed, 4 insertions(+)
sound/usb/quirks-table.h +4 -0
@@ -2110,6 +2110,10 @@ YAMAHA_DEVICE(0x7010, "UB99"), } }, { +/* M-Audio Micro */ +USB_DEVICE_VENDOR_SPEC (0x0763 ,0x201a ), +}, +{USB_DEVICE_VENDOR_SPEC (0x0763 ,0x2030 ), .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {/* .vendor_name = "M-Audio", */
Greg Kroah-Hartman
maintainerPATCH 26/114 ALSA: usb-audio: Add DSD support for Accuphase DAC-60
In reply to Greg Kroah-HartmanFrom: Jussi Laako <[email protected]>
commit 8cbd4725ffff3eface1f5f3397af02acad5b2831 upstream.
Accuphase DAC-60 option card supports native DSD up to DSD256, but doesn't have support for auto-detection. Explicitly enable DSD support for the correct altsetting.
--- sound/usb/quirks.c | 1 + 1 file changed, 1 insertion(+)
sound/usb/quirks.c +1 -0
@@ -1410,6 +1410,7 @@ u64 snd_usb_interface_dsd_format_quirks(/* XMOS based USB DACs */ switch (chip->usb_id) {case USB_ID (0x1511 ,0x0037 ):/* AURALiC VEGA */ +case USB_ID (0x21ed ,0xd75a ):/* Accuphase DAC-60 option card */ case USB_ID (0x2522 ,0x0012 ):/* LH Labs VI DAC Infinity */ case USB_ID (0x2772 ,0x0230 ):/* Pro-Ject Pre Box S2 Digital */ if (fp->altsetting ==2 )
Greg Kroah-Hartman
maintainerPATCH 27/114 vmlinux.lds.h: Fix placement of .data..decrypted section
In reply to Greg Kroah-HartmanFrom: Nathan Chancellor <[email protected]>
commit 000f8870a47bdc36730357883b6aef42bced91ee upstream.
Commit d4c639990036 ("vmlinux.lds.h: Avoid orphan section with !SMP") fixed an orphan section warning by adding the '.data..decrypted' section to the linker script under the PERCPU_DECRYPTED_SECTION define but that placement introduced a panic with !SMP, as the percpu sections are not instantiated with that configuration so attempting to access variables defined with DEFINE_PER_CPU_DECRYPTED() will result in a page fault.
Move the '.data..decrypted' section to the DATA_MAIN define so that the variables in it are properly instantiated at boot time with CONFIG_SMP=n.
--- include/asm-generic/vmlinux.lds.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/asm-generic/vmlinux.lds.h +1 -1
@@ -242,6 +242,7 @@#define DATA_DATA \ *(.xiptext) \ *(DATA_MAIN) \ + *(.data..decrypted) \ *(.ref.data) \ *(.data..shared_aligned)/* percpu related */ \ MEM_KEEP(init.data*) \
@@ -843,7 +844,6 @@#ifdef CONFIG_AMD_MEM_ENCRYPT #define PERCPU_DECRYPTED_SECTION \ . = ALIGN(PAGE_SIZE); \ - *(.data..decrypted) \ *(.data..percpu..decrypted) \ . = ALIGN(PAGE_SIZE);#else
Greg Kroah-Hartman
maintainerPATCH 28/114 nilfs2: fix deadlock in nilfs_count_free_blocks()
In reply to Greg Kroah-HartmanFrom: Ryusuke Konishi <[email protected]>
commit 8ac932a4921a96ca52f61935dbba64ea87bbd5dc upstream.
A semaphore deadlock can occur if nilfs_get_block() detects metadata corruption while locating data blocks and a superblock writeback occurs at the same time:
task 1 task 2
------ ------
* A file operation *nilfs_truncate()
nilfs_get_block()
down_read(rwsem A) <--
nilfs_bmap_lookup_contig()
... generic_shutdown_super()
nilfs_put_super()
* Prepare to write superblock *
down_write(rwsem B) <--
nilfs_cleanup_super()
* Detect b-tree corruption * nilfs_set_log_cursor()
nilfs_bmap_convert_error() nilfs_count_free_blocks()
__nilfs_error() down_read(rwsem A) <--
nilfs_set_error()
down_write(rwsem B) <--
*** DEADLOCK ***Here, nilfs_get_block() readlocks rwsem A (= NILFS_MDT(dat_inode)->mi_sem) and then calls nilfs_bmap_lookup_contig(), but if it fails due to metadata corruption, __nilfs_error() is called from nilfs_bmap_convert_error() inside the lock section.
Since __nilfs_error() calls nilfs_set_error() unless the filesystem is read-only and nilfs_set_error() attempts to writelock rwsem B (= nilfs->ns_sem) to write back superblock exclusively, hierarchical lock acquisition occurs in the order rwsem A -> rwsem B.
Now, if another task starts updating the superblock, it may writelock rwsem B during the lock sequence above, and can deadlock trying to readlock rwsem A in nilfs_count_free_blocks().
However, there is actually no need to take rwsem A in nilfs_count_free_blocks() because it, within the lock section, only reads a single integer data on a shared struct with nilfs_sufile_get_ncleansegs(). This has been the case after commit aa474a220180 ("nilfs2: add local variable to cache the number of clean segments"), that is, even before this bug was introduced.
So, this resolves the deadlock problem by just not taking the semaphore in nilfs_count_free_blocks().
--- fs/nilfs2/the_nilfs.c | 2 -- 1 file changed, 2 deletions(-)
fs/nilfs2/the_nilfs.c +0 -2
@@ -695,9 +695,7 @@ int nilfs_count_free_blocks(struct the_n {unsigned long ncleansegs; -down_read (&NILFS_MDT (nilfs->ns_dat)->mi_sem); ncleansegs =nilfs_sufile_get_ncleansegs (nilfs->ns_sufile); -up_read (&NILFS_MDT (nilfs->ns_dat)->mi_sem); *nblocks = (sector_t )ncleansegs * nilfs->ns_blocks_per_segment;return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 29/114 nilfs2: fix use-after-free bug of ns_writer on remount
In reply to Greg Kroah-HartmanFrom: Ryusuke Konishi <[email protected]>
commit 8cccf05fe857a18ee26e20d11a8455a73ffd4efd upstream.
If a nilfs2 filesystem is downgraded to read-only due to metadata corruption on disk and is remounted read/write, or if emergency read-only remount is performed, detaching a log writer and synchronizing the filesystem can be done at the same time.
In these cases, use-after-free of the log writer (hereinafter nilfs->ns_writer) can happen as shown in the scenario below:
Task1 Task2
-------------------------------- ------------------------------
nilfs_construct_segment
nilfs_segctor_sync
init_wait
init_waitqueue_entry
add_wait_queue
schedule
nilfs_remount (R/W remount case)
nilfs_attach_log_writer
nilfs_detach_log_writer
nilfs_segctor_destroy
kfree
finish_wait
_raw_spin_lock_irqsave
__raw_spin_lock_irqsave
do_raw_spin_lock
debug_spin_lock_before <-- use-after-free
While Task1 is sleeping, nilfs->ns_writer is freed by Task2. After Task1 waked up, Task1 accesses nilfs->ns_writer which is already freed. This scenario diagram is based on the Shigeru Yoshida's post [1].
This patch fixes the issue by not detaching nilfs->ns_writer on remount so that this UAF race doesn't happen. Along with this change, this patch also inserts a few necessary read-only checks with superblock instance where only the ns_writer pointer was used to check if the filesystem is read-only.
--- fs/nilfs2/segment.c | 15 ++++++++------- fs/nilfs2/super.c | 2 -- 2 files changed, 8 insertions(+), 9 deletions(-)
fs/nilfs2/segment.c +8 -7
@@ -322,7 +322,7 @@ void nilfs_relax_pressure_in_lock(structstruct the_nilfs *nilfs = sb->s_fs_info;struct nilfs_sc_info *sci = nilfs->ns_writer; -if (!sci || !sci->sc_flush_request) +if (sb_rdonly (sb) ||unlikely (!sci) || !sci->sc_flush_request)return ;set_bit (NILFS_SC_PRIOR_FLUSH , &sci->sc_flags);
@@ -2243,7 +2243,7 @@ int nilfs_construct_segment(struct superstruct nilfs_transaction_info *ti;int err; -if (!sci) +if (sb_rdonly (sb) ||unlikely (!sci))return -EROFS ;/* A call inside transactions causes a deadlock. */
@@ -2282,7 +2282,7 @@ int nilfs_construct_dsync_segment(structstruct nilfs_transaction_info ti;int err =0 ; -if (!sci) +if (sb_rdonly (sb) ||unlikely (!sci))return -EROFS ;nilfs_transaction_lock (sb, &ti,0 );
@@ -2778,11 +2778,12 @@ int nilfs_attach_log_writer(struct superif (nilfs->ns_writer) {/* -* This happens if the filesystem was remounted -* read/write after nilfs_error degenerated it into a -* read-only mount. +* This happens if the filesystem is made read-only by +* __nilfs_error or nilfs_remount and then remounted +* read/write. In these cases, reuse the existing +* writer. */ -nilfs_detach_log_writer (sb); +return 0 ; } nilfs->ns_writer =nilfs_segctor_new (sb, root);
fs/nilfs2/super.c +0 -2
@@ -1138,8 +1138,6 @@ static int nilfs_remount(struct super_blif ((bool )(*flags &SB_RDONLY ) ==sb_rdonly (sb)) goto out;if (*flags &SB_RDONLY ) { -/* Shutting down log writer */ -nilfs_detach_log_writer (sb); sb->s_flags |=SB_RDONLY ;/*
Greg Kroah-Hartman
maintainerPATCH 30/114 drm/i915/dmabuf: fix sg_table handling in map_dma_buf
In reply to Greg Kroah-HartmanFrom: Matthew Auld <[email protected]>
commit f90daa975911961b65070ec72bd7dd8d448f9ef7 upstream.
We need to iterate over the original entries here for the sg_table, pulling out the struct page for each one, to be remapped. However currently this incorrectly iterates over the final dma mapped entries, which is likely just one gigantic sg entry if the iommu is enabled, leading to us only mapping the first struct page (and any physically contiguous pages following it), even if there is potentially lots more data to follow.
--- drivers/gpu/drm/i915/i915_gem_dmabuf.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/drm/i915/i915_gem_dmabuf.c +2 -2
@@ -55,13 +55,13 @@ static struct sg_table *i915_gem_map_dma goto err_unpin_pages; } - ret =sg_alloc_table (st, obj->mm.pages->nents,GFP_KERNEL ); + ret =sg_alloc_table (st, obj->mm.pages->orig_nents,GFP_KERNEL );if (ret) goto err_free; src = obj->mm.pages->sgl; dst = st->sgl; -for (i =0 ; i < obj->mm.pages->nents; i++) { +for (i =0 ; i < obj->mm.pages->orig_nents; i++) {sg_set_page (dst,sg_page (src), src->length,0 ); dst =sg_next (dst); src =sg_next (src);
Greg Kroah-Hartman
maintainerPATCH 31/114 platform/x86: hp_wmi: Fix rfkill causing soft blocked wifi
In reply to Greg Kroah-HartmanFrom: Jorge Lopez <[email protected]>
commit 1598bfa8e1faa932de42e1ee7628a1c4c4263f0a upstream.
After upgrading BIOS to U82 01.02.01 Rev.A, the console is flooded strange char "^@" which printed out every second and makes login nearly impossible. Also the below messages were shown both in console and journal/dmesg every second:
usb 1-3: Device not responding to setup address. usb 1-3: device not accepting address 4, error -71 usb 1-3: device descriptor read/all, error -71 usb usb1-port3: unable to enumerate USB device
Wifi is soft blocked by checking rfkill. When unblocked manually, after few seconds it would be soft blocked again. So I was suspecting something triggered rfkill to soft block wifi. At the end it was fixed by removing hp_wmi module.
The root cause is the way hp-wmi driver handles command 1B on post-2009 BIOS. In pre-2009 BIOS, command 1Bh return 0x4 to indicate that BIOS no longer controls the power for the wireless devices.
--- drivers/platform/x86/hp-wmi.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
drivers/platform/x86/hp-wmi.c +10 -2
@@ -894,8 +894,16 @@ static int __init hp_wmi_bios_setup(stru wwan_rfkill =NULL ; rfkill2_count =0 ; -if (hp_wmi_rfkill_setup (device)) -hp_wmi_rfkill2_setup (device); +/* +* In pre-2009 BIOS, command 1Bh return 0x4 to indicate that +* BIOS no longer controls the power for the wireless +* devices. All features supported by this command will no +* longer be supported. +*/ +if (!hp_wmi_bios_2009_later ()) { +if (hp_wmi_rfkill_setup (device)) +hp_wmi_rfkill2_setup (device); + } err =device_create_file (&device->dev, &dev_attr_display);if (err)
Greg Kroah-Hartman
maintainerPATCH 32/114 btrfs: selftests: fix wrong error check in btrfs_free_dummy_root()
In reply to Greg Kroah-HartmanFrom: Zhang Xiaoxu <[email protected]>
commit 9b2f20344d450137d015b380ff0c2e2a6a170135 upstream.
The btrfs_alloc_dummy_root() uses ERR_PTR as the error return value rather than NULL, if error happened, there will be a NULL pointer dereference:
BUG: KASAN: null-ptr-deref in btrfs_free_dummy_root+0x21/0x50 [btrfs] Read of size 8 at addr 000000000000002c by task insmod/258926 CPU: 2 PID: 258926 Comm: insmod Tainted: G W 6.1.0-rc2+ #5 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.14.0-1.fc33 04/01/2014 Call Trace: <TASK> dump_stack_lvl+0x34/0x44 kasan_report+0xb7/0x140 kasan_check_range+0x145/0x1a0 btrfs_free_dummy_root+0x21/0x50 [btrfs] btrfs_test_free_space_cache+0x1a8c/0x1add [btrfs] btrfs_run_sanity_tests+0x65/0x80 [btrfs] init_btrfs_fs+0xec/0x154 [btrfs] do_one_initcall+0x87/0x2a0 do_init_module+0xdf/0x320 load_module+0x3006/0x3390 __do_sys_finit_module+0x113/0x1b0 do_syscall_64+0x35/0x80 entry_SYSCALL_64_after_hwframe+0x46/0xb0
--- fs/btrfs/tests/btrfs-tests.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/btrfs/tests/btrfs-tests.c +1 -1
@@ -174,7 +174,7 @@ void btrfs_free_dummy_fs_info(struct btrvoid btrfs_free_dummy_root (struct btrfs_root *root) { -if (!root) +if (IS_ERR_OR_NULL (root))return ;/* Will be freed by btrfs_free_fs_roots */ if (WARN_ON (test_bit (BTRFS_ROOT_IN_RADIX , &root->state)))
Greg Kroah-Hartman
maintainerPATCH 33/114 udf: Fix a slab-out-of-bounds write bug in udf_find_entry()
In reply to Greg Kroah-HartmanFrom: ZhangPeng <[email protected]>
commit c8af247de385ce49afabc3bf1cf4fd455c94bfe8 upstream.
Syzbot reported a slab-out-of-bounds Write bug:
loop0: detected capacity change from 0 to 2048
==================================================================
BUG: KASAN: slab-out-of-bounds in udf_find_entry+0x8a5/0x14f0 fs/udf/namei.c:253 Write of size 105 at addr ffff8880123ff896 by task syz-executor323/3610 CPU: 0 PID: 3610 Comm: syz-executor323 Not tainted 6.1.0-rc2-syzkaller-00105-gb229b6ca5abb #0 Hardware name: Google Compute Engine/Google Compute Engine, BIOS Google 10/11/2022 Call Trace: <TASK> __dump_stack lib/dump_stack.c:88 [inline] dump_stack_lvl+0x1b1/0x28e lib/dump_stack.c:106 print_address_description+0x74/0x340 mm/kasan/report.c:284 print_report+0x107/0x1f0 mm/kasan/report.c:395 kasan_report+0xcd/0x100 mm/kasan/report.c:495 kasan_check_range+0x2a7/0x2e0 mm/kasan/generic.c:189 memcpy+0x3c/0x60 mm/kasan/shadow.c:66 udf_find_entry+0x8a5/0x14f0 fs/udf/namei.c:253 udf_lookup+0xef/0x340 fs/udf/namei.c:309 lookup_open fs/namei.c:3391 [inline] open_last_lookups fs/namei.c:3481 [inline] path_openat+0x10e6/0x2df0 fs/namei.c:3710 do_filp_open+0x264/0x4f0 fs/namei.c:3740 do_sys_openat2+0x124/0x4e0 fs/open.c:1310 do_sys_open fs/open.c:1326 [inline] __do_sys_creat fs/open.c:1402 [inline] __se_sys_creat fs/open.c:1396 [inline] __x64_sys_creat+0x11f/0x160 fs/open.c:1396 do_syscall_x64 arch/x86/entry/common.c:50 [inline] do_syscall_64+0x3d/0xb0 arch/x86/entry/common.c:80 entry_SYSCALL_64_after_hwframe+0x63/0xcd RIP: 0033:0x7ffab0d164d9 Code: ff ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 40 00 48 89 f8 48 89
f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 c0 ff ff ff f7 d8 64 89 01 48
RSP: 002b:00007ffe1a7e6bb8 EFLAGS: 00000246 ORIG_RAX: 0000000000000055
RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007ffab0d164d9
RDX: 00007ffab0d164d9 RSI: 0000000000000000 RDI: 0000000020000180
RBP: 00007ffab0cd5a10 R08: 0000000000000000 R09: 0000000000000000
R10: 00005555573552c0 R11: 0000000000000246 R12: 00007ffab0cd5aa0
R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000
</TASK> Allocated by task 3610: kasan_save_stack mm/kasan/common.c:45 [inline] kasan_set_track+0x3d/0x60 mm/kasan/common.c:52 ____kasan_kmalloc mm/kasan/common.c:371 [inline] __kasan_kmalloc+0x97/0xb0 mm/kasan/common.c:380 kmalloc include/linux/slab.h:576 [inline] udf_find_entry+0x7b6/0x14f0 fs/udf/namei.c:243 udf_lookup+0xef/0x340 fs/udf/namei.c:309 lookup_open fs/namei.c:3391 [inline] open_last_lookups fs/namei.c:3481 [inline] path_openat+0x10e6/0x2df0 fs/namei.c:3710 do_filp_open+0x264/0x4f0 fs/namei.c:3740 do_sys_openat2+0x124/0x4e0 fs/open.c:1310 do_sys_open fs/open.c:1326 [inline] __do_sys_creat fs/open.c:1402 [inline] __se_sys_creat fs/open.c:1396 [inline] __x64_sys_creat+0x11f/0x160 fs/open.c:1396 do_syscall_x64 arch/x86/entry/common.c:50 [inline] do_syscall_64+0x3d/0xb0 arch/x86/entry/common.c:80 entry_SYSCALL_64_after_hwframe+0x63/0xcd The buggy address belongs to the object at ffff8880123ff800 which belongs to the cache kmalloc-256 of size 256
The buggy address is located 150 bytes inside of
256-byte region [ffff8880123ff800, ffff8880123ff900)
The buggy address belongs to the physical page:
page:ffffea000048ff80 refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x123fe
head:ffffea000048ff80 order:1 compound_mapcount:0 compound_pincount:0
flags: 0xfff00000010200(slab|head|node=0|zone=1|lastcpupid=0x7ff)
raw: 00fff00000010200 ffffea00004b8500 dead000000000003 ffff888012041b40 raw: 0000000000000000 0000000080100010 00000001ffffffff 0000000000000000 page dumped because: kasan: bad access detected page_owner tracks the page as allocated page last allocated via order 0, migratetype Unmovable, gfp_mask 0x0(), pid 1, tgid 1 (swapper/0), ts 1841222404, free_ts 0 create_dummy_stack mm/page_owner.c:67 [inline] register_early_stack+0x77/0xd0 mm/page_owner.c:83 init_page_owner+0x3a/0x731 mm/page_owner.c:93 kernel_init_freeable+0x41c/0x5d5 init/main.c:1629 kernel_init+0x19/0x2b0 init/main.c:1519
page_owner free stack trace missing
Memory state around the buggy address:
ffff8880123ff780: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
ffff8880123ff800: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
>ffff8880123ff880: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 06
^
ffff8880123ff900: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
ffff8880123ff980: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
==================================================================Fix this by changing the memory size allocated for copy_name from UDF_NAME_LEN(254) to UDF_NAME_LEN_CS0(255), because the total length (lfi) of subsequent memcpy can be up to 255.
--- fs/udf/namei.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/udf/namei.c +1 -1
@@ -241,7 +241,7 @@ static struct fileIdentDesc *udf_find_en poffset - lfi); else {if (!copy_name) { - copy_name =kmalloc (UDF_NAME_LEN , + copy_name =kmalloc (UDF_NAME_LEN_CS0 ,GFP_NOFS );if (!copy_name) { fi =ERR_PTR (-ENOMEM );
Greg Kroah-Hartman
maintainerPATCH 34/114 cert host tools: Stop complaining about deprecated OpenSSL functions
In reply to Greg Kroah-HartmanFrom: Linus Torvalds <[email protected]>
commit 6bfb56e93bcef41859c2d5ab234ffd80b691be35 upstream.
OpenSSL 3.0 deprecated the OpenSSL's ENGINE API. That is as may be, but the kernel build host tools still use it. Disable the warning about deprecated declarations until somebody who cares fixes it.
--- scripts/extract-cert.c | 7 +++++++ scripts/sign-file.c | 7 +++++++ 2 files changed, 14 insertions(+)
scripts/extract-cert.c +7 -0
@@ -23,6 +23,13 @@#include <openssl/err.h> #include <openssl/engine.h> +/* +* OpenSSL 3.0 deprecates the OpenSSL's ENGINE API. +* +* Remove this if/when that API is no longer used +*/ +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#define PKEY_ID_PKCS7 2 static __attribute__((noreturn))
scripts/sign-file.c +7 -0
@@ -30,6 +30,13 @@#include <openssl/engine.h> /* +* OpenSSL 3.0 deprecates the OpenSSL's ENGINE API. +* +* Remove this if/when that API is no longer used +*/ +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + +/* * Use CMS if we have openssl-1.0.0 or newer available - otherwise we have to * assume that it's not available and its header file is missing and that we * should use PKCS#7 instead. Switching to the older PKCS#7 format restricts
Greg Kroah-Hartman
maintainerPATCH 35/114 dmaengine: at_hdmac: Fix at_lli struct definition
In reply to Greg Kroah-HartmanFrom: Tudor Ambarus <[email protected]>
commit f1171bbdd2ba2a50ee64bb198a78c268a5baf5f1 upstream.
Those hardware registers are all of 32 bits, while dma_addr_t ca be of type u64 or u32 depending on CONFIG_ARCH_DMA_ADDR_T_64BIT. Force u32 to comply with what the hardware expects.
--- drivers/dma/at_hdmac_regs.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/dma/at_hdmac_regs.h +5 -5
@@ -168,13 +168,13 @@/* LLI == Linked List Item; aka DMA buffer descriptor */ struct at_lli {/* values that are not changed by hardware */ -dma_addr_t saddr; -dma_addr_t daddr; +u32 saddr; +u32 daddr;/* value that may get written back: */ -u32 ctrla; +u32 ctrla;/* more values that are not changed by hardware */ -u32 ctrlb; -dma_addr_t dscr;/* chain to next lli */ +u32 ctrlb; +u32 dscr;/* chain to next lli */ };/**
Greg Kroah-Hartman
maintainerPATCH 36/114 dmaengine: at_hdmac: Dont start transactions at tx_submit level
In reply to Greg Kroah-HartmanFrom: Tudor Ambarus <[email protected]>
commit 7176a6a8982d311e50a7c1168868d26e65bbba19 upstream.
tx_submit is supposed to push the current transaction descriptor to a pending queue, waiting for issue_pending() to be called. issue_pending() must start the transfer, not tx_submit(), thus remove atc_dostart() from atc_tx_submit(). Clients of at_xdmac that assume that tx_submit() starts the transfer must be updated and call dma_async_issue_pending() if they miss to call it.
The vdbg print was moved to after the lock is released. It is desirable to do the prints without the lock held if possible, and because the if statement disappears there's no reason why to do the print while holding the lock.
--- drivers/dma/at_hdmac.c | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-)
drivers/dma/at_hdmac.c +3 -11
@@ -680,19 +680,11 @@ static dma_cookie_t atc_tx_submit(structspin_lock_irqsave (&atchan->lock, flags); cookie =dma_cookie_assign (tx); -if (list_empty (&atchan->active_list)) { -dev_vdbg (chan2dev (tx->chan),"tx_submit: started %u\n" , - desc->txd.cookie); -atc_dostart (atchan, desc); -list_add_tail (&desc->desc_node, &atchan->active_list); - }else { -dev_vdbg (chan2dev (tx->chan),"tx_submit: queued %u\n" , - desc->txd.cookie); -list_add_tail (&desc->desc_node, &atchan->queue); - } - +list_add_tail (&desc->desc_node, &atchan->queue);spin_unlock_irqrestore (&atchan->lock, flags); +dev_vdbg (chan2dev (tx->chan),"tx_submit: queued %u\n" , + desc->txd.cookie);return cookie; }
Greg Kroah-Hartman
maintainerPATCH 37/114 dmaengine: at_hdmac: Fix completion of unissued descriptor in case of errors
In reply to Greg Kroah-HartmanFrom: Tudor Ambarus <[email protected]>
commit ef2cb4f0ce479f77607b04c4b0414bf32f863ee8 upstream.
In case the controller detected an error, the code took the chance to move all the queued (submitted) descriptors to the active (issued) list. This was wrong as if there were any descriptors in the submitted list they were moved to the issued list without actually issuing them to the controller, thus a completion could be raised without even fireing the descriptor.
--- drivers/dma/at_hdmac.c | 4 ---- 1 file changed, 4 deletions(-)
drivers/dma/at_hdmac.c +0 -4
@@ -556,10 +556,6 @@ static void atc_handle_error(struct at_d bad_desc =atc_first_active (atchan);list_del_init (&bad_desc->desc_node); -/* As we are stopped, take advantage to push queued descriptors -* in active_list */ -list_splice_init (&atchan->queue, atchan->active_list.prev); -/* Try to restart the controller */ if (!list_empty (&atchan->active_list))atc_dostart (atchan,atc_first_active (atchan));
Greg Kroah-Hartman
maintainerPATCH 38/114 dmaengine: at_hdmac: Dont allow CPU to reorder channel enable
In reply to Greg Kroah-HartmanFrom: Tudor Ambarus <[email protected]>
commit 580ee84405c27d6ed419abe4d2b3de1968abdafd upstream.
at_hdmac uses __raw_writel for register writes. In the absence of a barrier, the CPU may reorder the register operations. Introduce a write memory barrier so that the CPU does not reorder the channel enable, thus the start of the transfer, without making sure that all the pre-required register fields are already written.
--- drivers/dma/at_hdmac.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/dma/at_hdmac.c +2 -0
@@ -252,6 +252,8 @@ static void atc_dostart(struct at_dma_ch ATC_SPIP_BOUNDARY(first->boundary));channel_writel (atchan,DPIP ,ATC_DPIP_HOLE (first->dst_hole) |ATC_DPIP_BOUNDARY (first->boundary)); +/* Don't allow CPU to reorder channel enable. */ +wmb ();dma_writel (atdma,CHER , atchan->mask);vdbg_dump_regs (atchan);
Greg Kroah-Hartman
maintainerPATCH 39/114 dmaengine: at_hdmac: Fix impossible condition
In reply to Greg Kroah-HartmanFrom: Tudor Ambarus <[email protected]>
commit 28cbe5a0a46a6637adbda52337d7b2777fc04027 upstream.
The iterator can not be greater than ATC_MAX_DSCR_TRIALS, as the for loop will stop when i == ATC_MAX_DSCR_TRIALS. While here, use the common "i" name for the iterator.
--- drivers/dma/at_hdmac.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/dma/at_hdmac.c +4 -3
@@ -314,7 +314,8 @@ static int atc_get_bytes_left(struct dmastruct at_desc *desc_first =atc_first_active (atchan);struct at_desc *desc;int ret; -u32 ctrla, dscr, trials; +u32 ctrla, dscr; +unsigned int i;/* * If the cookie doesn't match to the currently running transfer then
@@ -384,7 +385,7 @@ static int atc_get_bytes_left(struct dma dscr =channel_readl (atchan,DSCR );rmb ();/* ensure DSCR is read before CTRLA */ ctrla =channel_readl (atchan,CTRLA ); -for (trials =0 ; trials <ATC_MAX_DSCR_TRIALS ; ++trials) { +for (i =0 ; i <ATC_MAX_DSCR_TRIALS ; ++i) {u32 new_dscr;rmb ();/* ensure DSCR is read after CTRLA */
@@ -410,7 +411,7 @@ static int atc_get_bytes_left(struct dmarmb ();/* ensure DSCR is read before CTRLA */ ctrla =channel_readl (atchan,CTRLA ); } -if (unlikely (trials >=ATC_MAX_DSCR_TRIALS )) +if (unlikely (i ==ATC_MAX_DSCR_TRIALS ))return -ETIMEDOUT ;/* for the first descriptor we can be more accurate */
Greg Kroah-Hartman
maintainerPATCH 40/114 dmaengine: at_hdmac: Check return code of dma_async_device_register
In reply to Greg Kroah-HartmanFrom: Tudor Ambarus <[email protected]>
commit c47e6403fa099f200868d6b106701cb42d181d2b upstream.
dma_async_device_register() can fail, check the return code and display an error.
--- drivers/dma/at_hdmac.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/dma/at_hdmac.c +6 -1
@@ -1958,7 +1958,11 @@ static int __init at_dma_probe(struct pldma_has_cap (DMA_SLAVE , atdma->dma_common.cap_mask) ?"slave " :"" , plat_dat->nr_channels); -dma_async_device_register (&atdma->dma_common); + err =dma_async_device_register (&atdma->dma_common); +if (err) { +dev_err (&pdev->dev,"Unable to register: %d.\n" , err); + goto err_dma_async_device_register; + }/* * Do not return an error if the dmac node is not present in order to
@@ -1978,6 +1982,7 @@ static int __init at_dma_probe(struct pl err_of_dma_controller_register:dma_async_device_unregister (&atdma->dma_common); +err_dma_async_device_register:dma_pool_destroy (atdma->memset_pool); err_memset_pool_create:dma_pool_destroy (atdma->dma_desc_pool);
Greg Kroah-Hartman
maintainerPATCH 41/114 net: tun: call napi_schedule_prep() to ensure we own a napi
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
commit 07d120aa33cc9d9115753d159f64d20c94458781 upstream.
A recent patch exposed another issue in napi_get_frags() caught by syzbot [1]
Before feeding packets to GRO, and calling napi_complete() we must first grab NAPI_STATE_SCHED.
[1]
WARNING: CPU: 0 PID: 3612 at net/core/dev.c:6076 napi_complete_done+0x45b/0x880 net/core/dev.c:6076 Modules linked in: CPU: 0 PID: 3612 Comm: syz-executor408 Not tainted 6.1.0-rc3-syzkaller-00175-g1118b2049d77 #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 10/26/2022 RIP: 0010:napi_complete_done+0x45b/0x880 net/core/dev.c:6076 Code: c1 ea 03 0f b6 14 02 4c 89 f0 83 e0 07 83 c0 03 38 d0 7c 08 84 d2 0f 85 24 04 00 00 41 89 5d 1c e9 73 fc ff ff e8 b5 53 22 fa <0f> 0b e9 82 fe ff ff e8 a9 53 22 fa 48 8b 5c 24 08 31 ff 48 89 de RSP: 0018:ffffc90003c4f920 EFLAGS: 00010293 RAX: 0000000000000000 RBX: 0000000000000030 RCX: 0000000000000000 RDX: ffff8880251c0000 RSI: ffffffff875a58db RDI: 0000000000000007 RBP: 0000000000000001 R08: 0000000000000007 R09: 0000000000000000 R10: 0000000000000001 R11: 0000000000000001 R12: ffff888072d02628 R13: ffff888072d02618 R14: ffff888072d02634 R15: 0000000000000000 FS: 0000555555f13300(0000) GS:ffff8880b9a00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 000055c44d3892b8 CR3: 00000000172d2000 CR4: 00000000003506f0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: <TASK> napi_complete include/linux/netdevice.h:510 [inline] tun_get_user+0x206d/0x3a60 drivers/net/tun.c:1980 tun_chr_write_iter+0xdb/0x200 drivers/net/tun.c:2027 call_write_iter include/linux/fs.h:2191 [inline] do_iter_readv_writev+0x20b/0x3b0 fs/read_write.c:735 do_iter_write+0x182/0x700 fs/read_write.c:861 vfs_writev+0x1aa/0x630 fs/read_write.c:934 do_writev+0x133/0x2f0 fs/read_write.c:977 do_syscall_x64 arch/x86/entry/common.c:50 [inline] do_syscall_64+0x35/0xb0 arch/x86/entry/common.c:80 entry_SYSCALL_64_after_hwframe+0x63/0xcd RIP: 0033:0x7f37021a3c19
--- drivers/net/tun.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-)
drivers/net/tun.c +13 -6
@@ -1962,18 +1962,25 @@ drop: headlen =eth_get_headlen (skb->data,skb_headlen (skb));if (unlikely (headlen >skb_headlen (skb))) { +WARN_ON_ONCE (1 ); + err = -ENOMEM ;this_cpu_inc (tun->pcpu_stats->rx_dropped); +napi_busy:napi_free_frags (&tfile->napi);rcu_read_unlock ();mutex_unlock (&tfile->napi_mutex); -WARN_ON (1 ); -return -ENOMEM ; +return err; } -local_bh_disable (); -napi_gro_frags (&tfile->napi); -napi_complete (&tfile->napi); -local_bh_enable (); +if (likely (napi_schedule_prep (&tfile->napi))) { +local_bh_disable (); +napi_gro_frags (&tfile->napi); +napi_complete (&tfile->napi); +local_bh_enable (); + }else { + err = -EBUSY ; + goto napi_busy; + }mutex_unlock (&tfile->napi_mutex); }else if (tfile->napi_enabled) {struct sk_buff_head *queue = &tfile->sk.sk_write_queue;
Greg Kroah-Hartman
maintainerPATCH 42/114 x86/cpu: Restore AMDs DE_CFG MSR after resume
In reply to Greg Kroah-HartmanFrom: Borislav Petkov <[email protected]>
commit 2632daebafd04746b4b96c2f26a6021bc38f6209 upstream.
DE_CFG contains the LFENCE serializing bit, restore it on resume too. This is relevant to older families due to the way how they do S3.
Unify and correct naming while at it.
--- arch/x86/include/asm/msr-index.h | 8 +++++--- arch/x86/kernel/cpu/amd.c | 10 ++++------ arch/x86/kvm/svm.c | 10 +++++----- arch/x86/kvm/x86.c | 2 +- arch/x86/power/cpu.c | 1 + tools/testing/selftests/kvm/include/x86.h | 8 +++++--- 6 files changed, 21 insertions(+), 18 deletions(-)
arch/x86/include/asm/msr-index.h +5 -3
@@ -399,6 +399,11 @@#define MSR_AMD64_OSVW_STATUS 0xc0010141#define MSR_AMD64_LS_CFG 0xc0011020#define MSR_AMD64_DC_CFG 0xc0011022 + +#define MSR_AMD64_DE_CFG 0xc0011029 +#define MSR_AMD64_DE_CFG_LFENCE_SERIALIZE_BIT 1 +#define MSR_AMD64_DE_CFG_LFENCE_SERIALIZE BIT_ULL(MSR_AMD64_DE_CFG_LFENCE_SERIALIZE_BIT) +#define MSR_AMD64_BU_CFG2 0xc001102a#define MSR_AMD64_IBSFETCHCTL 0xc0011030#define MSR_AMD64_IBSFETCHLINAD 0xc0011031
@@ -467,9 +472,6 @@#define FAM10H_MMIO_CONF_BASE_MASK 0xfffffffULL#define FAM10H_MMIO_CONF_BASE_SHIFT 20#define MSR_FAM10H_NODE_ID 0xc001100c -#define MSR_F10H_DECFG 0xc0011029 -#define MSR_F10H_DECFG_LFENCE_SERIALIZE_BIT 1 -#define MSR_F10H_DECFG_LFENCE_SERIALIZE BIT_ULL(MSR_F10H_DECFG_LFENCE_SERIALIZE_BIT)/* K8 MSRs */ #define MSR_K8_TOP_MEM1 0xc001001a
arch/x86/kernel/cpu/amd.c +4 -6
@@ -789,8 +789,6 @@ static void init_amd_gh(struct cpuinfo_xset_cpu_bug (c,X86_BUG_AMD_TLB_MMATCH ); } -#define MSR_AMD64_DE_CFG 0xC0011029 -static void init_amd_ln (struct cpuinfo_x86 *c) {/*
@@ -960,16 +958,16 @@ static void init_amd(struct cpuinfo_x86* msr_set_bit() uses the safe accessors, too, even if the MSR * is not present. */ -msr_set_bit (MSR_F10H_DECFG , -MSR_F10H_DECFG_LFENCE_SERIALIZE_BIT ); +msr_set_bit (MSR_AMD64_DE_CFG , +MSR_AMD64_DE_CFG_LFENCE_SERIALIZE_BIT );/* * Verify that the MSR write was successful (could be running * under a hypervisor) and only then assume that LFENCE is * serializing. */ - ret =rdmsrl_safe (MSR_F10H_DECFG , &val); -if (!ret && (val &MSR_F10H_DECFG_LFENCE_SERIALIZE )) { + ret =rdmsrl_safe (MSR_AMD64_DE_CFG , &val); +if (!ret && (val &MSR_AMD64_DE_CFG_LFENCE_SERIALIZE_BIT )) {/* A serializing LFENCE stops RDTSC speculation */ set_cpu_cap (c,X86_FEATURE_LFENCE_RDTSC ); }else {
arch/x86/kvm/svm.c +5 -5
@@ -4155,9 +4155,9 @@ static int svm_get_msr_feature(struct kv msr->data =0 ;switch (msr->index) { -case MSR_F10H_DECFG : -if (boot_cpu_has (X86_FEATURE_LFENCE_RDTSC )) - msr->data |=MSR_F10H_DECFG_LFENCE_SERIALIZE ; +case MSR_AMD64_DE_CFG : +if (cpu_feature_enabled (X86_FEATURE_LFENCE_RDTSC )) + msr->data |=MSR_AMD64_DE_CFG_LFENCE_SERIALIZE ;break ;default :return 1 ;
@@ -4259,7 +4259,7 @@ static int svm_get_msr(struct kvm_vcpu * msr_info->data =0x1E ; }break ; -case MSR_F10H_DECFG : +case MSR_AMD64_DE_CFG : msr_info->data = svm->msr_decfg;break ;default :
@@ -4446,7 +4446,7 @@ static int svm_set_msr(struct kvm_vcpu *case MSR_VM_IGNNE :vcpu_unimpl (vcpu,"unimplemented wrmsr: 0x%x data 0x%llx\n" , ecx, data);break ; -case MSR_F10H_DECFG : { +case MSR_AMD64_DE_CFG : {struct kvm_msr_entry msr_entry; msr_entry.index = msr->index;
arch/x86/kvm/x86.c +1 -1
@@ -1156,7 +1156,7 @@ static u32 msr_based_features[] = {MSR_IA32_VMX_EPT_VPID_CAP ,MSR_IA32_VMX_VMFUNC , -MSR_F10H_DECFG , +MSR_AMD64_DE_CFG ,MSR_IA32_UCODE_REV , MSR_IA32_ARCH_CAPABILITIES, };
arch/x86/power/cpu.c +1 -0
@@ -533,6 +533,7 @@ static void pm_save_spec_msr(void)MSR_TSX_FORCE_ABORT ,MSR_IA32_MCU_OPT_CTRL ,MSR_AMD64_LS_CFG , +MSR_AMD64_DE_CFG , };msr_build_context (spec_msr_id,ARRAY_SIZE (spec_msr_id));
tools/testing/selftests/kvm/include/x86.h +5 -3
@@ -614,6 +614,11 @@ void vcpu_load_state(struct kvm_vm *vm,#define MSR_AMD64_OSVW_STATUS 0xc0010141#define MSR_AMD64_LS_CFG 0xc0011020#define MSR_AMD64_DC_CFG 0xc0011022 + +#define MSR_AMD64_DE_CFG 0xc0011029 +#define MSR_AMD64_DE_CFG_LFENCE_SERIALIZE_BIT 1 +#define MSR_AMD64_DE_CFG_LFENCE_SERIALIZE BIT_ULL(MSR_AMD64_DE_CFG_LFENCE_SERIALIZE_BIT) +#define MSR_AMD64_BU_CFG2 0xc001102a#define MSR_AMD64_IBSFETCHCTL 0xc0011030#define MSR_AMD64_IBSFETCHLINAD 0xc0011031
@@ -664,9 +669,6 @@ void vcpu_load_state(struct kvm_vm *vm,#define FAM10H_MMIO_CONF_BASE_MASK 0xfffffffULL#define FAM10H_MMIO_CONF_BASE_SHIFT 20#define MSR_FAM10H_NODE_ID 0xc001100c -#define MSR_F10H_DECFG 0xc0011029 -#define MSR_F10H_DECFG_LFENCE_SERIALIZE_BIT 1 -#define MSR_F10H_DECFG_LFENCE_SERIALIZE BIT_ULL(MSR_F10H_DECFG_LFENCE_SERIALIZE_BIT)/* K8 MSRs */ #define MSR_K8_TOP_MEM1 0xc001001a
Greg Kroah-Hartman
maintainerPATCH 43/114 ASoC: wm5102: Revert "ASoC: wm5102: Fix PM disable depth imbalance in wm5102_probe"
In reply to Greg Kroah-HartmanFrom: Zhang Qilong <[email protected]>
[ Upstream commit de71d7567e358effd06dfc3e2a154b25f1331c10 ]
This reverts commit fcbb60820cd3008bb44334a0395e5e57ccb77329.
The pm_runtime_disable is redundant when error returns in wm5102_probe, we just revert the old patch to fix it.
--- sound/soc/codecs/wm5102.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
sound/soc/codecs/wm5102.c +3 -3
@@ -2085,6 +2085,9 @@ static int wm5102_probe(struct platform_device *pdev)regmap_update_bits (arizona->regmap, wm5102_digital_vu[i],WM5102_DIG_VU ,WM5102_DIG_VU ); +pm_runtime_enable (&pdev->dev); +pm_runtime_idle (&pdev->dev); + ret =arizona_request_irq (arizona,ARIZONA_IRQ_DSP_IRQ1 ,"ADSP2 Compressed IRQ" , wm5102_adsp2_irq, wm5102);
@@ -2117,9 +2120,6 @@ static int wm5102_probe(struct platform_device *pdev) goto err_spk_irqs; } -pm_runtime_enable (&pdev->dev); -pm_runtime_idle (&pdev->dev); -return ret; err_spk_irqs:
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 44/114 ASoC: wm5110: Revert "ASoC: wm5110: Fix PM disable depth imbalance in wm5110_probe"
In reply to Greg Kroah-HartmanFrom: Zhang Qilong <[email protected]>
[ Upstream commit 7d4e966f4cd73ff69bf06934e8e14a33fb7ef447 ]
This reverts commit 86b46bf1feb83898d89a2b4a8d08d21e9ea277a7.
The pm_runtime_disable is redundant when error returns in wm5110_probe, we just revert the old patch to fix it.
--- sound/soc/codecs/wm5110.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
sound/soc/codecs/wm5110.c +3 -3
@@ -2453,6 +2453,9 @@ static int wm5110_probe(struct platform_device *pdev)regmap_update_bits (arizona->regmap, wm5110_digital_vu[i],WM5110_DIG_VU ,WM5110_DIG_VU ); +pm_runtime_enable (&pdev->dev); +pm_runtime_idle (&pdev->dev); + ret =arizona_request_irq (arizona,ARIZONA_IRQ_DSP_IRQ1 ,"ADSP2 Compressed IRQ" , wm5110_adsp2_irq, wm5110);
@@ -2485,9 +2488,6 @@ static int wm5110_probe(struct platform_device *pdev) goto err_spk_irqs; } -pm_runtime_enable (&pdev->dev); -pm_runtime_idle (&pdev->dev); -return ret; err_spk_irqs:
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 45/114 ASoC: wm8997: Revert "ASoC: wm8997: Fix PM disable depth imbalance in wm8997_probe"
In reply to Greg Kroah-HartmanFrom: Zhang Qilong <[email protected]>
[ Upstream commit 68ce83e3bb26feba0fcdd59667fde942b3a600a1 ]
This reverts commit 41a736ac20602f64773e80f0f5b32cde1830a44a.
The pm_runtime_disable is redundant when error returns in wm8997_probe, we just revert the old patch to fix it.
--- sound/soc/codecs/wm8997.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
sound/soc/codecs/wm8997.c +3 -3
@@ -1159,6 +1159,9 @@ static int wm8997_probe(struct platform_device *pdev)regmap_update_bits (arizona->regmap, wm8997_digital_vu[i],WM8997_DIG_VU ,WM8997_DIG_VU ); +pm_runtime_enable (&pdev->dev); +pm_runtime_idle (&pdev->dev); +arizona_init_common (arizona); ret =arizona_init_vol_limit (arizona);
@@ -1177,9 +1180,6 @@ static int wm8997_probe(struct platform_device *pdev) goto err_spk_irqs; } -pm_runtime_enable (&pdev->dev); -pm_runtime_idle (&pdev->dev); -return ret; err_spk_irqs:
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 46/114 spi: intel: Fix the offset to get the 64K erase opcode
In reply to Greg Kroah-HartmanFrom: Mauro Lima <[email protected]>
[ Upstream commit 6a43cd02ddbc597dc9a1f82c1e433f871a2f6f06 ]
According to documentation, the 64K erase opcode is located in VSCC range [16:23] instead of [8:15].
Use the proper value to shift the mask over the correct range.
--- drivers/mtd/spi-nor/intel-spi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/spi-nor/intel-spi.c +1 -1
@@ -116,7 +116,7 @@#define ERASE_OPCODE_SHIFT 8#define ERASE_OPCODE_MASK (0xff << ERASE_OPCODE_SHIFT)#define ERASE_64K_OPCODE_SHIFT 16 -#define ERASE_64K_OPCODE_MASK (0xff << ERASE_OPCODE_SHIFT) +#define ERASE_64K_OPCODE_MASK (0xff << ERASE_64K_OPCODE_SHIFT)#define INTEL_SPI_TIMEOUT 5000/* ms */ #define INTEL_SPI_FIFO_SZ 64
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 47/114 selftests/futex: fix build for clang
In reply to Greg Kroah-HartmanFrom: Ricardo Cañuelo <[email protected]>
[ Upstream commit 03cab65a07e083b6c1010fbc8f9b817e9aca75d9 ]
Don't use the test-specific header files as source files to force a target dependency, as clang will complain if more than one source file is used for a compile command with a single '-o' flag.
Use the proper Makefile variables instead as defined in tools/testing/selftests/lib.mk.
--- tools/testing/selftests/futex/functional/Makefile | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
tools/testing/selftests/futex/functional/Makefile +2 -4
@@ -3,11 +3,11 @@ INCLUDES := -I../include -I../../ CFLAGS := $(CFLAGS) -g -O2 -Wall -D_GNU_SOURCE -pthread $(INCLUDES) LDFLAGS := $(LDFLAGS) -pthread -lrt -HEADERS := \ +LOCAL_HDRS := \ ../include/futextest.h \ ../include/atomic.h \ ../include/logging.h -TEST_GEN_FILES := \ +TEST_GEN_PROGS := \ futex_wait_timeout \ futex_wait_wouldblock \ futex_requeue_pi \
@@ -21,5 +21,3 @@ TEST_PROGS := run.sh top_srcdir = ../../../../.. KSFT_KHDR_INSTALL := 1 include ../../lib.mk - -$(TEST_GEN_FILES): $(HEADERS)
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 48/114 selftests/intel_pstate: fix build for ARCH=x86_64
In reply to Greg Kroah-HartmanFrom: Ricardo Cañuelo <[email protected]>
[ Upstream commit beb7d862ed4ac6aa14625418970f22a7d55b8615 ]
Handle the scenario where the build is launched with the ARCH envvar defined as x86_64.
--- tools/testing/selftests/intel_pstate/Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
tools/testing/selftests/intel_pstate/Makefile +3 -3
@@ -2,10 +2,10 @@ CFLAGS := $(CFLAGS) -Wall -D_GNU_SOURCE LDLIBS := $(LDLIBS) -lm -uname_M := $(shell uname -m 2>/dev/null || echo not) -ARCH ?= $(shell echo $(uname_M) | sed -e s/i.86/x86/ -e s/x86_64/x86/) +ARCH ?= $(shell uname -m 2>/dev/null || echo not) +ARCH_PROCESSED := $(shell echo $(ARCH) | sed -e s/i.86/x86/ -e s/x86_64/x86/) -ifeq (x86,$(ARCH)) +ifeq (x86,$(ARCH_PROCESSED)) TEST_GEN_FILES := msr aperf endif
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 49/114 rtc: cmos: fix build on non-ACPI platforms
In reply to Greg Kroah-HartmanFrom: Alexandre Belloni <[email protected]>
[ Upstream commit db4e955ae333567dea02822624106c0b96a2f84f ]
Now that rtc_wake_setup is called outside of cmos_wake_setup, it also need to be defined on non-ACPI platforms.
--- drivers/rtc/rtc-cmos.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/rtc/rtc-cmos.c +3 -0
@@ -1294,6 +1294,9 @@ static void cmos_check_acpi_rtc_status(struct device *dev, { } +static void rtc_wake_setup (struct device *dev) +{ +}#endif #ifdef CONFIG_PNP
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 50/114 NFSv4: Retry LOCK on OLD_STATEID during delegation return
In reply to Greg Kroah-HartmanFrom: Benjamin Coddington <[email protected]>
[ Upstream commit f5ea16137a3fa2858620dc9084466491c128535f ]
There's a small window where a LOCK sent during a delegation return can race with another OPEN on client, but the open stateid has not yet been updated. In this case, the client doesn't handle the OLD_STATEID error from the server and will lose this lock, emitting:
"NFS: nfs4_handle_delegation_recall_error: unhandled error -10024".
Fix this by sending the task through the nfs4 error handling in nfs4_lock_done() when we may have to reconcile our stateid with what the server believes it to be. For this case, the result is a retry of the LOCK operation with the updated stateid.
--- fs/nfs/nfs4proc.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
fs/nfs/nfs4proc.c +4 -2
@@ -6613,6 +6613,7 @@ static void nfs4_lock_done(struct rpc_task *task, void *calldata) {struct nfs4_lockdata *data = calldata;struct nfs4_lock_state *lsp = data->lsp; +struct nfs_server *server =NFS_SERVER (d_inode (data->ctx->dentry));dprintk ("%s: begin!\n" , __func__);
@@ -6622,8 +6623,7 @@ static void nfs4_lock_done(struct rpc_task *task, void *calldata) data->rpc_status = task->tk_status;switch (task->tk_status) {case 0 : -renew_lease (NFS_SERVER (d_inode (data->ctx->dentry)), - data->timestamp); +renew_lease (server, data->timestamp);if (data->arg.new_lock && !data->cancelled) { data->fl.fl_flags &= ~(FL_SLEEP |FL_ACCESS );if (locks_lock_inode_wait (lsp->ls_state->inode, &data->fl) <0 )
@@ -6644,6 +6644,8 @@ static void nfs4_lock_done(struct rpc_task *task, void *calldata)if (!nfs4_stateid_match (&data->arg.open_stateid, &lsp->ls_state->open_stateid)) goto out_restart; +else if (nfs4_async_handle_error (task, server, lsp->ls_state,NULL ) == -EAGAIN ) + goto out_restart; }else if (!nfs4_stateid_match (&data->arg.lock_stateid, &lsp->ls_stateid)) goto out_restart;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 51/114 drm/imx: imx-tve: Fix return type of imx_tve_connector_mode_valid
In reply to Greg Kroah-HartmanFrom: Nathan Huckleberry <[email protected]>
[ Upstream commit fc007fb815ab5395c3962c09b79a1630b0fbed9c ]
The mode_valid field in drm_connector_helper_funcs is expected to be of type:
enum drm_mode_status (* mode_valid) (struct drm_connector *connector,
struct drm_display_mode *mode);
The mismatched return type breaks forward edge kCFI since the underlying function definition does not match the function hook definition.
The return type of imx_tve_connector_mode_valid should be changed from int to enum drm_mode_status.
--- drivers/gpu/drm/imx/imx-tve.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/gpu/drm/imx/imx-tve.c +3 -2
@@ -243,8 +243,9 @@ static int imx_tve_connector_get_modes(struct drm_connector *connector)return ret; } -static int imx_tve_connector_mode_valid (struct drm_connector *connector, -struct drm_display_mode *mode) +static enum drm_mode_status +imx_tve_connector_mode_valid (struct drm_connector *connector, +struct drm_display_mode *mode) {struct imx_tve *tve =con_to_tve (connector);unsigned long rate;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 52/114 btrfs: remove pointless and double ulist frees in error paths of qgroup tests
In reply to Greg Kroah-HartmanFrom: Filipe Manana <[email protected]>
[ Upstream commit d0ea17aec12ea0f7b9d2ed727d8ef8169d1e7699 ]
Several places in the qgroup self tests follow the pattern of freeing the ulist pointer they passed to btrfs_find_all_roots() if the call to that function returned an error. That is pointless because that function always frees the ulist in case it returns an error.
Also In some places like at test_multiple_refs(), after a call to btrfs_qgroup_account_extent() we also leave "old_roots" and "new_roots" pointing to ulists that were freed, because btrfs_qgroup_account_extent() has freed those ulists, and if after that the next call to btrfs_find_all_roots() fails, we call ulist_free() on the "old_roots" ulist again, resulting in a double free.
So remove those calls to reduce the code size and avoid double ulist free in case of an error.
--- fs/btrfs/tests/qgroup-tests.c | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-)
fs/btrfs/tests/qgroup-tests.c +4 -12
@@ -230,7 +230,6 @@ static int test_no_shared_qgroup(struct btrfs_root *root, ret =btrfs_find_all_roots (&trans, fs_info, nodesize,0 , &old_roots, false);if (ret) { -ulist_free (old_roots);test_err ("couldn't find old roots: %d" , ret);return ret; }
@@ -246,7 +245,6 @@ static int test_no_shared_qgroup(struct btrfs_root *root, false);if (ret) {ulist_free (old_roots); -ulist_free (new_roots);test_err ("couldn't find old roots: %d" , ret);return ret; }
@@ -258,18 +256,19 @@ static int test_no_shared_qgroup(struct btrfs_root *root,return ret; } +/* btrfs_qgroup_account_extent() always frees the ulists passed to it. */ + old_roots =NULL ; + new_roots =NULL ; +if (btrfs_verify_qgroup_counts (fs_info,BTRFS_FS_TREE_OBJECTID , nodesize, nodesize)) {test_err ("qgroup counts didn't match expected values" );return -EINVAL ; } - old_roots =NULL ; - new_roots =NULL ; ret =btrfs_find_all_roots (&trans, fs_info, nodesize,0 , &old_roots, false);if (ret) { -ulist_free (old_roots);test_err ("couldn't find old roots: %d" , ret);return ret; }
@@ -284,7 +283,6 @@ static int test_no_shared_qgroup(struct btrfs_root *root, false);if (ret) {ulist_free (old_roots); -ulist_free (new_roots);test_err ("couldn't find old roots: %d" , ret);return ret; }
@@ -335,7 +333,6 @@ static int test_multiple_refs(struct btrfs_root *root, ret =btrfs_find_all_roots (&trans, fs_info, nodesize,0 , &old_roots, false);if (ret) { -ulist_free (old_roots);test_err ("couldn't find old roots: %d" , ret);return ret; }
@@ -351,7 +348,6 @@ static int test_multiple_refs(struct btrfs_root *root, false);if (ret) {ulist_free (old_roots); -ulist_free (new_roots);test_err ("couldn't find old roots: %d" , ret);return ret; }
@@ -372,7 +368,6 @@ static int test_multiple_refs(struct btrfs_root *root, ret =btrfs_find_all_roots (&trans, fs_info, nodesize,0 , &old_roots, false);if (ret) { -ulist_free (old_roots);test_err ("couldn't find old roots: %d" , ret);return ret; }
@@ -388,7 +383,6 @@ static int test_multiple_refs(struct btrfs_root *root, false);if (ret) {ulist_free (old_roots); -ulist_free (new_roots);test_err ("couldn't find old roots: %d" , ret);return ret; }
@@ -415,7 +409,6 @@ static int test_multiple_refs(struct btrfs_root *root, ret =btrfs_find_all_roots (&trans, fs_info, nodesize,0 , &old_roots, false);if (ret) { -ulist_free (old_roots);test_err ("couldn't find old roots: %d" , ret);return ret; }
@@ -431,7 +424,6 @@ static int test_multiple_refs(struct btrfs_root *root, false);if (ret) {ulist_free (old_roots); -ulist_free (new_roots);test_err ("couldn't find old roots: %d" , ret);return ret; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 53/114 Bluetooth: L2CAP: Fix l2cap_global_chan_by_psm
In reply to Greg Kroah-HartmanFrom: Luiz Augusto von Dentz <[email protected]>
[ Upstream commit f937b758a188d6fd328a81367087eddbb2fce50f ]
l2cap_global_chan_by_psm shall not return fixed channels as they are not meant to be connected by (S)PSM.
--- net/bluetooth/l2cap_core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/bluetooth/l2cap_core.c +1 -1
@@ -1824,7 +1824,7 @@ static struct l2cap_chan *l2cap_global_chan_by_psm(int state, __le16 psm,if (link_type ==LE_LINK && c->src_type ==BDADDR_BREDR )continue ; -if (c->psm == psm) { +if (c->chan_type !=L2CAP_CHAN_FIXED && c->psm == psm) {int src_match, dst_match;int src_any, dst_any;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 54/114 ASoC: core: Fix use-after-free in snd_soc_exit()
In reply to Greg Kroah-HartmanFrom: Chen Zhongjin <[email protected]>
[ Upstream commit 6ec27c53886c8963729885bcf2dd996eba2767a7 ]
KASAN reports a use-after-free:
BUG: KASAN: use-after-free in device_del+0xb5b/0xc60 Read of size 8 at addr ffff888008655050 by task rmmod/387 CPU: 2 PID: 387 Comm: rmmod Hardware name: QEMU Standard PC (i440FX + PIIX, 1996) Call Trace: <TASK> dump_stack_lvl+0x79/0x9a print_report+0x17f/0x47b kasan_report+0xbb/0xf0 device_del+0xb5b/0xc60 platform_device_del.part.0+0x24/0x200 platform_device_unregister+0x2e/0x40 snd_soc_exit+0xa/0x22 [snd_soc_core] __do_sys_delete_module.constprop.0+0x34f/0x5b0 do_syscall_64+0x3a/0x90 entry_SYSCALL_64_after_hwframe+0x63/0xcd ... </TASK>
It's bacause in snd_soc_init(), snd_soc_util_init() is possble to fail, but its ret is ignored, which makes soc_dummy_dev unregistered twice.
snd_soc_init()
snd_soc_util_init()
platform_device_register_simple(soc_dummy_dev) platform_driver_register() # fail platform_device_unregister(soc_dummy_dev)
platform_driver_register() # success
...snd_soc_exit()
snd_soc_util_exit()
# soc_dummy_dev will be unregistered for second time
To fix it, handle error and stop snd_soc_init() when util_init() fail. Also clean debugfs when util_init() or driver_register() fail.
--- sound/soc/soc-core.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-)
sound/soc/soc-core.c +15 -2
@@ -3863,10 +3863,23 @@ EXPORT_SYMBOL_GPL(snd_soc_of_get_dai_link_codecs);static int __init snd_soc_init (void ) { +int ret; +snd_soc_debugfs_init (); -snd_soc_util_init (); + ret =snd_soc_util_init (); +if (ret) + goto err_util_init; -return platform_driver_register (&soc_driver); + ret =platform_driver_register (&soc_driver); +if (ret) + goto err_register; +return 0 ; + +err_register: +snd_soc_util_exit (); +err_util_init: +snd_soc_debugfs_exit (); +return ret; }module_init (snd_soc_init);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 55/114 serial: 8250_omap: remove wait loop from Errata i202 workaround
In reply to Greg Kroah-HartmanFrom: Matthias Schiffer <[email protected]>
[ Upstream commit e828e56684d61b17317e0cfdef83791fa61cb76b ]
We were occasionally seeing the "Errata i202: timedout" on an AM335x board when repeatedly opening and closing a UART connected to an active sender. As new input may arrive at any time, it is possible to miss the "RX FIFO empty" condition, forcing the loop to wait until it times out.
Nothing in the i202 Advisory states that such a wait is even necessary; other FIFO clear functions like serial8250_clear_fifos() do not wait either. For this reason, it seems safe to remove the wait, fixing the mentioned issue.
--- drivers/tty/serial/8250/8250_omap.c | 17 ----------------- 1 file changed, 17 deletions(-)
drivers/tty/serial/8250/8250_omap.c +0 -17
@@ -162,27 +162,10 @@ static void omap8250_set_mctrl(struct uart_port *port, unsigned int mctrl)static void omap_8250_mdr1_errataset (struct uart_8250_port *up,struct omap8250_priv *priv) { -u8 timeout =255 ; -serial_out (up,UART_OMAP_MDR1 , priv->mdr1);udelay (2 );serial_out (up,UART_FCR , up->fcr |UART_FCR_CLEAR_XMIT |UART_FCR_CLEAR_RCVR ); -/* -* Wait for FIFO to empty: when empty, RX_FIFO_E bit is 0 and -* TX_FIFO_E bit is 1. -*/ -while (UART_LSR_THRE != (serial_in (up,UART_LSR ) & - (UART_LSR_THRE |UART_LSR_DR ))) { - timeout--; -if (!timeout) { -/* Should *never* happen. we warn and carry on */ -dev_crit (up->port.dev,"Errata i202: timedout %x\n" , -serial_in (up,UART_LSR )); -break ; - } -udelay (1 ); - } } static void omap_8250_get_divisor(struct uart_port *port, unsigned int baud,
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 56/114 serial: 8250: omap: Flush PM QOS work on remove
In reply to Greg Kroah-HartmanFrom: Tony Lindgren <[email protected]>
[ Upstream commit d0b68629bd2fb61e0171a62f2e8da3db322f5cf6 ]
Rebinding 8250_omap in a loop will at some point produce a warning for kernel/power/qos.c:296 cpu_latency_qos_update_request() with error "cpu_latency_qos_update_request called for unknown object". Let's flush the possibly pending PM QOS work scheduled from omap8250_runtime_suspend() before we disable runtime PM.
--- drivers/tty/serial/8250/8250_omap.c | 1 + 1 file changed, 1 insertion(+)
drivers/tty/serial/8250/8250_omap.c +1 -0
@@ -1262,6 +1262,7 @@ static int omap8250_remove(struct platform_device *pdev)pm_runtime_dont_use_autosuspend (&pdev->dev);pm_runtime_put_sync (&pdev->dev); +flush_work (&priv->qos_work);pm_runtime_disable (&pdev->dev);serial8250_unregister_port (priv->line);pm_qos_remove_request (&priv->pm_qos_request);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 57/114 serial: imx: Add missing .thaw_noirq hook
In reply to Greg Kroah-HartmanFrom: Shawn Guo <[email protected]>
[ Upstream commit 4561d8008a467cb05ac632a215391d6b787f40aa ]
The following warning is seen with non-console UART instance when system hibernates.
[ 37.371969] ------------[ cut here ]------------ [ 37.376599] uart3_root_clk already disabled [ 37.380810] WARNING: CPU: 0 PID: 296 at drivers/clk/clk.c:952 clk_core_disable+0xa4/0xb0 ... [ 37.506986] Call trace: [ 37.509432] clk_core_disable+0xa4/0xb0 [ 37.513270] clk_disable+0x34/0x50 [ 37.516672] imx_uart_thaw+0x38/0x5c [ 37.520250] platform_pm_thaw+0x30/0x6c [ 37.524089] dpm_run_callback.constprop.0+0x3c/0xd4 [ 37.528972] device_resume+0x7c/0x160 [ 37.532633] dpm_resume+0xe8/0x230 [ 37.536036] hibernation_snapshot+0x288/0x430 [ 37.540397] hibernate+0x10c/0x2e0 [ 37.543798] state_store+0xc4/0xd0 [ 37.547203] kobj_attr_store+0x1c/0x30 [ 37.550953] sysfs_kf_write+0x48/0x60 [ 37.554619] kernfs_fop_write_iter+0x118/0x1ac [ 37.559063] new_sync_write+0xe8/0x184 [ 37.562812] vfs_write+0x230/0x290 [ 37.566214] ksys_write+0x68/0xf4 [ 37.569529] __arm64_sys_write+0x20/0x2c [ 37.573452] invoke_syscall.constprop.0+0x50/0xf0 [ 37.578156] do_el0_svc+0x11c/0x150 [ 37.581648] el0_svc+0x30/0x140 [ 37.584792] el0t_64_sync_handler+0xe8/0xf0 [ 37.588976] el0t_64_sync+0x1a0/0x1a4 [ 37.592639] ---[ end trace 56e22eec54676d75 ]---
On hibernating, pm core calls into related hooks in sequence like:
.freeze
.freeze_noirq
.thaw_noirq
.thaw
With .thaw_noirq hook being absent, the clock will be disabled in a unbalanced call which results the warning above.
imx_uart_freeze()
clk_prepare_enable()
imx_uart_suspend_noirq()
clk_disable()
imx_uart_thaw
clk_disable_unprepare()
Adding the missing .thaw_noirq hook as imx_uart_resume_noirq() will have the call sequence corrected as below and thus fix the warning.
imx_uart_freeze()
clk_prepare_enable()
imx_uart_suspend_noirq()
clk_disable()
imx_uart_resume_noirq()
clk_enable()
imx_uart_thaw
clk_disable_unprepare()
--- drivers/tty/serial/imx.c | 1 + 1 file changed, 1 insertion(+)
drivers/tty/serial/imx.c +1 -0
@@ -2510,6 +2510,7 @@ static const struct dev_pm_ops imx_uart_pm_ops = { .suspend_noirq = imx_uart_suspend_noirq, .resume_noirq = imx_uart_resume_noirq, .freeze_noirq = imx_uart_suspend_noirq, + .thaw_noirq = imx_uart_resume_noirq, .restore_noirq = imx_uart_resume_noirq, .suspend = imx_uart_suspend, .resume = imx_uart_resume,
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 58/114 tty: n_gsm: fix sleep-in-atomic-context bug in gsm_control_send
In reply to Greg Kroah-HartmanFrom: Duoming Zhou <[email protected]>
[ Upstream commit 7b7dfe4833c70a11cdfa51b38705103bd31eddaa ]
The function gsm_dlci_t1() is a timer handler that runs in an atomic context, but it calls "kzalloc(..., GFP_KERNEL)" that may sleep. As a result, the sleep-in-atomic-context bug will happen. The process is shown below:
gsm_dlci_t1()
gsm_dlci_open()
gsm_modem_update()
gsm_modem_upd_via_msc()
gsm_control_send()
kzalloc(sizeof(.., GFP_KERNEL) //may sleep
This patch changes the gfp_t parameter of kzalloc() from GFP_KERNEL to GFP_ATOMIC in order to mitigate the bug.
--- drivers/tty/n_gsm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/tty/n_gsm.c +1 -1
@@ -1413,7 +1413,7 @@ static struct gsm_control *gsm_control_send(struct gsm_mux *gsm, unsigned int command, u8 *data, int clen) { struct gsm_control *ctrl = kzalloc(sizeof(struct gsm_control), -GFP_KERNEL ); +GFP_ATOMIC );unsigned long flags;if (ctrl ==NULL )return NULL ;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 59/114 ASoC: soc-utils: Remove __exit for snd_soc_util_exit()
In reply to Greg Kroah-HartmanFrom: Chen Zhongjin <[email protected]>
[ Upstream commit 314d34fe7f0a5836cb0472950c1f17744b4efde8 ]
snd_soc_util_exit() is called in __init snd_soc_init() for cleanup. Remove the __exit annotation for it to fix the build warning:
WARNING: modpost: sound/soc/snd-soc-core.o: section mismatch in reference: init_module (section: .init.text) -> snd_soc_util_exit (section: .exit.text)
--- sound/soc/soc-utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/soc/soc-utils.c +1 -1
@@ -373,7 +373,7 @@ int __init snd_soc_util_init(void)return ret; } -void __exit snd_soc_util_exit(void) +void snd_soc_util_exit (void ) {platform_driver_unregister (&soc_dummy_driver);platform_device_unregister (soc_dummy_dev);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 60/114 block: sed-opal: kmalloc the cmd/resp buffers
In reply to Greg Kroah-HartmanFrom: Serge Semin <[email protected]>
[ Upstream commit f829230dd51974c1f4478900ed30bb77ba530b40 ]
In accordance with [1] the DMA-able memory buffers must be cacheline-aligned otherwise the cache writing-back and invalidation performed during the mapping may cause the adjacent data being lost. It's specifically required for the DMA-noncoherent platforms [2]. Seeing the opal_dev.{cmd,resp} buffers are implicitly used for DMAs in the NVME and SCSI/SD drivers in framework of the nvme_sec_submit() and sd_sec_submit() methods respectively they must be cacheline-aligned to prevent the denoted problem. One of the option to guarantee that is to kmalloc the buffers [2]. Let's explicitly allocate them then instead of embedding into the opal_dev structure instance.
Note this fix was inspired by the commit c94b7f9bab22 ("nvme-hwmon:
kmalloc the NVME SMART log buffer").
[1] Documentation/core-api/dma-api.rst
[2] Documentation/core-api/dma-api-howto.rst
--- block/sed-opal.c | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-)
block/sed-opal.c +28 -4
@@ -94,8 +94,8 @@ struct opal_dev {u64 lowest_lba;size_t pos; -u8 cmd[IO_BUFFER_LENGTH ]; -u8 resp[IO_BUFFER_LENGTH ]; +u8 *cmd; +u8 *resp;struct parsed_resp parsed;size_t prev_d_len;
@@ -2028,6 +2028,8 @@ void free_opal_dev(struct opal_dev *dev)if (!dev)return ;clean_opal_dev (dev); +kfree (dev->resp); +kfree (dev->cmd);kfree (dev); }EXPORT_SYMBOL (free_opal_dev);
@@ -2040,16 +2042,38 @@ struct opal_dev *init_opal_dev(void *data, sec_send_recv *send_recv)if (!dev)return NULL ; +/* +* Presumably DMA-able buffers must be cache-aligned. Kmalloc makes +* sure the allocated buffer is DMA-safe in that regard. +*/ + dev->cmd =kmalloc (IO_BUFFER_LENGTH ,GFP_KERNEL ); +if (!dev->cmd) + goto err_free_dev; + + dev->resp =kmalloc (IO_BUFFER_LENGTH ,GFP_KERNEL ); +if (!dev->resp) + goto err_free_cmd; +INIT_LIST_HEAD (&dev->unlk_lst);mutex_init (&dev->dev_lock); dev->data = data; dev->send_recv = send_recv;if (check_opal_support (dev) !=0 ) {pr_debug ("Opal is not supported on this device\n" ); -kfree (dev); -return NULL ; + goto err_free_resp; }return dev; + +err_free_resp: +kfree (dev->resp); + +err_free_cmd: +kfree (dev->cmd); + +err_free_dev: +kfree (dev); + +return NULL ; }EXPORT_SYMBOL (init_opal_dev);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 61/114 siox: fix possible memory leak in siox_device_add()
In reply to Greg Kroah-HartmanFrom: Yang Yingliang <[email protected]>
[ Upstream commit 6e63153db50059fb78b8a8447b132664887d24e3 ]
If device_register() returns error in siox_device_add(), the name allocated by dev_set_name() need be freed. As comment of device_register() says, it should use put_device() to give up the reference in the error path. So fix this by calling put_device(), then the name can be freed in kobject_cleanup(), and sdevice is freed in siox_device_release(), set it to null in error path.
--- drivers/siox/siox-core.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/siox/siox-core.c +2 -0
@@ -835,6 +835,8 @@ static struct siox_device *siox_device_add(struct siox_master *smaster, err_device_register:/* don't care to make the buffer smaller again */ +put_device (&sdevice->dev); + sdevice =NULL ; err_buf_alloc:siox_master_unlock (smaster);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 62/114 parport_pc: Avoid FIFO port location truncation
In reply to Greg Kroah-HartmanFrom: Maciej W. Rozycki <[email protected]>
[ Upstream commit ab126f51c93a15093df604f661c9480854c005a3 ]
Match the data type of a temporary holding a reference to the FIFO port with the type of the original reference coming from `struct parport', avoiding data truncation with LP64 ports such as SPARC64 that refer to PCI port I/O locations via their corresponding MMIO addresses and will therefore have non-zero bits in the high 32-bit part of the reference. And in any case it is cleaner to have the data types matching here.
--- drivers/parport/parport_pc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/parport/parport_pc.c +1 -1
@@ -474,7 +474,7 @@ static size_t parport_pc_fifo_write_block_pio(struct parport *port,const unsigned char *bufp = buf;size_t left = length;unsigned long expire = jiffies + port->physport->cad->timeout; -const int fifo =FIFO (port); +const unsigned long fifo =FIFO (port);int poll_for =8 ;/* 80 usecs */ const struct parport_pc_private *priv = port->physport->private_data;const int fifo_depth = priv->fifo_depth;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 63/114 pinctrl: devicetree: fix null pointer dereferencing in pinctrl_dt_to_map
In reply to Greg Kroah-HartmanFrom: Zeng Heng <[email protected]>
[ Upstream commit 91d5c5060ee24fe8da88cd585bb43b843d2f0dce ]
Here is the BUG report by KASAN about null pointer dereference:
BUG: KASAN: null-ptr-deref in strcmp+0x2e/0x50 Read of size 1 at addr 0000000000000000 by task python3/2640 Call Trace: strcmp __of_find_property of_find_property pinctrl_dt_to_map
kasprintf() would return NULL pointer when kmalloc() fail to allocate. So directly return ENOMEM, if kasprintf() return NULL pointer.
--- drivers/pinctrl/devicetree.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/pinctrl/devicetree.c +2 -0
@@ -235,6 +235,8 @@ int pinctrl_dt_to_map(struct pinctrl *p, struct pinctrl_dev *pctldev)for (state =0 ; ; state++) {/* Retrieve the pinctrl-* property */ propname =kasprintf (GFP_KERNEL ,"pinctrl-%d" , state); +if (!propname) +return -ENOMEM ; prop =of_find_property (np, propname, &size);kfree (propname);if (!prop) {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 64/114 ata: libata-transport: fix double ata_host_put() in ata_tport_add()
In reply to Greg Kroah-HartmanFrom: Yang Yingliang <[email protected]>
[ Upstream commit 8c76310740807ade5ecdab5888f70ecb6d35732e ]
In the error path in ata_tport_add(), when calling put_device(), ata_tport_release() is called, it will put the refcount of 'ap->host'.
And then ata_host_put() is called again, the refcount is decreased to 0, ata_host_release() is called, all ports are freed and set to null.
When unbinding the device after failure, ata_host_stop() is called to release the resources, it leads a null-ptr-deref(), because all the ports all freed and null.
Unable to handle kernel NULL pointer dereference at virtual address 0000000000000008 CPU: 7 PID: 18671 Comm: modprobe Kdump: loaded Tainted: G E 6.1.0-rc3+ #8 pstate: 80400009 (Nzcv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--) pc : ata_host_stop+0x3c/0x84 [libata] lr : release_nodes+0x64/0xd0 Call trace: ata_host_stop+0x3c/0x84 [libata] release_nodes+0x64/0xd0 devres_release_all+0xbc/0x1b0 device_unbind_cleanup+0x20/0x70 really_probe+0x158/0x320 __driver_probe_device+0x84/0x120 driver_probe_device+0x44/0x120 __driver_attach+0xb4/0x220 bus_for_each_dev+0x78/0xdc driver_attach+0x2c/0x40 bus_add_driver+0x184/0x240 driver_register+0x80/0x13c __pci_register_driver+0x4c/0x60 ahci_pci_driver_init+0x30/0x1000 [ahci]
Fix this by removing redundant ata_host_put() in the error path.
--- drivers/ata/libata-transport.c | 1 - 1 file changed, 1 deletion(-)
drivers/ata/libata-transport.c +0 -1
@@ -317,7 +317,6 @@ int ata_tport_add(struct device *parent, tport_err:transport_destroy_device (dev);put_device (dev); -ata_host_put (ap->host);return error; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 65/114 net: bgmac: Drop free_netdev() from bgmac_enet_remove()
In reply to Greg Kroah-HartmanFrom: Wei Yongjun <[email protected]>
[ Upstream commit 6f928ab8ee9bfbcb0e631c47ea8a16c3d5116ff1 ]
netdev is allocated in bgmac_alloc() with devm_alloc_etherdev() and will be auto released in ->remove and ->probe failure path. Using free_netdev() in bgmac_enet_remove() leads to double free.
--- drivers/net/ethernet/broadcom/bgmac.c | 1 - 1 file changed, 1 deletion(-)
drivers/net/ethernet/broadcom/bgmac.c +0 -1
@@ -1566,7 +1566,6 @@ void bgmac_enet_remove(struct bgmac *bgmac)phy_disconnect (bgmac->net_dev->phydev);netif_napi_del (&bgmac->napi);bgmac_dma_free (bgmac); -free_netdev (bgmac->net_dev); }EXPORT_SYMBOL_GPL (bgmac_enet_remove);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 66/114 mISDN: fix possible memory leak in mISDN_dsp_element_register()
In reply to Greg Kroah-HartmanFrom: Yang Yingliang <[email protected]>
[ Upstream commit 98a2ac1ca8fd6eca6867726fe238d06e75eb1acd ]
Afer commit 1fa5ae857bb1 ("driver core: get rid of struct device's bus_id string array"), the name of device is allocated dynamically, use put_device() to give up the reference, so that the name can be freed in kobject_cleanup() when the refcount is 0.
The 'entry' is going to be freed in mISDN_dsp_dev_release(), so the kfree() is removed. list_del() is called in mISDN_dsp_dev_release(), so it need be initialized.
--- drivers/isdn/mISDN/dsp_pipeline.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/isdn/mISDN/dsp_pipeline.c +2 -1
@@ -97,6 +97,7 @@ int mISDN_dsp_element_register(struct mISDN_dsp_element *elem)if (!entry)return -ENOMEM ; +INIT_LIST_HEAD (&entry->list); entry->elem = elem; entry->dev.class = elements_class;
@@ -131,7 +132,7 @@ int mISDN_dsp_element_register(struct mISDN_dsp_element *elem)device_unregister (&entry->dev);return ret; err1: -kfree (entry); +put_device (&entry->dev);return ret; }EXPORT_SYMBOL (mISDN_dsp_element_register);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 67/114 mISDN: fix misuse of put_device() in mISDN_register_device()
In reply to Greg Kroah-HartmanFrom: Wang ShaoBo <[email protected]>
[ Upstream commit 2d25107e111a85c56f601a5470f1780ec054e6ac ]
We should not release reference by put_device() before calling device_initialize().
--- drivers/isdn/mISDN/core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/isdn/mISDN/core.c +1 -1
@@ -231,7 +231,7 @@ mISDN_register_device(struct mISDNdevice *dev, err =get_free_devid ();if (err <0 ) - goto error1; +return err; dev->id = err;device_initialize (&dev->dev);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 68/114 net: caif: fix double disconnect client in chnl_net_open()
In reply to Greg Kroah-HartmanFrom: Zhengchao Shao <[email protected]>
[ Upstream commit 8fbb53c8bfd8c56ecf1f78dc821778b58f505503 ]
When connecting to client timeout, disconnect client for twice in chnl_net_open(). Remove one. Compile tested only.
--- net/caif/chnl_net.c | 3 --- 1 file changed, 3 deletions(-)
net/caif/chnl_net.c +0 -3
@@ -314,9 +314,6 @@ static int chnl_net_open(struct net_device *dev)if (result ==0 ) {pr_debug ("connect timeout\n" ); -caif_disconnect_client (dev_net (dev), &priv->chnl); - priv->state =CAIF_DISCONNECTED ; -pr_debug ("state disconnected\n" ); result = -ETIMEDOUT ; goto error; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 69/114 bnxt_en: Remove debugfs when pci_register_driver failed
In reply to Greg Kroah-HartmanFrom: Gaosheng Cui <[email protected]>
[ Upstream commit 991aef4ee4f6eb999924f429b943441a32835c8f ]
When pci_register_driver failed, we need to remove debugfs, which will caused a resource leak, fix it.
Resource leak logs as follows:
[ 52.184456] debugfs: Directory 'bnxt_en' with parent '/' already present!
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +9 -1
@@ -9383,8 +9383,16 @@ static struct pci_driver bnxt_pci_driver = {static int __init bnxt_init (void ) { +int err; +bnxt_debug_init (); -return pci_register_driver (&bnxt_pci_driver); + err =pci_register_driver (&bnxt_pci_driver); +if (err) { +bnxt_debug_exit (); +return err; + } + +return 0 ; } static void __exit bnxt_exit(void)
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 70/114 xen/pcpu: fix possible memory leak in register_pcpu()
In reply to Greg Kroah-HartmanFrom: Yang Yingliang <[email protected]>
[ Upstream commit da36a2a76b01b210ffaa55cdc2c99bc8783697c5 ]
In device_add(), dev_set_name() is called to allocate name, if it returns error, the name need be freed. As comment of device_register() says, it should use put_device() to give up the reference in the error path. So fix this by calling put_device(), then the name can be freed in kobject_cleanup().
--- drivers/xen/pcpu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/xen/pcpu.c +1 -1
@@ -228,7 +228,7 @@ static int register_pcpu(struct pcpu *pcpu) err =device_register (dev);if (err) { -pcpu_release (dev); +put_device (dev);return err; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 71/114 drbd: use after free in drbd_create_device()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit a7a1598189228b5007369a9622ccdf587be0730f ]
The drbd_destroy_connection() frees the "connection" so use the _safe() iterator to prevent a use after free.
--- drivers/block/drbd/drbd_main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/block/drbd/drbd_main.c +2 -2
@@ -2770,7 +2770,7 @@ static int init_submitter(struct drbd_device *device)enum drbd_ret_code drbd_create_device (struct drbd_config_context *adm_ctx,unsigned int minor) {struct drbd_resource *resource = adm_ctx->resource; -struct drbd_connection *connection; +struct drbd_connection *connection, *n;struct drbd_device *device;struct drbd_peer_device *peer_device, *tmp_peer_device;struct gendisk *disk;
@@ -2898,7 +2898,7 @@ enum drbd_ret_code drbd_create_device(struct drbd_config_context *adm_ctx, unsig out_idr_remove_vol:idr_remove (&connection->peer_devices, vnr); out_idr_remove_from_resource: -for_each_connection (connection, resource) { +for_each_connection_safe (connection, n, resource) { peer_device =idr_remove (&connection->peer_devices, vnr);if (peer_device)kref_put (&connection->kref, drbd_destroy_connection);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 72/114 net/x25: Fix skb leak in x25_lapb_receive_frame()
In reply to Greg Kroah-HartmanFrom: Wei Yongjun <[email protected]>
[ Upstream commit 2929cceb2fcf0ded7182562e4888afafece82cce ]
x25_lapb_receive_frame() using skb_copy() to get a private copy of skb, the new skb should be freed in the undersized/fragmented skb error handling path. Otherwise there is a memory leak.
--- net/x25/x25_dev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/x25/x25_dev.c +1 -1
@@ -122,7 +122,7 @@ int x25_lapb_receive_frame(struct sk_buff *skb, struct net_device *dev,if (!pskb_may_pull (skb,1 )) {x25_neigh_put (nb); -return 0 ; + goto drop; }switch (skb->data[0 ]) {
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 73/114 cifs: Fix wrong return value checking when GETFLAGS
In reply to Greg Kroah-HartmanFrom: Zhang Xiaoxu <[email protected]>
[ Upstream commit 92bbd67a55fee50743b42825d1c016e7fd5c79f9 ]
The return value of CIFSGetExtAttr is negative, should be checked with -EOPNOTSUPP rather than EOPNOTSUPP.
--- fs/cifs/ioctl.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
fs/cifs/ioctl.c +2 -2
@@ -149,7 +149,7 @@ long cifs_ioctl(struct file *filep, unsigned int command, unsigned long arg) rc =put_user (ExtAttrBits &FS_FL_USER_VISIBLE , (int __user *)arg); -if (rc !=EOPNOTSUPP ) +if (rc != -EOPNOTSUPP ) break; }#endif /* CONFIG_CIFS_POSIX */
@@ -178,7 +178,7 @@ long cifs_ioctl(struct file *filep, unsigned int command, unsigned long arg)* pSMBFile->fid.netfid, * extAttrBits, * &ExtAttrMask); -* if (rc != EOPNOTSUPP) +* if (rc != -EOPNOTSUPP) * break; */
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 74/114 net: thunderbolt: Fix error handling in tbnet_init()
In reply to Greg Kroah-HartmanFrom: Yuan Can <[email protected]>
[ Upstream commit f524b7289bbb0c8ffaa2ba3c34c146e43da54fb2 ]
A problem about insmod thunderbolt-net failed is triggered with following log given while lsmod does not show thunderbolt_net:
insmod: ERROR: could not insert module thunderbolt-net.ko: File exists
The reason is that tbnet_init() returns tb_register_service_driver() directly without checking its return value, if tb_register_service_driver() failed, it returns without removing property directory, resulting the property directory can never be created later.
tbnet_init()
tb_register_property_dir() # register property directory tb_register_service_driver()
driver_register()
bus_add_driver()
priv = kzalloc(...) # OOM happened
# return without remove property directory
Fix by remove property directory when tb_register_service_driver() returns error.
--- drivers/net/thunderbolt.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-)
drivers/net/thunderbolt.c +14 -5
@@ -1342,12 +1342,21 @@ static int __init tbnet_init(void) TBNET_MATCH_FRAGS_ID); ret =tb_register_property_dir ("network" , tbnet_dir); -if (ret) { -tb_property_free_dir (tbnet_dir); -return ret; - } +if (ret) + goto err_free_dir; + + ret =tb_register_service_driver (&tbnet_driver); +if (ret) + goto err_unregister; -return tb_register_service_driver (&tbnet_driver); +return 0 ; + +err_unregister: +tb_unregister_property_dir ("network" , tbnet_dir); +err_free_dir: +tb_property_free_dir (tbnet_dir); + +return ret; }module_init (tbnet_init);
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 75/114 ftrace: Fix the possible incorrect kernel message
In reply to Greg Kroah-HartmanFrom: Wang Wensheng <[email protected]>
commit 08948caebe93482db1adfd2154eba124f66d161d upstream.
If the number of mcount entries is an integer multiple of ENTRIES_PER_PAGE, the page count showing on the console would be wrong.
--- kernel/trace/ftrace.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/trace/ftrace.c +1 -1
@@ -6229,7 +6229,7 @@ void __init ftrace_init(void) }pr_info ("ftrace: allocating %ld entries in %ld pages\n" , - count, count /ENTRIES_PER_PAGE +1 ); + count,DIV_ROUND_UP (count,ENTRIES_PER_PAGE )); last_ftrace_enabled = ftrace_enabled =1 ;
Greg Kroah-Hartman
maintainerPATCH 76/114 ftrace: Optimize the allocation for mcount entries
In reply to Greg Kroah-HartmanFrom: Wang Wensheng <[email protected]>
commit bcea02b096333dc74af987cb9685a4dbdd820840 upstream.
If we can't allocate this size, try something smaller with half of the size. Its order should be decreased by one instead of divided by two.
--- kernel/trace/ftrace.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/trace/ftrace.c +1 -1
@@ -3033,7 +3033,7 @@ static int ftrace_allocate_records(struc/* if we can't allocate this size, try something smaller */ if (!order)return -ENOMEM ; - order >>=1 ; + order--; goto again; }
Greg Kroah-Hartman
maintainerPATCH 77/114 ftrace: Fix null pointer dereference in ftrace_add_mod()
In reply to Greg Kroah-HartmanFrom: Xiu Jianfeng <[email protected]>
commit 19ba6c8af9382c4c05dc6a0a79af3013b9a35cd0 upstream.
The @ftrace_mod is allocated by kzalloc(), so both the members {prev,next} of @ftrace_mode->list are NULL, it's not a valid state to call list_del(). If kstrdup() for @ftrace_mod->{func|module} fails, it goes to @out_free tag and calls free_ftrace_mod() to destroy @ftrace_mod, then list_del() will write prev->next and next->prev, where null pointer dereference happens.
BUG: kernel NULL pointer dereference, address: 0000000000000008 Oops: 0002 [#1] PREEMPT SMP NOPTI Call Trace: <TASK> ftrace_mod_callback+0x20d/0x220 ? do_filp_open+0xd9/0x140 ftrace_process_regex.isra.51+0xbf/0x130 ftrace_regex_write.isra.52.part.53+0x6e/0x90 vfs_write+0xee/0x3a0 ? __audit_filter_op+0xb1/0x100 ? auditd_test_task+0x38/0x50 ksys_write+0xa5/0xe0 do_syscall_64+0x3a/0x90 entry_SYSCALL_64_after_hwframe+0x63/0xcd Kernel panic - not syncing: Fatal exception
So call INIT_LIST_HEAD() to initialize the list member to fix this issue.
--- kernel/trace/ftrace.c | 1 + 1 file changed, 1 insertion(+)
kernel/trace/ftrace.c +1 -0
@@ -1331,6 +1331,7 @@ static int ftrace_add_mod(struct trace_aif (!ftrace_mod)return -ENOMEM ; +INIT_LIST_HEAD (&ftrace_mod->list); ftrace_mod->func =kstrdup (func,GFP_KERNEL ); ftrace_mod->module =kstrdup (module,GFP_KERNEL ); ftrace_mod->enable = enable;
Greg Kroah-Hartman
maintainerPATCH 78/114 ring_buffer: Do not deactivate non-existant pages
In reply to Greg Kroah-HartmanFrom: Daniil Tatianin <[email protected]>
commit 56f4ca0a79a9f1af98f26c54b9b89ba1f9bcc6bd upstream.
rb_head_page_deactivate() expects cpu_buffer to contain a valid list of ->pages, so verify that the list is actually present before calling it.
Found by Linux Verification Center (linuxtesting.org) with the SVACE static analysis tool.
--- kernel/trace/ring_buffer.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
kernel/trace/ring_buffer.c +2 -2
@@ -1328,9 +1328,9 @@ static void rb_free_cpu_buffer(struct rifree_buffer_page (cpu_buffer->reader_page); -rb_head_page_deactivate (cpu_buffer); -if (head) { +rb_head_page_deactivate (cpu_buffer); +list_for_each_entry_safe (bpage, tmp, head, list) {list_del_init (&bpage->list);free_buffer_page (bpage);
Greg Kroah-Hartman
maintainerPATCH 79/114 ALSA: usb-audio: Drop snd_BUG_ON() from snd_usbmidi_output_open()
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
commit ad72c3c3f6eb81d2cb189ec71e888316adada5df upstream.
snd_usbmidi_output_open() has a check of the NULL port with snd_BUG_ON(). snd_BUG_ON() was used as this shouldn't have happened, but in reality, the NULL port may be seen when the device gives an invalid endpoint setup at the descriptor, hence the driver skips the allocation. That is, the check itself is valid and snd_BUG_ON() should be dropped from there. Otherwise it's confusing as if it were a real bug, as recently syzbot stumbled on it.
--- sound/usb/midi.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
sound/usb/midi.c +1 -3
@@ -1149,10 +1149,8 @@ static int snd_usbmidi_output_open(struc port = &umidi->endpoints[i].out->ports[j];break ; } -if (!port) { -snd_BUG (); +if (!port)return -ENXIO ; - } substream->runtime->private_data = port; port->state =STATE_UNKNOWN ;
Greg Kroah-Hartman
maintainerPATCH 80/114 slimbus: stream: correct presence rate frequencies
In reply to Greg Kroah-HartmanFrom: Krzysztof Kozlowski <[email protected]>
commit b9c1939627f8185dec8ba6d741e9573a4c7a5834 upstream.
Correct few frequencies in presence rate table - multiplied by 10 (110250 instead of 11025 Hz).
--- drivers/slimbus/stream.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/slimbus/stream.c +4 -4
@@ -67,10 +67,10 @@ static const int slim_presence_rate_tabl384000 ,768000 ,0 ,/* Reserved */ -110250 , -220500 , -441000 , -882000 , +11025 , +22050 , +44100 , +88200 ,176400 ,352800 , 705600,
Greg Kroah-Hartman
maintainerPATCH 81/114 speakup: fix a segfault caused by switching consoles
In reply to Greg Kroah-HartmanFrom: Mushahid Hussain <[email protected]>
commit 0fc801f8018000c8e64a275a20cb1da7c54e46df upstream.
This patch fixes a segfault by adding a null check on synth in speakup_con_update(). The segfault can be reproduced as follows:
- Login into a text console
- Load speakup and speakup_soft modules
- Remove speakup_soft
- Switch to a graphics console
This is caused by lack of a null check on synth in speakup_con_update().
Here's the sequence that causes the segfault:
- When we remove the speakup_soft, synth_release() sets the synth to null.
- After that, when we change the virtual console to graphics console, vt_notifier_call() is fired, which then calls speakup_con_update().
- Inside speakup_con_update() there's no null check on synth, so it calls synth_printf().
- Inside synth_printf(), synth_buffer_add() and synth_start(), both access synth, when it is null and causing a segfault.
Therefore adding a null check on synth solves the issue.
--- drivers/staging/speakup/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/staging/speakup/main.c +1 -1
@@ -1778,7 +1778,7 @@ static void speakup_con_update(struct vc {unsigned long flags; -if (!speakup_console[vc->vc_num] || spk_parked) +if (!speakup_console[vc->vc_num] || spk_parked || !synth)return ;if (!spin_trylock_irqsave (&speakup_info.spinlock, flags))/* Speakup output, discard */
Greg Kroah-Hartman
maintainerPATCH 82/114 USB: serial: option: add Sierra Wireless EM9191
In reply to Greg Kroah-HartmanFrom: Benoît Monin <[email protected]>
commit df3414b0a245f43476061fddd78cee7d6cff797f upstream.
Add support for the AT and diag ports, similar to other qualcomm SDX55 modems. In QDL mode, the modem uses a different device ID and support is provided by qcserial in commit 11c52d250b34 ("USB: serial: qcserial:
add EM9191 QDL support").
T: Bus=08 Lev=01 Prnt=01 Port=01 Cnt=01 Dev#= 3 Spd=5000 MxCh= 0 D: Ver= 3.20 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 9 #Cfgs= 1 P: Vendor=1199 ProdID=90d3 Rev=00.06 S: Manufacturer=Sierra Wireless, Incorporated S: Product=Sierra Wireless EM9191 S: SerialNumber=xxxxxxxxxxxxxxxx C: #Ifs= 4 Cfg#= 1 Atr=a0 MxPwr=896mA I: If#=0x0 Alt= 0 #EPs= 1 Cls=02(commc) Sub=0e Prot=00 Driver=cdc_mbim I: If#=0x1 Alt= 1 #EPs= 2 Cls=0a(data ) Sub=00 Prot=02 Driver=cdc_mbim I: If#=0x3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=(none) I: If#=0x4 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=30 Driver=(none)
--- drivers/usb/serial/option.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/usb/serial/option.c +5 -0
@@ -581,6 +581,9 @@ static void option_instat_callback(struc#define OPPO_VENDOR_ID 0x22d9#define OPPO_PRODUCT_R11 0x276c +/* Sierra Wireless products */ +#define SIERRA_VENDOR_ID 0x1199 +#define SIERRA_PRODUCT_EM9191 0x90d3/* Device flags */
@@ -2176,6 +2179,8 @@ static const struct usb_device_id option { USB_DEVICE_INTERFACE_CLASS(0x305a, 0x1405, 0xff) }, /* GosunCn GM500 MBIM */ { USB_DEVICE_INTERFACE_CLASS(0x305a, 0x1406, 0xff) }, /* GosunCn GM500 ECM/NCM */ { USB_DEVICE_AND_INTERFACE_INFO(OPPO_VENDOR_ID, OPPO_PRODUCT_R11, 0xff, 0xff, 0x30) }, + { USB_DEVICE_AND_INTERFACE_INFO(SIERRA_VENDOR_ID, SIERRA_PRODUCT_EM9191, 0xff, 0xff, 0x30) }, + { USB_DEVICE_AND_INTERFACE_INFO(SIERRA_VENDOR_ID, SIERRA_PRODUCT_EM9191, 0xff, 0, 0) }, { } /* Terminating entry */ };MODULE_DEVICE_TABLE (usb, option_ids);
Greg Kroah-Hartman
maintainerPATCH 83/114 USB: serial: option: remove old LARA-R6 PID
In reply to Greg Kroah-HartmanFrom: Davide Tronchin <[email protected]>
commit 2ec106b96afc19698ff934323b633c0729d4c7f8 upstream.
Remove the UBLOX_PRODUCT_R6XX 0x90fa association since LARA-R6 00B final product uses a new USB composition with different PID. 0x90fa PID used only by LARA-R6 internal prototypes.
Move 0x90fa PID directly in the option_ids array since used by other Qualcomm based modem vendors as pointed out in:
https://lore.kernel.org/all/[email protected]
--- drivers/usb/serial/option.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/usb/serial/option.c +1 -2
@@ -240,7 +240,6 @@ static void option_instat_callback(struc#define QUECTEL_PRODUCT_UC15 0x9090/* These u-blox products use Qualcomm's vendor ID */ #define UBLOX_PRODUCT_R410M 0x90b2 -#define UBLOX_PRODUCT_R6XX 0x90fa/* These Yuga products use Qualcomm's vendor ID */ #define YUGA_PRODUCT_CLM920_NC5 0x9625
@@ -1127,7 +1126,7 @@ static const struct usb_device_id option/* u-blox products using Qualcomm vendor ID */ { USB_DEVICE(QUALCOMM_VENDOR_ID, UBLOX_PRODUCT_R410M), .driver_info = RSVD(1) | RSVD(3) }, - { USB_DEVICE(QUALCOMM_VENDOR_ID, UBLOX_PRODUCT_R6XX), + { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x90fa), .driver_info = RSVD(3) },/* Quectel products using Quectel vendor ID */ { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC21, 0xff, 0xff, 0xff),
Greg Kroah-Hartman
maintainerPATCH 84/114 USB: serial: option: add u-blox LARA-R6 00B modem
In reply to Greg Kroah-HartmanFrom: Davide Tronchin <[email protected]>
commit d9e37a5c4d80ea25a7171ab8557a449115554e76 upstream.
The official LARA-R6 (00B) modem uses 0x908b PID. LARA-R6 00B does not implement a QMI interface on port 4, the reservation (RSVD(4)) has been added to meet other companies that implement QMI on that interface.
LARA-R6 00B USB composition exposes the following interfaces:
If 0: Diagnostic
If 1: AT parser
If 2: AT parser
If 3: AT parser/alternative functions
--- drivers/usb/serial/option.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/usb/serial/option.c +2 -0
@@ -1126,6 +1126,8 @@ static const struct usb_device_id option/* u-blox products using Qualcomm vendor ID */ { USB_DEVICE(QUALCOMM_VENDOR_ID, UBLOX_PRODUCT_R410M), .driver_info = RSVD(1) | RSVD(3) }, + { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x908b), /* u-blox LARA-R6 00B */ + .driver_info = RSVD(4) }, { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x90fa), .driver_info = RSVD(3) },/* Quectel products using Quectel vendor ID */
Greg Kroah-Hartman
maintainerPATCH 85/114 USB: serial: option: add u-blox LARA-L6 modem
In reply to Greg Kroah-HartmanFrom: Davide Tronchin <[email protected]>
commit c1547f12df8b8e9ca2686accee43213ecd117efe upstream.
Add LARA-L6 PIDs for three different USB compositions.
LARA-L6 module can be configured (by AT interface) in three different USB modes:
* Default mode (Vendor ID: 0x1546 Product ID: 0x1341) with 4 serial interfaces
* RmNet mode (Vendor ID: 0x1546 Product ID: 0x1342) with 4 serial interfaces and 1 RmNet virtual network interface
* CDC-ECM mode (Vendor ID: 0x1546 Product ID: 0x1343) with 4 serial interface and 1 CDC-ECM virtual network interface
In default mode LARA-L6 exposes the following interfaces:
If 0: Diagnostic
If 1: AT parser
If 2: AT parser
If 3: AT parser/alternative functions
In RmNet mode LARA-L6 exposes the following interfaces:
If 0: Diagnostic
If 1: AT parser
If 2: AT parser
If 3: AT parset/alternative functions
If 4: RMNET interface
In CDC-ECM mode LARA-L6 exposes the following interfaces:
If 0: Diagnostic
If 1: AT parser
If 2: AT parser
If 3: AT parset/alternative functions
If 4: CDC-ECM interface
--- drivers/usb/serial/option.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/usb/serial/option.c +8 -0
@@ -162,6 +162,8 @@ static void option_instat_callback(struc#define NOVATELWIRELESS_PRODUCT_G2 0xA010#define NOVATELWIRELESS_PRODUCT_MC551 0xB001 +#define UBLOX_VENDOR_ID 0x1546 +/* AMOI PRODUCTS */ #define AMOI_VENDOR_ID 0x1614#define AMOI_PRODUCT_H01 0x0800
@@ -1130,6 +1132,12 @@ static const struct usb_device_id option .driver_info = RSVD(4) }, { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x90fa), .driver_info = RSVD(3) }, +/* u-blox products */ + { USB_DEVICE(UBLOX_VENDOR_ID, 0x1341) }, /* u-blox LARA-L6 */ + { USB_DEVICE(UBLOX_VENDOR_ID, 0x1342), /* u-blox LARA-L6 (RMNET) */ + .driver_info = RSVD(4) }, + { USB_DEVICE(UBLOX_VENDOR_ID, 0x1343), /* u-blox LARA-L6 (ECM) */ + .driver_info = RSVD(4) },/* Quectel products using Quectel vendor ID */ { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC21, 0xff, 0xff, 0xff), .driver_info = NUMEP2 },
Greg Kroah-Hartman
maintainerPATCH 86/114 USB: serial: option: add Fibocom FM160 0x0111 composition
In reply to Greg Kroah-HartmanFrom: Reinhard Speyerer <[email protected]>
commit 148f4b32b4504d8a32cf82049b7b9499a4b299ab upstream.
Add support for the following Fibocom FM160 composition:
0x0111: MBIM + MODEM + DIAG + AT
T: Bus=01 Lev=02 Prnt=125 Port=01 Cnt=02 Dev#= 93 Spd=480 MxCh= 0 D: Ver= 2.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1 P: Vendor=2cb7 ProdID=0111 Rev= 5.04 S: Manufacturer=Fibocom S: Product=Fibocom FM160 Modem_SN:12345678 S: SerialNumber=12345678 C:* #Ifs= 5 Cfg#= 1 Atr=a0 MxPwr=500mA A: FirstIf#= 0 IfCount= 2 Cls=02(comm.) Sub=0e Prot=00 I:* If#= 0 Alt= 0 #EPs= 1 Cls=02(comm.) Sub=0e Prot=00 Driver=cdc_mbim E: Ad=81(I) Atr=03(Int.) MxPS= 64 Ivl=32ms I: If#= 1 Alt= 0 #EPs= 0 Cls=0a(data ) Sub=00 Prot=02 Driver=cdc_mbim I:* If#= 1 Alt= 1 #EPs= 2 Cls=0a(data ) Sub=00 Prot=02 Driver=cdc_mbim E: Ad=8e(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=0f(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms I:* If#= 2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=40 Driver=option E: Ad=83(I) Atr=03(Int.) MxPS= 10 Ivl=32ms E: Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms I:* If#= 3 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=30 Driver=option E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=84(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms I:* If#= 4 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=40 Driver=option E: Ad=86(I) Atr=03(Int.) MxPS= 10 Ivl=32ms E: Ad=85(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
--- drivers/usb/serial/option.c | 1 + 1 file changed, 1 insertion(+)
drivers/usb/serial/option.c +1 -0
@@ -2179,6 +2179,7 @@ static const struct usb_device_id option { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x010a, 0xff) }, /* Fibocom MA510 (ECM mode) */ { USB_DEVICE_AND_INTERFACE_INFO(0x2cb7, 0x010b, 0xff, 0xff, 0x30) }, /* Fibocom FG150 Diag */ { USB_DEVICE_AND_INTERFACE_INFO(0x2cb7, 0x010b, 0xff, 0, 0) }, /* Fibocom FG150 AT */ + { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x0111, 0xff) }, /* Fibocom FM160 (MBIM mode) */ { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a0, 0xff) }, /* Fibocom NL668-AM/NL652-EU (laptop MBIM) */ { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a2, 0xff) }, /* Fibocom FM101-GL (laptop MBIM) */ { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a4, 0xff), /* Fibocom FM101-GL (laptop MBIM) */
Greg Kroah-Hartman
maintainerPATCH 87/114 usb: add NO_LPM quirk for Realforce 87U Keyboard
In reply to Greg Kroah-HartmanFrom: Nicolas Dumazet <[email protected]>
commit 181135bb20dcb184edd89817831b888eb8132741 upstream.
Before adding this quirk, this (mechanical keyboard) device would not be recognized, logging:
new full-speed USB device number 56 using xhci_hcd unable to read config index 0 descriptor/start: -32 chopping to 0 config(s)
It would take dozens of plugging/unpuggling cycles for the keyboard to be recognized. Keyboard seems to simply work after applying this quirk.
This issue had been reported by users in two places already ([1], [2]) but nobody tried upstreaming a patch yet. After testing I believe their suggested fix (DELAY_INIT + NO_LPM + DEVICE_QUALIFIER) was probably a little overkill. I assume this particular combination was tested because it had been previously suggested in [3], but only NO_LPM seems sufficient for this device.
[1]: https://qiita.com/float168/items/fed43d540c8e2201b543
[2]: https://blog.kostic.dev/posts/making-the-realforce-87ub-work-with-usb30-on-Ubuntu/
[3]: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1678477
--- drivers/usb/core/quirks.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/usb/core/quirks.c +3 -0
@@ -362,6 +362,9 @@ static const struct usb_device_id usb_qu { USB_DEVICE(0x0781, 0x5583), .driver_info = USB_QUIRK_NO_LPM }, { USB_DEVICE(0x0781, 0x5591), .driver_info = USB_QUIRK_NO_LPM }, + /* Realforce 87U Keyboard */ + { USB_DEVICE(0x0853, 0x011b), .driver_info = USB_QUIRK_NO_LPM }, + /* M-Systems Flash Disk Pioneers */ { USB_DEVICE(0x08ec, 0x1000), .driver_info = USB_QUIRK_RESET_RESUME },
Greg Kroah-Hartman
maintainerPATCH 88/114 usb: chipidea: fix deadlock in ci_otg_del_timer
In reply to Greg Kroah-HartmanFrom: Duoming Zhou <[email protected]>
commit 7a58b8d6021426b796eebfae80983374d9a80a75 upstream.
There is a deadlock in ci_otg_del_timer(), the process is shown below:
(thread 1) | (thread 2) ci_otg_del_timer() | ci_otg_hrtimer_func() ... | spin_lock_irqsave() //(1) | ... ... | hrtimer_cancel() | spin_lock_irqsave() //(2)
(block forever)
We hold ci->lock in position (1) and use hrtimer_cancel() to wait ci_otg_hrtimer_func() to stop, but ci_otg_hrtimer_func() also need ci->lock in position (2). As a result, the hrtimer_cancel() in ci_otg_del_timer() will be blocked forever.
This patch extracts hrtimer_cancel() from the protection of spin_lock_irqsave() in order that the ci_otg_hrtimer_func() could obtain the ci->lock.
What`s more, there will be no race happen. Because the "next_timer" is always under the protection of spin_lock_irqsave() and we only check whether "next_timer" equals to NUM_OTG_FSM_TIMERS in the following code.
--- drivers/usb/chipidea/otg_fsm.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/usb/chipidea/otg_fsm.c +2 -0
@@ -256,8 +256,10 @@ static void ci_otg_del_timer(struct ci_h ci->enabled_otg_timer_bits &= ~(1 << t);if (ci->next_otg_timer == t) {if (ci->enabled_otg_timer_bits ==0 ) { +spin_unlock_irqrestore (&ci->lock, flags);/* No enabled timers after delete it */ hrtimer_cancel (&ci->otg_fsm_hrtimer); +spin_lock_irqsave (&ci->lock, flags); ci->next_otg_timer =NUM_OTG_FSM_TIMERS ; }else {/* Find the next timer */
Greg Kroah-Hartman
maintainerPATCH 89/114 iio: adc: at91_adc: fix possible memory leak in at91_adc_allocate_trigger()
In reply to Greg Kroah-HartmanFrom: Yang Yingliang <[email protected]>
commit 65f20301607d07ee279b0804d11a05a62a6c1a1c upstream.
If iio_trigger_register() returns error, it should call iio_trigger_free() to give up the reference that hold in iio_trigger_alloc(), so that it can call iio_trig_release() to free memory when the refcount hit to 0.
--- drivers/iio/adc/at91_adc.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/iio/adc/at91_adc.c +3 -1
@@ -617,8 +617,10 @@ static struct iio_trigger *at91_adc_allo trig->ops = &at91_adc_trigger_ops; ret =iio_trigger_register (trig); -if (ret) +if (ret) { +iio_trigger_free (trig);return NULL ; + }return trig; }
Greg Kroah-Hartman
maintainerPATCH 90/114 iio: trigger: sysfs: fix possible memory leak in iio_sysfs_trig_init()
In reply to Greg Kroah-HartmanFrom: Yang Yingliang <[email protected]>
commit efa17e90e1711bdb084e3954fa44afb6647331c0 upstream.
dev_set_name() allocates memory for name, it need be freed when device_add() fails, call put_device() to give up the reference that hold in device_initialize(), so that it can be freed in kobject_cleanup() when the refcount hit to 0.
Fault injection test can trigger this:
unreferenced object 0xffff8e8340a7b4c0 (size 32):
comm "modprobe", pid 243, jiffies 4294678145 (age 48.845s) hex dump (first 32 bytes):
69 69 6f 5f 73 79 73 66 73 5f 74 72 69 67 67 65 iio_sysfs_trigge
72 00 a7 40 83 8e ff ff 00 86 13 c4 f6 ee ff ff r..@............
backtrace:
[<0000000074999de8>] __kmem_cache_alloc_node+0x1e9/0x360
[<00000000497fd30b>] __kmalloc_node_track_caller+0x44/0x1a0
[<000000003636c520>] kstrdup+0x2d/0x60
[<0000000032f84da2>] kobject_set_name_vargs+0x1e/0x90
[<0000000092efe493>] dev_set_name+0x4e/0x70--- drivers/iio/trigger/iio-trig-sysfs.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/iio/trigger/iio-trig-sysfs.c +5 -1
@@ -211,9 +211,13 @@ static int iio_sysfs_trigger_remove(intstatic int __init iio_sysfs_trig_init (void ) { +int ret;device_initialize (&iio_sysfs_trig_dev);dev_set_name (&iio_sysfs_trig_dev,"iio_sysfs_trigger" ); -return device_add (&iio_sysfs_trig_dev); + ret =device_add (&iio_sysfs_trig_dev); +if (ret) +put_device (&iio_sysfs_trig_dev); +return ret; }module_init (iio_sysfs_trig_init);
Greg Kroah-Hartman
maintainerPATCH 91/114 iio: pressure: ms5611: changed hardcoded SPI speed to value limited
In reply to Greg Kroah-HartmanFrom: Mitja Spes <[email protected]>
commit 741cec30cc52058d1c10d415f3b98319887e4f73 upstream.
Don't hardcode the ms5611 SPI speed, limit it instead.
--- drivers/iio/pressure/ms5611_spi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/iio/pressure/ms5611_spi.c +1 -1
@@ -95,7 +95,7 @@ static int ms5611_spi_probe(struct spi_dspi_set_drvdata (spi, indio_dev); spi->mode =SPI_MODE_0 ; - spi->max_speed_hz =20000000 ; + spi->max_speed_hz =min (spi->max_speed_hz,20000000U ); spi->bits_per_word =8 ; ret =spi_setup (spi);if (ret <0 )
Greg Kroah-Hartman
maintainerPATCH 92/114 dm ioctl: fix misbehavior if list_versions races with module loading
In reply to Greg Kroah-HartmanFrom: Mikulas Patocka <[email protected]>
commit 4fe1ec995483737f3d2a14c3fe1d8fe634972979 upstream.
__list_versions will first estimate the required space using the "dm_target_iterate(list_version_get_needed, &needed)" call and then will fill the space using the "dm_target_iterate(list_version_get_info, &iter_info)" call. Each of these calls locks the targets using the "down_read(&_lock)" and "up_read(&_lock)" calls, however between the first and second "dm_target_iterate" there is no lock held and the target modules can be loaded at this point, so the second "dm_target_iterate" call may need more space than what was the first "dm_target_iterate" returned.
The code tries to handle this overflow (see the beginning of list_version_get_info), however this handling is incorrect.
The code sets "param->data_size = param->data_start + needed" and "iter_info.end = (char *)vers+len" - "needed" is the size returned by the first dm_target_iterate call; "len" is the size of the buffer allocated by userspace.
"len" may be greater than "needed"; in this case, the code will write up to "len" bytes into the buffer, however param->data_size is set to "needed", so it may write data past the param->data_size value. The ioctl interface copies only up to param->data_size into userspace, thus part of the result will be truncated.
Fix this bug by setting "iter_info.end = (char *)vers + needed;" - this guarantees that the second "dm_target_iterate" call will write only up to the "needed" buffer and it will exit with "DM_BUFFER_FULL_FLAG" if it overflows the "needed" space - in this case, userspace will allocate a larger buffer and retry.
Note that there is also a bug in list_version_get_needed - we need to add "strlen(tt->name) + 1" to the needed size, not "strlen(tt->name)".
--- drivers/md/dm-ioctl.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/md/dm-ioctl.c +2 -2
@@ -573,7 +573,7 @@ static void list_version_get_needed(strusize_t *needed = needed_param; *needed +=sizeof (struct dm_target_versions ); - *needed +=strlen (tt->name); + *needed +=strlen (tt->name) +1 ; *needed +=ALIGN_MASK ; }
@@ -628,7 +628,7 @@ static int list_versions(struct file *fi iter_info.old_vers =NULL ; iter_info.vers = vers; iter_info.flags =0 ; - iter_info.end = (char *)vers+len; + iter_info.end = (char *)vers + needed;/* * Now loop through filling out the names & versions.
Greg Kroah-Hartman
maintainerPATCH 93/114 serial: 8250: Fall back to non-DMA Rx if IIR_RDI occurs
In reply to Greg Kroah-HartmanFrom: Ilpo Järvinen <[email protected]>
commit a931237cbea256aff13bb403da13a97b2d1605d9 upstream.
DW UART sometimes triggers IIR_RDI during DMA Rx when IIR_RX_TIMEOUT should have been triggered instead. Since IIR_RDI has higher priority than IIR_RX_TIMEOUT, this causes the Rx to hang into interrupt loop. The problem seems to occur at least with some combinations of small-sized transfers (I've reproduced the problem on Elkhart Lake PSE UARTs).
If there's already an on-going Rx DMA and IIR_RDI triggers, fall graciously back to non-DMA Rx. That is, behave as if IIR_RX_TIMEOUT had occurred.
8250_omap already considers IIR_RDI similar to this change so its nothing unheard of.
--- drivers/tty/serial/8250/8250_port.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/tty/serial/8250/8250_port.c +4 -0
@@ -1865,6 +1865,10 @@ EXPORT_SYMBOL_GPL(serial8250_modem_statustatic bool handle_rx_dma (struct uart_8250_port *up,unsigned int iir) {switch (iir &0x3f ) { +case UART_IIR_RDI : +if (!up->dma->rx_running) +break ; +/* fall-through */ case UART_IIR_RX_TIMEOUT :serial8250_rx_dma_flush (up);/* fall-through */
Greg Kroah-Hartman
maintainerPATCH 94/114 serial: 8250_lpss: Configure DMA also w/o DMA filter
In reply to Greg Kroah-HartmanFrom: Ilpo Järvinen <[email protected]>
commit 1bfcbe5805d0cfc83c3544dcd01e0a282c1f6790 upstream.
If the platform doesn't use DMA device filter (as is the case with Elkhart Lake), whole lpss8250_dma_setup() setup is skipped. This results in skipping also *_maxburst setup which is undesirable. Refactor lpss8250_dma_setup() to configure DMA even if filter is not setup.
--- drivers/tty/serial/8250/8250_lpss.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-)
drivers/tty/serial/8250/8250_lpss.c +11 -4
@@ -246,8 +246,13 @@ static int lpss8250_dma_setup(struct lpsstruct dw_dma_slave *rx_param, *tx_param;struct device *dev = port->port.dev; -if (!lpss->dma_param.dma_dev) +if (!lpss->dma_param.dma_dev) { + dma = port->dma; +if (dma) + goto out_configuration_only; +return 0 ; + } rx_param =devm_kzalloc (dev,sizeof (*rx_param),GFP_KERNEL );if (!rx_param)
@@ -258,16 +263,18 @@ static int lpss8250_dma_setup(struct lpsreturn -ENOMEM ; *rx_param = lpss->dma_param; - dma->rxconf.src_maxburst = lpss->dma_maxburst; - *tx_param = lpss->dma_param; - dma->txconf.dst_maxburst = lpss->dma_maxburst; dma->fn = lpss8250_dma_filter; dma->rx_param = rx_param; dma->tx_param = tx_param; port->dma = dma; + +out_configuration_only: + dma->rxconf.src_maxburst = lpss->dma_maxburst; + dma->txconf.dst_maxburst = lpss->dma_maxburst; +return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 95/114 mmc: core: properly select voltage range without power cycle
In reply to Greg Kroah-HartmanFrom: Yann Gautier <[email protected]>
commit 39a72dbfe188291b156dd6523511e3d5761ce775 upstream.
In mmc_select_voltage(), if there is no full power cycle, the voltage range selected at the end of the function will be on a single range (e.g. 3.3V/3.4V). To keep a range around the selected voltage (3.2V/3.4V), the mask shift should be reduced by 1.
This issue was triggered by using a specific SD-card (Verbatim Premium 16GB UHS-1) on an STM32MP157C-DK2 board. This board cannot do UHS modes and there is no power cycle. And the card was failing to switch to high-speed mode. When adding the range 3.2V/3.3V for this card with the proposed shift change, the card can switch to high-speed mode.
--- drivers/mmc/core/core.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
drivers/mmc/core/core.c +7 -1
@@ -1461,7 +1461,13 @@ u32 mmc_select_voltage(struct mmc_host *mmc_power_cycle (host, ocr); }else { bit =fls (ocr) -1 ; - ocr &=3 << bit; +/* +* The bit variable represents the highest voltage bit set in +* the OCR register. +* To keep a range of 2 values (e.g. 3.2V/3.3V and 3.3V/3.4V), +* we must shift the mask '3' with (bit - 1). +*/ + ocr &=3 << (bit -1 );if (bit != host->ios.vdd)dev_warn (mmc_dev (host),"exceeding card's volts\n" ); }
Greg Kroah-Hartman
maintainerPATCH 96/114 mmc: sdhci-pci: Fix possible memory leak caused by missing pci_dev_put()
In reply to Greg Kroah-HartmanFrom: Xiongfeng Wang <[email protected]>
commit 222cfa0118aa68687ace74aab8fdf77ce8fbd7e6 upstream.
pci_get_device() will increase the reference count for the returned pci_dev. We need to use pci_dev_put() to decrease the reference count before amd_probe() returns. There is no problem for the 'smbus_dev == NULL' branch because pci_dev_put() can also handle the NULL input parameter case.
--- drivers/mmc/host/sdhci-pci-core.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/mmc/host/sdhci-pci-core.c +2 -0
@@ -1532,6 +1532,8 @@ static int amd_probe(struct sdhci_pci_ch } } +pci_dev_put (smbus_dev); +if (gen ==AMD_CHIPSET_BEFORE_ML || gen ==AMD_CHIPSET_CZ ) chip->quirks2 |=SDHCI_QUIRK2_CLEAR_TRANSFERMODE_REG_BEFORE_CMD ;
Greg Kroah-Hartman
maintainerPATCH 97/114 docs: update mediator contact information in CoC doc
In reply to Greg Kroah-HartmanFrom: Shuah Khan <[email protected]>
commit 5fddf8962b429b8303c4a654291ecb6e61a7d747 upstream.
Update mediator contact information in CoC interpretation document.
--- Documentation/process/code-of-conduct-interpretation.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
Documentation/process/code-of-conduct-interpretation.rst +1 -1
@@ -51,7 +51,7 @@ the Technical Advisory Board (TAB) or ot uncertain how to handle situations that come up. It will not be considered a violation report unless you want it to be. If you are uncertain about approaching the TAB or any other maintainers, please -reach out to our conflict mediator, Joanna Lee <[email protected]>. +reach out to our conflict mediator, Joanna Lee <[email protected]>. In the end, "be kind to each other" is really what the end goal is for everybody. We know everyone is human and we all fail at times, but the
Greg Kroah-Hartman
maintainerPATCH 98/114 misc/vmw_vmci: fix an infoleak in vmci_host_do_receive_datagram()
In reply to Greg Kroah-HartmanFrom: Alexander Potapenko <[email protected]>
commit e5b0d06d9b10f5f43101bd6598b076c347f9295f upstream.
struct vmci_event_qp allocated by qp_notify_peer() contains padding, which may carry uninitialized data to the userspace, as observed by KMSAN:
BUG: KMSAN: kernel-infoleak in instrument_copy_to_user ./include/linux/instrumented.h:121 instrument_copy_to_user ./include/linux/instrumented.h:121 _copy_to_user+0x5f/0xb0 lib/usercopy.c:33 copy_to_user ./include/linux/uaccess.h:169 vmci_host_do_receive_datagram drivers/misc/vmw_vmci/vmci_host.c:431 vmci_host_unlocked_ioctl+0x33d/0x43d0 drivers/misc/vmw_vmci/vmci_host.c:925 vfs_ioctl fs/ioctl.c:51 ...
Uninit was stored to memory at:
kmemdup+0x74/0xb0 mm/util.c:131 dg_dispatch_as_host drivers/misc/vmw_vmci/vmci_datagram.c:271 vmci_datagram_dispatch+0x4f8/0xfc0 drivers/misc/vmw_vmci/vmci_datagram.c:339 qp_notify_peer+0x19a/0x290 drivers/misc/vmw_vmci/vmci_queue_pair.c:1479 qp_broker_attach drivers/misc/vmw_vmci/vmci_queue_pair.c:1662 qp_broker_alloc+0x2977/0x2f30 drivers/misc/vmw_vmci/vmci_queue_pair.c:1750 vmci_qp_broker_alloc+0x96/0xd0 drivers/misc/vmw_vmci/vmci_queue_pair.c:1940 vmci_host_do_alloc_queuepair drivers/misc/vmw_vmci/vmci_host.c:488 vmci_host_unlocked_ioctl+0x24fd/0x43d0 drivers/misc/vmw_vmci/vmci_host.c:927 ...
Local variable ev created at:
qp_notify_peer+0x54/0x290 drivers/misc/vmw_vmci/vmci_queue_pair.c:1456 qp_broker_attach drivers/misc/vmw_vmci/vmci_queue_pair.c:1662 qp_broker_alloc+0x2977/0x2f30 drivers/misc/vmw_vmci/vmci_queue_pair.c:1750
Bytes 28-31 of 48 are uninitialized
Memory access of size 48 starts at ffff888035155e00 Data copied to user address 0000000020000100
Use memset() to prevent the infoleaks.
Also speculatively fix qp_notify_peer_local(), which may suffer from the same problem.
--- drivers/misc/vmw_vmci/vmci_queue_pair.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/misc/vmw_vmci/vmci_queue_pair.c +2 -0
@@ -865,6 +865,7 @@ static int qp_notify_peer_local(bool attu32 context_id =vmci_get_context_id ();struct vmci_event_qp ev; +memset (&ev,0 ,sizeof (ev)); ev.msg.hdr.dst =vmci_make_handle (context_id,VMCI_EVENT_HANDLER ); ev.msg.hdr.src =vmci_make_handle (VMCI_HYPERVISOR_CONTEXT_ID ,VMCI_CONTEXT_RESOURCE_ID );
@@ -1476,6 +1477,7 @@ static int qp_notify_peer(bool attach,* kernel. */ +memset (&ev,0 ,sizeof (ev)); ev.msg.hdr.dst =vmci_make_handle (peer_id,VMCI_EVENT_HANDLER ); ev.msg.hdr.src =vmci_make_handle (VMCI_HYPERVISOR_CONTEXT_ID ,VMCI_CONTEXT_RESOURCE_ID );
Greg Kroah-Hartman
maintainerPATCH 99/114 scsi: target: tcm_loop: Fix possible name leak in tcm_loop_setup_hba_bus()
In reply to Greg Kroah-HartmanFrom: Yang Yingliang <[email protected]>
[ Upstream commit bc68e428d4963af0201e92159629ab96948f0893 ]
If device_register() fails in tcm_loop_setup_hba_bus(), the name allocated by dev_set_name() need be freed. As comment of device_register() says, it should use put_device() to give up the reference in the error path. So fix this by calling put_device(), then the name can be freed in kobject_cleanup(). The 'tl_hba' will be freed in tcm_loop_release_adapter(), so it don't need goto error label in this case.
--- drivers/target/loopback/tcm_loop.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/target/loopback/tcm_loop.c +2 -1
@@ -409,6 +409,7 @@ static int tcm_loop_setup_hba_bus(struct tcm_loop_hba *tl_hba, int tcm_loop_host ret =device_register (&tl_hba->dev);if (ret) {pr_err ("device_register() failed for tl_hba->dev: %d\n" , ret); +put_device (&tl_hba->dev);return -ENODEV ; }
@@ -1103,7 +1104,7 @@ static struct se_wwn *tcm_loop_make_scsi_hba(*/ ret =tcm_loop_setup_hba_bus (tl_hba, tcm_loop_hba_no_cnt);if (ret) - goto out; +return ERR_PTR (ret); sh = tl_hba->sh; tcm_loop_hba_no_cnt++;
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 100/114 Input: i8042 - fix leaking of platform device on module removal
In reply to Greg Kroah-HartmanFrom: Chen Jun <[email protected]>
[ Upstream commit 81cd7e8489278d28794e7b272950c3e00c344e44 ]
Avoid resetting the module-wide i8042_platform_device pointer in i8042_probe() or i8042_remove(), so that the device can be properly destroyed by i8042_exit() on module unload.
--- drivers/input/serio/i8042.c | 4 ---- 1 file changed, 4 deletions(-)
drivers/input/serio/i8042.c +0 -4
@@ -1544,8 +1544,6 @@ static int i8042_probe(struct platform_device *dev) {int error; - i8042_platform_device = dev; -if (i8042_reset ==I8042_RESET_ALWAYS ) { error =i8042_controller_selftest ();if (error)
@@ -1583,7 +1581,6 @@ static int i8042_probe(struct platform_device *dev)i8042_free_aux_ports ();/* in case KBD failed but AUX not */ i8042_free_irqs ();i8042_controller_reset (false); - i8042_platform_device =NULL ;return error; }
@@ -1593,7 +1590,6 @@ static int i8042_remove(struct platform_device *dev)i8042_unregister_ports ();i8042_free_irqs ();i8042_controller_reset (false); - i8042_platform_device =NULL ;return 0 ; }
Signature · 1 line
2.35.1
Greg Kroah-Hartman
maintainerPATCH 101/114 serial: 8250: Flush DMA Rx on RLSI
In reply to Greg Kroah-HartmanFrom: Ilpo Järvinen <[email protected]>
commit 1980860e0c8299316cddaf0992dd9e1258ec9d88 upstream.
Returning true from handle_rx_dma() without flushing DMA first creates a data ordering hazard. If DMA Rx has handled any character at the point when RLSI occurs, the non-DMA path handles any pending characters jumping them ahead of those characters that are pending under DMA.
--- drivers/tty/serial/8250/8250_port.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/tty/serial/8250/8250_port.c +1 -2
@@ -1869,10 +1869,9 @@ static bool handle_rx_dma(struct uart_82if (!up->dma->rx_running)break ;/* fall-through */ +case UART_IIR_RLSI :case UART_IIR_RX_TIMEOUT :serial8250_rx_dma_flush (up); -/* fall-through */ -case UART_IIR_RLSI :return true; }return up->dma->rx_dma (up);
Greg Kroah-Hartman
maintainerPATCH 102/114 macvlan: enforce a consistent minimal mtu
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
commit b64085b00044bdf3cd1c9825e9ef5b2e0feae91a upstream.
macvlan should enforce a minimal mtu of 68, even at link creation.
This patch avoids the current behavior (which could lead to crashes in ipv6 stack if the link is brought up)
$ ip link add macvlan1 link eno1 mtu 8 type macvlan # This should fail !
$ ip link sh dev macvlan1
5: macvlan1@eno1: <BROADCAST,MULTICAST> mtu 8 qdisc noop
state DOWN mode DEFAULT group default qlen 1000
link/ether 02:47:6c:24:74:82 brd ff:ff:ff:ff:ff:ff
$ ip link set macvlan1 mtu 67
Error: mtu less than device minimum.
$ ip link set macvlan1 mtu 68
$ ip link set macvlan1 mtu 8
Error: mtu less than device minimum.--- drivers/net/macvlan.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/macvlan.c +1 -1
@@ -1137,7 +1137,7 @@ void macvlan_common_setup(struct net_dev {ether_setup (dev); - dev->min_mtu =0 ; +/* ether_setup() has set dev->min_mtu to ETH_MIN_MTU. */ dev->max_mtu =ETH_MAX_MTU ; dev->priv_flags &= ~IFF_TX_SKB_SHARING ;netif_keep_dst (dev);
Greg Kroah-Hartman
maintainerPATCH 103/114 tcp: cdg: allow tcp_cdg_release() to be called multiple times
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
commit 72e560cb8c6f80fc2b4afc5d3634a32465e13a51 upstream.
Apparently, mptcp is able to call tcp_disconnect() on an already disconnected flow. This is generally fine, unless current congestion control is CDG, because it might trigger a double-free [1]
Instead of fixing MPTCP, and future bugs, we can make tcp_disconnect() more resilient.
[1]
BUG: KASAN: double-free in slab_free mm/slub.c:3539 [inline] BUG: KASAN: double-free in kfree+0xe2/0x580 mm/slub.c:4567 CPU: 0 PID: 3645 Comm: kworker/0:7 Not tainted 6.0.0-syzkaller-02734-g0326074ff465 #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 09/22/2022 Workqueue: events mptcp_worker Call Trace: <TASK> __dump_stack lib/dump_stack.c:88 [inline] dump_stack_lvl+0xcd/0x134 lib/dump_stack.c:106 print_address_description mm/kasan/report.c:317 [inline] print_report.cold+0x2ba/0x719 mm/kasan/report.c:433 kasan_report_invalid_free+0x81/0x190 mm/kasan/report.c:462 ____kasan_slab_free+0x18b/0x1c0 mm/kasan/common.c:356 kasan_slab_free include/linux/kasan.h:200 [inline] slab_free_hook mm/slub.c:1759 [inline] slab_free_freelist_hook+0x8b/0x1c0 mm/slub.c:1785 slab_free mm/slub.c:3539 [inline] kfree+0xe2/0x580 mm/slub.c:4567 tcp_disconnect+0x980/0x1e20 net/ipv4/tcp.c:3145 __mptcp_close_ssk+0x5ca/0x7e0 net/mptcp/protocol.c:2327 mptcp_do_fastclose net/mptcp/protocol.c:2592 [inline] mptcp_worker+0x78c/0xff0 net/mptcp/protocol.c:2627 process_one_work+0x991/0x1610 kernel/workqueue.c:2289 worker_thread+0x665/0x1080 kernel/workqueue.c:2436 kthread+0x2e4/0x3a0 kernel/kthread.c:376 ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:306 </TASK> Allocated by task 3671: kasan_save_stack+0x1e/0x40 mm/kasan/common.c:38 kasan_set_track mm/kasan/common.c:45 [inline] set_alloc_info mm/kasan/common.c:437 [inline] ____kasan_kmalloc mm/kasan/common.c:516 [inline] ____kasan_kmalloc mm/kasan/common.c:475 [inline] __kasan_kmalloc+0xa9/0xd0 mm/kasan/common.c:525 kmalloc_array include/linux/slab.h:640 [inline] kcalloc include/linux/slab.h:671 [inline] tcp_cdg_init+0x10d/0x170 net/ipv4/tcp_cdg.c:380 tcp_init_congestion_control+0xab/0x550 net/ipv4/tcp_cong.c:193 tcp_reinit_congestion_control net/ipv4/tcp_cong.c:217 [inline] tcp_set_congestion_control+0x96c/0xaa0 net/ipv4/tcp_cong.c:391 do_tcp_setsockopt+0x505/0x2320 net/ipv4/tcp.c:3513 tcp_setsockopt+0xd4/0x100 net/ipv4/tcp.c:3801 mptcp_setsockopt+0x35f/0x2570 net/mptcp/sockopt.c:844 __sys_setsockopt+0x2d6/0x690 net/socket.c:2252 __do_sys_setsockopt net/socket.c:2263 [inline] __se_sys_setsockopt net/socket.c:2260 [inline] __x64_sys_setsockopt+0xba/0x150 net/socket.c:2260 do_syscall_x64 arch/x86/entry/common.c:50 [inline] do_syscall_64+0x35/0xb0 arch/x86/entry/common.c:80 entry_SYSCALL_64_after_hwframe+0x63/0xcd Freed by task 16: kasan_save_stack+0x1e/0x40 mm/kasan/common.c:38 kasan_set_track+0x21/0x30 mm/kasan/common.c:45 kasan_set_free_info+0x20/0x30 mm/kasan/generic.c:370 ____kasan_slab_free mm/kasan/common.c:367 [inline] ____kasan_slab_free+0x166/0x1c0 mm/kasan/common.c:329 kasan_slab_free include/linux/kasan.h:200 [inline] slab_free_hook mm/slub.c:1759 [inline] slab_free_freelist_hook+0x8b/0x1c0 mm/slub.c:1785 slab_free mm/slub.c:3539 [inline] kfree+0xe2/0x580 mm/slub.c:4567 tcp_cleanup_congestion_control+0x70/0x120 net/ipv4/tcp_cong.c:226 tcp_v4_destroy_sock+0xdd/0x750 net/ipv4/tcp_ipv4.c:2254 tcp_v6_destroy_sock+0x11/0x20 net/ipv6/tcp_ipv6.c:1969 inet_csk_destroy_sock+0x196/0x440 net/ipv4/inet_connection_sock.c:1157 tcp_done+0x23b/0x340 net/ipv4/tcp.c:4649 tcp_rcv_state_process+0x40e7/0x4990 net/ipv4/tcp_input.c:6624 tcp_v6_do_rcv+0x3fc/0x13c0 net/ipv6/tcp_ipv6.c:1525 tcp_v6_rcv+0x2e8e/0x3830 net/ipv6/tcp_ipv6.c:1759 ip6_protocol_deliver_rcu+0x2db/0x1950 net/ipv6/ip6_input.c:439 ip6_input_finish+0x14c/0x2c0 net/ipv6/ip6_input.c:484 NF_HOOK include/linux/netfilter.h:302 [inline] NF_HOOK include/linux/netfilter.h:296 [inline] ip6_input+0x9c/0xd0 net/ipv6/ip6_input.c:493 dst_input include/net/dst.h:455 [inline] ip6_rcv_finish+0x193/0x2c0 net/ipv6/ip6_input.c:79 ip_sabotage_in net/bridge/br_netfilter_hooks.c:874 [inline] ip_sabotage_in+0x1fa/0x260 net/bridge/br_netfilter_hooks.c:865 nf_hook_entry_hookfn include/linux/netfilter.h:142 [inline] nf_hook_slow+0xc5/0x1f0 net/netfilter/core.c:614 nf_hook.constprop.0+0x3ac/0x650 include/linux/netfilter.h:257 NF_HOOK include/linux/netfilter.h:300 [inline] ipv6_rcv+0x9e/0x380 net/ipv6/ip6_input.c:309 __netif_receive_skb_one_core+0x114/0x180 net/core/dev.c:5485 __netif_receive_skb+0x1f/0x1c0 net/core/dev.c:5599 netif_receive_skb_internal net/core/dev.c:5685 [inline] netif_receive_skb+0x12f/0x8d0 net/core/dev.c:5744 NF_HOOK include/linux/netfilter.h:302 [inline] NF_HOOK include/linux/netfilter.h:296 [inline] br_pass_frame_up+0x303/0x410 net/bridge/br_input.c:68 br_handle_frame_finish+0x909/0x1aa0 net/bridge/br_input.c:199 br_nf_hook_thresh+0x2f8/0x3d0 net/bridge/br_netfilter_hooks.c:1041 br_nf_pre_routing_finish_ipv6+0x695/0xef0 net/bridge/br_netfilter_ipv6.c:207 NF_HOOK include/linux/netfilter.h:302 [inline] br_nf_pre_routing_ipv6+0x417/0x7c0 net/bridge/br_netfilter_ipv6.c:237 br_nf_pre_routing+0x1496/0x1fe0 net/bridge/br_netfilter_hooks.c:507 nf_hook_entry_hookfn include/linux/netfilter.h:142 [inline] nf_hook_bridge_pre net/bridge/br_input.c:255 [inline] br_handle_frame+0x9c9/0x12d0 net/bridge/br_input.c:399 __netif_receive_skb_core+0x9fe/0x38f0 net/core/dev.c:5379 __netif_receive_skb_one_core+0xae/0x180 net/core/dev.c:5483 __netif_receive_skb+0x1f/0x1c0 net/core/dev.c:5599 process_backlog+0x3a0/0x7c0 net/core/dev.c:5927 __napi_poll+0xb3/0x6d0 net/core/dev.c:6494 napi_poll net/core/dev.c:6561 [inline] net_rx_action+0x9c1/0xd90 net/core/dev.c:6672 __do_softirq+0x1d0/0x9c8 kernel/softirq.c:571
--- net/ipv4/tcp_cdg.c | 2 ++ 1 file changed, 2 insertions(+)
net/ipv4/tcp_cdg.c +2 -0
@@ -374,6 +374,7 @@ static void tcp_cdg_init(struct sock *skstruct cdg *ca =inet_csk_ca (sk);struct tcp_sock *tp =tcp_sk (sk); + ca->gradients =NULL ;/* We silently fall back to window = 1 if allocation fails. */ if (window >1 ) ca->gradients = kcalloc(window, sizeof(ca->gradients[0]),
@@ -387,6 +388,7 @@ static void tcp_cdg_release(struct sockstruct cdg *ca =inet_csk_ca (sk);kfree (ca->gradients); + ca->gradients =NULL ; }static struct tcp_congestion_ops tcp_cdg__read_mostly = {
Greg Kroah-Hartman
maintainerPATCH 104/114 kcm: avoid potential race in kcm_tx_work
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
commit ec7eede369fe5b0d085ac51fdbb95184f87bfc6c upstream.
syzbot found that kcm_tx_work() could crash [1] in:
/* Primarily for SOCK_SEQPACKET sockets */
if (likely(sk->sk_socket) &&
test_bit(SOCK_NOSPACE, &sk->sk_socket->flags)) {
<<*>> clear_bit(SOCK_NOSPACE, &sk->sk_socket->flags);
sk->sk_write_space(sk);
}I think the reason is that another thread might concurrently run in kcm_release() and call sock_orphan(sk) while sk is not locked. kcm_tx_work() find sk->sk_socket being NULL.
[1]
BUG: KASAN: null-ptr-deref in instrument_atomic_write include/linux/instrumented.h:86 [inline] BUG: KASAN: null-ptr-deref in clear_bit include/asm-generic/bitops/instrumented-atomic.h:41 [inline] BUG: KASAN: null-ptr-deref in kcm_tx_work+0xff/0x160 net/kcm/kcmsock.c:742 Write of size 8 at addr 0000000000000008 by task kworker/u4:3/53 CPU: 0 PID: 53 Comm: kworker/u4:3 Not tainted 5.19.0-rc3-next-20220621-syzkaller #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011 Workqueue: kkcmd kcm_tx_work Call Trace: <TASK> __dump_stack lib/dump_stack.c:88 [inline] dump_stack_lvl+0xcd/0x134 lib/dump_stack.c:106 kasan_report+0xbe/0x1f0 mm/kasan/report.c:495 check_region_inline mm/kasan/generic.c:183 [inline] kasan_check_range+0x13d/0x180 mm/kasan/generic.c:189 instrument_atomic_write include/linux/instrumented.h:86 [inline] clear_bit include/asm-generic/bitops/instrumented-atomic.h:41 [inline] kcm_tx_work+0xff/0x160 net/kcm/kcmsock.c:742 process_one_work+0x996/0x1610 kernel/workqueue.c:2289 worker_thread+0x665/0x1080 kernel/workqueue.c:2436 kthread+0x2e9/0x3a0 kernel/kthread.c:376 ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:302 </TASK>
--- net/kcm/kcmsock.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/kcm/kcmsock.c +1 -1
@@ -1845,10 +1845,10 @@ static int kcm_release(struct socket *so kcm =kcm_sk (sk); mux = kcm->mux; +lock_sock (sk);sock_orphan (sk);kfree_skb (kcm->seq_skb); -lock_sock (sk);/* Purge queue under lock to avoid race condition with tx_work trying * to act when queue is nonempty. If tx_work runs after this point * it will just return.
Greg Kroah-Hartman
maintainerPATCH 105/114 bpf, test_run: Fix alignment problem in bpf_prog_test_run_skb()
In reply to Greg Kroah-HartmanFrom: Baisong Zhong <[email protected]>
commit d3fd203f36d46aa29600a72d57a1b61af80e4a25 upstream.
We got a syzkaller problem because of aarch64 alignment fault if KFENCE enabled. When the size from user bpf program is an odd number, like 399, 407, etc, it will cause the struct skb_shared_info's unaligned access. As seen below:
BUG: KFENCE: use-after-free read in __skb_clone+0x23c/0x2a0 net/core/skbuff.c:1032
Use-after-free read at 0xffff6254fffac077 (in kfence-#213):
__lse_atomic_add arch/arm64/include/asm/atomic_lse.h:26 [inline] arch_atomic_add arch/arm64/include/asm/atomic.h:28 [inline] arch_atomic_inc include/linux/atomic-arch-fallback.h:270 [inline] atomic_inc include/asm-generic/atomic-instrumented.h:241 [inline] __skb_clone+0x23c/0x2a0 net/core/skbuff.c:1032 skb_clone+0xf4/0x214 net/core/skbuff.c:1481 ____bpf_clone_redirect net/core/filter.c:2433 [inline] bpf_clone_redirect+0x78/0x1c0 net/core/filter.c:2420 bpf_prog_d3839dd9068ceb51+0x80/0x330 bpf_dispatcher_nop_func include/linux/bpf.h:728 [inline] bpf_test_run+0x3c0/0x6c0 net/bpf/test_run.c:53 bpf_prog_test_run_skb+0x638/0xa7c net/bpf/test_run.c:594 bpf_prog_test_run kernel/bpf/syscall.c:3148 [inline] __do_sys_bpf kernel/bpf/syscall.c:4441 [inline] __se_sys_bpf+0xad0/0x1634 kernel/bpf/syscall.c:4381
kfence-#213: 0xffff6254fffac000-0xffff6254fffac196, size=407, cache=kmalloc-512
allocated by task 15074 on cpu 0 at 1342.585390s:
kmalloc include/linux/slab.h:568 [inline] kzalloc include/linux/slab.h:675 [inline] bpf_test_init.isra.0+0xac/0x290 net/bpf/test_run.c:191 bpf_prog_test_run_skb+0x11c/0xa7c net/bpf/test_run.c:512 bpf_prog_test_run kernel/bpf/syscall.c:3148 [inline] __do_sys_bpf kernel/bpf/syscall.c:4441 [inline] __se_sys_bpf+0xad0/0x1634 kernel/bpf/syscall.c:4381 __arm64_sys_bpf+0x50/0x60 kernel/bpf/syscall.c:4381
To fix the problem, we adjust @size so that (@size + @hearoom) is a multiple of SMP_CACHE_BYTES. So we make sure the struct skb_shared_info is aligned to a cache line.
--- net/bpf/test_run.c | 1 + 1 file changed, 1 insertion(+)
net/bpf/test_run.c +1 -0
@@ -87,6 +87,7 @@ static void *bpf_test_init(const union bif (size <ETH_HLEN || size >PAGE_SIZE - headroom - tailroom)return ERR_PTR (-EINVAL ); + size =SKB_DATA_ALIGN (size); data =kzalloc (size + headroom + tailroom,GFP_USER );if (!data)return ERR_PTR (-ENOMEM );
Greg Kroah-Hartman
maintainerPATCH 106/114 kcm: close race conditions on sk_receive_queue
In reply to Greg Kroah-HartmanFrom: Cong Wang <[email protected]>
commit 5121197ecc5db58c07da95eb1ff82b98b121a221 upstream.
sk->sk_receive_queue is protected by skb queue lock, but for KCM sockets its RX path takes mux->rx_lock to protect more than just skb queue. However, kcm_recvmsg() still only grabs the skb queue lock, so race conditions still exist.
We can teach kcm_recvmsg() to grab mux->rx_lock too but this would introduce a potential performance regression as struct kcm_mux can be shared by multiple KCM sockets.
So we have to enforce skb queue lock in requeue_rx_msgs() and handle skb peek case carefully in kcm_wait_data(). Fortunately, skb_recv_datagram() already handles it nicely and is widely used by other sockets, we can just switch to skb_recv_datagram() after getting rid of the unnecessary sock lock in kcm_recvmsg() and kcm_splice_read(). Side note: SOCK_DONE is not used by KCM sockets, so it is safe to get rid of this check too.
I ran the original syzbot reproducer for 30 min without seeing any issue.
--- net/kcm/kcmsock.c | 60 +++++++----------------------------------------------- 1 file changed, 8 insertions(+), 52 deletions(-)
net/kcm/kcmsock.c +8 -52
@@ -224,7 +224,7 @@ static void requeue_rx_msgs(struct kcm_mstruct sk_buff *skb;struct kcm_sock *kcm; -while ((skb =__skb_dequeue (head))) { +while ((skb =skb_dequeue (head))) {/* Reset destructor to avoid calling kcm_rcv_ready */ skb->destructor = sock_rfree;skb_orphan (skb);
@@ -1085,53 +1085,18 @@ out_error:return err; } -static struct sk_buff *kcm_wait_data (struct sock *sk,int flags, -long timeo,int *err) -{ -struct sk_buff *skb; - -while (!(skb =skb_peek (&sk->sk_receive_queue))) { -if (sk->sk_err) { - *err =sock_error (sk); -return NULL ; - } - -if (sock_flag (sk,SOCK_DONE )) -return NULL ; - -if ((flags &MSG_DONTWAIT ) || !timeo) { - *err = -EAGAIN ; -return NULL ; - } - -sk_wait_data (sk, &timeo,NULL ); - -/* Handle signals */ -if (signal_pending (current)) { - *err =sock_intr_errno (timeo); -return NULL ; - } - } - -return skb; -} -static int kcm_recvmsg (struct socket *sock,struct msghdr *msg,size_t len,int flags) { +int noblock = flags &MSG_DONTWAIT ;struct sock *sk = sock->sk;struct kcm_sock *kcm =kcm_sk (sk);int err =0 ; -long timeo;struct strp_msg *stm;int copied =0 ;struct sk_buff *skb; - timeo =sock_rcvtimeo (sk, flags &MSG_DONTWAIT ); - -lock_sock (sk); - - skb =kcm_wait_data (sk, flags, timeo, &err); + skb =skb_recv_datagram (sk, flags, noblock, &err);if (!skb) goto out;
@@ -1162,14 +1127,11 @@ msg_finished:/* Finished with message */ msg->msg_flags |=MSG_EOR ;KCM_STATS_INCR (kcm->stats.rx_msgs); -skb_unlink (skb, &sk->sk_receive_queue); -kfree_skb (skb); } } out: -release_sock (sk); - +skb_free_datagram (sk, skb);return copied ? : err; }
@@ -1177,9 +1139,9 @@ static ssize_t kcm_splice_read(struct so struct pipe_inode_info *pipe, size_t len, unsigned int flags) { + int noblock = flags & MSG_DONTWAIT;struct sock *sk = sock->sk;struct kcm_sock *kcm =kcm_sk (sk); -long timeo;struct strp_msg *stm;int err =0 ;ssize_t copied;
@@ -1187,11 +1149,7 @@ static ssize_t kcm_splice_read(struct so/* Only support splice for SOCKSEQPACKET */ - timeo =sock_rcvtimeo (sk, flags &MSG_DONTWAIT ); - -lock_sock (sk); - - skb =kcm_wait_data (sk, flags, timeo, &err); + skb =skb_recv_datagram (sk, flags, noblock, &err);if (!skb) goto err_out;
@@ -1219,13 +1177,11 @@ static ssize_t kcm_splice_read(struct so* finish reading the message. */ -release_sock (sk); - +skb_free_datagram (sk, skb);return copied; err_out: -release_sock (sk); - +skb_free_datagram (sk, skb);return err; }
Greg Kroah-Hartman
maintainerPATCH 107/114 9p: trans_fd/p9_conn_cancel: drop client lock earlier
In reply to Greg Kroah-HartmanFrom: Dominique Martinet <[email protected]>
commit 52f1c45dde9136f964d63a77d19826c8a74e2c7f upstream.
syzbot reported a double-lock here and we no longer need this lock after requests have been moved off to local list:
just drop the lock earlier.
--- net/9p/trans_fd.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/9p/trans_fd.c +2 -1
@@ -220,6 +220,8 @@ static void p9_conn_cancel(struct p9_conlist_move (&req->req_list, &cancel_list); } +spin_unlock (&m->client->lock); +list_for_each_entry_safe (req, rtmp, &cancel_list, req_list) {p9_debug (P9_DEBUG_ERROR ,"call back req %p\n" , req);list_del (&req->req_list);
@@ -227,7 +229,6 @@ static void p9_conn_cancel(struct p9_con req->t_err = err;p9_client_cb (m->client, req,REQ_STATUS_ERROR ); } -spin_unlock (&m->client->lock); } static __poll_t
Greg Kroah-Hartman
maintainerPATCH 108/114 gfs2: Check sb_bsize_shift after reading superblock
In reply to Greg Kroah-HartmanFrom: Andrew Price <[email protected]>
commit 670f8ce56dd0632dc29a0322e188cc73ce3c6b92 upstream.
Fuzzers like to scribble over sb_bsize_shift but in reality it's very unlikely that this field would be corrupted on its own. Nevertheless it should be checked to avoid the possibility of messy mount errors due to bad calculations. It's always a fixed value based on the block size so we can just check that it's the expected value.
Tested with:
mkfs.gfs2 -O -p lock_nolock /dev/vdb
for i in 0 -1 64 65 32 33; do
gfs2_edit -p sb field sb_bsize_shift $i /dev/vdb mount /dev/vdb /mnt/test && umount /mnt/test
done
Before this patch we get a withdraw after
[ 76.413681] gfs2: fsid=loop0.0: fatal: invalid metadata block [ 76.413681] bh = 19 (type: exp=5, found=4) [ 76.413681] function = gfs2_meta_buffer, file = fs/gfs2/meta_io.c, line = 492
and with UBSAN configured we also get complaints like
[ 76.373395] UBSAN: shift-out-of-bounds in fs/gfs2/ops_fstype.c:295:19 [ 76.373815] shift exponent 4294967287 is too large for 64-bit type 'long unsigned int'
After the patch, these complaints don't appear, mount fails immediately and we get an explanation in dmesg.
--- fs/gfs2/ops_fstype.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
fs/gfs2/ops_fstype.c +4 -1
@@ -172,7 +172,10 @@ static int gfs2_check_sb(struct gfs2_sbdpr_warn ("Invalid superblock size\n" );return -EINVAL ; } - +if (sb->sb_bsize_shift !=ffs (sb->sb_bsize) -1 ) { +pr_warn ("Invalid block size shift\n" ); +return -EINVAL ; + }return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 109/114 gfs2: Switch from strlcpy to strscpy
In reply to Greg Kroah-HartmanFrom: Andreas Gruenbacher <[email protected]>
commit 204c0300c4e99707e9fb6e57840aa1127060e63f upstream.
Switch from strlcpy to strscpy and make sure that @count is the size of the smaller of the source and destination buffers. This prevents reading beyond the end of the source buffer when the source string isn't null terminated.
Found by a modified version of syzkaller.
--- fs/gfs2/ops_fstype.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
fs/gfs2/ops_fstype.c +4 -2
@@ -372,8 +372,10 @@ static int init_names(struct gfs2_sbd *sif (!table[0 ]) table = sdp->sd_vfs->s_id; -strlcpy (sdp->sd_proto_name, proto,GFS2_FSNAME_LEN ); -strlcpy (sdp->sd_table_name, table,GFS2_FSNAME_LEN ); +BUILD_BUG_ON (GFS2_LOCKNAME_LEN >GFS2_FSNAME_LEN ); + +strscpy (sdp->sd_proto_name, proto,GFS2_LOCKNAME_LEN ); +strscpy (sdp->sd_table_name, table,GFS2_LOCKNAME_LEN ); table = sdp->sd_table_name;while ((table =strchr (table,'/' )))
Greg Kroah-Hartman
maintainerPATCH 110/114 9p/trans_fd: always use O_NONBLOCK read/write
In reply to Greg Kroah-HartmanFrom: Tetsuo Handa <[email protected]>
commit ef575281b21e9a34dfae544a187c6aac2ae424a9 upstream.
syzbot is reporting hung task at p9_fd_close() [1], for p9_mux_poll_stop()
from p9_conn_destroy() from p9_fd_close() is failing to interrupt already
started kernel_read() from p9_fd_read() from p9_read_work() and/or kernel_write() from p9_fd_write() from p9_write_work() requests.
Since p9_socket_open() sets O_NONBLOCK flag, p9_mux_poll_stop() does not need to interrupt kernel_read()/kernel_write(). However, since p9_fd_open() does not set O_NONBLOCK flag, but pipe blocks unless signal is pending, p9_mux_poll_stop() needs to interrupt kernel_read()/kernel_write() when the file descriptor refers to a pipe. In other words, pipe file descriptor needs to be handled as if socket file descriptor.
We somehow need to interrupt kernel_read()/kernel_write() on pipes.
A minimal change, which this patch is doing, is to set O_NONBLOCK flag
from p9_fd_open(), for O_NONBLOCK flag does not affect reading/writing
of regular files. But this approach changes O_NONBLOCK flag on userspace- supplied file descriptors (which might break userspace programs), and O_NONBLOCK flag could be changed by userspace. It would be possible to set O_NONBLOCK flag every time p9_fd_read()/p9_fd_write() is invoked, but still remains small race window for clearing O_NONBLOCK flag.
If we don't want to manipulate O_NONBLOCK flag, we might be able to surround kernel_read()/kernel_write() with set_thread_flag(TIF_SIGPENDING) and recalc_sigpending(). Since p9_read_work()/p9_write_work() works are processed by kernel threads which process global system_wq workqueue, signals could not be delivered from remote threads when p9_mux_poll_stop()
from p9_conn_destroy() from p9_fd_close() is called. Therefore, calling
set_thread_flag(TIF_SIGPENDING)/recalc_sigpending() every time would be needed if we count on signals for making kernel_read()/kernel_write() non-blocking.
--- net/9p/trans_fd.c | 3 +++ 1 file changed, 3 insertions(+)
net/9p/trans_fd.c +3 -0
@@ -836,11 +836,14 @@ static int p9_fd_open(struct p9_client * goto out_free_ts;if (!(ts->rd->f_mode &FMODE_READ )) goto out_put_rd; +/* prevent workers from hanging on IO when fd is a pipe */ + ts->rd->f_flags |=O_NONBLOCK ; ts->wr =fget (wfd);if (!ts->wr) goto out_put_rd;if (!(ts->wr->f_mode &FMODE_WRITE )) goto out_put_wr; + ts->wr->f_flags |=O_NONBLOCK ; client->trans = ts; client->status = Connected;
Greg Kroah-Hartman
maintainerPATCH 111/114 mm: fs: initialize fsdata passed to write_begin/write_end interface
In reply to Greg Kroah-HartmanFrom: Alexander Potapenko <[email protected]>
commit 1468c6f4558b1bcd92aa0400f2920f9dc7588402 upstream.
Functions implementing the a_ops->write_end() interface accept the void *fsdata parameter that is supposed to be initialized by the corresponding a_ops->write_begin() (which accepts void **fsdata).
However not all a_ops->write_begin() implementations initialize fsdata unconditionally, so it may get passed uninitialized to a_ops->write_end(), resulting in undefined behavior.
Fix this by initializing fsdata with NULL before the call to write_begin(), rather than doing so in all possible a_ops implementations.
This patch covers only the following cases found by running x86 KMSAN under syzkaller:
- generic_perform_write()
- cont_expand_zero() and generic_cont_expand_simple()
- page_symlink()
Other cases of passing uninitialized fsdata may persist in the codebase.
--- fs/buffer.c | 4 ++-- fs/namei.c | 2 +- mm/filemap.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-)
fs/buffer.c +2 -2
@@ -2321,7 +2321,7 @@ int generic_cont_expand_simple(struct in {struct address_space *mapping = inode->i_mapping;struct page *page; -void *fsdata; +void *fsdata =NULL ;int err; err =inode_newsize_ok (inode, size);
@@ -2347,7 +2347,7 @@ static int cont_expand_zero(struct filestruct inode *inode = mapping->host;unsigned int blocksize =i_blocksize (inode);struct page *page; -void *fsdata; +void *fsdata =NULL ;pgoff_t index, curidx;loff_t curpos;unsigned zerofrom, offset, len;
fs/namei.c +1 -1
@@ -4826,7 +4826,7 @@ int __page_symlink(struct inode *inode, {struct address_space *mapping = inode->i_mapping;struct page *page; -void *fsdata; +void *fsdata =NULL ;int err;unsigned int flags =0 ;if (nofs)
mm/filemap.c +1 -1
@@ -3140,7 +3140,7 @@ ssize_t generic_perform_write(struct filunsigned long offset;/* Offset into pagecache page */ unsigned long bytes;/* Bytes to write to page */ size_t copied;/* Bytes copied from user */ -void *fsdata; +void *fsdata =NULL ; offset = (pos & (PAGE_SIZE -1 )); bytes = min_t(unsigned long, PAGE_SIZE - offset,
Greg Kroah-Hartman
maintainerPATCH 112/114 ntfs: fix use-after-free in ntfs_attr_find()
In reply to Greg Kroah-HartmanFrom: Hawkins Jiawei <[email protected]>
commit d85a1bec8e8d552ab13163ca1874dcd82f3d1550 upstream.
Patch series "ntfs: fix bugs about Attribute", v2.
This patchset fixes three bugs relative to Attribute in record:
Patch 1 adds a sanity check to ensure that, attrs_offset field in first mft record loading from disk is within bounds.
Patch 2 moves the ATTR_RECORD's bounds checking earlier, to avoid dereferencing ATTR_RECORD before checking this ATTR_RECORD is within bounds.
Patch 3 adds an overflow checking to avoid possible forever loop in ntfs_attr_find().
Without patch 1 and patch 2, the kernel triggersa KASAN use-after-free detection as reported by Syzkaller.
Although one of patch 1 or patch 2 can fix this, we still need both of them. Because patch 1 fixes the root cause, and patch 2 not only fixes the direct cause, but also fixes the potential out-of-bounds bug.
This patch (of 3):
Syzkaller reported use-after-free read as follows:
==================================================================
BUG: KASAN: use-after-free in ntfs_attr_find+0xc02/0xce0 fs/ntfs/attrib.c:597 Read of size 2 at addr ffff88807e352009 by task syz-executor153/3607
[...]
Call Trace:
<TASK>
__dump_stack lib/dump_stack.c:88 [inline]
dump_stack_lvl+0xcd/0x134 lib/dump_stack.c:106
print_address_description mm/kasan/report.c:317 [inline]
print_report.cold+0x2ba/0x719 mm/kasan/report.c:433
kasan_report+0xb1/0x1e0 mm/kasan/report.c:495
ntfs_attr_find+0xc02/0xce0 fs/ntfs/attrib.c:597
ntfs_attr_lookup+0x1056/0x2070 fs/ntfs/attrib.c:1193
ntfs_read_inode_mount+0x89a/0x2580 fs/ntfs/inode.c:1845
ntfs_fill_super+0x1799/0x9320 fs/ntfs/super.c:2854
mount_bdev+0x34d/0x410 fs/super.c:1400
legacy_get_tree+0x105/0x220 fs/fs_context.c:610
vfs_get_tree+0x89/0x2f0 fs/super.c:1530
do_new_mount fs/namespace.c:3040 [inline]
path_mount+0x1326/0x1e20 fs/namespace.c:3370
do_mount fs/namespace.c:3383 [inline]
__do_sys_mount fs/namespace.c:3591 [inline]
__se_sys_mount fs/namespace.c:3568 [inline]
__x64_sys_mount+0x27f/0x300 fs/namespace.c:3568
do_syscall_x64 arch/x86/entry/common.c:50 [inline]
do_syscall_64+0x35/0xb0 arch/x86/entry/common.c:80
entry_SYSCALL_64_after_hwframe+0x63/0xcd
[...]
</TASK>
The buggy address belongs to the physical page:
page:ffffea0001f8d400 refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x7e350
head:ffffea0001f8d400 order:3 compound_mapcount:0 compound_pincount:0
flags: 0xfff00000010200(slab|head|node=0|zone=1|lastcpupid=0x7ff)
raw: 00fff00000010200 0000000000000000 dead000000000122 ffff888011842140
raw: 0000000000000000 0000000000040004 00000001ffffffff 0000000000000000
page dumped because: kasan: bad access detected
Memory state around the buggy address:
ffff88807e351f00: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
ffff88807e351f80: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
>ffff88807e352000: fa fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
^
ffff88807e352080: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
ffff88807e352100: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
==================================================================Kernel will loads $MFT/$DATA's first mft record in ntfs_read_inode_mount().
Yet the problem is that after loading, kernel doesn't check whether attrs_offset field is a valid value.
To be more specific, if attrs_offset field is larger than bytes_allocated field, then it may trigger the out-of-bounds read bug(reported as use-after-free bug) in ntfs_attr_find(), when kernel tries to access the corresponding mft record's attribute.
This patch solves it by adding the sanity check between attrs_offset field and bytes_allocated field, after loading the first mft record.
--- fs/ntfs/inode.c | 7 +++++++ 1 file changed, 7 insertions(+)
fs/ntfs/inode.c +7 -0
@@ -1854,6 +1854,13 @@ int ntfs_read_inode_mount(struct inode * goto err_out; } +/* Sanity check offset to the first attribute */ +if (le16_to_cpu (m->attrs_offset) >=le32_to_cpu (m->bytes_allocated)) { +ntfs_error (sb,"Incorrect mft offset to the first attribute %u in superblock." , +le16_to_cpu (m->attrs_offset)); + goto err_out; + } +/* Need this to sanity check attribute list references to $MFT. */ vi->i_generation = ni->seq_no =le16_to_cpu (m->sequence_number);
Greg Kroah-Hartman
maintainerPATCH 113/114 ntfs: fix out-of-bounds read in ntfs_attr_find()
In reply to Greg Kroah-HartmanFrom: Hawkins Jiawei <[email protected]>
commit 36a4d82dddbbd421d2b8e79e1cab68c8126d5075 upstream.
Kernel iterates over ATTR_RECORDs in mft record in ntfs_attr_find(). To ensure access on these ATTR_RECORDs are within bounds, kernel will do some checking during iteration.
The problem is that during checking whether ATTR_RECORD's name is within bounds, kernel will dereferences the ATTR_RECORD name_offset field, before checking this ATTR_RECORD strcture is within bounds. This problem may result out-of-bounds read in ntfs_attr_find(), reported by Syzkaller:
==================================================================
BUG: KASAN: use-after-free in ntfs_attr_find+0xc02/0xce0 fs/ntfs/attrib.c:597 Read of size 2 at addr ffff88807e352009 by task syz-executor153/3607
[...]
Call Trace:
<TASK>
__dump_stack lib/dump_stack.c:88 [inline]
dump_stack_lvl+0xcd/0x134 lib/dump_stack.c:106
print_address_description mm/kasan/report.c:317 [inline]
print_report.cold+0x2ba/0x719 mm/kasan/report.c:433
kasan_report+0xb1/0x1e0 mm/kasan/report.c:495
ntfs_attr_find+0xc02/0xce0 fs/ntfs/attrib.c:597
ntfs_attr_lookup+0x1056/0x2070 fs/ntfs/attrib.c:1193
ntfs_read_inode_mount+0x89a/0x2580 fs/ntfs/inode.c:1845
ntfs_fill_super+0x1799/0x9320 fs/ntfs/super.c:2854
mount_bdev+0x34d/0x410 fs/super.c:1400
legacy_get_tree+0x105/0x220 fs/fs_context.c:610
vfs_get_tree+0x89/0x2f0 fs/super.c:1530
do_new_mount fs/namespace.c:3040 [inline]
path_mount+0x1326/0x1e20 fs/namespace.c:3370
do_mount fs/namespace.c:3383 [inline]
__do_sys_mount fs/namespace.c:3591 [inline]
__se_sys_mount fs/namespace.c:3568 [inline]
__x64_sys_mount+0x27f/0x300 fs/namespace.c:3568
do_syscall_x64 arch/x86/entry/common.c:50 [inline]
do_syscall_64+0x35/0xb0 arch/x86/entry/common.c:80
entry_SYSCALL_64_after_hwframe+0x63/0xcd
[...]
</TASK>
The buggy address belongs to the physical page:
page:ffffea0001f8d400 refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x7e350
head:ffffea0001f8d400 order:3 compound_mapcount:0 compound_pincount:0
flags: 0xfff00000010200(slab|head|node=0|zone=1|lastcpupid=0x7ff)
raw: 00fff00000010200 0000000000000000 dead000000000122 ffff888011842140
raw: 0000000000000000 0000000000040004 00000001ffffffff 0000000000000000
page dumped because: kasan: bad access detected
Memory state around the buggy address:
ffff88807e351f00: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
ffff88807e351f80: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
>ffff88807e352000: fa fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
^
ffff88807e352080: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
ffff88807e352100: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
==================================================================This patch solves it by moving the ATTR_RECORD strcture's bounds checking earlier, then checking whether ATTR_RECORD's name is within bounds. What's more, this patch also add some comments to improve its maintainability.
--- fs/ntfs/attrib.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-)
fs/ntfs/attrib.c +16 -4
@@ -608,11 +608,23 @@ static int ntfs_attr_find(const ATTR_TYPfor (;; a = (ATTR_RECORD *)((u8 *)a +le32_to_cpu (a->length))) {u8 *mrec_end = (u8 *)ctx->mrec +le32_to_cpu (ctx->mrec->bytes_allocated); -u8 *name_end = (u8 *)a +le16_to_cpu (a->name_offset) + - a->name_length *sizeof (ntfschar); -if ((u8 *)a < (u8 *)ctx->mrec || (u8 *)a > mrec_end || - name_end > mrec_end) +u8 *name_end; + +/* check whether ATTR_RECORD wrap */ +if ((u8 *)a < (u8 *)ctx->mrec)break ; + +/* check whether Attribute Record Header is within bounds */ +if ((u8 *)a > mrec_end || + (u8 *)a +sizeof (ATTR_RECORD ) > mrec_end) +break ; + +/* check whether ATTR_RECORD's name is within bounds */ + name_end = (u8 *)a +le16_to_cpu (a->name_offset) + + a->name_length *sizeof (ntfschar); +if (name_end > mrec_end) +break ; + ctx->attr = a;if (unlikely (le32_to_cpu (a->type) >le32_to_cpu (type) || a->type ==AT_END ))
Greg Kroah-Hartman
maintainerPATCH 114/114 ntfs: check overflow when iterating ATTR_RECORDs
In reply to Greg Kroah-HartmanFrom: Hawkins Jiawei <[email protected]>
commit 63095f4f3af59322bea984a6ae44337439348fe0 upstream.
Kernel iterates over ATTR_RECORDs in mft record in ntfs_attr_find(). Because the ATTR_RECORDs are next to each other, kernel can get the next ATTR_RECORD from end address of current ATTR_RECORD, through current ATTR_RECORD length field.
The problem is that during iteration, when kernel calculates the end address of current ATTR_RECORD, kernel may trigger an integer overflow bug in executing a = (ATTR_RECORD*)((u8*)a + le32_to_cpu(a->length)). This may wrap, leading to a forever iteration on 32bit systems.
This patch solves it by adding some checks on calculating end address of current ATTR_RECORD during iteration.
--- fs/ntfs/attrib.c | 8 ++++++++ 1 file changed, 8 insertions(+)
fs/ntfs/attrib.c +8 -0
@@ -631,6 +631,14 @@ static int ntfs_attr_find(const ATTR_TYPreturn -ENOENT ;if (unlikely (!a->length))break ; + +/* check whether ATTR_RECORD's length wrap */ +if ((u8 *)a +le32_to_cpu (a->length) < (u8 *)a) +break ; +/* check whether ATTR_RECORD's length is within bounds */ +if ((u8 *)a +le32_to_cpu (a->length) > mrec_end) +break ; +if (a->type != type)continue ;/*
Hi!
Quoted 4 lines
This is the start of the stable review cycle for the 4.19.267 release. There are 114 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
CIP testing did not find any problems here:
https://gitlab.com/cip-project/cip-testing/linux-stable-rc-ci/-/tree/linux-4.19.y
Best regards,
Pavel
Signature · 2 lines
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.267 release. There are 114 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Fri, 25 Nov 2022 08:45:20 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.19.267-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.19.y
and the diffstat can be found below.thanks,
greg k-h
All tests passing for Tegra ...
Test results for stable-v4.19:
10 builds: 10 pass, 0 fail
22 boots: 22 pass, 0 fail
40 tests: 40 pass, 0 failLinux version: 4.19.267-rc1-gf65c47c3f336
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,
tegra194-p2972-0000, tegra20-ventana,
tegra210-p2371-2180, tegra30-cardhu-a04Jon
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.267 release. There are 114 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Fri, 25 Nov 2022 08:45:20 +0000. Anything received after that time might be too late.
Build results:
total: 157 pass: 157 fail: 0 Qemu test results: total: 423 pass: 423 fail: 0
Guenter
Hi Greg,
Quoted 7 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.267 release. There are 114 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Fri, 25 Nov 2022 08:45:20 +0000. Anything received after that time might be too late.
Build test (gcc version 11.3.1 20221016):
mips: 63 configs -> no failure
arm: 115 configs -> no failure
arm64: 2 configs -> no failurex86_64: 4 configs -> no failure
alpha allmodconfig -> no failure
powerpc allmodconfig -> no failure
riscv allmodconfig -> no failure
s390 allmodconfig -> no failure
xtensa allmodconfig -> no failure
Boot test:x86_64: Booted on my test laptop. No regression.x86_64: Booted on qemu. No regression. [1]
[1]. https://openqa.qa.codethink.co.uk/tests/2206
Signature · 2 lines
Regards Sudip
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.267 release. There are 114 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Fri, 25 Nov 2022 08:45:20 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.19.267-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.19.y
and the diffstat can be found below.thanks,
greg k-h
Results from Linaro's test farm.
No regressions on arm64, arm, x86_64, and i386.
## Build
* kernel: 4.19.267-rc1
* git: https://gitlab.com/Linaro/lkft/mirrors/stable/linux-stable-rc
* git branch: linux-4.19.y
* git commit: f65c47c3f3362b712468c9b15657d9311e998240
* git describe: v4.19.266-115-gf65c47c3f336
* test details:
https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-4.19.y/build/v4.19.266-115-gf65c47c3f336
## Test Regressions (compared to v4.19.266)
## Metric Regressions (compared to v4.19.266)
## Test Fixes (compared to v4.19.266)
## Metric Fixes (compared to v4.19.266)
## Test result summary
total: 83846, pass: 73027, fail: 1316, skip: 8899, xfail: 604
## Build Summary
* arc: 10 total, 10 passed, 0 failed
* arm: 323 total, 318 passed, 5 failed
* arm64: 59 total, 58 passed, 1 failed
* i386: 29 total, 28 passed, 1 failed
* mips: 46 total, 46 passed, 0 failed
* parisc: 12 total, 12 passed, 0 failed
* powerpc: 63 total, 63 passed, 0 failed
* s390: 15 total, 15 passed, 0 failed
* sh: 24 total, 24 passed, 0 failed
* sparc: 12 total, 12 passed, 0 failed
* x86_64: 53 total, 52 passed, 1 failed
## Test suites summary
* boot
* fwts
* kselftest-android
* kselftest-arm64
* kselftest-arm64/arm64.btitest.bti_c_func
* kselftest-arm64/arm64.btitest.bti_j_func
* kselftest-arm64/arm64.btitest.bti_jc_func
* kselftest-arm64/arm64.btitest.bti_none_func
* kselftest-arm64/arm64.btitest.nohint_func
* kselftest-arm64/arm64.btitest.paciasp_func
* kselftest-arm64/arm64.nobtitest.bti_c_func
* kselftest-arm64/arm64.nobtitest.bti_j_func
* kselftest-arm64/arm64.nobtitest.bti_jc_func
* kselftest-arm64/arm64.nobtitest.bti_none_func
* kselftest-arm64/arm64.nobtitest.nohint_func
* kselftest-arm64/arm64.nobtitest.paciasp_func
* kselftest-breakpoints
* kselftest-drivers-dma-buf
* kselftest-efivarfs
* kselftest-gpio
* kselftest-intel_pstate
* kselftest-kvm
* kselftest-lib
* kselftest-net
* kselftest-net-forwarding
* kselftest-net-mptcp
* kselftest-netfilter
* kselftest-openat2
* kselftest-seccomp
* kselftest-timens
* kunit
* kvm-unit-tests
* libhugetlbfs
* log-parser-boot
* log-parser-test
* ltp-cap_bounds
* ltp-commands
* ltp-containers
* ltp-controllers
* ltp-cpuhotplug
* ltp-crypto
* ltp-cve
* ltp-dio
* ltp-fcntl-locktests
* ltp-filecaps
* ltp-fs
* ltp-fs_bind
* ltp-fs_perms_simple
* ltp-fsx
* ltp-hugetlb
* ltp-io
* ltp-ipc
* ltp-math
* ltp-mm
* ltp-nptl
* ltp-open-posix-tests
* ltp-pty
* ltp-sched
* ltp-securebits
* ltp-smoke
* ltp-syscalls
* ltp-tracing
* network-basic-tests
* packetdrill
* rcutorture
* v4l2-compliance
* vdso
--
Linaro LKFT
https://lkft.linaro.org
Quoted 14 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.267 release. There are 114 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Fri, 25 Nov 2022 08:45:20 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.19.267-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.19.y
and the diffstat can be found below.
Quoted 5 lines
thanks,
greg k-h
-------------
Tested on arm64 and x86 for 4.19.267-rc1,
Kernel repo:https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
Branch: linux-4.19.y
Version: 4.19.267-rc1
Commit: f65c47c3f3362b712468c9b15657d9311e998240
Compiler: gcc version 7.3.0 (GCC)
arm64:
--------------------------------------------------------------------
Testcase Result Summary:
total: 8947
passed: 8947
failed: 0
timeout: 0
--------------------------------------------------------------------
x86:
--------------------------------------------------------------------
Testcase Result Summary:
total: 8947
passed: 8947
failed: 0
timeout: 0
--------------------------------------------------------------------