5.10.270-rc1 review
Subsystems (2)
Greg Kroah-Hartman
maintainercover 5.10.270-rc1 review
This is the start of the stable review cycle for the 5.10.270 release. There are 798 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 Mon, 14 Sep 2026 06:54:17 +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/v5.x/stable-review/patch-5.10.270-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-5.10.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 5.10.270-rc1
Zhang Chen <[email protected]>
Bluetooth: L2CAP: Fix send LE flow credits in ACL link
Steven Rostedt (VMware) <[email protected]>
tracing: Handle %.*s in trace_check_vprintf()
Steven Rostedt (Google) <[email protected]>
tracing: Have trace event string test handle zero length strings
Michael Wu <[email protected]>
tracing: Fix race between update_event_fields and, event_define_fields
Dan Carpenter <[email protected]>
HID: fix an error code in hid_check_device_match()
Rafael Mendonca <[email protected]>
scsi: qla2xxx: Fix memory leak in __qlt_24xx_handle_abts()
Andy Shevchenko <[email protected]>
ACPI: utils: Document for_each_acpi_dev_match() macro
Thomas Gleixner <[email protected]>
mm/highmem: Take kmap_high_get() properly into account
Bjorn Andersson <[email protected]>
clk: qcom: gdsc: Bump parent usage count when GDSC is found enabled
Hui Tang <[email protected]>
crypto: testmgr - fix initialization of 'secret_size'
Hui Tang <[email protected]>
crypto: ecdh - extend 'cra_driver_name' with curve name
Dmitry Baryshkov <[email protected]>
driver core: platform: don't oops in platform_shutdown() on unbound devices
Jiayuan Chen <[email protected]>
tcp: fix corruption of urgent data on multi-segment retransmit
Deepanshu Kartikey <[email protected]>
usb: atm: usbatm: fix invalid ci_range initialization
bui duc phuc <[email protected]>
net: fec: only stop PTP if it was initialized
Jamal Hadi Salim <[email protected]>
net/sched: bound qdisc_pkt_len to prevent qdisc soft lockup
Maxime Chevallier <[email protected]>
net: stmmac: selftests: Account for the UC filter list for filtering tests
Maxime Chevallier <[email protected]>
net: stmmac: dwxgmac: Account for the primary MAC address for UC filtering
Maxime Chevallier <[email protected]>
net: stmmac: dwmac4: Account for the primary MAC address for UC filtering
Maxime Chevallier <[email protected]>
net: stmmac: dwmac1000: Account for the primary MAC address for UC filtering
Maxime Chevallier <[email protected]>
net: stmmac: selftests: Check multiple MMC counters
Muhammad Usama Anjum <[email protected]>
selftests/arm64: Treat KSM merge_across_nodes as optional
Pablo Neira Ayuso <[email protected]>
netfilter: x_tables: replace pr_{info,err}() by pr_info_ratelimited()
Marino Dzalto <[email protected]>
netfilter: xt_HL: add pr_fmt and checkentry validation
Michal Koutný <[email protected]>
netfilter: xt_cgroup: Make it independent from net_cls
Pablo Neira Ayuso <[email protected]>
netfilter: nf_tables: move hardware offload step after building the chain blob
bui duc phuc <[email protected]>
net: ethernet: sun4i-emac: Fix IRQ error handling
HyeongJun An <[email protected]>
ASoC: dapm: Fix off-by-one check on the second enum channel
John Johansen <[email protected]>
apparmor: policy_int make sure list heads are initialized before fail path
Thorsten Blum <[email protected]>
apparmor: Replace sprintf/strcpy with scnprintf/strscpy in aa_policy_init
Ruoyu Wang <[email protected]>
tpm: st33zp24: Validate locality read result
Ruoyu Wang <[email protected]>
tpm: st33zp24: Return zero on status read failure
Victor Nogueira <[email protected]>
net/sched: sch_teql: restore skb->dev on the slave failure path
Jamal Hadi Salim <[email protected]>
net/sched: sfq: clamp quantum to avoid signed overflow soft lockup
Jamal Hadi Salim <[email protected]>
net/sched: hhf: clamp quantum before hhf_change() to avoid overflow
Jamal Hadi Salim <[email protected]>
net/sched: fq_pie: clamp default quantum to avoid signed overflow
Jamal Hadi Salim <[email protected]>
net/sched: sch_codel: clamp default mtu to avoid disabling CoDel
Jamal Hadi Salim <[email protected]>
net/sched: fq_codel: clamp default quantum and mtu
Eric Dumazet <[email protected]>
net_sched: export pfifo_fast prio2band[]
Eric Dumazet <[email protected]>
net_sched: sch_fq: change how @inactive is tracked
Eric Dumazet <[email protected]>
net_sched: sch_fq: struct sched_data reorg
Jiapeng Chong <[email protected]>
net: ip6_gre: Remove the unused function ip6gre_tnl_addr_conflict()
Frank Sorenson <[email protected]>
cifs: fix clearing stats for fastest execution of each smb2 command
Allison Henderson <[email protected]>
net/rds: use wq_has_sleeper() in rds_cong_map_updated()
Xiang Mei <[email protected]>
net: qualcomm: rmnet: restore skb->dev on deaggregated frames
Cen Zhang (Microsoft) <[email protected]>
gtp: add synchronize_net() in gtp_newlink() error path to prevent use-after-free
Hyunwoo Kim <[email protected]>
Bluetooth: RFCOMM: Validate MTU in rfcomm_apply_pn() to prevent infinite loop
Chris Lu <[email protected]>
Bluetooth: btmtksdio: Take exclusive ownership of the SKB before TX
Pauli Virtanen <[email protected]>
Bluetooth: 6lowpan: fix cyclic locking warning on netdev unregister
Edward Adam Davis <[email protected]>
bluetooth/l2cap: sync sock recv cb and release
Sebastian Urban <[email protected]>
Bluetooth: compute LE flow credits based on recvbuf space
Dan Carpenter <[email protected]>
scsi: qla2xxx: Fix an loop timeout test
Junrui Luo <[email protected]>
NFSv4/pnfs: key the data server cache on the NFS version
Jeff Layton <[email protected]>
nfs: move the nfs4_data_server_cache into struct nfs_net
Junrui Luo <[email protected]>
NFSv4.2: fix LAYOUTSTATS send buffer exhaustion
Mahanta Jambigi <[email protected]>
net/smc: free pending qentry in smc_llc_flow_stop() before memset
Marek Czernohous <[email protected]>
forcedeth: stop the tx_timeout register dump past the requested window
Fan Ye <[email protected]>
net: thunderbolt: Count delivered packets in rx_packets and rx_bytes
Ruoyu Wang <[email protected]>
net: bridge: Reject descending VLAN tunnel ranges
Serhat Kumral <[email protected]>
RDMA/ucma: Allow path records to exactly fit the output buffer
Bradley Morgan <[email protected]>
prctl: fix PR_SET_MM_AUXV losing the forced AT_NULL terminator
Yi Ding <[email protected]>
rtc: pcf8563: fix clock provider leak on unbind
Li RongQing <[email protected]>
vdpa/mlx5: fix wrong list iterated in add_direct_chain error path
Michael S. Tsirkin <[email protected]>
virtio_balloon: disable indirect descriptors
Ruoyu Wang <[email protected]>
bonding: initialize err for empty target lists
Nguyen Dinh Phi <[email protected]>
vsock: use sock_error() to consume sk_err after a failed connect
Karl Mehltretter <[email protected]>
8139cp: fix Rx and Tx not being disabled in cp_suspend
Xu Rao <[email protected]>
ALSA: hda: Fix connection list comparison in proc output
Nikolay Aleksandrov <[email protected]>
net: bridge: vlan: fix inverted default vlan notification
Joas Antonio dos Santos <[email protected]>
ipvs: fix integer overflow in ftp helper port/address parsing
Lukasz Majewski <[email protected]>
net: hsr: Use full string description when opening HSR network device
Sebastian Andrzej Siewior <[email protected]>
hsr: Use a single struct for self_node.
Qingfang Deng <[email protected]>
pppox: drain queued packets on channel handoff
Junseo Lim <[email protected]>
net: kcm: Hold RCU read lock while running BPF parser
Ruoyu Wang <[email protected]>
NFSv4: remove callback IDR entry on client allocation failure
Arnaud Bonnet <[email protected]>
nfs: refactor pNFS functions using clear_and_wake_up_bit
Trond Myklebust <[email protected]>
NFSv4/pnfs: Clean up layout get on open
Arnaud Bonnet <[email protected]>
nfs: replace atomic bitops sequence with clear_and_wake_up_bit helper
Trond Myklebust <[email protected]>
NFS: Always clear an invalid mapping when attempting a buffered write
Junseo Lim <[email protected]>
bpf: Reject negative optlen in cgroup getsockopt hook
Junseo Lim <[email protected]>
lwt_bpf: Restore reserved headroom after xmit program
Delphine CC Chiu <[email protected]>
hwmon: (emc1403) Add support for EMC1442
Linmao Li <[email protected]>
mailbox: rockchip: disable pclk on probe failure and unbind
Arnaldo Carvalho de Melo <[email protected]>
perf dso: Guard against cache underflow on short reads in dso_cache__memcpy()
Arnaldo Carvalho de Melo <[email protected]>
perf dso: Guard close() against invalid fd in dso__decompress_kmodule_path()
Israel Téllez García <[email protected]>
bpf: Fix pending_pos walk on 32-bit ring position wrap
Steven Rostedt (Google) <[email protected]>
tracing: Have TRACE_DEFINE_ENUM affect trace event types as well
Steven Rostedt (VMware) <[email protected]>
tracing: Add DYNAMIC flag for dynamic events
Steven Rostedt (VMware) <[email protected]>
tracing: Add a verifier to check string pointers for trace events
Steven Rostedt (VMware) <[email protected]>
seq_buf: Add seq_buf_terminate() API
Chandrakanth Patil <[email protected]>
scsi: mpt3sas: Avoid freeing unallocated PCIe SGL buffers
Phillip Lougher <[email protected]>
Squashfs: check block offset is not negative
Krystian Kaniewski <[email protected]>
ocfs2: fix circular locking dependency in ocfs2_init_acl()
Yuan Chen <[email protected]>
bpftool: Fix double close in map dump
Bijan Tabatabai <[email protected]>
x86/pkeys: Fix pkey_alloc() return value when pkeys are not supported
Yuho Choi <[email protected]>
clocksource/drivers/armada: Unwind timer clock on init failure
Guangshuo Li <[email protected]>
clocksource/drivers/clps711x: Do not unmap clocksource MMIO
Yuho Choi <[email protected]>
xenbus: Unregister reboot notifier on init failure
Henrik Grimler <[email protected]>
power: supply: bq27xxx: bq27z561: fix invalid AverageEnergy address
Henrik Grimler <[email protected]>
power: supply: bq27xxx: bq28z610: fix invalid AverageEnergy address
Henrik Grimler <[email protected]>
power: supply: bq27xxx: bq27520g4: fix REG_TTES address
Matti Vaittinen <[email protected]>
power: supply: bd99954: Drop bad register fields
Felix Gu <[email protected]>
spi: img-spfi: don't disable runtime PM on DMA deferred probe
Ran Hongyun <[email protected]>
UBI: fix two issues in the ubi.mtd MODULE_PARM_DESC
Rosen Penev <[email protected]>
ASoC: xilinx: formatter_pcm: fix stream_data leak on open error
Yuho Choi <[email protected]>
ubi: Fix rollback for explicit UBI device numbers
Zhihao Cheng <[email protected]>
ubi: fastmap: Add module parameter to control reserving filling pool PEBs
Zhihao Cheng <[email protected]>
ubi: fastmap: Fix lapsed wear leveling for first 64 PEBs
Zhihao Cheng <[email protected]>
ubi: fastmap: Wait until there are enough free PEBs before filling pools
Yang Li <[email protected]>
ubi: Simplify bool conversion
ZhaoLong Wang <[email protected]>
ubi: fastmap: Add fastmap control support for module parameter
Zhihao Cheng <[email protected]>
ubi: fastmap: Add fastmap control support for 'UBI_IOCATT' ioctl
Zhihao Cheng <[email protected]>
UBI: fastmap: Pass to_be_tortured when reusing old fastmap PEBs
Zhihao Cheng <[email protected]>
UBI: Preserve torture flag when rescheduling failed erasures
Zhihao Cheng <[email protected]>
ubi: Replace erase_block() with sync_erase()
Zhihao Cheng <[email protected]>
ubi: fastmap: Allocate memory with GFP_NOFS in ubi_update_fastmap
Zhihao Cheng <[email protected]>
ubi: fastmap: erase_block: Get erase counter from wl_entry rather than flash
Zhihao Cheng <[email protected]>
ubi: fastmap: Fix missed ec updating after erasing old fastmap data block
Christophe JAILLET <[email protected]>
ubi: fastmap: Use the bitmap API to allocate bitmaps
Jilin Yuan <[email protected]>
ubi: Fix repeated words in comments
LiangCheng Wang <[email protected]>
ASoC: fsl-asoc-card: defer probe when the CPU DAI device is not ready
bui duc phuc <[email protected]>
ASoC: pxa: Use devm_clk_get_optional() for extclk clock
Zhu Yanjun <[email protected]>
RDMA/cma: Fix WARNING in res_to_rt
Fan Wu <[email protected]>
RDMA/cxgb4: Free debugfs on registration failure
Guangshuo Li <[email protected]>
dmaengine: qcom-bam-dma: fix autosuspend cleanup during removal
Linmao Li <[email protected]>
nfc: digital: Do not dump a NULL response in command completion
Yinhao Hu <[email protected]>
nfc: pn533: hold a reference to the request skb during send_frame
Doruk Tan Ozturk <[email protected]>
nfc: llcp: bound SNL TLV parsing to the skb and add length checks
Zhenghang Xiao <[email protected]>
nfc: nci: fix double completion race in nci_data_exchange_complete
Breno Leitao <[email protected]>
nfc: llcp: read llcp_sock->local under the socket lock in getsockopt
Breno Leitao <[email protected]>
nfc: llcp: avoid userspace overflow on invalid optlen
Babanpreet Singh <[email protected]>
spi: sprd-adi: Fix probe succeeding without registering the controller
Michael Walle <[email protected]>
powerpc/configs: enable CONFIG_RAS to fix EDAC support
Weiming Shi <[email protected]>
SUNRPC: check rpc_sockaddr2uaddr() return value in rpcb_register_inet4/6
Karl Mehltretter <[email protected]>
m68k: Fix backtraces for non-running tasks
Desnes Nunes <[email protected]>
iommu/vt-d: Fix UCTP context table slot when copying root entries
Danila Chernetsov <[email protected]>
fbdev: kyro: Validate overlay viewport coordinates
Ian Rogers <[email protected]>
perf synthetic-events: Fix divide by zero in perf_event__synthesize_threads
Ian Rogers <[email protected]>
perf synthetic-events: Fix uninitialized pthread_join
Ian Rogers <[email protected]>
perf stat: Fix evsel_list leak in cmd_stat
Namhyung Kim <[email protected]>
perf stat: Clear screen only if output file is a tty
Rosen Penev <[email protected]>
ARM: dts: helios4: add SATA regulator supplies
Rosen Penev <[email protected]>
ARM: dts: helios4: add vcc-supply to GPIO expander
Rosen Penev <[email protected]>
ARM: dts: helios4: add vcc-supply to EEPROM
Tomáš Macholda <[email protected]>
arm64: dts: turris-mox: fix usb3 phys
Nikhil Gautam <[email protected]>
iio: light: gp2ap002: re-enable irq if runtime suspend fails
Nikhil Gautam <[email protected]>
iio: light: gp2ap002: Fix unbalanced runtime PM on repeated event writes
Ali Ahmet Memis <[email protected]>
Bluetooth: MSFT: validate evt_prefix_len against the response length
Tanushree Shah <[email protected]>
perf trace-event: Fix integer truncation in do_read() and skip()
Zijun Hu <[email protected]>
Bluetooth: btusb: Fix BD_ADDR byte order in btusb_set_bdaddr_wcn6855()
Ricardo Neri <[email protected]>
sched/fair: Check CPU capacity before comparing group types during load balance
Valentin Schneider <[email protected]>
sched/fair: Introduce a CPU capacity comparison helper
Kamal Wadhwa <[email protected]>
regulator: qcom-rpmh: Fix PMIC5 BOB bypass mode handling
Loic Poulain <[email protected]>
phy: qcom: snps-femto-v2: Fix possible NULL-deref on early runtime suspend
Yichong Chen <[email protected]>
hugetlbfs: release subpool on fill_super failure
Simon Glass <[email protected]>
pinctrl: rockchip: Reset the pin count when recalculating SoC data
Mukesh Ojha <[email protected]>
firmware_loader: do not queue completed sysfs fallback requests
Russ Weight <[email protected]>
firmware_loader: Check fw_state_is_done in loading_store
Manish Rangankar <[email protected]>
scsi: qla2xxx: Remove redundant VPD flash read in sysfs read path
Timur Kristóf <[email protected]>
drm/amdgpu/gfx6: Use PFP on the compute queues too
Timur Kristóf <[email protected]>
drm/amdgpu/gfx6: Fixup emitting SWITCH_BUFFER packets
Tanushree Shah <[email protected]>
perf trace-event: Fix buffer overflow in read_string()
Timur Kristóf <[email protected]>
drm/amdgpu/gfx6: Fixup emit_cntxcntl()
Pengpeng Hou <[email protected]>
mfd: iqs62x: Reject zero-length firmware records
Pengpeng Hou <[email protected]>
mfd: rave-sp: validate received frame payload lengths
Vladimir Murzin <[email protected]>
arm64: hibernate: Restore DAIF state on error
Ada Couprie Diaz <[email protected]>
arm64: hibernate: mask DAIF before restoring hibernated kernel
Shuangpeng Bai <[email protected]>
RDMA/siw: Fix use-after-free in siw_accept()
Guoqing Jiang <[email protected]>
RDMA/siw: Introduce siw_free_cm_id
Yehyeong Lee <[email protected]>
IB/isert: post the full-feature receive buffers after session registration
Yehyeong Lee <[email protected]>
IB/isert: delay the final Login Response until the session is registered
Karl Mehltretter <[email protected]>
cpufreq: imx6q: fix out-of-bounds write when probed more than once
Karl Mehltretter <[email protected]>
cpufreq: imx6q: fix devres accumulation across driver rebind
Jernej Skrabec <[email protected]>
drm/sun4i: hdmi-phy: Fix H6 8-bit MPLL config at 594 MHz
Jernej Skrabec <[email protected]>
drm/sun4i: dw-hdmi: Drop TCON TOP port reference
Jernej Skrabec <[email protected]>
drm/sun4i: tcon: Drop remote endpoint reference
Jernej Skrabec <[email protected]>
drm/sun4i: crtc: Propagate layer initialization error
Jernej Skrabec <[email protected]>
drm/sun4i: tcon: Drop TCON TOP device reference
Geert Uytterhoeven <[email protected]>
bitfield: Add non-constant field_{prep,get}() helpers
Geert Uytterhoeven <[email protected]>
bitfield: Add less-checking __FIELD_{GET,PREP}()
Kuninori Morimoto <[email protected]>
of: property: use unsigned int return on of_graph_get_endpoint_count()
Kuninori Morimoto <[email protected]>
of: property: add missing kerneldoc for of_graph_get_endpoint_count()
Jernej Skrabec <[email protected]>
drm/sun4i: vi scaler: Fix coefficient selection
Cen Zhang <[email protected]>
ocfs2: synchronize heartbeat callbacks with o2net teardown
Joseph Qi <[email protected]>
ocfs2: use bitmap API in fill_node_map
Xie Yuanbin <[email protected]>
ARM: 9485/1: mm: acquire mmap write lock around show_pte() for user faults
Yehyeong Lee <[email protected]>
RDMA/srp: fix heap information leak on a truncated SRP_CRED_REQ
Sergei Litvin <[email protected]>
scripts/tags.sh: Prevent binary files appearing in cscope.files
Jialu Xu <[email protected]>
scripts/tags.sh: improve compiled sources generation
Mukesh Ojha <[email protected]>
remoteproc: fix OOB read via signed offset in rsc_table_for_each_entry()
Mukesh Ojha <[email protected]>
remoteproc: use rsc_table_for_each_entry() in rproc_handle_resources()
Mukesh Ojha <[email protected]>
remoteproc: Move resource table data structure to its own header
Suman Anna <[email protected]>
remoteproc: Fix various kernel-doc warnings
Mathieu Poirier <[email protected]>
remoteproc: Introduce function rproc_detach()
Mathieu Poirier <[email protected]>
remoteproc: Introduce function __rproc_detach()
Mathieu Poirier <[email protected]>
remoteproc: Add new detach() remoteproc operation
Suman Anna <[email protected]>
remoteproc: Add a rproc_set_firmware() API
Krzysztof Wilczyński <[email protected]>
PCI/sysfs: Add static PCI resource attribute macros
Yichong Chen <[email protected]>
fat: release buffer head after rebuilding parent
Guangshuo Li <[email protected]>
rapidio: clear mport->net when rio_add_net() fails
Calvin Owens <[email protected]>
pps: don't try to wait for negative timeouts in PPS_FETCH
Bradley Morgan <[email protected]>
lib/string: fix memchr_inv() for large ranges
Tao Cui <[email protected]>
block/kyber-iosched: flush per-cpu latency buckets over possible CPUs
Tao Cui <[email protected]>
block/blk-iocost: collect per-cpu latency stats over possible CPUs
Tao Cui <[email protected]>
block/blk-stat: drain per-cpu callback stats over possible CPUs
Breno Leitao <[email protected]>
phonet: pep: do not write beyond optlen in getsockopt
Sang-Heon Jeon <[email protected]>
iio: light: tsl2583: return zero in write_raw() on success
Sang-Heon Jeon <[email protected]>
iio: light: isl29028: return zero in write_raw() on success
Yuanshen Cao <[email protected]>
iio: light: tsl2772: fix ALS calibscale readback
Arnaldo Carvalho de Melo <[email protected]>
perf intel-bts: Fix off-by-one in auxtrace_info minimum size check
Arnaldo Carvalho de Melo <[email protected]>
perf intel-pt: Fix off-by-one in auxtrace_info minimum size check
Arnaldo Carvalho de Melo <[email protected]>
perf auxtrace: Fix queue grow overflow and old array leak
Arnaldo Carvalho de Melo <[email protected]>
perf thread-stack: Fix heap buffer overflow on branch stack wrap copy
Jiancheng Huang <[email protected]>
HID: lg4ff: validate report length before fixed offsets
Ai Chao <[email protected]>
HID: i2c-hid: Fix "(null)" output when reading report descriptor fails
Hans de Goede <[email protected]>
HID: i2c-hid: Switch i2c_hid_parse() to goto style error handling
Yousef Alhouseen <[email protected]>
HID: synchronize input before cleaning up a failed probe
Dmitry Torokhov <[email protected]>
HID: ensure timely release of driver-allocated resources
Dmitry Torokhov <[email protected]>
HID: split apart hid_device_probe to make logic more apparent
Karl Mehltretter <[email protected]>
tty: clear cdev pointer after cdev_add() failure
Karl Mehltretter <[email protected]>
serial: amba-pl011: unprepare console clock on unregister
Thomas Bogendoerfer <[email protected]>
MIPS: ptrace: Fix syscall skipping via PTRACE_SYSCALL
Gou Hao <[email protected]>
powerpc/smp: add NULL guard for cause_ipi in smp_muxed_ipi_message_pass
Laxman Acharya Padhya <[email protected]>
firmware: coreboot: Validate table bounds
Titouan Ameline de Cadeville <[email protected]>
firmware: google: Add bounds checks in coreboot_table_populate()
Kees Cook <[email protected]>
firmware: coreboot: Check size of table entry and use flex-array
Philipp Borgers <[email protected]>
mac80211: add ieee80211_is_tx_data helper function
Slawomir Stepien <[email protected]>
wifi: zd1211rw: reject secondary interfaces to prevent conflicts
Pranjal Shrivastava <[email protected]>
iommu/arm-smmu-v3: Convert to use atomic poll timeout
Linghui Wu <[email protected]>
wifi: ath10k: snoc: use memcpy_fromio() for MSA ramdump
Arnaldo Carvalho de Melo <[email protected]>
perf machine: Check snprintf truncation for guest kallsyms path
Arnaldo Carvalho de Melo <[email protected]>
perf machine: Free scandir entries in guest kernel map creation
Arnaldo Carvalho de Melo <[email protected]>
perf machine: Reset errno before strtol in guest kernel map creation
Arnaldo Carvalho de Melo <[email protected]>
perf machine: Don't abort guest map creation on first inaccessible dir
Arnaldo Carvalho de Melo <[email protected]>
perf machine: Check snprintf truncation in machines__findnew()
Arnaldo Carvalho de Melo <[email protected]>
perf machine: Use snprintf() for guestmount path construction
Arnaldo Carvalho de Melo <[email protected]>
perf machine: Guard against NULL strlist in machines__findnew()
Joy Zou <[email protected]>
regulator: core: use system_freezable_wq for init complete work
Jeff Johnson <[email protected]>
wifi: ath11k: fix leak in ath11k_service_ready_ext_event()
Konrad Dybcio <[email protected]>
drm/msm/dsi: Drop dev_pm_opp_set_rate(0)
Leo Yan <[email protected]>
perf: arm_spe: Make wakeup range check overflow safe
Felix Fietkau <[email protected]>
wifi: mt76: mt7915: use little-endian for bss_info_ra wire fields
Felix Fietkau <[email protected]>
wifi: mt76: mt7915: avoid nss underflow in mt7915_mcu_get_sta_nss
Devin Wittmayer <[email protected]>
wifi: mt76: mt76x02: do not WARN on invalid rx descriptor length
Yichong Chen <[email protected]>
fanotify: report full event length for FIONREAD
Abdun Nihaal <[email protected]>
misc: vmc_vmci: Fix potential memory leak in vmci_event_subscribe()
Naveen Kumar Chaudhary <[email protected]>
locking/lockdep: Fix NULL pointer dereference in __lock_set_class()
Adrian Hunter <[email protected]>
i3c: master: Fix device_register() error path
Jakub Kicinski <[email protected]>
i3c: dw: avoid shift-out-of-bounds when DAA assigns no devices
Aneesh Kumar K.V (Arm) <[email protected]>
iommu/dma: Check atomic pool allocation result directly
Vladimir Zapolskiy <[email protected]>
clk: qcom: Return expected ENOMEM error on dynamic allocation failure
Stanislav Kinsburskii <[email protected]>
lib/test_hmm: fail dmirror_fault() when the mirrored mm is gone
Pu Lehui <[email protected]>
bpf: Fix potential UAF in bpf_netns_link_update_prog
Hongyan Xu <[email protected]>
power: supply: sc2731_charger: cancel work on remove
Uwe Kleine-König <[email protected]>
power: supply: sc2731_charger: Convert to platform remove callback returning void
Hongyan Xu <[email protected]>
power: supply: isp1704_charger: cancel work on remove
Cheng-Han Wu <[email protected]>
selftests/zram: fix kernel_gte() for POSIX sh
Sajal Gupta <[email protected]>
md/raid5-ppl: fix use-after-free in ppl_do_flush()
Abdun Nihaal <[email protected]>
wifi: rtlwifi: pci: fix error path in rtl_pci_probe()
Guixin Liu <[email protected]>
nvme-fc: unmap cmd_iu DMA on rsp_iu mapping failure in init_request
Yehyeong Lee <[email protected]>
IB/isert: reject login PDUs declaring more data than was received
Yehyeong Lee <[email protected]>
IB/isert: reject PDUs declaring more data than was received
Leon Romanovsky <[email protected]>
RDMA/cxgb4: free STAG index when TPT entry write fails
Leon Romanovsky <[email protected]>
RDMA/mlx5: Send cong param changes to the resolved port mdev
Leon Romanovsky <[email protected]>
RDMA/mlx5: Fix stack out-of-bounds read in cc_params debugfs
David Lee <[email protected]>
nilfs2: prevent out-of-bounds read in super root block parsing
Joshua Crofts <[email protected]>
nilfs2: fix infinite loop in nilfs_clean_segments()
longlong yan <[email protected]>
clk/x86: pmc_atom: add kasprintf return value check
Myeonghun Pak <[email protected]>
clk: palmas: Manage external-control prepare with devm
Guangshuo Li <[email protected]>
clk: tegra: tegra124-emc: put EMC node on register failure
Ondrej Jirman <[email protected]>
arm64: dts: allwinner: sun50i-a64-pinephone: Fix mpu6050 mount matrix
Yonatan Nachum <[email protected]>
RDMA/efa: Fix PBL chunk length computation
Ivy Lopez <[email protected]>
staging: rtl8723bs: use kfree_sensitive() for key material
Bjorn Andersson <[email protected]>
remoteproc: Prevent crash handling to race with rproc_del()
Jingyi Wang <[email protected]>
remoteproc: core: Attach rproc asynchronously in rproc_add() path via schedule_work()
Mukesh Ojha <[email protected]>
remoteproc: Use unbounded workqueue for recovery work
Alex Elder <[email protected]>
remoteproc: use freezable workqueue for crash notifications
Mathieu Poirier <[email protected]>
remoteproc: Add new RPROC_ATTACHED state
Mathieu Poirier <[email protected]>
remoteproc: Remove useless check in rproc_del()
Babanpreet Singh <[email protected]>
w1: ds2482: Fix signedness bug in ds2482_w1_triplet()
Yichong Chen <[email protected]>
isofs: release zisofs block pointer buffer head
Maher Sanalla <[email protected]>
RDMA/mlx5: Fix integer overflow of user QP buffer size
Babanpreet Singh <[email protected]>
power: supply: sbs-battery: Use a per-device serial number buffer
Ikjoon Jang <[email protected]>
power: supply: sbs-battery: cache constant string properties
Karl Mehltretter <[email protected]>
ARM: lpc32xx: only run SoC init on LPC32xx hardware
Fabio Estevam <[email protected]>
arm64: dts: rockchip: Fix Gru WLAN sideband interrupt
Rob Herring <[email protected]>
arm64: dts: rockchip: Fix PCI node addresses on rk3399-gru
Chen-Yu Tsai <[email protected]>
arm64: dts: rockchip: Add gru-scarlet-dumo board
Florian Westphal <[email protected]>
netfilter: nf_nat_sip: rewind offset when NAT shrinks the packet
Can Peng <[email protected]>
drm/tve200: add OF module alias for autoloading
Cosmo Chou <[email protected]>
leds: pca9532: Fix phantom device registration on missing hardware
Leo Yan <[email protected]>
perf cs-etm: Avoid truncating AUX buffer sizes to int
Leo Yan <[email protected]>
perf cs-etm: Flush thread stacks after decoder reset
Andre Przywara <[email protected]>
ARM: dts: allwinner: a10: Fix PMU interrupt
Jeff Johnson <[email protected]>
wifi: ath11k: Avoid buffer overread in ath11k_wmi_tlv_op_rx()
Venkateswara Naralasetty <[email protected]>
ath11k: add trace log support
Jeff Johnson <[email protected]>
wifi: ath11k: Correctly copy the hint BSSID in WMI scan request
Jeff Johnson <[email protected]>
wifi: ath6kl: avoid buffer overreads in WMI event handlers
Baokun Li <[email protected]>
ext4: drain in-flight DIO before buffered write fallback
Pengpeng Hou <[email protected]>
thermal: intel: int3400: clean up ODVP on probe failures
Rafael J. Wysocki <[email protected]>
thermal: int340x_thermal: Consolidate priv->data_vault checks
Mukesh Ojha <[email protected]>
iommu/qcom: Fix inverted fault report check in qcom_iommu_fault()
Haoxiang Li <[email protected]>
iommu/qcom: Remove sysfs device on probe failure path
Miaoqian Lin <[email protected]>
iommu/arm-smmu: Add missing pm_runtime_disable() in qcom_iommu_device_probe
Kalesh AP <[email protected]>
RDMA/restrack: Fix typos in the comments
Leon Romanovsky <[email protected]>
RDMA/srpt: Pass the mapped task attribute to target_init_cmd()
Mike Christie <[email protected]>
scsi: target: srpt: Convert to new submission API
Mike Christie <[email protected]>
scsi: target: core: Break up target_submit_cmd_map_sgls()
Mike Christie <[email protected]>
scsi: target: core: Rename transport_init_se_cmd()
Sebastian Andrzej Siewior <[email protected]>
scsi: target: core: Replace in_interrupt() usage in target_submit_cmd_map_sgls()
Mike Christie <[email protected]>
scsi: qla2xxx: Move sess cmd list/lock to driver
Mike Christie <[email protected]>
scsi: target: Remove TARGET_SCF_LOOKUP_LUN_FROM_TAG
Mike Christie <[email protected]>
scsi: qla2xxx: Drop TARGET_SCF_LOOKUP_LUN_FROM_TAG
Yun Zhou <[email protected]>
ext4: skip extra isize expansion during mount to prevent deadlock
Chen Pei <[email protected]>
ACPI: PCI: Clear driver_data on all paths that free the acpi_pci_root
Pengpeng Hou <[email protected]>
ACPI: processor: validate MADT IOAPIC entry bounds
Kemeng Shi <[email protected]>
irqchip/gic-v3-its: Prevent leak in its_vpe_irq_domain_alloc()
TanZheng <[email protected]>
RDMA/srpt: Fix srpt_alloc_rw_ctxs() unwind counters
Danila Chernetsov <[email protected]>
RDMA/hfi1: Propagate sdma_txinit_ahg() errors
Linmao Li <[email protected]>
ASoC: meson: Keep link pointers valid on realloc failure
Koichiro Den <[email protected]>
dmaengine: dw-edma: Clear stale requests on termination
Koichiro Den <[email protected]>
dmaengine: dw-edma: Serialize channel state checks
Koichiro Den <[email protected]>
dmaengine: dw-edma: Serialize abort state updates
Yuho Choi <[email protected]>
driver core: soc: Unregister bus on early device registration failure
Greg Kroah-Hartman <[email protected]>
driver core: soc: remove layering violation for the soc_bus
Alban Bedel <[email protected]>
software node: Fix software_node_get_reference_args() with index -1
Ian Rogers <[email protected]>
perf ui hists: Fix uninitialized stack memory free on pstack allocation failure
zhouminqiang <[email protected]>
mtd: part: reject MTDPART_OFS_RETAIN in mtd_add_partition()
Ruoyu Wang <[email protected]>
mtd: mtdswap: Avoid freeing registered blktrans device twice
Pengpeng Hou <[email protected]>
soc: ti: knav_qmss: Remove debugfs file on teardown
Md Shofiqul Islam <[email protected]>
soc: ti: knav_qmss_queue: Implement resource cleanup in remove()
Xiang Mei <[email protected]>
vfio/pci: clear vdev->msi_perm after freeing it on init failure
Myeonghun Pak <[email protected]>
char: xilinx_hwicap: unregister class on init errors
Linmao Li <[email protected]>
ppdev: prevent overflow when setting port timeout
Pengpeng Hou <[email protected]>
misc: ad525x_dpot: use driver core groups for sysfs files
Uwe Kleine-König <[email protected]>
misc: ad525x_dpot: Make ad_dpot_remove() return void
Gleb Markov <[email protected]>
misc: rtsx: add missing write register handling
Pavel Zhigulin <[email protected]>
speakup: keyhelp: guard letter_offsets possible out-of-range indexing
Christophe JAILLET <[email protected]>
accessibility: speakup: Fix incorrect string length computation in report_char_chartab_status()
Yuho Choi <[email protected]>
uio: Fix stale info pointer in failed registration path
David Lee <[email protected]>
UDF symlink pathComponent header OOB read
Karl Mehltretter <[email protected]>
tty: hvc: restrict HVC_DCC to ARMv6+ and ARM64
Xu Yang <[email protected]>
usb: gadget: f_uac1_legacy: remove broken string configfs attributes
Rafael J. Wysocki <[email protected]>
ACPI: processor: idle: Expand _LPI package sanity checks
Wolfram Sang <[email protected]>
ACPI: move from strlcpy() with unused retval to strscpy()
Daniel Scally <[email protected]>
media: ACPI / bus: Add acpi_dev_get_next_match_dev() and helper macro
Mikko Perttunen <[email protected]>
gpu: host1x: Avoid stack over-read in debug output helpers
Mikko Perttunen <[email protected]>
gpu: host1x: Fix offset calculation in trace_write_gather
Maoyi Xie <[email protected]>
drm/bridge: tc358767: clamp the reported AUX read size to the request
Uday Khare <[email protected]>
remoteproc: qcom: Fix glink->node reference leak in qcom_add_glink_subdev
Zhongqiu Han <[email protected]>
cpufreq: schedutil: Fix self-contradictory comment in sugov_iowait_apply()
Rafael J. Wysocki <[email protected]>
cpufreq: schedutil: Add util to struct sg_cpu
Rafael J. Wysocki <[email protected]>
cpufreq: intel_pstate: Simplify intel_cpufreq_update_pstate()
Herve Codina <[email protected]>
irqdomain: Handle additional domain flags in irq_domain_instantiate()
Herve Codina <[email protected]>
irqdomain: Introduce irq_domain_instantiate()
Dan Carpenter <[email protected]>
cpufreq: spear: Fix an IS_ERR() vs NULL bug in spear1340_set_cpu_rate()
Bryam Vargas <[email protected]>
libnvdimm/labels: Bound the on-media label size before the shift
Baochen Qiang <[email protected]>
wifi: ath11k: cap out-of-range rx MCS instead of leaving bogus rate
Kyle Zeng <[email protected]>
hfsplus: validate thread record before delete key rebuild
Vishnu Santhosh <[email protected]>
rpmsg: glink: fix deadlock in endpoint destroy during driver detach
Srinivas Kandagatla <[email protected]>
rpmsg: glink: remove duplicate code for rpmsg device remove
Arun Kumar Neelakantam <[email protected]>
rpmsg: glink: Remove the rpmsg dev in close_ack
Ira Weiny <[email protected]>
iov_iter: lift memzero_page() to highmem.h
Thomas Gleixner <[email protected]>
highmem: Provide generic variant of kmap_atomic*
Leon Romanovsky <[email protected]>
RDMA/hfi1: Initialize debugfs after probe completes
Leon Romanovsky <[email protected]>
RDMA/hfi1: Stop flushing the global IB workqueue
Leon Romanovsky <[email protected]>
RDMA/hfi1: Create workqueues before device initialization
Leon Romanovsky <[email protected]>
RDMA/hfi1: Remove redundant PCI device ID validation
Leon Romanovsky <[email protected]>
RDMA/hfi1: Preserve unit 0 on allocation failure
Sean Rhodes <[email protected]>
misc: rtsx_usb: avoid USB I/O in runtime autosuspend
Pengpeng Hou <[email protected]>
pmdomain: bcm: bcm2835: handle genpd provider registration errors
Evgenii Burenchev <[email protected]>
ALSA: hpi: Check transport errors during HPI6000 adapter initialization
Xiang Mei <[email protected]>
xfrm6: fix out-of-bounds write in xfrm6_input_addr() when secpath is full
Yuho Choi <[email protected]>
hwrng: ks-sa - Fix runtime PM cleanup on registration failure
Martin Kaiser <[email protected]>
hwrng: ks-sa - access private data via struct hwrng
Leon Romanovsky <[email protected]>
RDMA/ipoib: Drain RCU callbacks during module teardown
Leon Romanovsky <[email protected]>
RDMA/core: Wait for RCU callbacks before unloading ib_core
Tetsuo Handa <[email protected]>
RDMA/core: Avoid flush_workqueue(system_unbound_wq) usage
Mert Seftali <[email protected]>
iio: accel: dmard09: Implement IIO_CHAN_INFO_SCALE
Laxman Acharya Padhya <[email protected]>
drm/panel: samsung-s6d16d0: Power off on prepare failure
Biju Das <[email protected]>
usb: renesas_usbhs: Fix power-off ordering on unbind
Uwe Kleine-König <[email protected]>
platform: Provide a remove callback that returns no value
Uwe Kleine-König <[email protected]>
driver core: platform: Emit a warning if a remove callback returned non-zero
Uwe Kleine-König <[email protected]>
driver core: platform: use bus_type functions
Uwe Kleine-König <[email protected]>
driver core: platform: change logic implementing platform_driver_probe
Uwe Kleine-König <[email protected]>
driver core: platform: reorder functions
Michael Bommarito <[email protected]>
usb: gadget: configfs: fix out-of-bounds read of qw_sign
Wolfram Sang <[email protected]>
hwspinlock: propagate errno when registering single lock
Cosmo Chou <[email protected]>
leds: pca9532: Fix inverted GPIO output polarity
Wei Wang <[email protected]>
iommu/amd: Fix false positive in SB IOAPIC IVRS validation
Fu Hao <[email protected]>
iommu/amd: Add support for Hygon family 18h model 4h IOAPIC
Wei Wang <[email protected]>
iommu/amd: Prevent SB IOAPIC from overriding IVRS validation errors
Vladimir Zapolskiy <[email protected]>
iommu/msm: Return -ENOMEM on memory allocation failure in probe
Daniel Borkmann <[email protected]>
bpf: Fix vmlinux BTF prep race in bpf_get_btf_vmlinux
Aleksandr Nogikh <[email protected]>
udf: Mark LVID buffer as uptodate before marking it dirty
Hongyan Xu <[email protected]>
usb: gadget: r8a66597: avoid double free of ep0_req in probe error path
Herman van Hazendonk <[email protected]>
clk: qcom: gdsc: tear down per-domain genpds in gdsc_unregister()
Bryan O'Donoghue <[email protected]>
clk: qcom: gdsc: Capture pm_genpd_add_subdomain result code
Bryan O'Donoghue <[email protected]>
clk: qcom: gdsc: Release pm subdomains in reverse add order
Dmitry Baryshkov <[email protected]>
clk: qcom: gdsc: enable optional power domain support
Herman van Hazendonk <[email protected]>
clk: qcom: gdsc: propagate gdsc_enable() failure for ALWAYS_ON domains
Herman van Hazendonk <[email protected]>
clk: qcom: gdsc: propagate gdsc_check_status() errors from gdsc_poll_status
David Woodhouse <[email protected]>
timekeeping: Account for monotonicity adjustment in ntp_error
Thomas Weißschuh <[email protected]>
y2038: uapi: Use 64-bit __kernel_old_timespec::tv_nsec on x32
Yuho Choi <[email protected]>
clocksource: Unregister subsystem on device registration failure
Jiangshan Yi <[email protected]>
selftests: timers: leap-a-day: Fix -w option and update usage comment
Kemeng Shi <[email protected]>
irqchip/gic-v3-its: Fix memleak in its_probe_one()
Feng Yang <[email protected]>
selftests/bpf: Fix memory leak in msg_alloc_iov
Malaya Kumar Rout <[email protected]>
selftests/bpf: Fix memory leak in msg_alloc_iov error path
Evgenii Burenchev <[email protected]>
ALSA: via82xx: Remove unreachable branch in snd_via686_pcm_pointer()
Dawei Feng <[email protected]>
staging: rtl8723bs: fix mismatched free of HalData in rtw_sdio_if1_init()
Ayush Mukkanwar <[email protected]>
staging: octeon: ethernet-mem: replace pr_warn with dev_warn in free functions
Yuvraj Singh Chauhan <[email protected]>
staging: octeon: fix free_irq dev_id mismatch in cvm_oct_rx_shutdown
Ayush Mukkanwar <[email protected]>
staging: octeon: add missing tasklet_kill in cvm_oct_tx_shutdown
Dan Carpenter <[email protected]>
staging: fbtft: Use sysfs_emit_at() to print to sysfs file
Bryam Vargas <[email protected]>
greybus: audio: bound the topology section sizes against the fetched size
Ahmet Sezgin Duran <[email protected]>
staging: sm750fb: gate dualview dataflow using g_dualview
Alexander A. Klimov <[email protected]>
staging: greybus: audio: correct sscanf() return value check
Jonathan Cameron <[email protected]>
of: Add cleanup.h based auto release via __free(device_node) markings
Haowen Tu <[email protected]>
PM: sleep: Fix off-by-one in wakelocks number limit check
Yuho Choi <[email protected]>
bus: ti-sysc: Fix /chosen node reference leak
Shin'ichiro Kawasaki <[email protected]>
nvmet-rdma: factor out response resource cleanup
Pengpeng Hou <[email protected]>
crypto: sa2ul - stop probe if context pool creation fails
Tang Bin <[email protected]>
crypto: sa2ul - Use the defined variable to clean code
Lothar Rubusch <[email protected]>
crypto: atmel-sha204a - fix heap info leak on I2C transfer failure
Thorsten Blum <[email protected]>
crypto: atmel-ecc - reject hardware ECDH without a public key
Thorsten Blum <[email protected]>
crypto: atmel-ecc - clean up and improve ECDH comments
Thorsten Blum <[email protected]>
crypto: atmel-ecc - replace min_t with min
Lee Jones <[email protected]>
crypto: atmel-ecc - Struct headers need to start with keyword 'struct'
Meng Yu <[email protected]>
crypto: ecdh - move curve_id of ECDH from the key to algorithm name
Tzung-Bi Shih <[email protected]>
platform/chrome: sensorhub: Fix memory overread in ring handler
Hisam Mehboob <[email protected]>
selftests/rseq: Replace glibc-specific __GNUC_PREREQ with portable check
Hanlin Song <[email protected]>
csky: Fix a4/a5 restoration in syscall trace path
Sanjay Chitroda <[email protected]>
iio: orientation: hid-sensor-rotation: Avoid race between callback setup and device exposure
Srinivas Kandagatla <[email protected]>
soundwire: qcom: Fix port exhaustion check in stream_alloc_ports
Srinivas Kandagatla <[email protected]>
soundwire: qcom: add static port map support
Srinivas Kandagatla <[email protected]>
soundwire: qcom: update port map allocation bit mask
Srinivas Kandagatla <[email protected]>
soundwire: add static port mapping support
Vladimir Zapolskiy <[email protected]>
dmaengine: hisilicon: Return -ENOMEM on dynamic memory allocation in probe
Suraj Gupta <[email protected]>
dmaengine: xilinx_dma: Fix channel idle state management in AXIDMA and MCDMA interrupt handlers
Vladimir Zapolskiy <[email protected]>
dmaengine: mediatek: mtk-uart-apdma: Return -ENOMEM on memory allocation failure
Asad Kamal <[email protected]>
drm/amdgpu/pm/powerplay: bounds-check voltage index in Vega10 lookup
Asad Kamal <[email protected]>
drm/amdgpu/pm/powerplay: bounds-check voltage index in SMU7 lookup
Sean Young <[email protected]>
media: keymaps: Remove obsolete RC_MAP_HAUPPAUGE_NEW keymap define
Sean Young <[email protected]>
media: keymaps: Remove obsolete RC_MAP_RC5_TV keymap define
Daniel McCarthy <[email protected]>
pinctrl: bcm2835: Don't remove an unregistered GPIO chip
Zide Chen <[email protected]>
perf/x86/intel/uncore: Keep PCI PMUs working when MMIO/MSR setup fails
Henrik Grimler <[email protected]>
drm/lima: call drm_mm_init() with a valid allocation range
Brian Masney <[email protected]>
clk: imx: scu: drop redundant init.ops variable assignment
Anson Huang <[email protected]>
clk: imx: scu: Add A72 frequency scaling support
Anson Huang <[email protected]>
clk: imx: scu: Add A53 frequency scaling support
Weigang He <[email protected]>
ARM: imx: fix device_node refcount leak in imx_src_init()
Min zhang <[email protected]>
clk: hisilicon: reset: Use devm_kzalloc to initialize hisi_reset_controller
Alexander A. Klimov <[email protected]>
clk: moxart: remove unused variables, fix refcount leak
Gui-Dong Han <[email protected]>
media: cec-pin: Fix event FIFO ordering
Weigang He <[email protected]>
soc: samsung: exynos-pmu: fix of_node refcount leak in exynos_get_pmu_regmap()
Michael Bommarito <[email protected]>
HID: roccat: bound device-supplied profile index
Philipp Weber <[email protected]>
HID: core: quiesce input in hid_hw_stop() to prevent use-after-free
Konstantin Andreev <[email protected]>
smack: restrict smackfs/{direct,mapped} values to 0-255
Konstantin Andreev <[email protected]>
smack: deduplicate smackfs/{direct,mapped} file_operations
Dmitry Antipov <[email protected]>
smack: simplify write handlers of sysfs entries
Austin Kim <[email protected]>
smack: mark 'smack_enabled' global variable as __initdata
Konstantin Andreev <[email protected]>
smack: fix incorrect task context in smack_msg_queue_msgrcv
Casey Schaufler <[email protected]>
Smack: fix W=1 build warnings
Maxime Ripard <[email protected]>
drm/bridge: cdns-mhdp8546: Return an error pointer on allocation failure
Daniel Borkmann <[email protected]>
bpf: Enforce expected_attach_type for tailcall compatibility
Martin Blumenstingl <[email protected]>
clk: meson: align gxbb_32k_clk_sel number of parents with actual count
Mahesh Rao <[email protected]>
firmware: stratix10-svc: Add mutex in stratix10 memory management
Arnaldo Carvalho de Melo <[email protected]>
perf sched: Fix register_pid() overflow, strcpy, and BUG_ON
Sven Eckelmann <[email protected]>
batman-adv: bla: avoid CRC corruption due to parallel claim add
Jian Shen <[email protected]>
net: hns3: don't auto enable misc vector
Pengpeng Hou <[email protected]>
Input: aiptek - validate raw macro indices before updating state
Jiayuan Chen <[email protected]>
bpf: Fix same-register dst/src OOB read and pointer leak in sock_ops
Zhengchuan Liang <[email protected]>
net: af_key: zero aligned sockaddr tail in PF_KEY exports
Xiang Mei <[email protected]>
bridge: mrp: reject zero test interval to avoid OOM panic
Wang Liang <[email protected]>
net: fix NULL pointer dereference in l3mdev_l3_rcv
Andrei Matei <[email protected]>
bpf: Guard stack limits against 32bit overflow
Sechang Lim <[email protected]>
tcp: clear sock_ops cb flags before force-closing a child socket
Arthur Gautier <[email protected]>
xhci: fix lost bounce buffers on TDs spanning several ring segments
Sunil Khatri <[email protected]>
drm/amdgpu: use AMDGPU_GPU_PAGE_SHIFT instead of PAGE_SHIFT
Thadeu Lima de Souza Cascardo <[email protected]>
drm: Fix drm_crtc_commit leak if signaled when PAGE_FLIP_EVENT is used
Harry Wentland <[email protected]>
drm/amd/display: avoid divide-by-zero in __is_lut_linear()
Thomas Zimmermann <[email protected]>
drm/hibmc: Fix list of formats on the primary plane
Wentao Liang <[email protected]>
drm/sun4i: fix refcount leak in sun4i_backend_init_sat()
Danilo Krummrich <[email protected]>
drm: fix race between partial drm_dev_register() failure and ioctl
Johan Hovold <[email protected]>
drm/bridge: dw-hdmi: fix i2c adapter leak on probe failure
Zhan Xusheng <[email protected]>
f2fs: fix i_size when pinned fallocate partially fails
Hao-Qun Huang <[email protected]>
f2fs: reject overlapping move range after len expansion
Wenjie Qi <[email protected]>
f2fs: return symlink writeback errors
Nilesh Javali <[email protected]>
scsi: qla2xxx: Zero-init bsg stack buffers to avoid info leak
Nilesh Javali <[email protected]>
scsi: qla2xxx: Use coherent DMA buffer for D_Port diagnostics
Nilesh Javali <[email protected]>
scsi: qla2xxx: Drop vport reference under lock in report ID acquisition
Nilesh Javali <[email protected]>
scsi: qla2xxx: Avoid req_q_map double-read in qla2x00_error_entry()
Nilesh Javali <[email protected]>
scsi: qla2xxx: Bound rsp_info_len to avoid OOB sense-data read
Nilesh Javali <[email protected]>
scsi: qla2xxx: Avoid double completion in async IOCB timeout
Nilesh Javali <[email protected]>
scsi: qla2xxx: Don't query firmware state while chip is down
Nilesh Javali <[email protected]>
scsi: qla2xxx: Fix FCE trace enable parsing in debugfs
Nilesh Javali <[email protected]>
scsi: qla2xxx: Zero mailbox struct in qla2x00_get_firmware_state()
Nilesh Javali <[email protected]>
scsi: qla2xxx: Fix FCE trace use-after-free during firmware dump
Nilesh Javali <[email protected]>
scsi: qla2xxx: Fix cs84xx use-after-free on host teardown
Nilesh Javali <[email protected]>
scsi: qla2xxx: Serialize flash version read in reset handler
Nilesh Javali <[email protected]>
scsi: qla2xxx: Clamp MSI-X derived queue counts to avoid truncation
Nilesh Javali <[email protected]>
scsi: qla2xxx: Bound image count in qla2x00_update_fru_versions()
Nilesh Javali <[email protected]>
scsi: qla2xxx: Check entry_status in qla24xx_modify_vp_config()
Nilesh Javali <[email protected]>
scsi: qla2xxx: Hold vport reference in qla24xx_report_id_acquisition()
Nilesh Javali <[email protected]>
scsi: qla2xxx: Fix Name Server logout detection on FWI2 adapters
Nilesh Javali <[email protected]>
scsi: qla2xxx: Bound i2c->length in I2C bsg handlers
Nilesh Javali <[email protected]>
scsi: qla2xxx: Zero SFP DMA buffer in FRU/I2C bsg handlers
Arash Golgol <[email protected]>
media: vimc: fix pixel format lookup in enum_framesizes
Uday Khare <[email protected]>
media: video-i2c: fix kthread error pointer left in kthread_vid_cap on failure
Mohammed EL Kadiri <[email protected]>
media: venus: fix payload size calculation in parse_raw_formats()
Mohammed EL Kadiri <[email protected]>
media: venus: fix payload size returned by parse_caps() and parse_alloc_mode()
Biren Pandya <[email protected]>
media: v4l2-fwnode: Fix fwnode leak in v4l2_fwnode_parse_link
Ilya Krutskih <[email protected]>
media: tda18250: fix possible integer overflow
Lei Huang <[email protected]>
media: s2255: check firmware size before reading trailing marker
HyeongJun An <[email protected]>
media: s2255: bound JPEG frame size before copying into the buffer
Valery Borovsky <[email protected]>
media: rtl2832_sdr: release URBs and stream buffers on start_streaming() failure
Valery Borovsky <[email protected]>
media: rtl2832_sdr: use vb2_video_unregister_device() on remove to fix DMA leak
Christian Hewitt <[email protected]>
media: meson: vdec: fix NULL pointer deref in vdec_try_fmt_common
Biren Pandya <[email protected]>
media: i2c: ov7740: fix use-after-destroy in remove
Shuangpeng Bai <[email protected]>
media: go7007: defer the ALSA v4l2 put until card release
Jiangong.Han <[email protected]>
media: em28xx: fix use-after-free of dev_next->devlist on disconnect
Diego Fernando Mancera Gomez <[email protected]>
media: em28xx: defer audio-only extension registration
Fan Wu <[email protected]>
media: cx23885: cancel NetUP CI work before teardown
Bryam Vargas <[email protected]>
media: cx231xx: reject geometry changes while the VBI queue is busy
Ruoyu Wang <[email protected]>
media: cobalt: Avoid freeing ALSA private data twice
Dawei Feng <[email protected]>
media: cedrus: fix memory leak in cedrus_init_ctrls()
Ruoyu Wang <[email protected]>
media: cec: Serialize exclusive follower delivery
Yi Ding <[email protected]>
media: cec: meson: ao-cec-g12a: name the CEC core regmap to avoid debugfs clash
Valery Borovsky <[email protected]>
media: airspy: use vb2_video_unregister_device() on disconnect to fix NULL deref
Christian Borntraeger <[email protected]>
KVM: s390: Restore sigset on error path
Christian Borntraeger <[email protected]>
KVM: s390: Zero initialize irq in reinject_machine_check
Christian Borntraeger <[email protected]>
KVM: s390: Free guest debug data on vcpu destroy
Christian Borntraeger <[email protected]>
KVM: s390: Fix old_data leak in guest debug error path
Christian Borntraeger <[email protected]>
KVM: s390: Fix memory leak in guest debug handling
Carlos López <[email protected]>
KVM: x86: hyper-v: Clamp stimer deadline to avoid livelock
Sanjay Chitroda <[email protected]>
iio: temperature: hid-sensor-temperature: switch to non-devm iio_device_register()
Cong Nguyen <[email protected]>
iio: srf04: fix pm_runtime handling on probe error path
Laxman Acharya Padhya <[email protected]>
iio: light: gp2ap002: Disable regulators on resume failure
Giorgi Tchankvetadze <[email protected]>
iio: light: cm32181: return zero after writing calibscale
Cong Nguyen <[email protected]>
iio: gyro: mpu3050: fix sign of raw angular velocity readings
Erick Henrique <[email protected]>
iio: dac: m62332: Fix regulator reference count imbalance
Linmao Li <[email protected]>
iio: chemical: sgp30: Handle IAQ thread creation failure
WenTao Liang <[email protected]>
ASoC: samsung: aries_audio_probe: double of_node_put due to direct assignment without of_node_get
Haoxiang Li <[email protected]>
AsoC: intel: sst: fix PCI device reference leak on probe failure
Haoxiang Li <[email protected]>
ASoC: fsl: mpc5200-i2s: Free DMA resources on probe failure
Runyu Xiao <[email protected]>
ASoC: cs35l34: drain threaded IRQ before runtime suspend
Runyu Xiao <[email protected]>
ASoC: cs35l33: drain threaded IRQ before runtime suspend
Linkai Gong <[email protected]>
i2c: mux: demux-pinctrl: fix OF node leak on kstrdup failure
Stephan Gerhold <[email protected]>
clk: qcom: gcc-msm8939: Fix enable_reg for gcc_blsp1_sleep_clk
Stephan Gerhold <[email protected]>
clk: qcom: gcc-msm8916: Fix enable_reg for gcc_blsp1_sleep_clk
Sven Eckelmann <[email protected]>
batman-adv: bla: prevent CRC corruptions after claim flush
Sven Eckelmann <[email protected]>
batman-adv: bla: fix freeing of claims on meshif deletion
Sven Eckelmann <[email protected]>
batman-adv: dat: avoid unaligned fault in IP extraction
Zhiling Zou <[email protected]>
batman-adv: fix stale receive device on merged fragments
Pengpeng Hou <[email protected]>
mtd: rawnand: validate ONFI extended parameter page sections
Xu Rao <[email protected]>
mtd: mtdoops: free page bitmap when the backing MTD is removed
Pengpeng Hou <[email protected]>
mtd: afs: validate v2 image info bounds
Helge Deller <[email protected]>
parisc: Fix alignment of asm statements in head.S
Pei Xiao <[email protected]>
parisc: eisa: Fix infinite loop when parsing invalid IRQ value
Bryam Vargas <[email protected]>
nvdimm/btt: reject an arena whose nfree is below the lane count
caina <[email protected]>
Revert "irqchip/mbigen: Fix mbigen node address layout"
Shivam Kumar <[email protected]>
nvmet-tcp: reject unsolicited H2CData PDUs
Shivam Kumar <[email protected]>
nvmet-tcp: fix out-of-bounds write when receiving an over-long PDU
Yehyeong Lee <[email protected]>
nvme-tcp: check the data direction of a C2HData PDU
Takashi Iwai <[email protected]>
ALSA: pcm: Fix race between non-atomic ops and trigger-start
Ahmad Byagowi <[email protected]>
i2c: mux: Fix channel node leak on adapter add failure
Dapeng Mi <[email protected]>
perf/x86/intel: Fix kernel address leakages in LBR stack
Hajo Noerenberg <[email protected]>
ata: ahci: work around lost interrupts on Marvell 88SE61xx
Koichiro Den <[email protected]>
dmaengine: dw-edma: Complete descriptors before pausing
Mikulas Patocka <[email protected]>
dm: fix resume-vs-remove race
Ibrahim Hashimov <[email protected]>
HID: wacom: validate report length in wacom_intuos_pro2_bt_irq
Wei Jie Law <[email protected]>
HID: rmi: fix OOB access with undersized RMI reports
Runyu Xiao <[email protected]>
scsi: pm8001: Use rollback index when freeing MSI-X vectors
Sujal Tuladhar <[email protected]>
scsi: target: iscsi: Reserve a terminator byte for the login payload
Can Peng <[email protected]>
thermal/drivers/qoriq: Disable clock on resume failure
Can Peng <[email protected]>
thermal/drivers/imx: Disable clock on runtime resume failure
Muhammad Bilal <[email protected]>
staging: rtl8723bs: fix OOB read in rtw_action_frame_parse()
Jeffin Philip <[email protected]>
usb: gadget: fix null pointer dereference in usb_put_function_instance()
Lovekesh Solanki <[email protected]>
USB: gadget: fix NULL pointer dereference in gadget_dev_ioctl()
Jameson Thies <[email protected]>
usb: typec: ucsi: displayport: Fix OOB altmode array index
Andy Shevchenko <[email protected]>
usb: f_mass_storage: Bump local buffer size in fsg_common_create_luns()
Liu Qi <[email protected]>
usb-storage: ene_ub6250: fix race between scan work and probe
Shuangpeng Bai <[email protected]>
media: usbtv: keep device alive while ALSA card exists
HyeongJun An <[email protected]>
ALSA: usb-audio: fix OOB write in snd_usbmidi_us122l_output()
Griffin Kroah-Hartman <[email protected]>
usb: image: mdc800: change kmalloc() to kzalloc()
Sabrina Dubroca <[email protected]>
espintcp: remove encap socket caching to avoid reference leak
Petr Vaganov <[email protected]>
scsi: core: Fill in DMA padding bytes in scsi_alloc_sgtables()
Masami Hiramatsu (Google) <[email protected]>
tracing/mmiotrace: Add NULL check for mmio_trace_array in logging functions
Steven Rostedt <[email protected]>
tracing/mmiotrace: Remove reference to unused per CPU data pointer
D. Wythe <[email protected]>
net/smc: fix potential panic dues to unprotected smc_llc_srv_add_link()
Zack Rusin <[email protected]>
drm/vmwgfx: drop dma_buf reference on foreign-fd prime import
Koichiro Den <[email protected]>
net: ntb_netdev: Fix TX busy and drop handling
Bryam Vargas <[email protected]>
selinux: reject an unclaimed class value in security_get_classes()
Christian Göttsche <[email protected]>
selinux: avoid implicit conversions in services code
Eric Dumazet <[email protected]>
tcp: fix potential race in tcp_v6_syn_recv_sock()
Youngjae Kwon <[email protected]>
fsnotify: Fix stale object mask after concurrent mark updates
Jinjie Ruan <[email protected]>
entry: Fix seccomp bypass after ptrace with TSYNC
Tristan Madani <[email protected]>
RDMA/rxe: Fix TOCTOU heap overflow in get_srq_wqe
Bob Pearson <[email protected]>
RDMA/rxe: Use the correct size of wqe when processing SRQ
Dan Carpenter <[email protected]>
RDMA/rxe: Missing unlock on error in get_srq_wqe()
Bob Pearson <[email protected]>
RDMA/rxe: Fix over copying in get_srq_wqe
Pablo Neira Ayuso <[email protected]>
netfilter: nf_tables: make nft_object rhltable per table
Yuqi Xu <[email protected]>
openvswitch: Fix CT limit teardown use-after-free
Ilya Maximets <[email protected]>
net: openvswitch: fix kernel-doc warnings in internal headers
Norbert Szetei <[email protected]>
net: skbuff: don't skb_tx_error() the source skb in skb_zerocopy()
Norbert Szetei <[email protected]>
net: skbuff: don't touch shared zerocopy state in skb_tx_error()
Sonali Pradhan <[email protected]>
usb: gadget: u_audio: Fix use-after-free on sound card disconnect
Tzung-Bi Shih <[email protected]>
platform/chrome: sensorhub: Fix dropped timestamp events and log spam
Zhan Xusheng <[email protected]>
udf: Fix i_lenExtents truncation on 32-bit kernels
Thomas Gleixner <[email protected]>
timer: Keep debugobjects state consistent in migrate_timer_list()
Bradley Morgan <[email protected]>
signal: avoid shared siginfo namespace rewrites
Myeonghun Pak <[email protected]>
tpm: tpm_i2c_nuvoton: disable IRQ on wait timeout
Maoyi Xie <[email protected]>
w1: ds28e17: reject an oversize length on an I2C block read
Chengfeng Ye <[email protected]>
vsock/virtio: flush works in dependency order
Abdun Nihaal <[email protected]>
wifi: rtw88: Fix potential memory leak in rtw_txq_push_skb()
Stanislaw Gruszka <[email protected]>
wifi: rtl818x: initialize eeprom_93cx6 struct to zero
Fabio Estevam <[email protected]>
wifi: mwifiex: Detach sync cmd buffer on interrupted wait
Abdun Nihaal <[email protected]>
wifi: brcmfmac: Fix memory leak in brcmf_sdio_read_control()
Adrian Hunter <[email protected]>
i3c: master: Fix info leak and UAF in device unregister path
Haotian Zhang <[email protected]>
dm-switch: use WRITE_ONCE() in switch_region_table_write()
Mikulas Patocka <[email protected]>
dm-stats: fix a crash if allocation of per-cpu data fails
Naman Jain <[email protected]>
PCI: hv: Set irq_retrigger callback for the Hyper-V PCI MSI irqchip
Matthieu Baerts (NGI0) <[email protected]>
mptcp: pm: ADD_ADDR rtx: free sk if last
Matthieu Baerts (NGI0) <[email protected]>
mptcp: pm: ADD_ADDR rtx: always decrease sk refcount
Haoze Xie <[email protected]>
netfilter: nf_queue: pin bridge device while NFQUEUE holds fake dst
Takashi Iwai <[email protected]>
ALSA: serial-u16550: Check card index validity at probe
Takashi Iwai <[email protected]>
ALSA: portman2x4: Check card index validity at probe
Takashi Iwai <[email protected]>
ALSA: mts64: Check card index validity at probe
Takashi Iwai <[email protected]>
ALSA: mpu401: Check card index validity at probe
Baul Lee <[email protected]>
ALSA: bcd2000: clear the URB pointers on disconnect
Baul Lee <[email protected]>
ALSA: 6fire: bound the MIDI event length from the device
Zhiling Zou <[email protected]>
seg6: reset IP6CB after IPv6 decapsulation
Zhiling Zou <[email protected]>
net: cap advertised IP tunnel headroom
Koichiro Den <[email protected]>
net: ntb_netdev: Count packets dropped on RX refill failure
Koichiro Den <[email protected]>
net: ntb_netdev: Avoid double-accounting netif_rx() drops
Koichiro Den <[email protected]>
NTB: ntb_transport: Reject oversized TX buffers
Koichiro Den <[email protected]>
NTB: ntb_transport: Fail TX enqueue when the QP link is down
Koichiro Den <[email protected]>
NTB: ntb_transport: Recycle TX entries before client callbacks
Ruoyu Wang <[email protected]>
net: openvswitch: fix nf_connlabels leak in ovs_ct_init
Ilya Maximets <[email protected]>
net: openvswitch: fix flow mask use-after-free on flow deletion
Asim Viladi Oglu Manizada <[email protected]>
net: tun: bound receive headroom
Fabio Porcedda <[email protected]>
net: usb: qmi_wwan: add Telit Cinterion FE990D50 composition
Aleksandr Khromov <[email protected]>
slip: fix use-after-free in sl_sync()
Weiming Shi <[email protected]>
xdp: fix zero-copy frame layout
Alexandra Winter <[email protected]>
net/iucv: filter frames in afiucv_hs_rcv() by ingress device
Seiji Nishikawa <[email protected]>
ipmi: si: Fix NULL pointer dereference after failed registration
Yousef Alhouseen <[email protected]>
ipmi: ipmb: validate write message length
Kuan-Wei Chiu <[email protected]>
interconnect: Fix use after free in icc_get() and of_icc_get_by_index()
Bryam Vargas <[email protected]>
platform/chrome: sensorhub: Bound the EC-reported sensor number
Fan Wu <[email protected]>
mmc: via-sdmmc: stop card-detect handling on probe failure
Kevin Tian <[email protected]>
iommu/vt-d: Fix no_iommu to disable platform opt-in
Krzysztof Wilczyński <[email protected]>
PCI/proc: Use file_ns_capable() when checking config space read access
Krzysztof Wilczyński <[email protected]>
PCI/proc: Avoid spurious runtime PM wakeup on config space accesses
Krzysztof Wilczyński <[email protected]>
PCI/sysfs: Avoid spurious runtime PM wakeup on config space accesses
Ronald Claveau <[email protected]>
PCI: meson: Fix GPIO state while requesting PERST#
Mohamad Raizudeen <[email protected]>
PCI: Fix 32-bit config write in Intel PCH Root Port MPC ACS quirk
Stefan Haberland <[email protected]>
s390/dasd: Propagate partial completion length across ERP recovery
Stefan Haberland <[email protected]>
s390/dasd: Guard sysfs discipline callbacks against unallocated private data
Stefan Haberland <[email protected]>
s390/dasd: Do not complete a failed ESE read as successful
Jianing Li <[email protected]>
power: supply: max17040: synchronize work cancellation on suspend
Fan Wu <[email protected]>
power: supply: lp8727: fix use-after-free in lp8727_release_irq()
Jameson Thies <[email protected]>
power: supply: cros_usbpd: Limit port counts to EC_USB_PD_MAX_PORTS
Bryam Vargas <[email protected]>
power: supply: cros_usbpd-charger: bound the EC-reported port count
Jun Yang <[email protected]>
sctp: fix stream->outcnt underflow on duplicate RECONF responses
Jun Yang <[email protected]>
sctp: distinguish sequence zero from wildcard in reconf lookup
Weiming Shi <[email protected]>
sctp: fix NULL deref on untransmitted RECONF completion
Hyunwoo Kim <[email protected]>
sctp: drop a chunk if its transport was removed
Hyunwoo Kim <[email protected]>
sctp: stop processing a packet once its association is deleted
Yehyeong Lee <[email protected]>
nvme-tcp: do not accept C2HData based on blk_rq_payload_bytes() alone
Yehyeong Lee <[email protected]>
nvme: zero the discard fallback page
Ewan D. Milne <[email protected]>
nvme: nvme-fc: Fix nvme_fc_create_hw_io_queues() queue deletion in error path
Michael Bommarito <[email protected]>
lockd: pin next file across nlm_inspect_file lock-drop
Cong Nguyen <[email protected]>
hwmon: (max6621) fix temperature clamp range
Cong Nguyen <[email protected]>
hwmon: (max6621) fix negative temperature offset and crit readings
Norbert Szetei <[email protected]>
openvswitch: only skb_tx_error() a packet we are about to drop
Ali Ahmet Memis <[email protected]>
openrisc: fix arbitrary kernel memory access via or1k_atomic syscall
Zhan Xusheng <[email protected]>
ocfs2: fix readdir position truncation on 32-bit kernels
Joseph Qi <[email protected]>
ocfs2: cluster: fix o2hb_dependent_users leak on pin failure
Joseph Qi <[email protected]>
ocfs2: cluster: avoid lock order inversion in o2hb_region_pin() from drop_item
Joseph Qi <[email protected]>
ocfs2: cluster: don't sleep while holding o2hb_live_lock in o2hb_region_pin()
Ibrahim Hashimov <[email protected]>
ocfs2: validate rl_used against rl_count in refcount block validator
Bryam Vargas <[email protected]>
ocfs2: validate lengths in dlm_mig_lockres_handler
Bryam Vargas <[email protected]>
ocfs2: bound namelen in dlm_migrate_request_handler
Dmitry Antipov <[email protected]>
ocfs2: always run deallocs on copy-on-write completion
Zhiling Zou <[email protected]>
orangefs: skip leading spaces before parsing client debug masks
Yifei Gao <[email protected]>
orangefs: fix double-free of trailer_buf on readdir copy failure
WenTao Liang <[email protected]>
regulator: max8998_pmic_dt_parse_pdata: of_node_put on reg_np after ownership transferred to rdata
WenTao Liang <[email protected]>
regulator: as3722_get_regulator_dt_data: fix premature of_node_put leaving dangling of_node pointer
Norbert Szetei <[email protected]>
RDMA/ucma: Lock the handler in ucma_set_ib_path()
Fan Wu <[email protected]>
RDMA/cxgb4: Cancel reg_work before freeing device on remove
Vaibhav Nagare <[email protected]>
qede: Fix NULL pointer dereference in TPA fragment processing
Johan Hovold <[email protected]>
remoteproc: scp: Fix device reference leak on failed lookup
Chunkai Deng <[email protected]>
rpmsg: glink: smem: order FIFO read after availability check
Doruk Tan Ozturk <[email protected]>
wifi: ath6kl: clamp assoc request/response lengths before subtracting IE offsets
David Lee <[email protected]>
udf: reject VAT indexes equal to the entry count
Chuck Lever <[email protected]>
SUNRPC: Reject krb5 v2 wrap tokens with oversized ec field
Chris Mason <[email protected]>
sunrpc: init gssp_lock before publishing proc entry
Chris Mason <[email protected]>
SUNRPC: harden gss_unwrap_resp_priv length checks
Chris Mason <[email protected]>
SUNRPC: harden gss_krb5_unwrap_v2 against short tokens
Chris Mason <[email protected]>
SUNRPC: Guard svcauth_gss_release() dispatch on rq_auth_stat
Jeff Layton <[email protected]>
SUNRPC: always drain cache_cleaner before destroying a cache_detail
Jeff Layton <[email protected]>
sunrpc: route to a populated pool in svc_pool_for_cpu()
Chris Mason <[email protected]>
SUNRPC: xdr_buf_trim: clamp buf->len to avoid underflow
Harshit Varu <[email protected]>
mptcp: fix uninitialized local_id in syncookie MP_JOIN reconstruction
Qing Ming <[email protected]>
mpls: reload header after pskb_may_pull()
Coly Li <[email protected]>
md: do overflow check for sb->bblog_shift in super_1_load()
Bryam Vargas <[email protected]>
libnvdimm/labels: Prevent integer overflow in __nd_label_validate()
Yuyang Huang <[email protected]>
ipv6: use RCU iterator to dump route exceptions
Zhiling Zou <[email protected]>
ip6_gre: fix hardware header length for NBMA tunnels
Zhiling Zou <[email protected]>
ip6_tunnel: use skb_cow_head() in ip6_tnl_xmit()
Guangshuo Li <[email protected]>
Bluetooth: hci_intel: fix usage_count leak when autosuspend_delay is negative
Valentin Kindschi <[email protected]>
Bluetooth: hci_event: clear HCI_LE_ADV only on a created connection
Chengfeng Ye <[email protected]>
Bluetooth: RFCOMM: serialize security confirmation handling
Gongwei Li <[email protected]>
Bluetooth: hci_uart: Fix false success return in hci_uart_setup()
Guangshuo Li <[email protected]>
Bluetooth: hci_bcm: fix usage_count leak when autosuspend_delay is negative
Hui Su <[email protected]>
cpufreq: schedutil: Fix rate limit overflow
Bryam Vargas <[email protected]>
dm array: reject an array block whose value size is not the caller's
Ilya Krutskih <[email protected]>
dm raid1: reserve space for NUL-terminator in build_constructor_string()
liyouhong <[email protected]>
dm-era: fix shadowed superblock leak on take-snap failure
Jiangshan Yi <[email protected]>
bnx2x: fix double free in bnx2x_init_firmware() error path
Christoph Zwerschke <[email protected]>
Bluetooth: btusb: Add ASUS USB-BT600 for Realtek 8761CU
Christoph Zwerschke <[email protected]>
Bluetooth: btusb: Add ASUS USB-BT540 for Realtek 8761CU
Niklas Cassel <[email protected]>
ata: libata-scsi: fix DSM TRIM for sector sizes larger than 2048 bytes
Matt Turner <[email protected]>
alpha: marvel: Fix lock ordering in init_io7_irqs()
Matt Turner <[email protected]>
alpha: marvel: Fix irq_set_status_flags to use correct IRQ number
Krzysztof Wilczyński <[email protected]>
alpha/PCI: Fix I/O port accessor argument order in pci_legacy_write()
Ivaylo Dimitrov <[email protected]>
hsi: omap_ssi_core: fix missing DMA mask setup for SSI controller device
Tien Sung Ang <[email protected]>
fpga: stratix10-soc: Fix SVC mailbox handling during reconfiguration
Marek Czernohous <[email protected]>
forcedeth: fix off-by-one when saving/restoring non-PCI config space
Myeonghun Pak <[email protected]>
fbdev: uvesafb: unregister connector callback on init failure
Florian Fuchs <[email protected]>
fbdev: pvr2fb: correct user pointer annotation and sentinel initializer
Runyu Xiao <[email protected]>
fbdev: omapfb: panel-dsi-cm: initialize lock before registering display
Yemu Lu <[email protected]>
fat: restore original value when fat_ent_write failed
Yichong Chen <[email protected]>
ecryptfs: show filename encryption options
Yichong Chen <[email protected]>
ecryptfs: release message context on send failure
Yichong Chen <[email protected]>
ecryptfs: reject too-small tag 70 packets
HanQuan <[email protected]>
ecryptfs: reject oversized encrypted_key_size in parse_tag_3_packet
Yichong Chen <[email protected]>
ecryptfs: pass packet set buffer size to parser
Yichong Chen <[email protected]>
ecryptfs: hold msg ctx list lock when cleaning daemon queue
Yichong Chen <[email protected]>
ecryptfs: fix tag 11 packet exact-fit size check
Pengpeng Hou <[email protected]>
eCryptfs: bound the packet-length peek to the user buffer
Jiangshan Yi <[email protected]>
HID: mcp2221: validate report size in mcp2221_raw_event()
Haoxiang Li <[email protected]>
HID: sensor: custom: Fix field sysfs group cleanup on failure
Xu Rao <[email protected]>
HID: roccat: free buffered reports when destroying device
Ibrahim Hashimov <[email protected]>
HID: picolcd: clamp eeprom debugfs read to bytes actually received
Jérémy Jean <[email protected]>
audit: avoid dropping live tree ref on fsnotify rule autoremove
Michael Bommarito <[email protected]>
ceph: bound xattr value length in __build_xattrs()
Xiubo Li <[email protected]>
ceph: fix UAF in __kick_flushing_caps() on cf entry freed during unlock
Jérémy Jean <[email protected]>
libceph: reject buckets with mismatched CRUSH ids
Chuck Lever <[email protected]>
NFSD: Prevent lock owner use-after-free during client teardown
Jeff Layton <[email protected]>
nfsd: revoke copy-notify stateids before dropping their reference
Jeff Layton <[email protected]>
nfsd: reject reclaim LOCK after RECLAIM_COMPLETE
Robbie Ko <[email protected]>
nfsd: reject out-of-range useconds in NFSv2 SETATTR/CREATE
Jeff Layton <[email protected]>
nfsd: initialize copy-notify stateid before publishing it
Jeff Layton <[email protected]>
nfsd: fix XDR padding calculation in ff_encode_getdeviceinfo
Jeff Layton <[email protected]>
nfsd: fix XDR length calculation in nfsd4_ff_encode_layoutget
Jeff Layton <[email protected]>
nfsd: fix version mismatch loops in nfsd_acl_init_request()
Chris Mason <[email protected]>
nfsd: fix cpntf publish race in nfs4_init_cp_state
Jeff Layton <[email protected]>
nfsd: check client ownership when cancelling a copy-notify stateid
Jeff Layton <[email protected]>
nfsd: block non-SAVEFH ops after FOREIGN PUTFH to prevent NULL deref
Jeff Layton <[email protected]>
nfsd: add filehandle match check to nfsd4_delegreturn()
Jeff Layton <[email protected]>
nfsd: add fh_want_write() for early-verified SETATTR in nfsd_proc_setattr()
Jeff Layton <[email protected]>
nfsd: validate symlink target length in NFSv4 CREATE
Chuck Lever <[email protected]>
nfsd: sample writeback error cursor before async COPY loop
Jeff Layton <[email protected]>
nfsd: return NFS4ERR_NOTSUPP for unsupported netloc4 types
Chuck Lever <[email protected]>
nfsd: Reset write verifier when async COPY writeback fails
Mike Snitzer <[email protected]>
NFSD: remove flawed WARN_ON_ONCE from nfsd_mode_check
Michael Bommarito <[email protected]>
NFSD: restart ssc_expire_umount walk after dropping nfsd_ssc_lock
Chuck Lever <[email protected]>
NFSD: Fix off-by-one in DRC bucket pruning limit
Chuck Lever <[email protected]>
NFSD: Encode only the status in NFS-ACL v2 GETACL error replies
Ibrahim Hashimov <[email protected]>
ubifs: fix out-of-bounds read in signature length check
Abdurrahman Hussain <[email protected]>
of: fix out-of-bounds read in of_alias_scan() stem parser
Ryusuke Konishi <[email protected]>
nilfs2: fix slab-out-of-bounds in nilfs_direct_propagate after truncation
Junrui Luo <[email protected]>
media: vicodec: fix out-of-bounds write in FWHT encoder
Weigang He <[email protected]>
media: cec: stm32: prevent out-of-bounds write on RX overflow
Vincent Mailhol <[email protected]>
lib/ucs2_string.c: fix out-of-bounds read in ucs2_strnlen()
Xingrui Li <[email protected]>
HID: sensor-hub: Fix out-of-bounds write in sensor_hub_get_feature
Daisuke Matsuda <[email protected]>
fpga: altera-cvp: Avoid out-of-bounds read in trailing byte write
Neill Kapron <[email protected]>
usb: gadget: f_fs: Prevent deadlock during ep0 read loop
Jeffin Philip <[email protected]>
usb: gadget: uvc: fix dangling pointers in uvc_function_bind() and uvc_function_unbind()
Yun Zhou <[email protected]>
usb: gadget: f_tcm: fix deadlock in usbg_make_tpg()
Myeonghun Pak <[email protected]>
usb: gadget: snps_udc_plat: clean up PHY on probe deferral
Johan Hovold <[email protected]>
USB: phy: fsl-usb: fix missing static keywords
Hao-Qun Huang <[email protected]>
staging: greybus: hid: fix SET_REPORT return value
Hans Verkuil <[email protected]>
Revert "media: v4l2-dev: fix error handling in __video_register_device()"
James Kim <[email protected]>
rapidio: mport_cdev: fix use-after-free in dma_req_free()
Bartosz Golaszewski <[email protected]>
powerpc/powermac: fix OF node refcount
Hui Su <[email protected]>
tracing: Fix crash passing ERR_PTR to kthread_stop()
Kiryl Shutsemau (Meta) <[email protected]>
x86/insn-eval: Move assign_register() out of KVM as insn_assign_reg()
Joy H.J. Lee <[email protected]>
tools/compiler: match glibc 2.42 definition of __attribute_const__
Guopeng Zhang <[email protected]>
mm: memcg: stop reclaim when a limit update is superseded
Breno Leitao <[email protected]>
mm/vmscan: report RCU-tasks quiescent states in shrink_lruvec()
Jordan R Abrahams-Whitehead <[email protected]>
include/linux/list.h: mark list_add and __list_add as __always_inline
Jérémy Jean <[email protected]>
timers/itimer: Zero-init old itimerval before copy to userspace
Felix Yan <[email protected]>
clocksource/drivers/timer-sun4i: Advertise a real minimum delta
Takashi Iwai <[email protected]>
ALSA: aloop: Fix racy access at PCM trigger
Fedor Pchelkin <[email protected]>
Revert "USB: serial: keyspan_pda: fix information leak"
-------------
Diffstat:
.../ABI/testing/configfs-usb-gadget-uac1_legacy | 3 - Documentation/usb/gadget-testing.rst | 3 - Makefile | 4 +- arch/alpha/kernel/pci-sysfs.c | 6 +- arch/alpha/kernel/sys_marvel.c | 25 +- arch/arm/boot/dts/armada-388-helios4.dts | 13 + arch/arm/boot/dts/sun4i-a10.dtsi | 2 +- arch/arm/mach-imx/src.c | 1 + arch/arm/mach-lpc32xx/common.c | 5 +- arch/arm/mach-lpc32xx/common.h | 2 + arch/arm/mach-lpc32xx/phy3250.c | 2 + arch/arm/mach-lpc32xx/pm.c | 5 +- arch/arm/mm/fault.c | 16 +- .../boot/dts/allwinner/sun50i-a64-pinephone.dtsi | 4 +- .../boot/dts/marvell/armada-3720-turris-mox.dts | 3 +- arch/arm64/boot/dts/rockchip/Makefile | 1 + .../boot/dts/rockchip/rk3399-gru-chromebook.dtsi | 6 +- .../boot/dts/rockchip/rk3399-gru-scarlet-dumo.dts | 41 ++ arch/arm64/boot/dts/rockchip/rk3399-gru.dtsi | 1 + arch/arm64/kernel/hibernate.c | 16 +- arch/csky/kernel/entry.S | 6 +- arch/m68k/kernel/traps.c | 4 +- arch/mips/kernel/ptrace.c | 6 +- arch/openrisc/kernel/entry.S | 43 ++- arch/parisc/kernel/head.S | 1 + arch/powerpc/configs/85xx-hw.config | 1 + arch/powerpc/kernel/smp.c | 3 + arch/powerpc/platforms/powermac/low_i2c.c | 2 +- arch/s390/kvm/guestdbg.c | 7 +- arch/s390/kvm/interrupt.c | 2 +- arch/s390/kvm/kvm-s390.c | 7 +- arch/x86/events/intel/lbr.c | 12 +- arch/x86/events/intel/uncore.c | 2 - arch/x86/include/asm/insn-eval.h | 36 ++ arch/x86/include/asm/pkeys.h | 3 + arch/x86/kvm/emulate.c | 26 +- arch/x86/kvm/hyperv.c | 25 +- block/blk-iocost.c | 2 +- block/blk-stat.c | 2 +- block/kyber-iosched.c | 2 +- crypto/ecdh.c | 74 ++-- crypto/ecdh_helper.c | 4 +- crypto/testmgr.c | 13 +- crypto/testmgr.h | 42 +- drivers/accessibility/speakup/keyhelp.c | 17 +- drivers/accessibility/speakup/kobjects.c | 6 +- drivers/acpi/bus.c | 4 +- drivers/acpi/pci_root.c | 3 +- drivers/acpi/processor_core.c | 31 +- drivers/acpi/processor_idle.c | 34 +- drivers/acpi/utils.c | 50 ++- drivers/ata/ahci.c | 49 +++ drivers/ata/libata-scsi.c | 28 +- drivers/base/firmware_loader/fallback.c | 38 +- drivers/base/firmware_loader/firmware.h | 10 + drivers/base/platform.c | 424 +++++++++++---------- drivers/base/soc.c | 19 +- drivers/base/swnode.c | 2 +- drivers/bluetooth/btmtksdio.c | 13 +- drivers/bluetooth/btusb.c | 15 +- drivers/bluetooth/hci_bcm.c | 1 + drivers/bluetooth/hci_intel.c | 1 + drivers/bluetooth/hci_ldisc.c | 2 +- drivers/bluetooth/hci_serdev.c | 2 +- drivers/bus/ti-sysc.c | 12 +- drivers/char/hw_random/ks-sa-rng.c | 22 +- drivers/char/ipmi/ipmb_dev_int.c | 5 +- drivers/char/ipmi/ipmi_msghandler.c | 1 + drivers/char/ppdev.c | 10 +- drivers/char/tpm/st33zp24/st33zp24.c | 8 +- drivers/char/tpm/tpm_i2c_nuvoton.c | 6 +- drivers/char/xilinx_hwicap/xilinx_hwicap.c | 5 +- drivers/clk/clk-moxart.c | 14 - drivers/clk/clk-palmas.c | 14 +- drivers/clk/hisilicon/reset.c | 2 +- drivers/clk/imx/clk-scu.c | 7 +- drivers/clk/meson/gxbb.c | 2 +- drivers/clk/qcom/common.c | 4 +- drivers/clk/qcom/gcc-msm8916.c | 5 +- drivers/clk/qcom/gcc-msm8939.c | 5 +- drivers/clk/qcom/gdsc.c | 108 +++++- drivers/clk/qcom/gdsc.h | 2 + drivers/clk/tegra/clk-tegra124-emc.c | 1 + drivers/clk/x86/clk-pmc-atom.c | 3 + drivers/clocksource/clps711x-timer.c | 2 +- drivers/clocksource/timer-armada-370-xp.c | 18 +- drivers/clocksource/timer-sun4i.c | 2 +- drivers/cpufreq/imx6q-cpufreq.c | 6 +- drivers/cpufreq/intel_pstate.c | 9 +- drivers/cpufreq/spear-cpufreq.c | 4 +- drivers/crypto/atmel-ecc.c | 73 ++-- drivers/crypto/atmel-sha204a.c | 6 +- drivers/crypto/sa2ul.c | 19 +- drivers/dma/dw-edma/dw-edma-core.c | 34 +- drivers/dma/hisi_dma.c | 2 +- drivers/dma/mediatek/mtk-uart-apdma.c | 2 +- drivers/dma/qcom/bam_dma.c | 1 + drivers/dma/xilinx/xilinx_dma.c | 12 +- drivers/firmware/google/coreboot_table.c | 35 +- drivers/firmware/google/coreboot_table.h | 1 + drivers/firmware/stratix10-svc.c | 21 +- drivers/fpga/altera-cvp.c | 10 +- drivers/fpga/stratix10-soc.c | 21 +- drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 2 +- drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c | 74 ++-- .../drm/amd/display/amdgpu_dm/amdgpu_dm_color.c | 6 + .../gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c | 24 ++ .../gpu/drm/amd/pm/powerplay/hwmgr/vega10_hwmgr.c | 35 +- .../gpu/drm/bridge/cadence/cdns-mhdp8546-core.c | 2 +- drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 3 +- drivers/gpu/drm/bridge/tc358767.c | 2 +- drivers/gpu/drm/drm_atomic_uapi.c | 2 + drivers/gpu/drm/drm_drv.c | 34 +- drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c | 6 +- drivers/gpu/drm/lima/lima_device.c | 12 +- drivers/gpu/drm/msm/dsi/dsi_host.c | 2 - drivers/gpu/drm/panel/panel-samsung-s6d16d0.c | 10 +- drivers/gpu/drm/sun4i/sun4i_backend.c | 2 +- drivers/gpu/drm/sun4i/sun4i_crtc.c | 2 +- drivers/gpu/drm/sun4i/sun4i_tcon.c | 20 +- drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c | 2 + drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c | 2 +- drivers/gpu/drm/sun4i/sun8i_vi_scaler.c | 18 +- drivers/gpu/drm/tve200/tve200_drv.c | 1 + drivers/gpu/drm/vmwgfx/ttm_object.c | 7 +- drivers/gpu/host1x/debug.c | 4 +- drivers/gpu/host1x/hw/channel_hw.c | 5 +- drivers/hid/hid-core.c | 127 +++--- drivers/hid/hid-lg4ff.c | 8 + drivers/hid/hid-mcp2221.c | 7 + drivers/hid/hid-picolcd_debugfs.c | 9 + drivers/hid/hid-rmi.c | 46 ++- drivers/hid/hid-roccat-kone.c | 8 +- drivers/hid/hid-roccat.c | 13 +- drivers/hid/hid-sensor-custom.c | 9 +- drivers/hid/hid-sensor-hub.c | 46 ++- drivers/hid/i2c-hid/i2c-hid-core.c | 16 +- drivers/hid/wacom_wac.c | 13 + drivers/hsi/controllers/omap_ssi_core.c | 6 + drivers/hwmon/emc1403.c | 6 +- drivers/hwmon/max6621.c | 8 +- drivers/hwspinlock/hwspinlock_core.c | 2 +- drivers/i2c/i2c-mux.c | 1 + drivers/i2c/muxes/i2c-demux-pinctrl.c | 1 + drivers/i3c/master.c | 11 +- drivers/i3c/master/dw-i3c-master.c | 10 +- drivers/iio/accel/dmard09.c | 7 + drivers/iio/chemical/sgp30.c | 3 + drivers/iio/dac/m62332.c | 17 +- drivers/iio/gyro/mpu3050-core.c | 2 +- drivers/iio/light/cm32181.c | 2 +- drivers/iio/light/gp2ap002.c | 24 +- drivers/iio/light/isl29028.c | 2 +- drivers/iio/light/tsl2583.c | 2 +- drivers/iio/light/tsl2772.c | 2 +- drivers/iio/orientation/hid-sensor-rotation.c | 20 +- drivers/iio/proximity/srf04.c | 1 + drivers/iio/temperature/hid-sensor-temperature.c | 3 +- drivers/infiniband/core/cma.c | 6 +- drivers/infiniband/core/device.c | 25 +- drivers/infiniband/core/restrack.c | 4 +- drivers/infiniband/core/ucma.c | 7 +- drivers/infiniband/hw/cxgb4/device.c | 8 +- drivers/infiniband/hw/cxgb4/mem.c | 4 +- drivers/infiniband/hw/efa/efa_verbs.c | 15 +- drivers/infiniband/hw/hfi1/chip.c | 4 +- drivers/infiniband/hw/hfi1/hfi.h | 2 - drivers/infiniband/hw/hfi1/init.c | 43 +-- drivers/infiniband/hw/hfi1/user_sdma.c | 13 +- drivers/infiniband/hw/mlx5/cong.c | 8 +- drivers/infiniband/hw/mlx5/qp.c | 25 +- drivers/infiniband/sw/rxe/rxe_resp.c | 13 +- drivers/infiniband/sw/siw/siw_cm.c | 32 +- drivers/infiniband/ulp/ipoib/ipoib_main.c | 2 + drivers/infiniband/ulp/isert/ib_isert.c | 85 ++++- drivers/infiniband/ulp/isert/ib_isert.h | 1 + drivers/infiniband/ulp/srp/ib_srp.c | 45 ++- drivers/infiniband/ulp/srpt/ib_srpt.c | 20 +- drivers/input/tablet/aiptek.c | 13 +- drivers/interconnect/core.c | 7 +- drivers/iommu/amd/init.c | 42 +- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 5 +- drivers/iommu/arm/arm-smmu/qcom_iommu.c | 14 +- drivers/iommu/dma-iommu.c | 13 +- drivers/iommu/intel/iommu.c | 16 +- drivers/iommu/msm_iommu.c | 2 +- drivers/irqchip/irq-gic-v3-its.c | 15 +- drivers/irqchip/irq-mbigen.c | 20 +- drivers/leds/leds-pca9532.c | 18 +- drivers/mailbox/rockchip-mailbox.c | 17 +- drivers/md/dm-era-target.c | 5 + drivers/md/dm-log-userspace-base.c | 1 + drivers/md/dm-stats.c | 6 +- drivers/md/dm-switch.c | 2 +- drivers/md/dm.c | 2 +- drivers/md/md.c | 7 + drivers/md/persistent-data/dm-array.c | 16 + drivers/md/raid5-ppl.c | 4 +- drivers/media/cec/core/cec-adap.c | 8 +- drivers/media/cec/core/cec-pin.c | 8 +- drivers/media/cec/platform/meson/ao-cec-g12a.c | 1 + drivers/media/cec/platform/stm32/stm32-cec.c | 3 +- drivers/media/dvb-frontends/rtl2832_sdr.c | 23 +- drivers/media/i2c/ov7740.c | 4 +- drivers/media/i2c/video-i2c.c | 8 +- drivers/media/pci/cobalt/cobalt-alsa-main.c | 1 - drivers/media/pci/cx23885/cimax2.c | 1 + drivers/media/platform/qcom/venus/hfi_parser.c | 9 +- drivers/media/test-drivers/vicodec/vicodec-core.c | 4 +- drivers/media/test-drivers/vimc/vimc-capture.c | 4 +- drivers/media/tuners/tda18250.c | 4 +- drivers/media/usb/airspy/airspy.c | 19 +- drivers/media/usb/cx231xx/cx231xx-video.c | 4 +- drivers/media/usb/em28xx/em28xx-cards.c | 3 +- drivers/media/usb/em28xx/em28xx-core.c | 2 + drivers/media/usb/go7007/snd-go7007.c | 10 +- drivers/media/usb/s2255/s2255drv.c | 11 + drivers/media/usb/usbtv/usbtv-audio.c | 11 + drivers/media/v4l2-core/v4l2-dev.c | 14 +- drivers/media/v4l2-core/v4l2-fwnode.c | 2 + drivers/mfd/iqs62x.c | 2 +- drivers/mfd/rave-sp.c | 64 +++- drivers/misc/ad525x_dpot-i2c.c | 4 +- drivers/misc/ad525x_dpot-spi.c | 4 +- drivers/misc/ad525x_dpot.c | 181 +++++---- drivers/misc/ad525x_dpot.h | 5 +- drivers/misc/cardreader/rtsx_pcr.c | 2 + drivers/misc/cardreader/rtsx_usb.c | 23 +- drivers/misc/vmw_vmci/vmci_event.c | 4 +- drivers/mmc/host/via-sdmmc.c | 8 +- drivers/mtd/mtdoops.c | 3 + drivers/mtd/mtdpart.c | 3 +- drivers/mtd/mtdswap.c | 1 + drivers/mtd/nand/raw/nand_onfi.c | 27 +- drivers/mtd/parsers/afs.c | 7 + drivers/mtd/ubi/attach.c | 4 +- drivers/mtd/ubi/build.c | 63 ++- drivers/mtd/ubi/cdev.c | 5 +- drivers/mtd/ubi/eba.c | 5 +- drivers/mtd/ubi/fastmap-wl.c | 53 ++- drivers/mtd/ubi/fastmap.c | 76 +--- drivers/mtd/ubi/io.c | 13 +- drivers/mtd/ubi/ubi.h | 19 +- drivers/mtd/ubi/wl.c | 38 +- drivers/mtd/ubi/wl.h | 6 +- drivers/net/bonding/bond_netlink.c | 2 +- drivers/net/ethernet/allwinner/sun4i-emac.c | 4 +- drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | 3 + drivers/net/ethernet/freescale/fec_main.c | 6 +- .../ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 12 +- drivers/net/ethernet/nvidia/forcedeth.c | 6 +- drivers/net/ethernet/qlogic/qede/qede.h | 8 +- drivers/net/ethernet/qlogic/qede/qede_fp.c | 1 + .../net/ethernet/qualcomm/rmnet/rmnet_map_data.c | 1 + drivers/net/ethernet/realtek/8139cp.c | 2 +- .../net/ethernet/stmicro/stmmac/dwmac1000_core.c | 2 +- drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c | 2 +- .../net/ethernet/stmicro/stmmac/dwxgmac2_core.c | 2 +- .../net/ethernet/stmicro/stmmac/stmmac_selftests.c | 35 +- drivers/net/gtp.c | 2 + drivers/net/ipvlan/ipvlan_l3s.c | 1 - drivers/net/ntb_netdev.c | 38 +- drivers/net/ppp/pppox.c | 17 + drivers/net/slip/slip.c | 11 +- drivers/net/thunderbolt.c | 6 +- drivers/net/tun.c | 21 +- drivers/net/usb/qmi_wwan.c | 1 + drivers/net/wireless/ath/ath10k/snoc.c | 9 +- drivers/net/wireless/ath/ath11k/debug.c | 12 +- drivers/net/wireless/ath/ath11k/debug.h | 3 +- drivers/net/wireless/ath/ath11k/dp_rx.c | 32 +- drivers/net/wireless/ath/ath11k/trace.c | 1 + drivers/net/wireless/ath/ath11k/trace.h | 172 +++++++++ drivers/net/wireless/ath/ath11k/wmi.c | 15 +- drivers/net/wireless/ath/ath6kl/cfg80211.c | 5 + drivers/net/wireless/ath/ath6kl/wmi.c | 17 +- .../wireless/broadcom/brcm80211/brcmfmac/sdio.c | 3 +- drivers/net/wireless/marvell/mwifiex/sta_ioctl.c | 12 + drivers/net/wireless/mediatek/mt76/mt76x02_mac.c | 2 +- drivers/net/wireless/mediatek/mt76/mt7915/mcu.c | 8 +- drivers/net/wireless/mediatek/mt76/mt7915/mcu.h | 6 +- drivers/net/wireless/realtek/rtl818x/rtl8180/dev.c | 2 +- drivers/net/wireless/realtek/rtl818x/rtl8187/dev.c | 2 +- drivers/net/wireless/realtek/rtlwifi/pci.c | 6 +- drivers/net/wireless/realtek/rtw88/tx.c | 1 + drivers/net/wireless/zydas/zd1211rw/zd_usb.c | 8 + drivers/nfc/pn533/pn533.c | 21 +- drivers/ntb/ntb_transport.c | 38 +- drivers/nvdimm/btt.c | 8 + drivers/nvdimm/label.c | 17 +- drivers/nvme/host/core.c | 2 +- drivers/nvme/host/fc.c | 8 +- drivers/nvme/host/tcp.c | 11 +- drivers/nvme/target/rdma.c | 13 +- drivers/nvme/target/tcp.c | 10 + drivers/of/base.c | 2 +- drivers/of/property.c | 10 +- drivers/parisc/eisa.c | 5 + drivers/pci/controller/dwc/pci-meson.c | 2 +- drivers/pci/controller/pci-hyperv.c | 1 + drivers/pci/pci-sysfs.c | 45 ++- drivers/pci/proc.c | 8 +- drivers/pci/quirks.c | 2 +- drivers/perf/arm_spe_pmu.c | 2 +- drivers/phy/qualcomm/phy-qcom-snps-femto-v2.c | 26 +- drivers/pinctrl/bcm/pinctrl-bcm2835.c | 1 - drivers/pinctrl/pinctrl-rockchip.c | 10 + drivers/platform/chrome/cros_ec_sensorhub_ring.c | 28 +- drivers/power/supply/bd99954-charger.h | 23 +- drivers/power/supply/bq27xxx_battery.c | 6 +- drivers/power/supply/cros_usbpd-charger.c | 17 +- drivers/power/supply/isp1704_charger.c | 1 + drivers/power/supply/lp8727_charger.c | 4 +- drivers/power/supply/max17040_battery.c | 2 +- drivers/power/supply/sbs-battery.c | 160 +++++--- drivers/power/supply/sc2731_charger.c | 8 +- drivers/pps/pps.c | 10 +- drivers/rapidio/devices/rio_mport_cdev.c | 10 +- drivers/rapidio/rio-scan.c | 1 + drivers/regulator/as3722-regulator.c | 1 - drivers/regulator/core.c | 6 +- drivers/regulator/max8998.c | 1 - drivers/regulator/qcom-rpmh-regulator.c | 6 +- drivers/remoteproc/mtk_scp.c | 9 +- drivers/remoteproc/qcom_common.c | 4 +- drivers/remoteproc/remoteproc_core.c | 357 +++++++++++++---- drivers/remoteproc/remoteproc_elf_loader.c | 12 +- drivers/remoteproc/remoteproc_sysfs.c | 35 +- drivers/remoteproc/remoteproc_virtio.c | 6 +- drivers/rpmsg/qcom_glink_native.c | 36 +- drivers/rpmsg/qcom_glink_smem.c | 7 + drivers/rtc/rtc-pcf8563.c | 4 +- drivers/s390/block/dasd.c | 6 +- drivers/s390/block/dasd_eckd.c | 40 +- drivers/s390/block/dasd_erp.c | 3 + drivers/scsi/mpt3sas/mpt3sas_base.c | 2 + drivers/scsi/pm8001/pm8001_init.c | 4 +- drivers/scsi/qla2xxx/qla_attr.c | 7 +- drivers/scsi/qla2xxx/qla_bsg.c | 39 +- drivers/scsi/qla2xxx/qla_def.h | 2 + drivers/scsi/qla2xxx/qla_dfs.c | 4 +- drivers/scsi/qla2xxx/qla_gs.c | 4 +- drivers/scsi/qla2xxx/qla_init.c | 47 ++- drivers/scsi/qla2xxx/qla_inline.h | 13 + drivers/scsi/qla2xxx/qla_isr.c | 20 +- drivers/scsi/qla2xxx/qla_mbx.c | 26 +- drivers/scsi/qla2xxx/qla_nx2.c | 2 +- drivers/scsi/qla2xxx/qla_os.c | 14 +- drivers/scsi/qla2xxx/qla_target.c | 24 +- drivers/scsi/qla2xxx/qla_target.h | 1 + drivers/scsi/qla2xxx/tcm_qla2xxx.c | 61 +-- drivers/scsi/scsi_lib.c | 2 + drivers/soc/bcm/bcm2835-power.c | 7 +- drivers/soc/samsung/exynos-pmu.c | 4 +- drivers/soc/ti/knav_qmss.h | 1 + drivers/soc/ti/knav_qmss_queue.c | 14 +- drivers/soundwire/qcom.c | 31 +- drivers/spi/spi-img-spfi.c | 5 +- drivers/spi/spi-sprd-adi.c | 6 + drivers/staging/fbtft/fbtft-sysfs.c | 2 +- drivers/staging/greybus/audio_gb.c | 13 + drivers/staging/greybus/audio_manager_sysfs.c | 2 +- drivers/staging/greybus/hid.c | 2 +- drivers/staging/media/meson/vdec/vdec.c | 4 +- drivers/staging/media/sunxi/cedrus/cedrus.c | 4 +- drivers/staging/octeon/ethernet-mem.c | 31 +- drivers/staging/octeon/ethernet-mem.h | 5 +- drivers/staging/octeon/ethernet-rx.c | 2 +- drivers/staging/octeon/ethernet-tx.c | 2 + drivers/staging/octeon/ethernet.c | 6 +- drivers/staging/rtl8723bs/core/rtw_cmd.c | 8 +- drivers/staging/rtl8723bs/core/rtw_ieee80211.c | 3 + drivers/staging/rtl8723bs/os_dep/sdio_intf.c | 4 +- drivers/staging/sm750fb/sm750.c | 4 +- drivers/target/iscsi/iscsi_target.c | 16 +- drivers/target/iscsi/iscsi_target_login.c | 2 +- drivers/target/target_core_transport.c | 345 +++++++++-------- drivers/target/target_core_xcopy.c | 8 +- drivers/thermal/imx_thermal.c | 9 +- .../intel/int340x_thermal/int3400_thermal.c | 9 +- drivers/thermal/qoriq_thermal.c | 13 +- drivers/tty/hvc/Kconfig | 2 +- drivers/tty/serial/amba-pl011.c | 10 + drivers/tty/tty_io.c | 4 +- drivers/uio/uio.c | 5 + drivers/usb/atm/usbatm.c | 4 +- drivers/usb/gadget/configfs.c | 4 +- drivers/usb/gadget/function/f_fs.c | 14 +- drivers/usb/gadget/function/f_mass_storage.c | 2 +- drivers/usb/gadget/function/f_tcm.c | 43 ++- drivers/usb/gadget/function/f_uac1_legacy.c | 56 --- drivers/usb/gadget/function/f_uvc.c | 7 +- drivers/usb/gadget/function/u_audio.c | 24 +- drivers/usb/gadget/function/u_uac1_legacy.h | 3 - drivers/usb/gadget/functions.c | 2 +- drivers/usb/gadget/legacy/inode.c | 3 +- drivers/usb/gadget/udc/r8a66597-udc.c | 1 - drivers/usb/gadget/udc/snps_udc_plat.c | 5 +- drivers/usb/host/xhci-ring.c | 32 +- drivers/usb/image/mdc800.c | 4 +- drivers/usb/phy/phy-fsl-usb.c | 52 +-- drivers/usb/phy/phy-fsl-usb.h | 6 +- drivers/usb/renesas_usbhs/common.c | 6 +- drivers/usb/serial/keyspan_pda.c | 2 +- drivers/usb/storage/ene_ub6250.c | 2 + drivers/usb/typec/ucsi/displayport.c | 2 +- drivers/vdpa/mlx5/core/mr.c | 2 +- drivers/vfio/pci/vfio_pci_config.c | 1 + drivers/video/fbdev/kyro/fbdev.c | 24 +- .../fbdev/omap2/omapfb/displays/panel-dsi-cm.c | 4 +- drivers/video/fbdev/pvr2fb.c | 4 +- drivers/video/fbdev/uvesafb.c | 2 + drivers/virtio/virtio_balloon.c | 6 + drivers/w1/masters/ds2482.c | 4 + drivers/w1/slaves/w1_ds28e17.c | 8 + drivers/xen/xenbus/xenbus_xs.c | 16 +- fs/ceph/caps.c | 11 +- fs/ceph/xattr.c | 1 + fs/cifs/cifs_debug.c | 2 +- fs/ecryptfs/crypto.c | 2 +- fs/ecryptfs/ecryptfs_kernel.h | 3 +- fs/ecryptfs/keystore.c | 45 ++- fs/ecryptfs/messaging.c | 11 +- fs/ecryptfs/miscdev.c | 5 +- fs/ecryptfs/super.c | 7 + fs/ext4/file.c | 7 + fs/ext4/inode.c | 10 + fs/f2fs/file.c | 9 +- fs/f2fs/namei.c | 11 +- fs/fat/misc.c | 4 + fs/fat/nfs.c | 4 +- fs/hfsplus/catalog.c | 25 +- fs/hfsplus/hfsplus_fs.h | 6 + fs/hugetlbfs/inode.c | 3 +- fs/isofs/compress.c | 1 + fs/lockd/svcsubs.c | 53 +-- fs/nfs/client.c | 21 +- fs/nfs/file.c | 2 + fs/nfs/filelayout/filelayoutdev.c | 3 +- fs/nfs/flexfilelayout/flexfilelayoutdev.c | 3 +- fs/nfs/inode.c | 111 +++--- fs/nfs/internal.h | 1 + fs/nfs/netns.h | 6 +- fs/nfs/nfs4client.c | 1 + fs/nfs/nfs4proc.c | 6 +- fs/nfs/pnfs.c | 61 ++- fs/nfs/pnfs.h | 3 +- fs/nfs/pnfs_nfs.c | 39 +- fs/nfsd/flexfilelayoutxdr.c | 20 +- fs/nfsd/nfs2acl.c | 31 +- fs/nfsd/nfs4proc.c | 39 +- fs/nfsd/nfs4state.c | 206 +++++++--- fs/nfsd/nfs4xdr.c | 17 + fs/nfsd/nfscache.c | 2 +- fs/nfsd/nfsfh.c | 4 +- fs/nfsd/nfsproc.c | 7 + fs/nfsd/nfssvc.c | 4 +- fs/nfsd/nfsxdr.c | 32 +- fs/nilfs2/bmap.c | 2 +- fs/nilfs2/bmap.h | 2 +- fs/nilfs2/btree.c | 39 +- fs/nilfs2/direct.c | 4 +- fs/nilfs2/segment.c | 4 + fs/nilfs2/the_nilfs.c | 6 + fs/notify/fanotify/fanotify_user.c | 17 +- fs/notify/inotify/inotify_user.c | 15 +- fs/ocfs2/acl.c | 141 ++++--- fs/ocfs2/acl.h | 19 +- fs/ocfs2/cluster/heartbeat.c | 201 +++++++--- fs/ocfs2/cluster/heartbeat.h | 7 +- fs/ocfs2/cluster/netdebug.c | 2 +- fs/ocfs2/cluster/nodemanager.c | 10 + fs/ocfs2/cluster/nodemanager.h | 1 + fs/ocfs2/cluster/tcp.c | 89 ++++- fs/ocfs2/cluster/tcp.h | 1 + fs/ocfs2/dir.c | 2 +- fs/ocfs2/dlm/dlmdomain.c | 2 +- fs/ocfs2/dlm/dlmmaster.c | 6 + fs/ocfs2/dlm/dlmrecovery.c | 9 + fs/ocfs2/namei.c | 17 +- fs/ocfs2/refcounttree.c | 47 ++- fs/ocfs2/stack_o2cb.c | 6 +- fs/ocfs2/xattr.c | 91 +++-- fs/ocfs2/xattr.h | 9 +- fs/orangefs/devorangefs-req.c | 1 + fs/orangefs/orangefs-debugfs.c | 1 + fs/squashfs/cache.c | 2 +- fs/ubifs/auth.c | 2 +- fs/udf/inode.c | 2 +- fs/udf/partition.c | 2 +- fs/udf/super.c | 23 +- fs/udf/symlink.c | 2 + include/acpi/acpi_bus.h | 21 + include/crypto/ecdh.h | 2 - include/linux/bitfield.h | 95 ++++- include/linux/bpf.h | 1 + include/linux/hid.h | 1 + include/linux/highmem.h | 89 ++++- include/linux/irqdomain.h | 23 ++ include/linux/list.h | 15 +- include/linux/nfs_fs.h | 1 + include/linux/nfs_xdr.h | 3 +- include/linux/of.h | 2 + include/linux/of_graph.h | 4 +- include/linux/platform_device.h | 11 + include/linux/remoteproc.h | 297 ++------------- include/linux/rsc_table.h | 364 ++++++++++++++++++ include/linux/rtsx_usb.h | 3 + include/linux/seq_buf.h | 25 ++ include/linux/soundwire/sdw.h | 2 + include/linux/trace_events.h | 3 + include/media/rc-map.h | 2 - include/net/bluetooth/l2cap.h | 11 +- include/net/inet_connection_sock.h | 11 +- include/net/ip_tunnels.h | 11 +- include/net/mac80211.h | 18 + include/net/netfilter/nf_queue.h | 1 + include/net/netfilter/nf_tables.h | 4 +- include/net/pkt_sched.h | 1 + include/net/sch_generic.h | 1 + include/net/sctp/structs.h | 2 +- include/net/tcp.h | 13 +- include/net/xfrm.h | 1 - include/target/target_core_base.h | 1 - include/target/target_core_fabric.h | 10 +- include/uapi/linux/time_types.h | 2 +- include/uapi/mtd/ubi-user.h | 8 +- kernel/auditfilter.c | 6 +- kernel/bpf/cgroup.c | 2 +- kernel/bpf/core.c | 4 + kernel/bpf/net_namespace.c | 17 +- kernel/bpf/ringbuf.c | 2 +- kernel/bpf/verifier.c | 26 +- kernel/entry/common.c | 3 + kernel/irq/irqdomain.c | 41 +- kernel/locking/lockdep.c | 2 + kernel/power/wakelock.c | 2 +- kernel/sched/cpufreq_schedutil.c | 59 +-- kernel/sched/fair.c | 53 +-- kernel/signal.c | 4 + kernel/sys.c | 2 +- kernel/time/clocksource.c | 8 +- kernel/time/itimer.c | 2 +- kernel/time/timekeeping.c | 6 + kernel/time/timer.c | 1 + kernel/trace/trace.c | 228 +++++++++++ kernel/trace/trace.h | 3 + kernel/trace/trace_dynevent.h | 4 +- kernel/trace/trace_events.c | 32 ++ kernel/trace/trace_events_synth.c | 2 +- kernel/trace/trace_kprobe.c | 4 +- kernel/trace/trace_mmiotrace.c | 24 +- kernel/trace/trace_output.c | 2 +- kernel/trace/trace_printk.c | 11 + kernel/trace/trace_uprobe.c | 4 +- lib/iov_iter.c | 8 +- lib/string.c | 3 +- lib/test_hmm.c | 2 +- lib/ucs2_string.c | 2 +- mm/Kconfig | 3 + mm/highmem.c | 151 +++++++- mm/memcontrol.c | 6 + mm/vmscan.c | 2 +- net/batman-adv/bridge_loop_avoidance.c | 80 ++-- net/batman-adv/distributed-arp-table.c | 8 +- net/batman-adv/main.c | 4 + net/bluetooth/6lowpan.c | 25 +- net/bluetooth/ecdh_helper.c | 2 - net/bluetooth/hci_event.c | 7 +- net/bluetooth/l2cap_core.c | 58 ++- net/bluetooth/l2cap_sock.c | 114 +++++- net/bluetooth/msft.c | 5 + net/bluetooth/rfcomm/core.c | 12 +- net/bluetooth/selftest.c | 2 +- net/bluetooth/smp.c | 6 +- net/bridge/br_mrp_netlink.c | 4 +- net/bridge/br_netlink_tunnel.c | 3 +- net/bridge/br_vlan.c | 4 +- net/ceph/osdmap.c | 2 + net/core/filter.c | 6 +- net/core/lwt_bpf.c | 15 +- net/core/skbuff.c | 11 +- net/core/xdp.c | 4 +- net/dccp/dccp.h | 4 +- net/dccp/ipv4.c | 4 +- net/dccp/ipv6.c | 7 +- net/dccp/minisocks.c | 2 +- net/hsr/hsr_device.c | 14 +- net/hsr/hsr_framereg.c | 63 ++- net/hsr/hsr_main.h | 8 +- net/ipv4/esp4.c | 49 +-- net/ipv4/inet_connection_sock.c | 9 + net/ipv4/ip_tunnel.c | 2 +- net/ipv4/syncookies.c | 2 +- net/ipv4/tcp_fastopen.c | 2 +- net/ipv4/tcp_ipv4.c | 8 +- net/ipv4/tcp_minisocks.c | 2 +- net/ipv4/tcp_output.c | 2 +- net/ipv6/esp6.c | 49 +-- net/ipv6/ip6_gre.c | 34 +- net/ipv6/ip6_tunnel.c | 22 +- net/ipv6/route.c | 2 +- net/ipv6/seg6_local.c | 9 + net/ipv6/sit.c | 2 +- net/ipv6/tcp_ipv6.c | 98 ++--- net/ipv6/xfrm6_input.c | 2 +- net/iucv/af_iucv.c | 2 + net/kcm/kcmsock.c | 3 + net/key/af_key.c | 52 ++- net/mpls/af_mpls.c | 2 + net/mptcp/pm_netlink.c | 30 +- net/mptcp/subflow.c | 6 +- net/mptcp/syncookies.c | 1 + net/netfilter/Kconfig | 2 +- net/netfilter/ipvs/ip_vs_ftp.c | 10 +- net/netfilter/nf_nat_sip.c | 5 + net/netfilter/nf_queue.c | 16 + net/netfilter/nf_tables_api.c | 48 +-- net/netfilter/nfnetlink_queue.c | 3 + net/netfilter/xt_cgroup.c | 21 +- net/netfilter/xt_hl.c | 27 ++ net/nfc/digital_core.c | 2 +- net/nfc/llcp_core.c | 29 +- net/nfc/llcp_sock.c | 14 +- net/nfc/nci/data.c | 10 +- net/openvswitch/conntrack.c | 130 ++++--- net/openvswitch/conntrack.h | 6 +- net/openvswitch/datapath.c | 60 +-- net/openvswitch/datapath.h | 26 +- net/openvswitch/vport.h | 8 + net/phonet/pep.c | 2 +- net/rds/cong.c | 4 +- net/sched/sch_api.c | 7 +- net/sched/sch_codel.c | 2 +- net/sched/sch_fq.c | 30 +- net/sched/sch_fq_codel.c | 6 +- net/sched/sch_fq_pie.c | 3 +- net/sched/sch_generic.c | 9 +- net/sched/sch_hhf.c | 4 + net/sched/sch_sfq.c | 3 +- net/sched/sch_teql.c | 1 + net/sctp/inqueue.c | 7 +- net/sctp/sm_sideeffect.c | 4 + net/sctp/stream.c | 48 ++- net/smc/af_smc.c | 2 + net/smc/smc_llc.c | 1 + net/sunrpc/auth_gss/auth_gss.c | 6 +- net/sunrpc/auth_gss/gss_krb5_wrap.c | 13 +- net/sunrpc/auth_gss/gss_rpc_upcall.c | 6 - net/sunrpc/auth_gss/gss_rpc_upcall.h | 1 - net/sunrpc/auth_gss/svcauth_gss.c | 3 +- net/sunrpc/cache.c | 7 +- net/sunrpc/rpcb_clnt.c | 4 + net/sunrpc/sunrpc_syms.c | 1 + net/sunrpc/svc.c | 29 +- net/sunrpc/xdr.c | 2 +- net/vmw_vsock/af_vsock.c | 6 +- net/vmw_vsock/virtio_transport.c | 2 +- net/xfrm/xfrm_state.c | 3 - scripts/tags.sh | 2 +- security/apparmor/lib.c | 20 +- security/selinux/include/security.h | 4 +- security/selinux/selinuxfs.c | 7 +- security/selinux/ss/services.c | 45 ++- security/smack/smack.h | 7 +- security/smack/smack_lsm.c | 95 +++-- security/smack/smackfs.c | 222 ++++------- sound/core/pcm_native.c | 2 + sound/drivers/aloop.c | 101 +++-- sound/drivers/mpu401/mpu401.c | 6 + sound/drivers/mts64.c | 6 + sound/drivers/portman2x4.c | 6 + sound/drivers/serial-u16550.c | 6 + sound/pci/asihpi/hpi6000.c | 5 + sound/pci/hda/hda_proc.c | 2 +- sound/pci/via82xx_modem.c | 26 +- sound/soc/codecs/cs35l33.c | 14 +- sound/soc/codecs/cs35l34.c | 14 +- sound/soc/fsl/fsl-asoc-card.c | 4 +- sound/soc/fsl/mpc5200_psc_i2s.c | 1 + sound/soc/intel/atom/sst/sst_pci.c | 4 +- sound/soc/meson/meson-card-utils.c | 17 +- sound/soc/pxa/pxa-ssp.c | 7 +- sound/soc/samsung/aries_wm8994.c | 1 + sound/soc/soc-dapm.c | 2 +- sound/soc/xilinx/xlnx_formatter_pcm.c | 14 +- sound/usb/6fire/comm.c | 9 +- sound/usb/bcd2000/bcd2000.c | 11 +- sound/usb/midi.c | 2 + tools/bpf/bpftool/map.c | 4 +- tools/include/linux/compiler.h | 2 +- tools/perf/builtin-sched.c | 40 +- tools/perf/builtin-stat.c | 15 +- tools/perf/ui/browsers/hists.c | 6 +- tools/perf/util/auxtrace.c | 15 +- tools/perf/util/cs-etm.c | 81 +++- tools/perf/util/dso.c | 19 +- tools/perf/util/intel-bts.c | 2 +- tools/perf/util/intel-pt.c | 2 +- tools/perf/util/machine.c | 34 +- tools/perf/util/synthetic-events.c | 6 +- tools/perf/util/thread-stack.c | 2 +- tools/perf/util/trace-event-read.c | 33 +- .../selftests/arm64/mte/check_ksm_options.c | 29 +- tools/testing/selftests/bpf/test_sockmap.c | 3 +- .../selftests/rseq/rseq-x86-thread-pointer.h | 4 +- tools/testing/selftests/timers/leap-a-day.c | 19 +- tools/testing/selftests/zram/zram_lib.sh | 2 +- 708 files changed, 8383 insertions(+), 4068 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/798 Revert "USB: serial: keyspan_pda: fix information leak"
5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fedor Pchelkin <[email protected]>
This reverts commit cccef1711efbcdbe999738ac27d37b9ef6271abd which is commit 6bfc8d01ac4068eced509f8fc74d0cd205e4dcec upstream.
The 5.10 backport is incorrect - instead of keyspan_pda_write_start() it touches the wrong function keyspan_pda_write() which now returns an incorrect number of buffered bytes.
It turns out that the proper fix for keyspan_pda_write_start() has been already incorporated into the ported version of upstream commit 034e38e8f687 ("USB: serial: keyspan_pda: add write-fifo support"), for unknown reason.
Other stable kernels, starting with 5.15, got proper backports.
Found by Linux Verification Center (linuxtesting.org) with Svace static analysis tool.
--- drivers/usb/serial/keyspan_pda.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/serial/keyspan_pda.c +1 -1
@@ -606,7 +606,7 @@ static int keyspan_pda_write(struct tty_struct *tty, struct usb_serial_port *porif (rc)return rc; -return 0 ; +return count; }static void keyspan_pda_dtr_rts (struct usb_serial_port *port,int on)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 2/798 ALSA: aloop: Fix racy access at PCM trigger
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
[ Upstream commit 826af7fa62e347464b1b4e0ba2fe19a92438084f ]
The PCM trigger callback of aloop driver tries to check the PCM state and stop the stream of the tied substream in the corresponding cable. Since both check and stop operations are performed outside the cable lock, this may result in UAF when a program attempts to trigger frequently while opening/closing the tied stream, as spotted by fuzzers.
For addressing the UAF, this patch changes two things:
- It covers the most of code in loopback_check_format() with cable->lock spinlock, and add the proper NULL checks. This avoids already some racy accesses.
- In addition, now we try to check the state of the capture PCM stream that may be stopped in this function, which was the major pain point leading to UAF.
[ Karl Mehltretter: open-coded spin_lock_irqsave() instead of scoped_guard();
used snd_pcm_running() instead of cruntime->state; dropped the access-mode comparison and notification (462494565c27, e299a9fd433f, cdac6e1f7164); kept the stop_count handling from the e5c33cdc6f40 backport. ]
--- sound/drivers/aloop.c | 99 ++++++++++++++++++++++++++----------------- 1 file changed, 59 insertions(+), 40 deletions(-)
sound/drivers/aloop.c +59 -40
@@ -323,56 +323,75 @@ static int loopback_snd_timer_close_cable(struct loopback_pcm *dpcm)static int loopback_check_format (struct loopback_cable *cable,int stream) { +struct loopback_pcm *dpcm_play, *dpcm_capt;struct snd_pcm_runtime *runtime, *cruntime;struct loopback_setup *setup;struct snd_card *card; -int check; +unsigned long flags; +bool stop_capture = false; +int check, err =0 ; + +spin_lock_irqsave (&cable->lock, flags); + dpcm_play = cable->streams[SNDRV_PCM_STREAM_PLAYBACK ]; + dpcm_capt = cable->streams[SNDRV_PCM_STREAM_CAPTURE ];if (cable->valid !=CABLE_VALID_BOTH ) { -if (stream ==SNDRV_PCM_STREAM_PLAYBACK ) - goto __notify; -return 0 ; - } - runtime = cable->streams[SNDRV_PCM_STREAM_PLAYBACK ]-> - substream->runtime; - cruntime = cable->streams[SNDRV_PCM_STREAM_CAPTURE ]-> - substream->runtime; - check = runtime->format != cruntime->format || - runtime->rate != cruntime->rate || - runtime->channels != cruntime->channels; -if (!check) -return 0 ; -if (stream ==SNDRV_PCM_STREAM_CAPTURE ) { -return -EIO ; +if (stream ==SNDRV_PCM_STREAM_CAPTURE || !dpcm_play) + goto unlock; }else { -/* close must not free the peer runtime below */ -atomic_inc (&cable->stop_count); -snd_pcm_stop (cable->streams[SNDRV_PCM_STREAM_CAPTURE ]-> - substream,SNDRV_PCM_STATE_DRAINING ); -if (atomic_dec_and_test (&cable->stop_count)) -wake_up (&cable->stop_wait); - __notify: - runtime = cable->streams[SNDRV_PCM_STREAM_PLAYBACK ]-> - substream->runtime; - setup =get_setup (cable->streams[SNDRV_PCM_STREAM_PLAYBACK ]); - card = cable->streams[SNDRV_PCM_STREAM_PLAYBACK ]->loopback->card; -if (setup->format != runtime->format) { -snd_ctl_notify (card,SNDRV_CTL_EVENT_MASK_VALUE , - &setup->format_id); - setup->format = runtime->format; +if (!dpcm_play || !dpcm_capt) { + err = -EIO ; + goto unlock; } -if (setup->rate != runtime->rate) { -snd_ctl_notify (card,SNDRV_CTL_EVENT_MASK_VALUE , - &setup->rate_id); - setup->rate = runtime->rate; + runtime = dpcm_play->substream->runtime; + cruntime = dpcm_capt->substream->runtime; +if (!runtime || !cruntime) { + err = -EIO ; + goto unlock; } -if (setup->channels != runtime->channels) { -snd_ctl_notify (card,SNDRV_CTL_EVENT_MASK_VALUE , - &setup->channels_id); - setup->channels = runtime->channels; + check = runtime->format != cruntime->format || + runtime->rate != cruntime->rate || + runtime->channels != cruntime->channels; +if (!check) + goto unlock; +if (stream ==SNDRV_PCM_STREAM_CAPTURE ) { + err = -EIO ; + goto unlock; + }else if (snd_pcm_running (dpcm_capt->substream)) { +/* close must not free the peer runtime below */ +atomic_inc (&cable->stop_count); + stop_capture = true; } } -return 0 ; + + setup =get_setup (dpcm_play); + card = dpcm_play->loopback->card; + runtime = dpcm_play->substream->runtime; +if (setup->format != runtime->format) { +snd_ctl_notify (card,SNDRV_CTL_EVENT_MASK_VALUE , + &setup->format_id); + setup->format = runtime->format; + } +if (setup->rate != runtime->rate) { +snd_ctl_notify (card,SNDRV_CTL_EVENT_MASK_VALUE , + &setup->rate_id); + setup->rate = runtime->rate; + } +if (setup->channels != runtime->channels) { +snd_ctl_notify (card,SNDRV_CTL_EVENT_MASK_VALUE , + &setup->channels_id); + setup->channels = runtime->channels; + } + +unlock: +spin_unlock_irqrestore (&cable->lock, flags); +if (stop_capture) { +snd_pcm_stop (dpcm_capt->substream,SNDRV_PCM_STATE_DRAINING ); +if (atomic_dec_and_test (&cable->stop_count)) +wake_up (&cable->stop_wait); + } + +return err; }static void loopback_active_notify (struct loopback_pcm *dpcm)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 3/798 clocksource/drivers/timer-sun4i: Advertise a real minimum delta
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Yan <[email protected]>
commit d21808328225ab8cee46885bf9a0dffcefbe630e upstream.
sun4i_clkevt_next_event() compensates for the timer stop/start synchronization delay by programming evt - TIMER_SYNC_TICKS into the hardware interval register. The clockevent device currently advertises TIMER_SYNC_TICKS as min_delta_ticks, so the clockevents core is allowed to call set_next_event() with evt == TIMER_SYNC_TICKS.
That programs a zero-tick interval. With oneshot/highres/nohz timer operation this can leave the next event stuck, which was observed as a boot hang on Allwinner D1 after the clockevents core started reusing forced minimum-delta events.
Advertise one extra tick instead, so the smallest event accepted by the core still programs at least one hardware tick after the synchronization compensation.
--- drivers/clocksource/timer-sun4i.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clocksource/timer-sun4i.c +1 -1
@@ -209,7 +209,7 @@ static int __init sun4i_timer_init(strucsun4i_timer_clear_interrupt (timer_of_base (&to));clockevents_config_and_register (&to.clkevt,timer_of_rate (&to), -TIMER_SYNC_TICKS ,0xffffffff ); +TIMER_SYNC_TICKS +1 ,0xffffffff );/* Enable timer0 interrupt */ val =readl (timer_of_base (&to) +TIMER_IRQ_EN_REG );
Greg Kroah-Hartman
maintainerPATCH 4/798 timers/itimer: Zero-init old itimerval before copy to userspace
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jérémy Jean <[email protected]>
commit 18c7d85864e554adc8fad1e8d2e9d2cb6c3911c8 upstream.
On native sparc64, struct __kernel_old_timeval contains a four-byte hole after tv_usec because tv_sec is 64-bit while __kernel_suseconds_t is 32-bit. put_itimerval() fills only the named fields in a stack-allocated __kernel_old_itimerval and copies the entire object to userspace, so getitimer() can expose the two padding holes.
Zero-initialize the aggregate before assigning the fields so implicit padding is deterministic before it crosses the user/kernel boundary.
--- kernel/time/itimer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/time/itimer.c +1 -1
@@ -100,7 +100,7 @@ static int do_getitimer(int which, strucstatic int put_itimerval (struct __kernel_old_itimerval __user *o,const struct itimerspec64 *i) { -struct __kernel_old_itimerval v; +struct __kernel_old_itimerval v = {}; v.it_interval.tv_sec = i->it_interval.tv_sec; v.it_interval.tv_usec = i->it_interval.tv_nsec /NSEC_PER_USEC ;
Greg Kroah-Hartman
maintainerPATCH 5/798 include/linux/list.h: mark list_add and __list_add as __always_inline
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jordan R Abrahams-Whitehead <[email protected]>
commit 2780860eddecba9ffe210bb9436eee3cf22bfcdd upstream.
This commit resolves an issue where modpost section verification fails due to section mismatches between list_add and its callers.
At present, list_add (and its internal __list_add) are called from both .text and .init code sections. Since inlining can vary per call site, list_add can be 4 different states:
list_add in text with arguments to non-.init.data values list_add in init with arguments to static .init.data values list_add in init with arguments to non-.init.data values list_add in text with arguments to static .init.data values
It is last instance that ends up causing the section mismatch caused by constant propagation of the address of static libs inside the dir_add as seen below (with the dir_list being defined statically in initramfs.c, resting in .init.data).
WARNING: modpost: vmlinux.o: section mismatch in reference: __list_add (section: .text.unlikely.) -> dir_list (section: .init.data)
Because of these section matching requirements, semantically, __list_add and list_add MUST be inlined. This will then ensure callers inside .init will receive a list_add that exists and refers to only .init data, and list_add code in .text sections will only refer to non-init data.
This issue manifests predominently in AutoFDO with clang, which is very hesitant to inline cold functions such as list_add even when marked inline. Marking them as __always_inline therefore matches the existing semantic constraints imposed by modpost's section mismatch checks.
--- include/linux/list.h | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-)
include/linux/list.h +11 -4
@@ -59,10 +59,13 @@ static inline bool __list_del_entry_vali* * This is only for internal list manipulation where we know * the prev/next entries already! +* +* Must be inlined to ensure it can be safely called +* with initdata arguments. */ -static inline void __list_add (struct list_head *new, -struct list_head *prev, -struct list_head *next) +static __always_inline void __list_add(struct list_head *new, +struct list_head *prev, +struct list_head *next) {if (!__list_add_valid (new, prev, next))return ;
@@ -80,8 +83,12 @@ static inline void __list_add(struct lis* * Insert a new entry after the specified head. * This is good for implementing stacks. +* +* Must be inlined to ensure it can be safely called +* with initdata arguments. */ -static inline void list_add (struct list_head *new,struct list_head *head) +static __always_inline void list_add(struct list_head *new, +struct list_head *head) {__list_add (new, head, head->next); }
Greg Kroah-Hartman
maintainerPATCH 6/798 mm/vmscan: report RCU-tasks quiescent states in shrink_lruvec()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Breno Leitao <[email protected]>
commit 25f52e81216884a7444bf07a606691feb09a94e3 upstream.
I am seeing some rcu_tasks stalls in the Meta fleet during reclaim.
INFO: rcu_tasks detected stalls on tasks: 0000000088620d09: .. nvcsw: 6735/6735 holdout: 1 idle_cpu: -1/8 task:GlobalCPUThread state:R running task pid:2552016 tgid:2524552 Call Trace: shrink_lruvec mem_cgroup_iter shrink_node do_try_to_free_pages try_to_free_pages __alloc_frozen_pages_noprof alloc_pages_noprof pte_alloc_one __pte_alloc handle_mm_fault
Nothing promises direct reclaim returns in bounded time, and the scan loop in shrink_lruvec() only calls cond_resched(), which is a no-op on PREEMPTION kernels. Involuntary preemption is not a Tasks-RCU quiescent state, so the reclaiming task never reports one and becomes a holdout.
Upgrade it to cond_resched_tasks_rcu_qs(), which reports a quiescent state even when cond_resched() does nothing.
PS: This has been discussed in [1]
--- mm/vmscan.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
mm/vmscan.c +1 -1
@@ -2484,7 +2484,7 @@ static void shrink_lruvec(struct lruvec } } -cond_resched (); +cond_resched_tasks_rcu_qs ();if (nr_reclaimed < nr_to_reclaim || proportional_reclaim)continue ;
Greg Kroah-Hartman
maintainerPATCH 7/798 mm: memcg: stop reclaim when a limit update is superseded
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guopeng Zhang <[email protected]>
commit 9477820c63cbf4d97114238f3d1ff10dfd6bee3f upstream.
kernfs serializes file operations only per open file, so separate open files can update the same memory.high or memory.max file concurrently. Both handlers store the new limit before synchronous reclaim, but continue to use the writer's local target in the reclaim loop. If another writer raises or removes the limit, the first writer can continue reclaiming toward a stale target.
For memory.max, this can leave the writer looping indefinitely once reclaim retries are exhausted. The OOM path sees sufficient margin under the current limit and returns true without killing, while the writer still compares usage against its stale target and records another OOM event.
Check the current limit at the start of each reclaim iteration and stop if it no longer matches the writer's target.
Reproducer:
Populate a cgroup with anonymous memory and disable swapping. Lower memory.max from one open file, then restore it to "max" through another open file after the new limit becomes visible.
Without the patch, the first writer remains blocked and repeatedly increments the OOM event counter. With the patch, it returns normally.
This was not motivated by a reported production workload. We found it through automated randomized testing for our cgroup observability work and reduced it to the reproducer above.
--- mm/memcontrol.c | 6 ++++++ 1 file changed, 6 insertions(+)
mm/memcontrol.c +6 -0
@@ -6363,6 +6363,9 @@ static ssize_t memory_high_write(structunsigned long nr_pages =page_counter_read (&memcg->memory);unsigned long reclaimed; +if (high !=READ_ONCE (memcg->memory.high)) +break ; +if (nr_pages <= high)break ;
@@ -6411,6 +6414,9 @@ static ssize_t memory_max_write(struct kfor (;;) {unsigned long nr_pages =page_counter_read (&memcg->memory); +if (max !=READ_ONCE (memcg->memory.max)) +break ; +if (nr_pages <= max)break ;
Greg Kroah-Hartman
maintainerPATCH 8/798 tools/compiler: match glibc 2.42 definition of __attribute_const__
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joy H.J. Lee <[email protected]>
commit 8700a4761beb219873956666cf91776a2c61e698 upstream.
glibc 2.42 added __attribute_const__ to sys/cdefs.h:
# define __attribute_const__ __attribute__ ((__const__))
GCC 15 warns when a macro is redefined to a different replacement list (-Wbuiltin-macro-redefined). Since host tool Makefiles (resolve_btfids, objtool) pass -Werror, this conflict becomes fatal.
The warning is suppressed on standard native builds because GCC treats /usr/include as a system header path (-isystem), and macro-redefinition warnings from system headers are silently suppressed by GCC. It fires when glibc headers are on a regular include path (-I) instead, which is the case in cross-compilation setups such as NixOS, where the sysroot's glibc is passed explicitly via -I rather than -isystem.
Per (C11 6.10.3), identical replacement lists are accepted silently. Match the glibc definition exactly, including the space before "((", so the redefinition is accepted without warning regardless of whether glibc headers are treated as system or non-system includes.
--- tools/include/linux/compiler.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/include/linux/compiler.h +1 -1
@@ -69,7 +69,7 @@#define __read_mostly#ifndef __attribute_const__ -# define __attribute_const__ +# define __attribute_const__ __attribute__ ((__const__))#endif #ifndef __maybe_unused
Greg Kroah-Hartman
maintainerPATCH 9/798 x86/insn-eval: Move assign_register() out of KVM as insn_assign_reg()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kiryl Shutsemau (Meta) <[email protected]>
commit 1fe104b048d77d6cb25bd938e6a67450fb50e61d upstream.
KVM's instruction emulator has a small helper, assign_register(), that writes a value into a register following the x86 rules for writes to general-purpose registers: an 8- or 16-bit write leaves the rest of the register untouched, a 32-bit write zero-extends the result to 64 bits, and a 64-bit write replaces the whole register.
The TDX guest #VE handler needs the same logic for port I/O emulation to get 32-bit zero-extension right. Rather than add a third copy of the same switch, move the helper verbatim to <asm/insn-eval.h>, rename it to insn_assign_reg(), and route KVM's callers through it.
Add <asm/insn.h> to the header's includes so it builds standalone in callers that have not pulled it in transitively.
No functional change.
--- arch/x86/include/asm/insn-eval.h | 36 ++++++++++++++++++++++++++++++++++++ arch/x86/kvm/emulate.c | 26 ++++---------------------- 2 files changed, 40 insertions(+), 22 deletions(-)
arch/x86/include/asm/insn-eval.h +36 -0
@@ -9,6 +9,7 @@#include <linux/compiler.h> #include <linux/bug.h> #include <linux/err.h> +#include <asm/insn.h> #include <asm/ptrace.h> #define INSN_CODE_SEG_ADDR_SZ (params) ((params >> 4) & 0xf)
@@ -29,4 +30,39 @@ int insn_fetch_from_user_inatomic(structbool insn_decode_from_regs (struct insn *insn,struct pt_regs *regs,unsigned char buf[MAX_INSN_SIZE ],int buf_size); +/* +* Write @val into *@reg following the x86 rules for writes to +* general-purpose registers (Intel SDM Vol. 1, "General-Purpose +* Registers in 64-Bit Mode"): an 8- or 16-bit write leaves the rest of +* the register untouched, a 32-bit write zero-extends the result into +* the upper 32 bits, and a 64-bit write replaces the whole register. +* +* @bytes is the width of the write, not a property of the instruction: +* an instruction that, say, sign-extends a 32-bit immediate into a +* 64-bit register does a 64-bit write here. +* +* @reg need not be 8-byte aligned: KVM's instruction emulator offsets +* the pointer by one byte to address the high-byte registers (AH, CH, +* DH, BH). Use narrow stores for the sub-word cases so the access +* width matches @bytes and the adjacent bytes are left alone. +*/ +static inline void insn_assign_reg (unsigned long *reg,u64 val,int bytes) +{ +switch (bytes) { +case 1 : + *(u8 *)reg = (u8 )val; +break ; +case 2 : + *(u16 *)reg = (u16 )val; +break ; +case 4 : +/* A 32-bit write zero-extends into the upper 32 bits. */ + *reg = (u32 )val; +break ; +case 8 : + *reg = val; +break ; + } +} +#endif /* _ASM_X86_INSN_EVAL_H */
arch/x86/kvm/emulate.c +4 -22
@@ -24,6 +24,7 @@#include <linux/stringify.h> #include <asm/fpu/api.h> #include <asm/debugreg.h> +#include <asm/insn-eval.h> #include <asm/nospec-branch.h> #include "x86.h"
@@ -526,25 +527,6 @@ static void assign_masked(ulong *dest, u *dest = (*dest & ~mask) | (src & mask); } -static void assign_register (unsigned long *reg,u64 val,int bytes) -{ -/* The 4-byte case *is* correct: in 64-bit mode we zero-extend. */ -switch (bytes) { -case 1 : - *(u8 *)reg = (u8 )val; -break ; -case 2 : - *(u16 *)reg = (u16 )val; -break ; -case 4 : - *reg = (u32 )val; -break ;/* 64b: zero-extend */ -case 8 : - *reg = val; -break ; - } -} -static inline unsigned long ad_mask (struct x86_emulate_ctxt *ctxt) {return (1UL << (ctxt->ad_bytes <<3 )) -1 ;
@@ -592,7 +574,7 @@ register_address_increment(struct x86_em {ulong *preg =reg_rmw (ctxt, reg); -assign_register (preg, *preg + inc, ctxt->ad_bytes); +insn_assign_reg (preg, *preg + inc, ctxt->ad_bytes); }static void rsp_increment (struct x86_emulate_ctxt *ctxt,int inc)
@@ -1884,7 +1866,7 @@ static int load_segment_descriptor(strucstatic void write_register_operand (struct operand *op) { -return assign_register (op->addr.reg, op->val, op->bytes); +return insn_assign_reg (op->addr.reg, op->val, op->bytes); }static int writeback (struct x86_emulate_ctxt *ctxt,struct operand *op)
@@ -2118,7 +2100,7 @@ static int em_popa(struct x86_emulate_ct rc =emulate_pop (ctxt, &val, ctxt->op_bytes);if (rc !=X86EMUL_CONTINUE )break ; -assign_register (reg_rmw (ctxt, reg), val, ctxt->op_bytes); +insn_assign_reg (reg_rmw (ctxt, reg), val, ctxt->op_bytes); --reg; }return rc;
Greg Kroah-Hartman
maintainerPATCH 10/798 tracing: Fix crash passing ERR_PTR to kthread_stop()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hui Su <[email protected]>
commit 649bc7df3e5d7be6f7996a95084037dbf3cad1e5 upstream.
event_test_stuff() calls kthread_run() and unconditionally passes the returned task_struct pointer to kthread_stop(). kthread_run() returns an error pointer such as ERR_PTR(-ENOMEM) when kthread creation fails, for example under memory pressure during the boot-time event self-test. kthread_stop() then dereferences the invalid pointer, crashing the kernel.
Check the result of kthread_run() before passing it to kthread_stop(). Use WARN_ON() so that a failure to create the self-test thread does not go unnoticed, matching the ring-buffer self-test fix in commit 91542863abad ("ring-buffer: Fix crash passing ERR_PTR to kthread_stop()").
--- kernel/trace/trace_events.c | 2 ++ 1 file changed, 2 insertions(+)
kernel/trace/trace_events.c +2 -0
@@ -3603,6 +3603,8 @@ static __init void event_test_stuff(voidstruct task_struct *test_thread; test_thread =kthread_run (event_test_thread,NULL ,"test-events" ); +if (WARN_ON (IS_ERR (test_thread))) +return ;msleep (1 );kthread_stop (test_thread); }
Greg Kroah-Hartman
maintainerPATCH 11/798 powerpc/powermac: fix OF node refcount
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bartosz Golaszewski <[email protected]>
commit bd0abfe6b013aeb2a1aebc5fbc7ceeb50355bda3 upstream.
Platform devices created with platform_device_alloc() call platform_device_release() when the last reference to the device's kobject is dropped. This function calls of_node_put() unconditionally. This works fine for devices created with platform_device_register_full() but users of the split approach (platform_device_alloc() + platform_device_add()) must bump the reference of the of_node they assign manually. Add the missing call to of_node_get().
--- arch/powerpc/platforms/powermac/low_i2c.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/powerpc/platforms/powermac/low_i2c.c +1 -1
@@ -1501,7 +1501,7 @@ static int __init pmac_i2c_create_platfoif (bus->platform_dev ==NULL )return -ENOMEM ; bus->platform_dev->dev.platform_data = bus; - bus->platform_dev->dev.of_node = bus->busnode; + bus->platform_dev->dev.of_node =of_node_get (bus->busnode);platform_device_add (bus->platform_dev); }
Greg Kroah-Hartman
maintainerPATCH 12/798 rapidio: mport_cdev: fix use-after-free in dma_req_free()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Kim <[email protected]>
commit 5cbef379a94b161726c5f504598bf4791d45cedc upstream.
dma_req_free() acquires buf_mutex through req->map, drops the mapping reference with kref_put(), and then dereferences req->map again to unlock the mutex.
If kref_put() drops the last reference, mport_release_mapping() frees the mapping, and the subsequent mutex_unlock() dereferences a freed object. This is a use-after-free.
Fix this by caching map and md before kref_put(), clearing req->map while holding buf_mutex, and using the cached md for mutex unlocking.
The bug is reachable from userspace via the RapidIO mport character device interface.
--- drivers/rapidio/devices/rio_mport_cdev.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
drivers/rapidio/devices/rio_mport_cdev.c +7 -3
@@ -582,9 +582,13 @@ static void dma_req_free(struct kref *re }if (req->map) { -mutex_lock (&req->map->md->buf_mutex); -kref_put (&req->map->ref, mport_release_mapping); -mutex_unlock (&req->map->md->buf_mutex); +struct rio_mport_mapping *map = req->map; +struct mport_dev *md = map->md; + +mutex_lock (&md->buf_mutex); + req->map =NULL ; +kref_put (&map->ref, mport_release_mapping); +mutex_unlock (&md->buf_mutex); }kref_put (&priv->dma_ref, mport_release_dma);
Greg Kroah-Hartman
maintainerPATCH 13/798 Revert "media: v4l2-dev: fix error handling in __video_register_device()"
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hans Verkuil <[email protected]>
commit e7600f5cee5de14065f950807931d6e6d40fb2d7 upstream.
This reverts commit 2a934fdb01db6458288fc9386d3d8ceba6dd551a.
The intentions of that patch were good, but it doesn't work.
The idea is that if device_register fails, you have to do a put_device to let the ref counter release resources.
However, the V4L2 API says that if video_register_device() fails, then you have to call video_device_release(), which kfree()s the video_device struct.
But the put_device() will already have freed the struct, so you end up in a double-free scenario.
There is not really a good way of fixing this without breaking video_register_device() into two parts, one that initializes everything, and one that does the actual device_register, and then converting all V4L2 drivers to this new model.
That is a massive job, and it is very unlikely that device_register will fail.
So rather than ending up in a double-free scenario, just revert this patch, and in that case we'll have a small memory leak. Which is a lot more robust.
--- drivers/media/v4l2-core/v4l2-dev.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
drivers/media/v4l2-core/v4l2-dev.c +7 -7
@@ -1029,25 +1029,25 @@ int __video_register_device(struct video vdev->dev.class = &video_class; vdev->dev.devt =MKDEV (VIDEO_MAJOR , vdev->minor); vdev->dev.parent = vdev->dev_parent; - vdev->dev.release = v4l2_device_release;dev_set_name (&vdev->dev,"%s%d" , name_base, vdev->num); - -/* Increase v4l2_device refcount */ -v4l2_device_get (vdev->v4l2_dev); -mutex_lock (&videodev_lock); ret =device_register (&vdev->dev);if (ret <0 ) {mutex_unlock (&videodev_lock);pr_err ("%s: device_register failed\n" , __func__); -put_device (&vdev->dev); -return ret; + goto cleanup; } +/* Register the release callback that will be called when the last +reference to the device goes away. */ + vdev->dev.release = v4l2_device_release;if (nr !=-1 && nr != vdev->num && warn_if_nr_in_use)pr_warn ("%s: requested %s%d, got %s\n" , __func__, name_base, nr,video_device_node_name (vdev)); +/* Increase v4l2_device refcount */ +v4l2_device_get (vdev->v4l2_dev); +/* Part 5: Register the entity. */ ret =video_register_media_controller (vdev);
Greg Kroah-Hartman
maintainerPATCH 14/798 staging: greybus: hid: fix SET_REPORT return value
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hao-Qun Huang <[email protected]>
commit 6d45195a9626d8aaaaed212c55638829a9c624a3 upstream.
__gb_hid_output_raw_report() stores the result of gb_hid_set_report() in ret and even adjusts it to account for the report ID byte, but then always returns 0.
This hides Greybus transport errors from HID_REQ_SET_REPORT callers, and makes hidraw report zero bytes written to user space on success, although hid_hw_raw_request() is expected to return the number of bytes transferred or a negative errno. The sibling GET_REPORT path, __gb_hid_get_raw_report(), already follows this convention.
Return ret like the other HID transport drivers do.
--- drivers/staging/greybus/hid.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/staging/greybus/hid.c +1 -1
@@ -256,7 +256,7 @@ static int __gb_hid_output_raw_report(stif (report_id && ret >=0 ) ret++;/* add report_id to the number of transfered bytes */ -return 0 ; +return ret; } static int gb_hid_raw_request(struct hid_device *hid, unsigned char reportnum,
Greg Kroah-Hartman
maintainerPATCH 15/798 USB: phy: fsl-usb: fix missing static keywords
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 80574c40598aedbc1751c528e414d7e224bc6313 upstream.
A recent change enabling compile testing of a Freescale dual-role controller indirectly enabled a USB PHY driver to be built. That driver in turn is missing a bunch of static keywords which results in warnings like:
drivers/usb/phy/phy-fsl-usb.c:105:5: error: no previous prototype for 'write_ulpi' [-Werror=missing-prototypes]
105 | int write_ulpi(u8 addr, u8 data)
| ^~~~~~~~~~
which consequently breaks -Werror builds.
Add the missing static keywords.
--- drivers/usb/phy/phy-fsl-usb.c | 52 +++++++++++++++++++++--------------------- drivers/usb/phy/phy-fsl-usb.h | 6 ++-- 2 files changed, 29 insertions(+), 29 deletions(-)
drivers/usb/phy/phy-fsl-usb.c +26 -26
@@ -45,7 +45,7 @@static const char driver_name[] ="fsl-usb2-otg" ; -const pm_message_t otg_suspend_state = { +static const pm_message_t otg_suspend_state = { .event =1 , };
@@ -56,11 +56,11 @@ static struct fsl_otg *fsl_otg_dev;static int srp_wait_done;/* FSM timers */ -struct fsl_otg_timer *a_wait_vrise_tmr, *a_wait_bcon_tmr, *a_aidl_bdis_tmr, +static struct fsl_otg_timer *a_wait_vrise_tmr, *a_wait_bcon_tmr, *a_aidl_bdis_tmr, *b_ase0_brst_tmr, *b_se0_srp_tmr;/* Driver specific timers */ -struct fsl_otg_timer *b_data_pulse_tmr, *b_vbus_pulse_tmr, *b_srp_fail_tmr, +static struct fsl_otg_timer *b_data_pulse_tmr, *b_vbus_pulse_tmr, *b_srp_fail_tmr, *b_srp_wait_tmr, *a_wait_enum_tmr;static struct list_head active_timers;
@@ -101,7 +101,7 @@ static void (*_fsl_writel)(u32 v, unsign#define fsl_writel (val, addr) writel(val, addr)#endif /* CONFIG_PPC32 */ -int write_ulpi (u8 addr,u8 data) +static int write_ulpi (u8 addr,u8 data) {u32 temp;
@@ -114,7 +114,7 @@ int write_ulpi(u8 addr, u8 data)/* Operations that will be called from OTG Finite State Machine */ /* Charge vbus for vbus pulsing in SRP */ -void fsl_otg_chrg_vbus (struct otg_fsm *fsm,int on) +static void fsl_otg_chrg_vbus (struct otg_fsm *fsm,int on) {u32 tmp;
@@ -132,7 +132,7 @@ void fsl_otg_chrg_vbus(struct otg_fsm *f }/* Discharge vbus through a resistor to ground */ -void fsl_otg_dischrg_vbus (int on) +static void fsl_otg_dischrg_vbus (int on) {u32 tmp;
@@ -150,7 +150,7 @@ void fsl_otg_dischrg_vbus(int on) }/* A-device driver vbus, controlled through PP bit in PORTSC */ -void fsl_otg_drv_vbus (struct otg_fsm *fsm,int on) +static void fsl_otg_drv_vbus (struct otg_fsm *fsm,int on) {u32 tmp;
@@ -168,7 +168,7 @@ void fsl_otg_drv_vbus(struct otg_fsm *fs* Pull-up D+, signalling connect by periperal. Also used in * data-line pulsing in SRP */ -void fsl_otg_loc_conn (struct otg_fsm *fsm,int on) +static void fsl_otg_loc_conn (struct otg_fsm *fsm,int on) {u32 tmp;
@@ -187,7 +187,7 @@ void fsl_otg_loc_conn(struct otg_fsm *fs* port. In host mode, controller will automatically send SOF. * Suspend will block the data on the port. */ -void fsl_otg_loc_sof (struct otg_fsm *fsm,int on) +static void fsl_otg_loc_sof (struct otg_fsm *fsm,int on) {u32 tmp;
@@ -202,7 +202,7 @@ void fsl_otg_loc_sof(struct otg_fsm *fsm }/* Start SRP pulsing by data-line pulsing, followed with v-bus pulsing. */ -void fsl_otg_start_pulse (struct otg_fsm *fsm) +static void fsl_otg_start_pulse (struct otg_fsm *fsm) {u32 tmp;
@@ -218,7 +218,7 @@ void fsl_otg_start_pulse(struct otg_fsmfsl_otg_add_timer (fsm, b_data_pulse_tmr); } -void b_data_pulse_end (unsigned long foo) +static void b_data_pulse_end (unsigned long foo) {#ifdef HA_DATA_PULSE #else
@@ -229,7 +229,7 @@ void b_data_pulse_end(unsigned long foo)fsl_otg_pulse_vbus (); } -void fsl_otg_pulse_vbus (void ) +static void fsl_otg_pulse_vbus (void ) { srp_wait_done =0 ;fsl_otg_chrg_vbus (&fsl_otg_dev->fsm,1 );
@@ -237,7 +237,7 @@ void fsl_otg_pulse_vbus(void)fsl_otg_add_timer (&fsl_otg_dev->fsm, b_vbus_pulse_tmr); } -void b_vbus_pulse_end (unsigned long foo) +static void b_vbus_pulse_end (unsigned long foo) {fsl_otg_chrg_vbus (&fsl_otg_dev->fsm,0 );
@@ -250,7 +250,7 @@ void b_vbus_pulse_end(unsigned long foo)fsl_otg_add_timer (&fsl_otg_dev->fsm, b_srp_wait_tmr); } -void b_srp_end (unsigned long foo) +static void b_srp_end (unsigned long foo) {fsl_otg_dischrg_vbus (0 ); srp_wait_done =1 ;
@@ -265,7 +265,7 @@ void b_srp_end(unsigned long foo)* a_host will start by SRP. It needs to set b_hnp_enable before * actually suspending to start HNP */ -void a_wait_enum (unsigned long foo) +static void a_wait_enum (unsigned long foo) {VDBG ("a_wait_enum timeout\n" );if (!fsl_otg_dev->phy.otg->host->b_hnp_enable)
@@ -275,13 +275,13 @@ void a_wait_enum(unsigned long foo) }/* The timeout callback function to set time out bit */ -void set_tmout (unsigned long indicator) +static void set_tmout (unsigned long indicator) { *(int *)indicator =1 ; }/* Initialize timers */ -int fsl_otg_init_timers (struct otg_fsm *fsm) +static int fsl_otg_init_timers (struct otg_fsm *fsm) {/* FSM used timers */ a_wait_vrise_tmr = otg_timer_initializer(&set_tmout, TA_WAIT_VRISE,
@@ -338,7 +338,7 @@ int fsl_otg_init_timers(struct otg_fsm * }/* Uninitialize timers */ -void fsl_otg_uninit_timers (void ) +static void fsl_otg_uninit_timers (void ) {/* FSM used timers */ kfree (a_wait_vrise_tmr);
@@ -390,7 +390,7 @@ static struct fsl_otg_timer *fsl_otg_get }/* Add timer to timer list */ -void fsl_otg_add_timer (struct otg_fsm *fsm,void *gtimer) +static void fsl_otg_add_timer (struct otg_fsm *fsm,void *gtimer) {struct fsl_otg_timer *timer = gtimer;struct fsl_otg_timer *tmp_timer;
@@ -420,7 +420,7 @@ static void fsl_otg_fsm_add_timer(struct }/* Remove timer from the timer list; clear timeout status */ -void fsl_otg_del_timer (struct otg_fsm *fsm,void *gtimer) +static void fsl_otg_del_timer (struct otg_fsm *fsm,void *gtimer) {struct fsl_otg_timer *timer = gtimer;struct fsl_otg_timer *tmp_timer, *del_tmp;
@@ -442,7 +442,7 @@ static void fsl_otg_fsm_del_timer(struct }/* Reset controller, not reset the bus */ -void otg_reset_controller (void ) +static void otg_reset_controller (void ) {u32 command;
@@ -454,7 +454,7 @@ void otg_reset_controller(void) }/* Call suspend/resume routines in host driver */ -int fsl_otg_start_host (struct otg_fsm *fsm,int on) +static int fsl_otg_start_host (struct otg_fsm *fsm,int on) {struct usb_otg *otg = fsm->otg;struct device *dev;
@@ -521,7 +521,7 @@ end:* Call suspend and resume function in udc driver * to stop and start udc driver. */ -int fsl_otg_start_gadget (struct otg_fsm *fsm,int on) +static int fsl_otg_start_gadget (struct otg_fsm *fsm,int on) {struct usb_otg *otg = fsm->otg;struct device *dev;
@@ -703,7 +703,7 @@ static int fsl_otg_start_hnp(struct usb_* intact. It needs to have knowledge of some USB interrupts * such as port change. */ -irqreturn_t fsl_otg_isr (int irq,void *dev_id) +static irqreturn_t fsl_otg_isr (int irq,void *dev_id) {struct otg_fsm *fsm = &((struct fsl_otg *)dev_id)->fsm;struct usb_otg *otg = ((struct fsl_otg *)dev_id)->phy.otg;
@@ -829,7 +829,7 @@ err: }/* OTG Initialization */ -int usb_otg_start (struct platform_device *pdev) +static int usb_otg_start (struct platform_device *pdev) {struct fsl_otg *p_otg;struct usb_phy *otg_trans =usb_get_phy (USB_PHY_TYPE_USB2 );
@@ -1002,7 +1002,7 @@ static int fsl_otg_remove(struct platforreturn 0 ; } -struct platform_driver fsl_otg_driver = { +static struct platform_driver fsl_otg_driver = { .probe = fsl_otg_probe, .remove = fsl_otg_remove, .driver = {
drivers/usb/phy/phy-fsl-usb.h +3 -3
@@ -373,6 +373,6 @@ struct fsl_otg_config {#define FSL_OTG_NAME "fsl-usb2-otg" -void fsl_otg_add_timer (struct otg_fsm *fsm,void *timer); -void fsl_otg_del_timer (struct otg_fsm *fsm,void *timer); -void fsl_otg_pulse_vbus (void ); +static void fsl_otg_add_timer (struct otg_fsm *fsm,void *timer); +static void fsl_otg_del_timer (struct otg_fsm *fsm,void *timer); +static void fsl_otg_pulse_vbus (void );
Greg Kroah-Hartman
maintainerPATCH 16/798 usb: gadget: snps_udc_plat: clean up PHY on probe deferral
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Myeonghun Pak <[email protected]>
commit 886338ea7d40e4ba5123c58204d7f7e53d825825 upstream.
When the referenced extcon device has not registered yet, extcon_get_edev_by_phandle() returns -EPROBE_DEFER after the driver has initialized and powered on the PHY. The direct return bypasses the common cleanup path and leaves both operations unbalanced.
Store the lookup error first and route deferred probing through exit_phy, while retaining the existing behavior of suppressing the error message for deferral.
This issue was identified during our ongoing static-analysis research while reviewing kernel code.
--- drivers/usb/gadget/udc/snps_udc_plat.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/usb/gadget/udc/snps_udc_plat.c +2 -3
@@ -161,10 +161,9 @@ static int udc_plat_probe(struct platforif (of_get_property (dev->of_node,"extcon" ,NULL )) { udc->edev =extcon_get_edev_by_phandle (dev,0 );if (IS_ERR (udc->edev)) { -if (PTR_ERR (udc->edev) == -EPROBE_DEFER ) -return -EPROBE_DEFER ; -dev_err (dev,"Invalid or missing extcon\n" ); ret =PTR_ERR (udc->edev); +if (ret != -EPROBE_DEFER ) +dev_err (dev,"Invalid or missing extcon\n" ); goto exit_phy; }
Greg Kroah-Hartman
maintainerPATCH 17/798 usb: gadget: f_tcm: fix deadlock in usbg_make_tpg()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yun Zhou <[email protected]>
commit 9dbf74f4022f80f7669d2b3c22c5deb46c1b5674 upstream.
usbg_make_tpg() held dep_lock while calling configfs_depend_item_unlocked(), which acquires the configfs root inode lock when operating across subsystems. This creates a circular lock dependency with configfs_rmdir():
dep_lock -> configfs root inode lock -> su_mutex -> dep_lock
In usbg_make_tpg(), dep_lock only serialized the read of opts->ready, which is a monotonic flag that transitions from false to true exactly once (in tcm_set_name()) and never reverts. Remove dep_lock from usbg_make_tpg() entirely and use READ_ONCE/WRITE_ONCE to access opts->ready locklessly instead.
--- drivers/usb/gadget/function/f_tcm.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-)
drivers/usb/gadget/function/f_tcm.c +12 -11
@@ -1358,19 +1358,25 @@ static struct se_portal_group *usbg_make opts = container_of(tpg_instances[i].func_inst, struct f_tcm_opts, func_inst); -mutex_lock (&opts->dep_lock); -if (!opts->ready) - goto unlock_dep; +if (!READ_ONCE (opts->ready)) + goto unlock_inst;if (opts->has_dep) {if (!try_module_get (opts->dependent)) - goto unlock_dep; + goto unlock_inst; }else { +/* +* configfs_depend_item_unlocked() may acquire the configfs +* root inode lock when the target belongs to a different +* subsystem. Calling it under dep_lock would create a +* circular dependency: +* dep_lock -> configfs inode lock -> su_mutex -> dep_lock +*/ ret =configfs_depend_item_unlocked ( wwn->wwn_group.cg_subsys, &opts->func_inst.group.cg_item);if (ret) - goto unlock_dep; + goto unlock_inst; } tpg =kzalloc (sizeof (struct usbg_tpg ),GFP_KERNEL );
@@ -1396,7 +1402,6 @@ static struct se_portal_group *usbg_make tpg_instances[i].tpg = tpg; tpg->fi = tpg_instances[i].func_inst; -mutex_unlock (&opts->dep_lock);mutex_unlock (&tpg_instances_lock);return &tpg->se_tpg;
@@ -1409,8 +1414,6 @@ unref_dep:module_put (opts->dependent); else configfs_undepend_item_unlocked(&opts->func_inst.group.cg_item); -unlock_dep: -mutex_unlock (&opts->dep_lock); unlock_inst:mutex_unlock (&tpg_instances_lock);
@@ -2368,9 +2371,7 @@ static int tcm_set_name(struct usb_functpr_debug ("tcm: Activating %s\n" , name); -mutex_lock (&opts->dep_lock); - opts->ready = true; -mutex_unlock (&opts->dep_lock); +WRITE_ONCE (opts->ready, true);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 18/798 usb: gadget: uvc: fix dangling pointers in uvc_function_bind() and uvc_function_unbind()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeffin Philip <[email protected]>
commit bdab5605259ba5d6ff927c1a85cc83eb3ecfdacc upstream.
In uvc_function_bind() error path, we use usb_ep_free_request which uses uvc->control_req but does not set it to NULL afterwards. Thus, uvc->control_req is a dangling pointer causing a UAF. Also we do not set the uvc->control_buf pointer to NULL after freeing it, which is another dangling pointer. Fix it by setting uvc->control_req to NULL after we run usb_ep_free_request() and uvc->control_buf to NULL after kfree. Do the same for uvc_function_unbind().
--- drivers/usb/gadget/function/f_uvc.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/usb/gadget/function/f_uvc.c +6 -1
@@ -780,9 +780,12 @@ uvc_function_bind(struct usb_configurati v4l2_error:v4l2_device_unregister (&uvc->v4l2_dev); error: -if (uvc->control_req) +if (uvc->control_req) {usb_ep_free_request (cdev->gadget->ep0, uvc->control_req); + uvc->control_req =NULL ; + }kfree (uvc->control_buf); + uvc->control_buf =NULL ;usb_free_all_descriptors (f);return ret;
@@ -957,7 +960,9 @@ static void uvc_function_unbind(struct u uvc->vdev_release_done =NULL ;usb_ep_free_request (cdev->gadget->ep0, uvc->control_req); + uvc->control_req =NULL ;kfree (uvc->control_buf); + uvc->control_buf =NULL ;usb_free_all_descriptors (f); }
Greg Kroah-Hartman
maintainerPATCH 19/798 usb: gadget: f_fs: Prevent deadlock during ep0 read loop
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Neill Kapron <[email protected]>
commit 569dd7e5dcffe1e1c6b26ca2cd3be57eb433e082 upstream.
Currently, ffs_ep0_read() holds ffs->mutex when it prepares to go to sleep waiting for an event. When no setup events are pending, it calls wait_event_interruptible_exclusive_locked_irq() with the mutex still held. The wait macro deliberately drops the waitqueue spinlock before sleeping but does not drop the mutex.
If a userspace daemon is polling ep0 via read() and the gadget is asynchronously torn down via configfs (e.g., echo "" > UDC), a deadlock can occur:
1. The configfs teardown calls functionfs_unbind(), which queues a FUNCTIONFS_UNBIND event.
2. The daemon wakes up, consumes the event, and drops the mutex.
3. However, if the daemon loops and immediately issues another read() before exiting, it reacquires ffs->mutex and again goes into an interruptible sleep.
4. Meanwhile, functionfs_unbind() continues execution and attempts to acquire ffs->mutex to tear down ep0req.
5. The kernel deadlocks because the configfs thread is stuck in an uninterruptible sleep waiting for the mutex, while the userspace daemon is in an interruptible sleep holding the mutex forever because no more events will arrive.
To fix this, we drop both the waitqueue spinlock and ffs->mutex before going to sleep, and use wait_event_interruptible_exclusive() instead. Upon waking up, we jump back to the retry label to safely reacquire the mutex and re-evaluate the state machine. By not sleeping with ffs->mutex held, we natively decouple gadget teardowns (which require the mutex) from userspace polling.
--- drivers/usb/gadget/function/f_fs.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-)
drivers/usb/gadget/function/f_fs.c +10 -4
@@ -518,6 +518,7 @@ static ssize_t ffs_ep0_read(struct fileif (ffs_setup_state_clear_cancelled (ffs) ==FFS_SETUP_CANCELLED )return -EIDRM ; +retry:/* Acquire mutex */ ret =ffs_mutex_lock (&ffs->mutex, file->f_flags &O_NONBLOCK );if (unlikely (ret <0 ))
@@ -552,10 +553,15 @@ static ssize_t ffs_ep0_read(struct filebreak ; } -if (wait_event_interruptible_exclusive_locked_irq (ffs->ev.waitq, - ffs->ev.count)) { - ret = -EINTR ; -break ; +if (!ffs->ev.count) { +spin_unlock_irq (&ffs->ev.waitq.lock); +mutex_unlock (&ffs->mutex); + +if (wait_event_interruptible_exclusive (ffs->ev.waitq, + ffs->ev.count)) +return -EINTR ; + + goto retry; }/* unlocks spinlock */
Greg Kroah-Hartman
maintainerPATCH 20/798 fpga: altera-cvp: Avoid out-of-bounds read in trailing byte write
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daisuke Matsuda <[email protected]>
commit 9da70a43b5fea60d758137f7f0ccfe19356cb5bb upstream.
The trailing byte path in altera_cvp_send_block() dereferences a u32 pointer even when only 1-3 bytes remain in the input buffer. If the buffer ends at a page or scatterlist boundary, this can read past the valid image data and fault.
Copy the remaining bytes into a zero-initialized u32 before writing the final word so only valid bytes are read from the input buffer.
--- drivers/fpga/altera-cvp.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
drivers/fpga/altera-cvp.c +6 -4
@@ -16,6 +16,7 @@#include <linux/module.h> #include <linux/pci.h> #include <linux/sizes.h> +#include <linux/string.h> #define CVP_BAR 0/* BAR used for data transfer in memory mode */ #define CVP_DUMMY_WR 244/* dummy writes to clear CvP state machine */
@@ -265,7 +266,7 @@ static int altera_cvp_v2_wait_for_creditstatic int altera_cvp_send_block (struct altera_cvp_conf *conf,const u32 *data,size_t len) { -u32 mask, words = len /sizeof (u32); +u32 words = len /sizeof (u32);int i, remainder;for (i =0 ; i < words; i++)
@@ -274,9 +275,10 @@ static int altera_cvp_send_block(struct/* write up to 3 trailing bytes, if any */ remainder = len %sizeof (u32);if (remainder) { - mask =BIT (remainder *8 ) -1 ; -if (mask) - conf->write_data (conf, *data & mask); +u32 word =0 ; + +memcpy (&word, data, remainder); + conf->write_data (conf, word); }return 0 ;
Greg Kroah-Hartman
maintainerPATCH 21/798 HID: sensor-hub: Fix out-of-bounds write in sensor_hub_get_feature
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xingrui Li <[email protected]>
commit c92693f3ed099401d0383ef35ca1fe1e6ba033de upstream.
sensor_hub_get_feature() clamps its return value to the caller's buffer size, but the copy loop still copies field->report_size / 8 bytes for each report value. A malicious HID descriptor can advertise a large feature field size while an IIO caller supplies a small stack buffer, such as a single s32, causing an out-of-bounds write.
HID core stores parsed report values in __s32 slots and clamps extracted values to 32 bits. Reject feature fields that require more than one slot per value, guard the total byte count calculation, and clamp each per-value copy to the remaining caller buffer.
--- drivers/hid/hid-sensor-hub.c | 44 +++++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 18 deletions(-)
drivers/hid/hid-sensor-hub.c +26 -18
@@ -240,12 +240,17 @@ int sensor_hub_get_feature(struct hid_se u32 field_index, int buffer_size, void *buffer) { struct hid_report *report; +struct hid_field *field;struct sensor_hub_data *data =hid_get_drvdata (hsdev->hdev); -int report_size; +size_t field_size; +size_t report_size; +size_t copied =0 ; +size_t to_copy;int ret =0 ; -u8 *val_ptr; -int buffer_index =0 ; -int i; +unsigned int i; + +if (!buffer || buffer_size <=0 ) +return -EINVAL ;memset (buffer,0 , buffer_size);
@@ -259,26 +264,29 @@ int sensor_hub_get_feature(struct hid_sehid_hw_request (hsdev->hdev, report,HID_REQ_GET_REPORT );hid_hw_wait (hsdev->hdev); + field = report->field[field_index]; +/* calculate number of bytes required to read this field */ - report_size =DIV_ROUND_UP (report->field[field_index]->report_size, -8 ) * - report->field[field_index]->report_count; -if (!report_size) { + field_size =DIV_ROUND_UP (field->report_size,8 ); +/* HID core stores each parsed report value in a __s32 slot. */ +if (!field_size || field_size >sizeof (field->value[0 ])) { + ret = -EINVAL ; + goto done_proc; + } +if (field->report_count >SIZE_MAX / field_size) { ret = -EINVAL ; goto done_proc; } - ret =min (report_size, buffer_size); - val_ptr = (u8 *)report->field[field_index]->value; -for (i =0 ; i < report->field[field_index]->report_count; ++i) { -if (buffer_index >= ret) -break ; - -memcpy (&((u8 *)buffer)[buffer_index], val_ptr, - report->field[field_index]->report_size /8 ); - val_ptr +=sizeof (__s32); - buffer_index += (report->field[field_index]->report_size /8 ); + report_size = field_size * field->report_count; + report_size =min_t (size_t, report_size, buffer_size); + +for (i =0 ; i < field->report_count && copied < report_size; ++i) { + to_copy =min (field_size, report_size - copied); +memcpy (&((u8 *)buffer)[copied], &field->value[i], to_copy); + copied += to_copy; } + ret = copied; done_proc:mutex_unlock (&data->mutex);
Greg Kroah-Hartman
maintainerPATCH 22/798 lib/ucs2_string.c: fix out-of-bounds read in ucs2_strnlen()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vincent Mailhol <[email protected]>
commit cec0d03fe785380540dc1b4d07c80f67ae2ffc78 upstream.
Patch series "lib/ucs2_string.c: fix out-of-bounds read in ucs2_strnlen()", v2.
This series fixes an off-by-one out-of-bounds read in ucs2_strnlen().
The first patch is the real fix, the second patch comes as a bonus and fixes the code indentation.
This patch (of 2):
ucs2_strnlen() checks the current character before checking whether the caller-provided maximum length has been reached. If the input is not NUL-terminated within that bound, the loop can read one ucs2_char_t past the limit.
Test the length before dereferencing to prevent an off-by-one out-of-bounds read.
--- lib/ucs2_string.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
lib/ucs2_string.c +1 -1
@@ -8,7 +8,7 @@ ucs2_strnlen(const ucs2_char_t *s, size_ {unsigned long length =0 ; -while (*s++ !=0 && length < maxlength) +while (length < maxlength && *s++ !=0 ) length++;return length; }
Greg Kroah-Hartman
maintainerPATCH 23/798 media: cec: stm32: prevent out-of-bounds write on RX overflow
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Weigang He <[email protected]>
commit fb9dda38d4b9e90db07ed9a0ee2d35bf85494035 upstream.
stm32_rx_done() appends each received CEC byte to rx_msg.msg[] using rx_msg.len as the write index, incrementing it on every RXBR (receive-byte-ready) interrupt without checking it against the buffer size:
cec->rx_msg.msg[cec->rx_msg.len++] = val & 0xFF;
rx_msg.msg[] is a fixed CEC_MAX_MSG_SIZE (16) byte array in struct cec_msg, and rx_msg.len is only reset on RXACKE/RXOVR or after a completed message (RXEND). The number of bytes received before RXEND is decided by the remote CEC device (it sets EOM), not by the driver. A peer that keeps sending bytes without ending the message drives RXBR repeatedly, pushing rx_msg.len past 16 and writing peer-controlled bytes out of bounds into the surrounding memory. This is reachable in normal operation once the driver has probed and receiving is enabled, from the IRQ thread, without any local privilege.
The length check in the CEC core runs on the consumer side, after the byte has been stored, so it does not prevent the overflow. Bound the index in the driver before the store, as the other platform CEC drivers already do (e.g. tegra_cec), dropping the excess bytes of an overlong frame.
Found by static analysis tool CodeQL.
--- drivers/media/cec/platform/stm32/stm32-cec.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/media/cec/platform/stm32/stm32-cec.c +2 -1
@@ -133,7 +133,8 @@ static void stm32_rx_done(struct stm32_cu32 val;regmap_read (cec->regmap,CEC_RXDR , &val); - cec->rx_msg.msg[cec->rx_msg.len++] = val &0xFF ; +if (cec->rx_msg.len <CEC_MAX_MSG_SIZE ) + cec->rx_msg.msg[cec->rx_msg.len++] = val &0xFF ; }if (cec->irq_status &RXEND ) {
Greg Kroah-Hartman
maintainerPATCH 24/798 media: vicodec: fix out-of-bounds write in FWHT encoder
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junrui Luo <[email protected]>
commit cf4500ebf6fb57bf4ab83c3dd349a40257dbe2a9 upstream.
vidioc_s_fmt_vid_out() sizes the encoder CAPTURE buffer from the compressed descriptor pixfmt_fwht, whose sizeimage_mult is 3:coded_w * coded_h * 3 + sizeof(struct fwht_cframe_hdr). fwht_encode_frame() encodes one plane per component, and an incompressible plane takes the FWHT_FRAME_UNENCODED path in encode_plane(), copying the plane verbatim.
For a 4-component pixel format all four planes are full resolution (width_div == height_div == 1), so a frame that forces every plane through the unencoded fallback writessizeof(struct fwht_cframe_hdr) + 4 * coded_w * coded_h bytes, overrunning the plane by coded_w * coded_h, which can result in corruption of adjacent kernel heap memory.
Bump pixfmt_fwht.sizeimage_mult from 3 to 4, matching the largest components_num among the supported raw formats, so the capture buffer is always large enough for the unencoded fallback.
--- drivers/media/test-drivers/vicodec/vicodec-core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/media/test-drivers/vicodec/vicodec-core.c +2 -2
@@ -61,11 +61,11 @@ struct pixfmt_info { };static const struct v4l2_fwht_pixfmt_info pixfmt_fwht = { -V4L2_PIX_FMT_FWHT ,0 ,3 ,1 ,1 ,1 ,1 ,1 ,0 ,1 +V4L2_PIX_FMT_FWHT ,0 ,4 ,1 ,1 ,1 ,1 ,1 ,0 ,1 };static const struct v4l2_fwht_pixfmt_info pixfmt_stateless_fwht = { -V4L2_PIX_FMT_FWHT_STATELESS ,0 ,3 ,1 ,1 ,1 ,1 ,1 ,0 ,1 +V4L2_PIX_FMT_FWHT_STATELESS ,0 ,4 ,1 ,1 ,1 ,1 ,1 ,0 ,1 };static void vicodec_dev_release (struct device *dev)
Greg Kroah-Hartman
maintainerPATCH 25/798 nilfs2: fix slab-out-of-bounds in nilfs_direct_propagate after truncation
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ryusuke Konishi <[email protected]>
commit 45662dedb8f272ef7f16e69f13424c4bd0399240 upstream.
Shuangpeng Bai reported that KASAN detected a slab-out-of-bounds error in nilfs_direct_propagate() during testing.
Analysis revealed that after truncating a file, a node block immediately below the B-tree root was not deleted. Instead, it remained in the B-tree node cache in a dirty state. The log writer subsequently detected this block and incorrectly invoked nilfs_direct_propagate() on it, which is designed to handle only data blocks in direct mapping.
B-tree nodes in the cache are managed by virtual block numbers, and their logical keys typically exceed the range expected by direct mapping. Consequently, processing such a node as a direct mapping entry triggers a slab-out-of-bounds access.
The root cause is that when a B-tree mapping collapses into a direct mapping during truncation, an intermediate node block pointed to by the root node is left behind as garbage instead of being explicitly deleted.
This resolves the issue by adding a nilfs_btree_discard() operation to delete the remaining intermediate node block during the conversion. A 'deform' flag is added to the bop_delete interface to explicitly signal that the deletion is part of a mapping transformation. This allows the B-tree mapping implementation to perform the necessary cleanup and discarding of the residual node structure that would be otherwise be left orphaned after the transition.
--- fs/nilfs2/bmap.c | 2 +- fs/nilfs2/bmap.h | 2 +- fs/nilfs2/btree.c | 39 ++++++++++++++++++++++++++++++++------- fs/nilfs2/direct.c | 4 ++-- 4 files changed, 36 insertions(+), 11 deletions(-)
fs/nilfs2/bmap.c +1 -1
@@ -181,7 +181,7 @@ static int nilfs_bmap_do_delete(struct nreturn ret; } -return bmap->b_ops->bop_delete (bmap, key); +return bmap->b_ops->bop_delete (bmap, key, false); }/**
fs/nilfs2/bmap.h +1 -1
@@ -50,7 +50,7 @@ struct nilfs_bmap_operations {int (*bop_lookup_contig)(const struct nilfs_bmap *,__u64 ,__u64 *,unsigned int );int (*bop_insert)(struct nilfs_bmap *,__u64 ,__u64 ); -int (*bop_delete)(struct nilfs_bmap *,__u64 ); +int (*bop_delete)(struct nilfs_bmap *bmap,__u64 key,bool deform);void (*bop_clear)(struct nilfs_bmap *);int (*bop_propagate)(struct nilfs_bmap *,struct buffer_head *);
fs/nilfs2/btree.c +32 -7
@@ -1427,6 +1427,28 @@ static void nilfs_btree_shrink(struct ni path[level].bp_bh =NULL ; } +/** +* nilfs_btree_discard - discard the last node for the mapping transformation +* @btree: bmap struct of btree +* @path: array of nilfs_btree_path struct +* @level: level of the B-tree node being operated on +* @keyp: argument for passing a key (unused) +* @ptrp: argument for passing a pointer (unused) +*/ +static void nilfs_btree_discard (struct nilfs_bmap *btree, +struct nilfs_btree_path *path,int level, +__u64 *keyp,__u64 *ptrp) +{ +struct nilfs_btree_node *root =nilfs_btree_get_root (btree); + +nilfs_btree_node_delete (root,0 ,NULL ,NULL , +NILFS_BTREE_ROOT_NCHILDREN_MAX ); +nilfs_btree_node_set_level (root, level); + +nilfs_btnode_delete (path[level].bp_bh); + path[level].bp_bh =NULL ; +} +static void nilfs_btree_nop (struct nilfs_bmap *btree,struct nilfs_btree_path *path,int level,__u64 *keyp,__u64 *ptrp)
@@ -1437,7 +1459,7 @@ static int nilfs_btree_prepare_delete(ststruct nilfs_btree_path *path, int *levelp, struct nilfs_bmap_stats *stats, - struct inode *dat) + struct inode *dat, bool deform) { struct buffer_head *bh;struct nilfs_btree_node *node, *parent, *sib;
@@ -1524,15 +1546,17 @@ static int nilfs_btree_prepare_delete(stif (nilfs_btree_node_get_nchildren (node) -1 <=NILFS_BTREE_ROOT_NCHILDREN_MAX ) { path[level].bp_op = nilfs_btree_shrink; - stats->bs_nblocks +=2 ; - level++; - path[level].bp_op = nilfs_btree_nop; - goto shrink_root_child; + }else if (deform) { + path[level].bp_op = nilfs_btree_discard; }else { path[level].bp_op = nilfs_btree_do_delete; stats->bs_nblocks++; goto out; } + stats->bs_nblocks +=2 ; + level++; + path[level].bp_op = nilfs_btree_nop; + goto shrink_root_child; } }
@@ -1583,7 +1607,7 @@ static void nilfs_btree_commit_delete(stnilfs_bmap_set_dirty (btree); } -static int nilfs_btree_delete (struct nilfs_bmap *btree,__u64 key) +static int nilfs_btree_delete (struct nilfs_bmap *btree,__u64 key,bool deform) {struct nilfs_btree_path *path;
@@ -1603,7 +1627,8 @@ static int nilfs_btree_delete(struct nil dat =NILFS_BMAP_USE_VBN (btree) ?nilfs_bmap_get_dat (btree) :NULL ; - ret =nilfs_btree_prepare_delete (btree, path, &level, &stats, dat); + ret =nilfs_btree_prepare_delete (btree, path, &level, &stats, dat, + deform);if (ret <0 ) goto out;nilfs_btree_commit_delete (btree, path, level, dat);
fs/nilfs2/direct.c +2 -2
@@ -144,7 +144,7 @@ static int nilfs_direct_insert(struct nireturn ret; } -static int nilfs_direct_delete (struct nilfs_bmap *bmap,__u64 key) +static int nilfs_direct_delete (struct nilfs_bmap *bmap,__u64 key,bool deform) {union nilfs_bmap_ptr_req req;struct inode *dat;
@@ -234,7 +234,7 @@ int nilfs_direct_delete_and_convert(stru/* no need to allocate any resource for conversion */ /* delete */ - ret = bmap->b_ops->bop_delete (bmap, key); + ret = bmap->b_ops->bop_delete (bmap, key, true);if (ret <0 )return ret;
Greg Kroah-Hartman
maintainerPATCH 26/798 of: fix out-of-bounds read in of_alias_scan() stem parser
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Abdurrahman Hussain <[email protected]>
commit 5bb01c657ff9fc807c2c592ca18af34c4fc3bc6f upstream.
The stem parser tests isdigit(*(end - 1)) before checking end > start and so reads one byte before the property name when the name is empty or all digits. Check the bound first.
--- drivers/of/base.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/of/base.c +1 -1
@@ -2014,7 +2014,7 @@ void of_alias_scan(void * (*dt_alloc)(u6/* walk the alias backwards to extract the id and work out * the 'stem' string */ -while (isdigit (*(end-1 )) && end > start) +while (end > start &&isdigit (*(end -1 ))) end--; len = end - start;
Greg Kroah-Hartman
maintainerPATCH 27/798 ubifs: fix out-of-bounds read in signature length check
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ibrahim Hashimov <[email protected]>
commit 95d27c1708bb6e8823c8e7c623f9abc2a91bf4bf upstream.
ubifs_sb_verify_signature() bounds the on-disk ubifs_sig_node->len field before handing the signature payload to verify_pkcs7_signature(), but the check has the wrong sign:
if (le32_to_cpu(signode->len) > snod->len + sizeof(struct ubifs_sig_node))
The signature bytes start sizeof(struct ubifs_sig_node) (UBIFS_SIG_NODE_SZ, 64 bytes) into the node, so the payload is at most
snod->len - sizeof(struct ubifs_sig_node)
bytes long. Adding the header size instead of subtracting it accepts a declared length up to 2 * UBIFS_SIG_NODE_SZ larger than the node actually holds -- past the end of c->sbuf, which is vmalloc(c->leb_size). verify_pkcs7_signature() -> pkcs7_parse_message() -> asn1_ber_decoder() is then handed that inflated length and reads beyond the allocation while walking the DER headers. The node length comes straight from the mounted image, so a crafted signed UBIFS image reaches this via ubifs_read_superblock() before the signature is cryptographically checked.
snod->len is guaranteed to be >= UBIFS_SIG_NODE_SZ by the node scanner (c->ranges[UBIFS_SIG_NODE].min_len == UBIFS_SIG_NODE_SZ), so the corrected subtraction cannot underflow. Legitimately signed images are unaffected: a correct superblock never declares a signature longer than the node it is embedded in.
--- fs/ubifs/auth.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/ubifs/auth.c +1 -1
@@ -219,7 +219,7 @@ int ubifs_sb_verify_signature(struct ubi signode = snod->node; -if (le32_to_cpu (signode->len) > snod->len +sizeof (struct ubifs_sig_node )) { +if (le32_to_cpu (signode->len) > snod->len -sizeof (struct ubifs_sig_node )) {ubifs_err (c,"invalid signature len %d" ,le32_to_cpu (signode->len)); err = -EINVAL ; goto out_destroy;
Greg Kroah-Hartman
maintainerPATCH 28/798 NFSD: Encode only the status in NFS-ACL v2 GETACL error replies
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chuck Lever <[email protected]>
commit ed4edddad19babf76b56882ad9600f5646b167a0 upstream.
The NFSv2 ACL GETACL reply is a union that carries file attributes and ACL data only when the status is NFS_OK. All error cases are void results. However, currently the NFSv2 ACL GETACL result encoder decides whether to append the "OK" body by testing only whether the file handle resolved to a positive dentry, not the actual reply status.
A GETACL request that resolves its file handle but then fails for another reason (an unsupported mask value, a getattr failure, or an ACL retrieval error) therefore appends file attributes and ACL data after the error status on the wire. Worse, when the mask is rejected, fh_getattr() hasn't been called at all, so those attributes are serialized from a zero-filled kstat and are junk.
The logic before the xdr_stream conversion used the reply status. Revert to that approach (but keep the xdr_stream conversion in place).
--- fs/nfsd/nfs2acl.c | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-)
fs/nfsd/nfs2acl.c +15 -16
@@ -246,22 +246,21 @@ nfsaclsvc_encode_getaclres(struct svc_rqif (!svcxdr_encode_stat (xdr, resp->status))return false; - -if (dentry ==NULL ||d_really_is_negative (dentry)) -return true; - inode =d_inode (dentry); - -if (!svcxdr_encode_fattr (rqstp, xdr, &resp->fh, &resp->stat)) -return false; -if (xdr_stream_encode_u32 (xdr, resp->mask) <0 ) -return false; - -if (!nfs_stream_encode_acl (xdr, inode, resp->acl_access, - resp->mask &NFS_ACL ,0 )) -return false; -if (!nfs_stream_encode_acl (xdr, inode, resp->acl_default, - resp->mask &NFS_DFACL ,NFS_ACL_DEFAULT )) -return false; +switch (resp->status) { +case nfs_ok: + inode =d_inode (dentry); +if (!svcxdr_encode_fattr (rqstp, xdr, &resp->fh, &resp->stat)) +return false; +if (xdr_stream_encode_u32 (xdr, resp->mask) <0 ) +return false; +if (!nfs_stream_encode_acl (xdr, inode, resp->acl_access, + resp->mask &NFS_ACL ,0 )) +return false; +if (!nfs_stream_encode_acl (xdr, inode, resp->acl_default, + resp->mask &NFS_DFACL ,NFS_ACL_DEFAULT )) +return false; +break ; + }return true; }
Greg Kroah-Hartman
maintainerPATCH 29/798 NFSD: Fix off-by-one in DRC bucket pruning limit
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chuck Lever <[email protected]>
commit d0728723c80dcb3432effd67c7e919b596004b1d upstream.
nfsd_prune_bucket_locked() evicts an entry before checking the freed count against @max. The check uses "++freed > max", which does not break until freed exceeds max, resulting in max + 1 evictions. Use ">=" so the limit stated in the function comment is honored.
--- fs/nfsd/nfscache.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/nfsd/nfscache.c +1 -1
@@ -283,7 +283,7 @@ nfsd_prune_bucket_locked(struct nfsd_netnfsd_cacherep_unlink_locked (nn, b, rp);list_add (&rp->c_lru, dispose); -if (max && ++freed > max) +if (max && ++freed >= max)break ; } }
Greg Kroah-Hartman
maintainerPATCH 30/798 NFSD: restart ssc_expire_umount walk after dropping nfsd_ssc_lock
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Bommarito <[email protected]>
commit 036c1b182f4da65363e79ec0ac276edc6b7296e5 upstream.
nfsd4_ssc_expire_umount() walks nn->nfsd_ssc_mount_list with list_for_each_entry_safe(ni, tmp, ...). For each expired entry it sets nsui_busy = true, drops nfsd_ssc_lock to run mntput() on the source vfsmount, then reacquires the lock to list_del + kfree the entry and continue iterating via the macro's saved tmp pointer.
The nsui_busy flag protects the current ni from concurrent nfsd4_ssc_setup_dul() finders during the lock-drop window, but it does not pin tmp. Another nfsd RPC thread that fails its source- server mount and reaches nfsd4_ssc_cancel_dul() will, during that same window, take nfsd_ssc_lock, list_del + kfree its own ssc_umount item, and release the lock. If that item is the saved tmp of the expire walk, the next iteration dereferences a freed nfsd4_ssc_umount_item.
Restart the walk from the head after the mntput() unlock window so no saved next pointer survives the lock-drop. The list is bounded by the number of active inter-server source mounts (typically small) and the expire delayed-work runs periodically rather than per-IO, so the restart is cheap.
--- fs/nfsd/nfs4state.c | 44 +++++++++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 19 deletions(-)
fs/nfsd/nfs4state.c +25 -19
@@ -6014,30 +6014,36 @@ static void nfsd4_ssc_shutdown_umount(ststatic void nfsd4_ssc_expire_umount (struct nfsd_net *nn) {bool do_wakeup = false; -struct nfsd4_ssc_umount_item *ni =NULL ; -struct nfsd4_ssc_umount_item *tmp; +struct nfsd4_ssc_umount_item *ni; +restart:spin_lock (&nn->nfsd_ssc_lock); -list_for_each_entry_safe (ni, tmp, &nn->nfsd_ssc_mount_list, nsui_list) { -if (time_after (jiffies, ni->nsui_expire)) { -if (refcount_read (&ni->nsui_refcnt) >1 ) -continue ; +list_for_each_entry (ni, &nn->nfsd_ssc_mount_list, nsui_list) { +if (!time_after (jiffies, ni->nsui_expire)) +break ; +if (refcount_read (&ni->nsui_refcnt) >1 ) +continue ; -/* mark being unmount */ - ni->nsui_busy = true; -spin_unlock (&nn->nfsd_ssc_lock); -mntput (ni->nsui_vfsmount); -spin_lock (&nn->nfsd_ssc_lock); +/* Prevent concurrent setup during unmount */ + ni->nsui_busy = true; +spin_unlock (&nn->nfsd_ssc_lock); +mntput (ni->nsui_vfsmount); +spin_lock (&nn->nfsd_ssc_lock); -/* waiters need to start from begin of list */ -list_del (&ni->nsui_list); -kfree (ni); +/* Force concurrent scanners to restart */ +list_del (&ni->nsui_list); +kfree (ni); -/* wakeup ssc_connect waiters */ - do_wakeup = true; -continue ; - } -break ; +/* wakeup ssc_connect waiters */ + do_wakeup = true; +/* +* Concurrent nfsd4_ssc_cancel_dul() can free any item +* on the list under nfsd_ssc_lock while mntput() runs +* above. Restart from the head; the list is short and +* the expire worker is periodic, so this is cheap. +*/ +spin_unlock (&nn->nfsd_ssc_lock); + goto restart; }if (do_wakeup)wake_up_all (&nn->nfsd_ssc_waitq);
Greg Kroah-Hartman
maintainerPATCH 31/798 NFSD: remove flawed WARN_ON_ONCE from nfsd_mode_check
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mike Snitzer <[email protected]>
commit aa0cf48a448c5a9fe1a1e880899ecd589ce39e6e upstream.
The header for commit e75b23f9e323 ("nfsd: check d_can_lookup in fh_verify of directories") details the assumption that justified adding the WARN_ON_ONCE to nfsd_mode_check(), that assumption is invalid (in the case of NFS reexport).
When NFSD exports an NFS filesystem it is very possible for nfsd_mode_check() to encounter a @dentry that doesn't have i_op->lookup (see nfs_fhget()'s NFS_ATTR_FATTR_MOUNTPOINT and NFS_ATTR_FATTR_V4_REFERRAL handling, and d_flags_for_inode()).
So remove nfsd_mode_check()'s WARN_ON_ONCE(). The nfserr_notdir return on that branch must stay. It guards the subsequent lookup_one_unlocked() -> __lookup_slow() path, which calls inode->i_op->lookup() with no NULL check, so returning nfserr_notdir is what keeps a client LOOKUP into such a @dentry from dereferencing a NULL method pointer.
--- fs/nfsd/nfsfh.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
fs/nfsd/nfsfh.c +1 -3
@@ -69,10 +69,8 @@ nfsd_mode_check(struct svc_rqst *rqstp,if (requested ==0 )/* the caller doesn't care */ return nfs_ok;if (mode == requested) { -if (mode ==S_IFDIR && !d_can_lookup (dentry)) { -WARN_ON_ONCE (1 ); +if (mode ==S_IFDIR && !d_can_lookup (dentry))return nfserr_notdir; - }return nfs_ok; }/*
Greg Kroah-Hartman
maintainerPATCH 32/798 nfsd: Reset write verifier when async COPY writeback fails
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chuck Lever <[email protected]>
commit f5cb2276954cb80987a93ef9f9dfbfdbfc0f10b9 upstream.
Async COPY captures nn->writeverf at request time and reports it to the client via CB_OFFLOAD after the worker kthread completes. When the post-copy vfs_fsync_range() or filemap_check_wb_err() in _nfsd_copy_file_range() reports an error, the worker correctly leaves NFSD4_COPY_F_COMMITTED clear so that CB_OFFLOAD encodes wr_stable_how as NFS_UNSTABLE, but the server's write verifier is not rotated.
A client that receives NFS_UNSTABLE in CB_OFFLOAD follows up with COMMIT to make the copied data durable. With the verifier unchanged, COMMIT returns the same value the client just received via CB_OFFLOAD, and the client concludes the copy is durable -- silently dropping the data whose writeback in fact failed. This violates the UNSTABLE+COMMIT durability contract (RFC 7862 section 15.1, RFC 8881 section 18.32) and matches the bug just fixed in nfsd_vfs_write() and nfsd_commit().
Rotate nn->writeverf at the writeback-failure site. The async COPY worker has no svc_rqst, so commit_reset_write_verifier() is not available here; calling nfsd_reset_write_verifier() directly mirrors the trace-less reset already used by nfsd_file_check_write_error() for the same purpose. Filter out -EAGAIN and -ESTALE, matching commit_reset_write_verifier(), since neither indicates a durable-storage failure.
--- fs/nfsd/nfs4proc.c | 2 ++ 1 file changed, 2 insertions(+)
fs/nfsd/nfs4proc.c +2 -0
@@ -1628,6 +1628,8 @@ static ssize_t _nfsd_copy_file_range(str status =filemap_check_wb_err (dst->f_mapping, since);if (!status)set_bit (NFSD4_COPY_F_COMMITTED , ©->cp_flags); +else if (status != -EAGAIN && status != -ESTALE ) +nfsd_reset_write_verifier (copy->cp_nn); }return bytes_copied; }
Greg Kroah-Hartman
maintainerPATCH 33/798 nfsd: return NFS4ERR_NOTSUPP for unsupported netloc4 types
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeff Layton <[email protected]>
commit 45b06a75086f331f52cbb81223a59421d43f8809 upstream.
nfsd4_decode_nl4_server() handled only NL4_NETADDR and returned nfserr_bad_xdr for NL4_NAME and NL4_URL. Those forms are well-formed XDR, so BADXDR is misleading -- the request is unsupported, not malformed.
Decode and discard the utf8str_cis for NL4_NAME and NL4_URL to keep the stream consistent, and return nfserr_notsupp. nfsd4_proc_compound() honors a decode-time op->status, so the op fails without executing.
--- fs/nfsd/nfs4xdr.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
fs/nfsd/nfs4xdr.c +13 -0
@@ -1918,6 +1918,7 @@ static __be32 nfsd4_decode_nl4_server(st {struct nfs42_netaddr *naddr;__be32 *p; +u32 str_len;if (xdr_stream_decode_u32 (argp->xdr, &ns->nl4_type) <0 )return nfserr_bad_xdr;
@@ -1947,6 +1948,18 @@ static __be32 nfsd4_decode_nl4_server(streturn nfserr_bad_xdr;memcpy (naddr->addr, p, naddr->addr_len);break ; +case NL4_NAME : +case NL4_URL : +/* +* Well-formed XDR, but only NL4_NETADDR is supported. Consume +* the utf8str_cis to keep the stream aligned, then return +* NFS4ERR_NOTSUPP rather than the misleading NFS4ERR_BADXDR. +*/ +if (xdr_stream_decode_u32 (argp->xdr, &str_len) <0 ) +return nfserr_bad_xdr; +if (!xdr_inline_decode (argp->xdr, str_len)) +return nfserr_bad_xdr; +return nfserr_notsupp;default :return nfserr_bad_xdr; }
Greg Kroah-Hartman
maintainerPATCH 34/798 nfsd: sample writeback error cursor before async COPY loop
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chuck Lever <[email protected]>
commit 20a67a7d18221af736f124770c2c5e859b479046 upstream.
_nfsd_copy_file_range() samples dst->f_wb_err into "since" after the copy loop, then uses it to detect writeback errors via filemap_check_wb_err() once vfs_fsync_range() returns. Because the nfsd_file cache reuses a single struct file across requests targeting the same inode, a concurrent COMMIT or stable WRITE on dst advances dst->f_wb_err to the current mapping->wb_err via file_check_and_advance_wb_err() during its own vfs_fsync_range(). If that advancement lands between the writeback error appearing in mapping->wb_err and the COPY worker sampling "since", the worker captures the already-advanced cursor, errseq_check() sees cur == since and returns zero, and NFSD4_COPY_F_COMMITTED is set even though writeback failed. CB_OFFLOAD then encodes wr_stable_how = FILE_SYNC4, the client treats the copied data as durable, and the failure becomes silent data loss.
Sample since once at the start of the function. The cursor then reflects state in effect before this COPY issues any writes, and filemap_check_wb_err() detects any error that occurs during the copy regardless of which thread first observes it. This matches the pattern used by nfsd_vfs_write() and nfsd4_clone_file_range().
--- fs/nfsd/nfs4proc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/nfsd/nfs4proc.c +1 -1
@@ -1607,6 +1607,7 @@ static ssize_t _nfsd_copy_file_range(str/* See RFC 7862 p.67: */ if (bytes_total ==0 ) bytes_total =ULLONG_MAX ; + since =READ_ONCE (dst->f_wb_err); do { if (kthread_should_stop()) break;
@@ -1621,7 +1622,6 @@ static ssize_t _nfsd_copy_file_range(str }while (bytes_total >0 &&nfsd4_copy_is_async (copy));/* for a non-zero asynchronous copy do a commit of data */ if (nfsd4_copy_is_async (copy) && copy->cp_res.wr_bytes_written >0 ) { - since =READ_ONCE (dst->f_wb_err); end = copy->cp_dst_pos + copy->cp_res.wr_bytes_written -1 ; status =vfs_fsync_range (dst, copy->cp_dst_pos, end,0 );if (!status)
Greg Kroah-Hartman
maintainerPATCH 35/798 nfsd: validate symlink target length in NFSv4 CREATE
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeff Layton <[email protected]>
commit 041f57056e5fb9c80adc088269322d2c61074406 upstream.
nfsd4_decode_create() accepts an unbounded cr_datalen from the wire for NF4LNK symlink targets, allowing a client to force a kmalloc of up to the maximum RPC payload size (several MiB) per COMPOUND op that persists until compound teardown. The VFS rejects oversized targets with ENAMETOOLONG, but the allocation has already occurred.
Reject cr_datalen == 0 early with nfserr_inval and cr_datalen greater than NFS4_MAXPATHLEN (PATH_MAX) with nfserr_nametoolong to bound the allocation.
--- fs/nfsd/nfs4xdr.c | 4 ++++ 1 file changed, 4 insertions(+)
fs/nfsd/nfs4xdr.c +4 -0
@@ -801,6 +801,10 @@ nfsd4_decode_create(struct nfsd4_compouncase NF4LNK :if (xdr_stream_decode_u32 (argp->xdr, &create->cr_datalen) <0 )return nfserr_bad_xdr; +if (create->cr_datalen ==0 ) +return nfserr_inval; +if (create->cr_datalen >NFS4_MAXPATHLEN ) +return nfserr_nametoolong; p =xdr_inline_decode (argp->xdr, create->cr_datalen);if (!p)return nfserr_bad_xdr;
Greg Kroah-Hartman
maintainerPATCH 36/798 nfsd: add fh_want_write() for early-verified SETATTR in nfsd_proc_setattr()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeff Layton <[email protected]>
commit 4e475be769aa9f7a2c1ce55a2b8592cfccacddcc upstream.
The BOTH_TIME_SET branch calls fh_verify() early so setattr_prepare() can inspect the dentry. This causes nfsd_setattr() to skip fh_want_write(), so notify_change() runs without a mount write reference.
Add the missing fh_want_write() call after the early fh_verify().
--- fs/nfsd/nfsproc.c | 7 +++++++ 1 file changed, 7 insertions(+)
fs/nfsd/nfsproc.c +7 -0
@@ -55,6 +55,7 @@ nfsd_proc_setattr(struct svc_rqst *rqstp .na_iattr = iap, };struct svc_fh *fhp; +int hosterr; dprintk("nfsd: SETATTR %s, valid=%x, size=%ld\n", SVCFH_fmt(&argp->fh),
@@ -90,6 +91,12 @@ nfsd_proc_setattr(struct svc_rqst *rqstpif (resp->status != nfs_ok) goto out; + hosterr =fh_want_write (fhp); +if (hosterr) { + resp->status =nfserrno (hosterr); + goto out; + } +if (delta <0 ) delta = -delta; if (delta < MAX_TOUCH_TIME_ERROR &&
Greg Kroah-Hartman
maintainerPATCH 37/798 nfsd: add filehandle match check to nfsd4_delegreturn()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeff Layton <[email protected]>
commit 04cce9d79f2b1a114f7128e08bf60a473e10f1ec upstream.
nfsd4_delegreturn() is the only stateful NFSv4 operation that does not call nfs4_check_fh() to verify the delegation's file matches cstate->current_fh. A client can DELEGRETURN with a mismatched filehandle, destroying the correct delegation but waking the wrong inode's waiters.
Add the missing nfs4_check_fh() call after the generation check.
--- fs/nfsd/nfs4state.c | 4 ++++ 1 file changed, 4 insertions(+)
fs/nfsd/nfs4state.c +4 -0
@@ -7128,6 +7128,10 @@ nfsd4_delegreturn(struct svc_rqst *rqstpif (status) goto put_stateid; + status =nfs4_check_fh (&cstate->current_fh, &dp->dl_stid); +if (status) + goto put_stateid; +trace_nfsd_deleg_return (stateid);wake_up_var (d_inode (cstate->current_fh.fh_dentry));destroy_delegation (dp);
Greg Kroah-Hartman
maintainerPATCH 38/798 nfsd: block non-SAVEFH ops after FOREIGN PUTFH to prevent NULL deref
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeff Layton <[email protected]>
commit c59738a00aa51b16adc1b5ceb7c80877168efb4d upstream.
When CONFIG_NFSD_V4_2_INTER_SSC is enabled, nfsd4_putfh() can return success with fh_dentry and fh_export both NULL if fh_verify() returns nfserr_stale and putfh->no_verify is true. The NFSD4_FH_FOREIGN flag is set, but the compound dispatch loop only uses this flag to bypass the nfserr_nofilehandle check -- it does not prevent subsequent ops from running with a NULL fh_dentry.
A remote client can exploit this by crafting a COMPOUND that includes an inter-SSC COPY (which causes check_if_stalefh_allowed() to set no_verify=true on the saved PUTFH) with an additional op inserted between the source PUTFH and SAVEFH. For example, SETATTR calls fh_want_write() which dereferences fh_export->ex_path.mnt without calling fh_verify() first, causing a NULL pointer dereference in the nfsd kthread.
Fix this by gating the dispatch loop: when NFSD4_FH_FOREIGN is set and fh_dentry is NULL, only OP_SAVEFH (needed for the inter-SSC flow) and ops with ALLOWED_WITHOUT_FH (which don't need a resolved filehandle) may proceed. All other ops receive nfserr_stale, per RFC 7862 Section 15.2.3 which specifies that foreign filehandle validation is deferred to the consuming operation and NFS4ERR_STALE returned at that point.
--- fs/nfsd/nfs4proc.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-)
fs/nfsd/nfs4proc.c +16 -3
@@ -2642,9 +2642,22 @@ nfsd4_proc_compound(struct svc_rqst *rqs op->status =nfsd4_open_omfg (rqstp, cstate, op); goto encode_op; } -if (!current_fh->fh_dentry && - !HAS_FH_FLAG (current_fh,NFSD4_FH_FOREIGN )) { -if (!(op->opdesc->op_flags &ALLOWED_WITHOUT_FH )) { +if (!current_fh->fh_dentry) { +if (HAS_FH_FLAG (current_fh,NFSD4_FH_FOREIGN )) { +/* +* FOREIGN fh from inter-SSC PUTFH: only +* SAVEFH may proceed with a NULL fh_dentry. +* Per RFC 7862 S15.2.3, validation of a +* foreign fh is deferred to the operation +* that consumes it, and NFS4ERR_STALE is +* returned at that point. +*/ +if (op->opnum !=OP_SAVEFH && + !(op->opdesc->op_flags &ALLOWED_WITHOUT_FH )) { + op->status = nfserr_stale; + goto encode_op; + } + }else if (!(op->opdesc->op_flags &ALLOWED_WITHOUT_FH )) { op->status = nfserr_nofilehandle; goto encode_op; }
Greg Kroah-Hartman
maintainerPATCH 39/798 nfsd: check client ownership when cancelling a copy-notify stateid
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeff Layton <[email protected]>
commit 6bdbfab96e0cf25e5f57dac5c09dc1749751a4bf upstream.
On the OFFLOAD_CANCEL path (clp != NULL), manage_cpntf_state() freed the target cpntf state without checking ownership. The lookup key st->si_opaque.so_id is allocated cyclically (guessable) and the embedded clientid is the fixed per-net nn->s2s_cp_cl_id, so any authenticated NFSv4.2 client could cancel and free another client's copy-notify stateid.
Compare the creating clientid recorded in state->cp_p_clid against the requesting client's cl_clientid and return nfserr_bad_stateid on a mismatch instead of freeing the entry.
--- fs/nfsd/nfs4state.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)
fs/nfsd/nfs4state.c +12 -2
@@ -6621,10 +6621,20 @@ __be32 manage_cpntf_state(struct nfsd_ne state =NULL ; goto unlock; } -if (!clp) +if (!clp) {refcount_inc (&state->cp_stateid.cs_count); -else + }else if (memcmp (&clp->cl_clientid, &state->cp_p_clid, +sizeof (clientid_t))) { +/* +* OFFLOAD_CANCEL: only the creating client may cancel. +* so_id is guessable, so without this check any client +* could free another's cpntf state. +*/ + state =NULL ; + goto unlock; + }else {_free_cpntf_state_locked (nn, state); + } } unlock:spin_unlock (&nn->s2s_cp_lock);
Greg Kroah-Hartman
maintainerPATCH 40/798 nfsd: fix cpntf publish race in nfs4_init_cp_state
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Mason <[email protected]>
commit be3a5c1d857b0dcbc11796cea603ef25834f75b2 upstream.
nfs4_alloc_init_cpntf_state() published the new cpntf entry into the s2s_cp_stateids IDR (with cs_type set) in one s2s_cp_lock section, then took the lock again to list_add() it onto p_stid->sc_cp_list. In the gap the entry is reachable by so_id but cp_list is still {NULL,NULL} from kzalloc. A racing OFFLOAD_CANCEL (so_id is echoed to the client as cnr_stateid, so any NFSv4.2 client can drive it) reaches manage_cpntf_state() -> _free_cpntf_state_locked() and does list_del() on the zeroed list_head, oopsing the server.
Fold the cs_type assignment and the list_add() into the same critical section as idr_alloc_cyclic(), so a concurrent lookup either misses the entry or sees a fully linked cp_list. INIT_LIST_HEAD() the entry after allocation and switch _free_cpntf_state_locked() to list_del_init() so a stale unlink is a no-op. nfs4_init_copy_state() passes NULL p_stid and skips the list_add, preserving NFS4_COPY_STID semantics.
--- fs/nfsd/nfs4state.c | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-)
fs/nfsd/nfs4state.c +25 -10
@@ -984,7 +984,7 @@ out_free:* Create a unique stateid_t to represent each COPY. */ static int nfs4_init_cp_state (struct nfsd_net *nn,copy_stateid_t *stid, -unsigned char cs_type) +unsigned char cs_type,struct nfs4_stid *p_stid) {int new_id;
@@ -994,19 +994,34 @@ static int nfs4_init_cp_state(struct nfsidr_preload (GFP_KERNEL );spin_lock (&nn->s2s_cp_lock); new_id =idr_alloc_cyclic (&nn->s2s_cp_stateids, stid,0 ,0 ,GFP_NOWAIT ); - stid->cs_stid.si_opaque.so_id = new_id; - stid->cs_stid.si_generation =1 ; +if (new_id >=0 ) { + stid->cs_stid.si_opaque.so_id = new_id; + stid->cs_stid.si_generation =1 ; +/* +* Set cs_type and link onto sc_cp_list under the same lock +* that installed the IDR entry, so a concurrent +* manage_cpntf_state() sees either no entry or a fully +* linked cp_list. +*/ + stid->cs_type = cs_type; +if (p_stid) { +struct nfs4_cpntf_state *cps = + container_of(stid, struct nfs4_cpntf_state, + cp_stateid); + +list_add (&cps->cp_list, &p_stid->sc_cp_list); + } + }spin_unlock (&nn->s2s_cp_lock);idr_preload_end ();if (new_id <0 )return 0 ; - stid->cs_type = cs_type;return 1 ; }int nfs4_init_copy_state (struct nfsd_net *nn,struct nfsd4_copy *copy) { -return nfs4_init_cp_state (nn, ©->cp_stateid,NFS4_COPY_STID ); +return nfs4_init_cp_state (nn, ©->cp_stateid,NFS4_COPY_STID ,NULL ); } struct nfs4_cpntf_state *nfs4_alloc_init_cpntf_state(struct nfsd_net *nn,
@@ -1017,13 +1032,13 @@ struct nfs4_cpntf_state *nfs4_alloc_init cps =kzalloc (sizeof (struct nfs4_cpntf_state ),GFP_KERNEL );if (!cps)return NULL ; +/* So a stale list_del_init() before linking is a no-op. */ +INIT_LIST_HEAD (&cps->cp_list); cps->cpntf_time =ktime_get_boottime_seconds ();refcount_set (&cps->cp_stateid.cs_count,1 ); -if (!nfs4_init_cp_state (nn, &cps->cp_stateid,NFS4_COPYNOTIFY_STID )) +if (!nfs4_init_cp_state (nn, &cps->cp_stateid,NFS4_COPYNOTIFY_STID , + p_stid)) goto out_free; -spin_lock (&nn->s2s_cp_lock); -list_add (&cps->cp_list, &p_stid->sc_cp_list); -spin_unlock (&nn->s2s_cp_lock);return cps; out_free:kfree (cps);
@@ -6593,7 +6608,7 @@ _free_cpntf_state_locked(struct nfsd_netWARN_ON_ONCE (cps->cp_stateid.cs_type !=NFS4_COPYNOTIFY_STID );if (!refcount_dec_and_test (&cps->cp_stateid.cs_count))return ; -list_del (&cps->cp_list); +list_del_init (&cps->cp_list);idr_remove (&nn->s2s_cp_stateids, cps->cp_stateid.cs_stid.si_opaque.so_id);kfree (cps);
Greg Kroah-Hartman
maintainerPATCH 41/798 nfsd: fix version mismatch loops in nfsd_acl_init_request()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeff Layton <[email protected]>
commit 9bc761051dcd9a4a8b59e64b2b185172d13c716d upstream.
The loops that compute the supported version range for PROG_MISMATCH test nfsd_support_acl_version(rqstp->rq_vers) instead of nfsd_support_acl_version(i), so every iteration fails and the function returns rpc_prog_unavail instead of rpc_prog_mismatch.
Replace rqstp->rq_vers with the loop variable i, matching the pattern used by the sibling nfsd_init_request() function.
--- fs/nfsd/nfssvc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
fs/nfsd/nfssvc.c +2 -2
@@ -853,7 +853,7 @@ nfsd_acl_init_request(struct svc_rqst *r ret->mismatch.lovers =NFSD_ACL_NRVERS ;for (i =NFSD_ACL_MINVERS ; i <NFSD_ACL_NRVERS ; i++) { -if (nfsd_support_acl_version (rqstp->rq_vers) && +if (nfsd_support_acl_version (i) &&nfsd_vers (nn, i,NFSD_TEST )) { ret->mismatch.lovers = i;break ;
@@ -863,7 +863,7 @@ nfsd_acl_init_request(struct svc_rqst *rreturn rpc_prog_unavail; ret->mismatch.hivers =NFSD_ACL_MINVERS ;for (i =NFSD_ACL_NRVERS -1 ; i >=NFSD_ACL_MINVERS ; i--) { -if (nfsd_support_acl_version (rqstp->rq_vers) && +if (nfsd_support_acl_version (i) &&nfsd_vers (nn, i,NFSD_TEST )) { ret->mismatch.hivers = i;break ;
Greg Kroah-Hartman
maintainerPATCH 42/798 nfsd: fix XDR length calculation in nfsd4_ff_encode_layoutget
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeff Layton <[email protected]>
commit f9868174af49d207fbaf0c5e055d088a983684af upstream.
The XDR buffer size calculation in nfsd4_ff_encode_layoutget() has multiple errors that can result in either an out-of-bounds write or leaking uninitialized kernel memory to the client:
- fh_len doesn't account for XDR padding on the file handle data
- uid and gid lengths use "8 + len" but xdr_encode_opaque() actually writes "4 + xdr_align_size(len)" bytes
- ds_len omits the flags and stats_collect_hint fields (8 bytes), while len's header constant overestimates by 8 bytes -- these partially cancel but leave a net mismatch
The worst case occurs with short strings (e.g. uid=0, gid=0 with an odd-sized file handle), where the function writes up to 5 bytes past the reserved XDR buffer. Conversely, when string lengths happen to be 4-byte aligned, the reservation is too large and stale buffer content is sent to the client.
Fix this by breaking out every encoded field explicitly in the ds_len calculation, using xdr_align_size() for all variable-length opaque fields, and correcting the header constants.
--- fs/nfsd/flexfilelayoutxdr.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-)
fs/nfsd/flexfilelayoutxdr.c +11 -6
@@ -30,19 +30,24 @@ nfsd4_ff_encode_layoutget(struct xdr_strstruct ff_idmap uid;struct ff_idmap gid; - fh_len =4 + fl->fh.size; + fh_len =4 +xdr_align_size (fl->fh.size); uid.len =sprintf (uid.buf,"%u" ,from_kuid (&init_user_ns, fl->uid)); gid.len =sprintf (gid.buf,"%u" ,from_kgid (&init_user_ns, fl->gid)); -/* 8 + len for recording the length, name, and padding */ - ds_len =20 +sizeof (stateid_opaque_t) +4 + fh_len + -8 + uid.len +8 + gid.len; +/* data server entry: deviceid + efficiency + stateid + fh list + +* user + group + flags + stats_collect_hint +*/ + ds_len =16 +4 +4 +sizeof (stateid_opaque_t) +4 + fh_len + +4 +xdr_align_size (uid.len) + +4 +xdr_align_size (gid.len) + +4 +4 ; +/* mirror: ds_count + ds */ mirror_len =4 + ds_len; -/* The layout segment */ - len =20 + mirror_len; +/* stripe_unit + mirror_count + mirror */ + len =12 + mirror_len; p =xdr_reserve_space (xdr,sizeof (__be32) + len);if (!p)
Greg Kroah-Hartman
maintainerPATCH 43/798 nfsd: fix XDR padding calculation in ff_encode_getdeviceinfo
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeff Layton <[email protected]>
commit 8b989aaec85e1293a871d602590c951fe44b8647 upstream.
nfsd4_ff_encode_getdeviceinfo() computes the da_addr_body reservation as 16 + netid_len + addr_len, but the subsequent xdr_encode_opaque() calls emit 8 + round_up(netid_len, 4) + round_up(addr_len, 4) bytes. The mismatch means the declared da_addr_body length exceeds the actual encoded data by 2-8 bytes on every flexfile GETDEVICEINFO reply, leaking stale reply-page content to the client and mis-aligning the subsequent version list decode.
Use xdr_align_size() for each string length to match what xdr_encode_opaque() actually writes.
--- fs/nfsd/flexfilelayoutxdr.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/nfsd/flexfilelayoutxdr.c +2 -1
@@ -99,7 +99,8 @@ nfsd4_ff_encode_getdeviceinfo(struct xdr }/* len + padding for two strings */ - addr_len =16 + da->netaddr.netid_len + da->netaddr.addr_len; + addr_len =8 +xdr_align_size (da->netaddr.netid_len) + +xdr_align_size (da->netaddr.addr_len); ver_len =20 ; len =4 + ver_len +4 + addr_len;
Greg Kroah-Hartman
maintainerPATCH 44/798 nfsd: initialize copy-notify stateid before publishing it
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeff Layton <[email protected]>
commit 129643893b79f8a3c6b72045f933fbab5ee424ca upstream.
nfsd4_copy_notify() finished initializing the cpntf state after nfs4_alloc_init_cpntf_state() had already linked it into the s2s_cp_stateids IDR and the parent's sc_cp_list, with cs_count == 1 (the membership reference) and none held for the caller. A racing OFFLOAD_CANCEL (crafted cl_id == nn->s2s_cp_cl_id plus the guessable so_id) could reach manage_cpntf_state() and free the entry, turning the caller's subsequent cpn_cnr_stateid read and cp_p_stateid/cp_p_clid writes into use-after-free. The owning clientid was also only recorded after publication, so it could not gate an ownership check in that window.
Record cp_p_stateid and cp_p_clid inside nfs4_alloc_init_cpntf_state() before nfs4_init_cp_state() publishes the entry, and return it with an extra reference. The caller reads the stateid under that reference and drops it with nfs4_put_cpntf_state(); on a late error the laundromat reaps the entry.
--- fs/nfsd/nfs4proc.c | 16 +++++++++------- fs/nfsd/nfs4state.c | 10 +++++++++- 2 files changed, 18 insertions(+), 8 deletions(-)
fs/nfsd/nfs4proc.c +9 -7
@@ -1885,7 +1885,6 @@ nfsd4_copy_notify(struct svc_rqst *rqstpstruct nfsd_net *nn =net_generic (SVC_NET (rqstp), nfsd_net_id);struct nfs4_stid *stid;struct nfs4_cpntf_state *cps; -struct nfs4_client *clp = cstate->clp; status = nfs4_preprocess_stateid_op(rqstp, cstate, &cstate->current_fh, &cn->cpn_src_stateid, RD_STATE, NULL,
@@ -1897,12 +1896,14 @@ nfsd4_copy_notify(struct svc_rqst *rqstp cn->cpn_nsec =0 ; status =nfserrno (-ENOMEM ); +/* +* The returned cps is published and fully initialized, and carries an +* extra reference for us; drop it once we are done with it. +*/ cps =nfs4_alloc_init_cpntf_state (nn, stid);if (!cps) goto out;memcpy (&cn->cpn_cnr_stateid, &cps->cp_stateid.cs_stid,sizeof (stateid_t)); -memcpy (&cps->cp_p_stateid, &stid->sc_stateid,sizeof (stateid_t)); -memcpy (&cps->cp_p_clid, &clp->cl_clientid,sizeof (clientid_t));/* For now, only return one server address in cpn_src, the * address used by the client to connect to this server.
@@ -1911,10 +1912,11 @@ nfsd4_copy_notify(struct svc_rqst *rqstp status =nfsd4_set_netaddr ((struct sockaddr *)&rqstp->rq_daddr, &cn->cpn_src->u.nl4_addr);WARN_ON_ONCE (status); -if (status) { -nfs4_put_cpntf_state (nn, cps); - goto out; - } +/* +* Drop our extra reference. The membership reference keeps the entry +* alive for a later inter-server READ, or until the laundromat reaps it. +*/ +nfs4_put_cpntf_state (nn, cps); out:nfs4_put_stid (stid);return status;
fs/nfsd/nfs4state.c +9 -1
@@ -1035,7 +1035,15 @@ struct nfs4_cpntf_state *nfs4_alloc_init/* So a stale list_del_init() before linking is a no-op. */ INIT_LIST_HEAD (&cps->cp_list); cps->cpntf_time =ktime_get_boottime_seconds (); -refcount_set (&cps->cp_stateid.cs_count,1 ); +/* +* Fully initialize the entry before nfs4_init_cp_state() publishes it, +* since a concurrent OFFLOAD_CANCEL could then free it. Take an extra +* reference for the caller (dropped with nfs4_put_cpntf_state()). +*/ +memcpy (&cps->cp_p_stateid, &p_stid->sc_stateid,sizeof (stateid_t)); +memcpy (&cps->cp_p_clid, &p_stid->sc_client->cl_clientid, +sizeof (clientid_t)); +refcount_set (&cps->cp_stateid.cs_count,2 );if (!nfs4_init_cp_state (nn, &cps->cp_stateid,NFS4_COPYNOTIFY_STID , p_stid)) goto out_free;
Greg Kroah-Hartman
maintainerPATCH 45/798 nfsd: reject out-of-range useconds in NFSv2 SETATTR/CREATE
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Robbie Ko <[email protected]>
commit 26709c8ffe73772eb69e68d553ac71d91228dccc upstream.
The NFSv2 sattr decoder converts the wire useconds to nanoseconds in svcxdr_decode_sattr():
iap->ia_atime.tv_nsec = tmp2 * NSEC_PER_USEC;
tmp2 is a u32 and NSEC_PER_USEC is 1000, so the product is computed in unsigned long. On ILP32 that is 32 bits, and an out-of-range useconds value such as 4294968 wraps to tv_nsec == 704. The corruption therefore happens during decode, before any proc function can inspect the value, and a later range check on tv_nsec would see an in-range result and accept it. Rejecting in the decoder yields an RPC GARBAGE_ARGS reply. NFSv2 defines no NFSERR_INVAL, so there is no NFS-level status to return for a malformed time argument, and the check cannot move to the proc function the way the v3/v4 nsec range checks do.
Guard the raw useconds before the multiplication and reject values greater than 1000000. useconds == 1000000 is kept: it is the Sun convention for "set to the current server time", and the in-tree Linux NFSv2 client emits it in both the atime and the mtime field for a plain touch / utimes(file, NULL) (see encode_sattr() and xdr_encode_current_server_time() in fs/nfs/nfs2xdr.c). Rejecting 1000000 would turn that common operation into a hard decode failure for both SETATTR and CREATE. 1000000 * NSEC_PER_USEC is 10^9, which does not wrap on ILP32, so the Sun convention value passes through safely. Only genuinely out-of-range values (> 1000000) are rejected. The atime and mtime guards are therefore symmetric.
The decoder only applied the Sun convention in the mtime block, which clears ATTR_ATIME_SET|ATTR_MTIME_SET when mtime useconds == 1000000. If a client puts 1000000 in the atime field but not in the mtime field, the atime block stored an out-of-range tv_nsec (10^9) and left ATTR_ATIME_SET set, so the bogus value reached the filesystem. Apply the convention in the atime block as well, clearing ATTR_ATIME_SET so the server uses its current time and ignores the value. Only ATTR_ATIME_SET is cleared there. The mtime block keeps its existing behavior, where 1000000 means "set both atime and mtime to now".
--- fs/nfsd/nfsxdr.c | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-)
fs/nfsd/nfsxdr.c +22 -10
@@ -10,6 +10,16 @@#include "auth.h" /* +* Sun convention: a sattr time-useconds field of one full second (an +* otherwise out-of-range value) means "set this time to the current +* server time." It's needed to make permissions checks for the "touch" +* program across NFSv2 mounts work correctly. See description of +* sattr in section 6.1 of "NFS Illustrated" by Brent Callaghan, +* Addison-Wesley, ISBN 0-201-32750-5 +*/ +#define NFS2_SATTR_SET_TO_SERVER_TIME (1000000) + +/* * Mapping of S_IF* types to NFS file types */ static const u32 nfs_ftypes[] = {
@@ -172,27 +182,29 @@ svcxdr_decode_sattr(struct svc_rqst *rqs tmp1 =be32_to_cpup (p++); tmp2 =be32_to_cpup (p++);if (tmp1 != (u32)-1 && tmp2 != (u32)-1 ) { +/* +* Range test here to prevent the multiplication from +* wrapping to a valid (but incorrect) value on 32-bit +* platforms. +*/ +if (tmp2 >NFS2_SATTR_SET_TO_SERVER_TIME ) +return false; iap->ia_valid |=ATTR_ATIME |ATTR_ATIME_SET ; iap->ia_atime.tv_sec = tmp1; iap->ia_atime.tv_nsec = tmp2 *NSEC_PER_USEC ; +if (tmp2 ==NFS2_SATTR_SET_TO_SERVER_TIME ) + iap->ia_valid &= ~ATTR_ATIME_SET ; } tmp1 =be32_to_cpup (p++); tmp2 =be32_to_cpup (p++);if (tmp1 != (u32)-1 && tmp2 != (u32)-1 ) { +if (tmp2 >NFS2_SATTR_SET_TO_SERVER_TIME ) +return false; iap->ia_valid |=ATTR_MTIME |ATTR_MTIME_SET ; iap->ia_mtime.tv_sec = tmp1; iap->ia_mtime.tv_nsec = tmp2 *NSEC_PER_USEC ; -/* -* Passing the invalid value useconds=1000000 for mtime -* is a Sun convention for "set both mtime and atime to -* current server time". It's needed to make permissions -* checks for the "touch" program across v2 mounts to -* Solaris and Irix boxes work correctly. See description of -* sattr in section 6.1 of "NFS Illustrated" by -* Brent Callaghan, Addison-Wesley, ISBN 0-201-32750-5 -*/ -if (tmp2 ==1000000 ) +if (tmp2 ==NFS2_SATTR_SET_TO_SERVER_TIME ) iap->ia_valid &= ~(ATTR_ATIME_SET |ATTR_MTIME_SET ); }
Greg Kroah-Hartman
maintainerPATCH 46/798 nfsd: reject reclaim LOCK after RECLAIM_COMPLETE
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeff Layton <[email protected]>
commit 2327ba1d9546727a35b17888777e991f68a9b305 upstream.
nfsd4_lock() only checks the namespace-wide grace flag when deciding whether to accept a reclaim LOCK. It does not check the per-client NFSD4_CLIENT_RECLAIM_COMPLETE bit. An NFSv4.1+ client that has already sent RECLAIM_COMPLETE can submit lk_reclaim=1 while grace is still active (e.g. lockd holds the grace list open), and the server accepts it instead of returning NFS4ERR_NO_GRACE as required by RFC 8881 section 18.51.3.
The OPEN path already enforces both tiers: the grace check plus the per-client RECLAIM_COMPLETE check in nfs4_check_open_reclaim(). Add the equivalent per-client check to the LOCK path.
--- fs/nfsd/nfs4state.c | 3 +++ 1 file changed, 3 insertions(+)
fs/nfsd/nfs4state.c +3 -0
@@ -7628,6 +7628,9 @@ nfsd4_lock(struct svc_rqst *rqstp, struc status = nfserr_no_grace;if (!locks_in_grace (net) && lock->lk_reclaim) goto out; +if (lock->lk_reclaim && +test_bit (NFSD4_CLIENT_RECLAIM_COMPLETE , &cstate->clp->cl_flags)) + goto out;if (lock->lk_reclaim) fl_flags |=FL_RECLAIM ;
Greg Kroah-Hartman
maintainerPATCH 47/798 nfsd: revoke copy-notify stateids before dropping their reference
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeff Layton <[email protected]>
commit 3b0c3595db99bb4bebd7c8aa8a36f3c50e411bb7 upstream.
Copy-notify stateids live in the s2s_cp_stateids IDR and on their parent stid's sc_cp_list, pinned by a single membership reference. _free_cpntf_state_locked() only unlinks an entry once its refcount reaches zero, so any revoke path that runs while a concurrent find_cpntf_state()/manage_cpntf_state() holder has elevated cs_count drops the reference without unlinking, leaving the entry discoverable with its membership reference already consumed. A second revoke or a laundromat tick then frees it while the reader still holds the pointer -- a KASAN-detectable use-after-free at the reader's nfs4_put_cpntf_state().
This affected all three revoke paths:
- The parent-stid drain (nfs4_free_cpntf_statelist()) repeatedly called _free_cpntf_state_locked() on the first list entry; a holder that had bumped cs_count made it return early, so the next iteration re-decremented and burned the holder's reference.
- OFFLOAD_CANCEL (manage_cpntf_state()) and laundromat expiry likewise
used _free_cpntf_state_locked() and could drop 2->1 without unlinking.
Add revoke_cpntf_state_locked(), which unhashes the entry from the IDR and sc_cp_list first (deferring the final free to any holder), and use it from all three revoke paths. The drain now walks with list_for_each_entry_safe() and revokes each entry unconditionally, so it terminates in one pass per entry regardless of cs_count. The unhash is gated on !list_empty(&cps->cp_list); the idr_remove() gate matters because idr_alloc_cyclic() may have recycled the so_id by then. Keep _free_cpntf_state_locked() for the reference-holder put path only, where a concurrent revoke may already have unlinked the entry (its list_del_init() then a no-op).
--- fs/nfsd/nfs4state.c | 78 +++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 62 insertions(+), 16 deletions(-)
fs/nfsd/nfs4state.c +62 -16
@@ -1066,18 +1066,66 @@ void nfs4_free_copy_state(struct nfsd4_cspin_unlock (&nn->s2s_cp_lock); } +/* +* Drop the parent's reference on an already-unlinked cpntf entry. If a +* concurrent holder still owns a reference, its nfs4_put_cpntf_state() does +* the final free. +* +* nn->s2s_cp_lock must be held. +*/ +static void put_cpntf_state_unlinked_locked (struct nfs4_cpntf_state *cps) +{ +WARN_ON_ONCE (cps->cp_stateid.cs_type !=NFS4_COPYNOTIFY_STID ); +WARN_ON_ONCE (!list_empty (&cps->cp_list)); + +if (refcount_dec_and_test (&cps->cp_stateid.cs_count)) +kfree (cps); +} + +/* +* Unhash from the IDR and sc_cp_list. Gated on list_empty() to avoid +* evicting a recycled so_id. +*/ +static void nfsd4_unhash_cpntf_state (struct nfsd_net *nn,struct nfs4_cpntf_state *cps) +{ +lockdep_assert_held (&nn->s2s_cp_lock); + +if (!list_empty (&cps->cp_list)) { +list_del_init (&cps->cp_list); +idr_remove (&nn->s2s_cp_stateids, cps->cp_stateid.cs_stid.si_opaque.so_id); + } +} + +/* +* Revoke a copy-notify stateid: unlink it from the IDR and sc_cp_list first +* so no new finder can discover it, then drop the membership reference. Every +* revoke path (cancel, laundromat, drain) must use this rather than +* _free_cpntf_state_locked(), which unlinks only at refcount zero and so could +* let a second revoke free the entry under a concurrent reader. +* +* nn->s2s_cp_lock must be held. +*/ +static void revoke_cpntf_state_locked (struct nfsd_net *nn, +struct nfs4_cpntf_state *cps) +{ +nfsd4_unhash_cpntf_state (nn, cps); +put_cpntf_state_unlinked_locked (cps); +} +static void nfs4_free_cpntf_statelist (struct net *net,struct nfs4_stid *stid) { -struct nfs4_cpntf_state *cps; +struct nfs4_cpntf_state *cps, *tmp;struct nfsd_net *nn; nn =net_generic (net, nfsd_net_id);spin_lock (&nn->s2s_cp_lock); -while (!list_empty (&stid->sc_cp_list)) { - cps =list_first_entry (&stid->sc_cp_list, - struct nfs4_cpntf_state, cp_list); -_free_cpntf_state_locked (nn, cps); - } +/* +* Revoke unlinks each entry before dropping the parent's reference, so +* the drain terminates in one pass per entry regardless of cs_count; a +* concurrent holder does the final kfree via nfs4_put_cpntf_state(). +*/ +list_for_each_entry_safe (cps, tmp, &stid->sc_cp_list, cp_list) +revoke_cpntf_state_locked (nn, cps);spin_unlock (&nn->s2s_cp_lock); }
@@ -6223,7 +6271,7 @@ nfs4_laundromat(struct nfsd_net *nn) cps = container_of(cps_t, struct nfs4_cpntf_state, cp_stateid);if (cps->cp_stateid.cs_type ==NFS4_COPYNOTIFY_STID &&state_expired (<, cps->cpntf_time)) -_free_cpntf_state_locked (nn, cps); +revoke_cpntf_state_locked (nn, cps); }spin_unlock (&nn->s2s_cp_lock);nfs4_get_client_reaplist (nn, &reaplist, <);
@@ -6610,16 +6658,14 @@ nfs4_check_file(struct svc_rqst *rqstp, out:return status; } -static void -_free_cpntf_state_locked (struct nfsd_net *nn,struct nfs4_cpntf_state *cps) + +static void _free_cpntf_state_locked (struct nfsd_net *nn,struct nfs4_cpntf_state *cps) {WARN_ON_ONCE (cps->cp_stateid.cs_type !=NFS4_COPYNOTIFY_STID ); -if (!refcount_dec_and_test (&cps->cp_stateid.cs_count)) -return ; -list_del_init (&cps->cp_list); -idr_remove (&nn->s2s_cp_stateids, - cps->cp_stateid.cs_stid.si_opaque.so_id); -kfree (cps); +if (refcount_dec_and_test (&cps->cp_stateid.cs_count)) { +nfsd4_unhash_cpntf_state (nn, cps); +kfree (cps); + } }/* * A READ from an inter server to server COPY will have a
@@ -6656,7 +6702,7 @@ __be32 manage_cpntf_state(struct nfsd_ne state =NULL ; goto unlock; }else { -_free_cpntf_state_locked (nn, state); +revoke_cpntf_state_locked (nn, state); } } unlock:
Greg Kroah-Hartman
maintainerPATCH 48/798 NFSD: Prevent lock owner use-after-free during client teardown
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chuck Lever <[email protected]>
commit 5e2fa29d223a9a1e6a948e40b109d09081d1decd upstream.
__destroy_client() releases a client's open owners, but a lock owner whose only reference is a blocked lock (nbl) stays on cl_ownerstr_hashtbl. client_has_state() does not count a bare owner, so DESTROY_CLIENTID can reach __destroy_client() with such owners present.
__destroy_client() then walks the table, calling remove_blocked_locks() on each owner without a reference. Freeing a blocked lock drops the owner reference held via flc_owner. The per-net laundromat reaps blocked locks from nn->blocked_locks_lru independently of client state. The two paths share blocked_locks_lock only for the list splice, not the owner's lifetime. The laundromat therefore frees the owner as __destroy_client() dereferences it, a NULL dereference in remove_blocked_locks().
nfsd4_release_lockowner() holds a reference across the same call; __destroy_client() does not. Hold cl_lock across the walk, taking a reference and unhashing each owner, then drop it before remove_blocked_locks() and nfs4_put_stateowner(), which take blocked_locks_lock and cl_lock.
--- fs/nfsd/nfs4state.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-)
fs/nfsd/nfs4state.c +13 -3
@@ -2336,14 +2336,24 @@ __destroy_client(struct nfs4_client *clprelease_openowner (oo); }for (i =0 ; i <OWNER_HASH_SIZE ; i++) { -struct nfs4_stateowner *so, *tmp; +struct nfs4_stateowner *so; -list_for_each_entry_safe (so, tmp, &clp->cl_ownerstr_hashtbl[i], - so_strhash) { +spin_lock (&clp->cl_lock); +while (!list_empty (&clp->cl_ownerstr_hashtbl[i])) { + so =list_first_entry (&clp->cl_ownerstr_hashtbl[i], + struct nfs4_stateowner, so_strhash);/* Should be no openowners at this point */ WARN_ON_ONCE (so->so_is_open_owner); +nfs4_get_stateowner (so); +unhash_lockowner_locked (lockowner (so)); +spin_unlock (&clp->cl_lock); +remove_blocked_locks (lockowner (so)); +nfs4_put_stateowner (so); + +spin_lock (&clp->cl_lock); } +spin_unlock (&clp->cl_lock); }nfsd4_return_all_client_layouts (clp);nfsd4_shutdown_copy (clp);
Greg Kroah-Hartman
maintainerPATCH 49/798 libceph: reject buckets with mismatched CRUSH ids
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jérémy Jean <[email protected]>
commit 3cde4a8302301679937474a5f7a851394cc1bd11 upstream.
crush_decode() stores bucket data by array slot, and the mapper later derives the per-bucket workspace index from the decoded bucket id. A malformed map can therefore make one bucket reuse another bucket's workspace by encoding an id different from -1 - slot.
For uniform buckets, the second replica selection expands the source bucket's permutation into that aliased workspace buffer. If the source bucket is larger than the aliased bucket, the write runs past the smaller permutation array and can escape the kvmalloc'd CRUSH workspace. KASAN reports a slab OOB write of 4 bytes in bucket_perm_choose().
Reject buckets whose encoded id does not match their array slot. Valid CRUSH maps already use the canonical negative id corresponding to the bucket slot, so this restores the invariant expected by work->work[-1 - in->id] without changing valid map behavior.
--- net/ceph/osdmap.c | 2 ++ 1 file changed, 2 insertions(+)
net/ceph/osdmap.c +2 -0
@@ -503,6 +503,8 @@ static struct crush_map *crush_decode(voceph_decode_need (p, end,4 *sizeof (u32), bad); b->id =ceph_decode_32 (p); +if (b->id !=-1 - i) + goto bad; b->type =ceph_decode_16 (p);if (b->type ==0 ) goto bad;
Greg Kroah-Hartman
maintainerPATCH 50/798 ceph: fix UAF in __kick_flushing_caps() on cf entry freed during unlock
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiubo Li <[email protected]>
commit 7af4c4f01305b0935adf6d4301b1ec407025485d upstream.
list_for_each_entry() iterates ci->i_cap_flush_list but drops i_ceph_lock to send cap messages. During the unlock window, handle_cap_flush_ack() can acquire i_ceph_lock, detach cf entries with tid <= flush_tid from the list, release i_ceph_lock, and free them via ceph_free_cap_flush() outside any lock. When the original thread reacquires i_ceph_lock and the for-loop macro advances via cf = list_next_entry(cf, i_list), it dereferences cf->i_list.next on freed memory.
The race timeline:
__kick_flushing_caps() handle_cap_flush_ack()
----------------------- -----------------------
holds i_ceph_lock <---
iterates to cf (tid=10)
prepares FLUSH message
drops i_ceph_lock <---
__send_cap() ── FLUSH(tid=10)
MDS sends FLUSH_ACK(tid=10)
---> acquires i_ceph_lock
cf->tid(10) <= flush_tid(10), detaches cf from i_cap_flush_list drops i_ceph_lock ceph_free_cap_flush(cf) <- frees it!
acquires i_ceph_lock <---
for-loop advances:
cf = list_next_entry(cf, i_list)
-- UAF on freed cf->i_list.next
The cf was just sent by __kick_flushing_caps itself via __send_cap(). The MDS may respond with FLUSH_ACK quickly enough that handle_cap_flush_ack() frees cf before __kick_flushing_caps can finish the iteration.
Fix by converting to a manual while loop: save the next pointer under i_ceph_lock before dropping it, then use the saved pointer after reacquiring, so the potentially-freed cf is never accessed again.
--- fs/ceph/caps.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
fs/ceph/caps.c +9 -2
@@ -2513,9 +2513,14 @@ static void __kick_flushing_caps(struct } } -list_for_each_entry (cf, &ci->i_cap_flush_list, i_list) { -if (cf->tid < first_tid) + cf = list_first_entry(&ci->i_cap_flush_list, struct ceph_cap_flush, i_list); +while (&cf->i_list != &ci->i_cap_flush_list) { +struct ceph_cap_flush *next; + +if (cf->tid < first_tid) { + cf =list_next_entry (cf, i_list);continue ; + } cap = ci->i_auth_cap;if (!(cap && cap->session == session)) {
@@ -2525,6 +2530,7 @@ static void __kick_flushing_caps(struct } first_tid = cf->tid +1 ; + next =list_next_entry (cf, i_list);if (!cf->is_capsnap) {struct cap_msg_args arg;
@@ -2565,6 +2571,7 @@ static void __kick_flushing_caps(struct }spin_lock (&ci->i_ceph_lock); + cf = next; } }
Greg Kroah-Hartman
maintainerPATCH 51/798 ceph: bound xattr value length in __build_xattrs()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Bommarito <[email protected]>
commit 68d541754d6cd3bb98d1fd8314f57e5eb533557d upstream.
__build_xattrs() decodes the MDS-supplied xattr blob one attribute at a time. For each attribute it reads a 32-bit name length, advances past the name bytes, reads a 32-bit value length, records the value pointer, and advances past the value bytes. The two length fields are read with ceph_decode_32_safe(), but the value bytes themselves are advanced over with a bare "p += len" and no ceph_decode_need() check that "len" bytes remain in the blob.
For every attribute except the last, the next iteration's ceph_decode_32_safe() on the following name length implicitly verifies that the previous value did not run past the blob end. The final attribute has no successor, so its decoded value length is never checked against the blob bounds. A malicious or compromised metadata server can set the last attribute's value length larger than the bytes actually present in the blob.
The blob is a dedicated kvmalloc() allocation sized to the wire length (ceph_buffer_new() in ceph_fill_inode()). __set_xattr() records the oversized length in xattr->val_len verbatim, and a later getxattr(2) runs memcpy(value, xattr->val, xattr->val_len) into a user-supplied buffer, copying bytes past the end of the allocation back to user space.
Impact: a malicious metadata server discloses adjacent kernel heap bytes to a local user via getxattr(2) on a CephFS file. Add the missing ceph_decode_need() so an out-of-bounds value length on the final attribute fails the decode and returns -EIO instead of being stored.
--- fs/ceph/xattr.c | 1 + 1 file changed, 1 insertion(+)
fs/ceph/xattr.c +1 -0
@@ -715,6 +715,7 @@ start: name = p; p += len;ceph_decode_32_safe (&p, end, len, bad); +ceph_decode_need (&p, end, len, bad); val = p; p += len;
Greg Kroah-Hartman
maintainerPATCH 52/798 audit: avoid dropping live tree ref on fsnotify rule autoremove
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jérémy Jean <[email protected]>
commit 783f0f0974c156aca630f4ffff248671082a098d upstream.
audit_del_rule() is used for both netlink deletion templates and internal fsnotify autoremove. The former passes a parsed template which owns a temporary tree reference; the latter passes the installed entry itself.
The unconditional audit_put_tree() at the end of audit_del_rule() assumes the template case. For mixed AUDIT_DIR plus AUDIT_EXE rules, an fsnotify autoremove event therefore drops the installed rule's live tree reference. Repeating this across rules sharing the same tree can free the tree while another rule still references it, and a later autoremove dereferences the freed pathname while comparing rules.
Move the temporary-tree put to audit_rule_change(), the caller that owns deletion templates. Keep it in the AUDIT_DEL_RULE cleanup so both successful deletion and -ENOENT still release the parser-owned tree.
--- kernel/auditfilter.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
kernel/auditfilter.c +2 -4
@@ -1015,7 +1015,6 @@ static inline int audit_add_rule(structint audit_del_rule (struct audit_entry *entry) {struct audit_entry *e; -struct audit_tree *tree = entry->rule.tree;struct list_head *list;int ret =0 ;#ifdef CONFIG_AUDITSYSCALL
@@ -1063,9 +1062,6 @@ int audit_del_rule(struct audit_entry *e out:mutex_unlock (&audit_filter_mutex); -if (tree) -audit_put_tree (tree);/* that's the temporary one */ -return ret; }
@@ -1150,6 +1146,8 @@ int audit_rule_change(int type, int seq, }if (err || type ==AUDIT_DEL_RULE ) { +if (type ==AUDIT_DEL_RULE && entry->rule.tree) +audit_put_tree (entry->rule.tree);if (entry->rule.exe)audit_remove_mark (entry->rule.exe);audit_free_rule (entry);
Greg Kroah-Hartman
maintainerPATCH 53/798 HID: picolcd: clamp eeprom debugfs read to bytes actually received
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ibrahim Hashimov <[email protected]>
commit e9c667395ac1f8024f623250b32bae4c7af9caa0 upstream.
picolcd_debug_eeprom_read() trusts resp->raw_data[2] -- a length byte supplied by the device in its REPORT_EE_DATA reply -- clamped only to the caller's read() count:
ret = resp->raw_data[2]; if (ret > s) ret = s; if (copy_to_user(u, resp->raw_data+3, ret))
It never checks resp->raw_size, the number of bytes picolcd_raw_event() actually copied into the 64-byte raw_data[] of the kmalloc'd struct picolcd_pending. A device (or a spoofed picoLCD) returning a length byte of 0xff, read with a count >= 255, makes copy_to_user() read past raw_data[] into adjacent slab memory and return it to userspace through the debugfs "eeprom" file:
BUG: KASAN: slab-out-of-bounds in _copy_to_user Read of size 255 ... picolcd_debug_eeprom_read+0x214/0x2f0 [hid_picolcd]
The debug-dump path in the same file already validates the device length byte against the received size before trusting it; this read does not. The file is created S_IRUSR (root-only) and a crafted device is needed, so it is neither unprivileged- nor remotely-triggerable.
Clamp the copy length to resp->raw_size - 3 (the payload actually received, minus the 3-byte header), floored at 0 for short replies.
--- drivers/hid/hid-picolcd_debugfs.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/hid/hid-picolcd_debugfs.c +9 -0
@@ -98,6 +98,15 @@ static ssize_t picolcd_debug_eeprom_read ret = resp->raw_data[2 ];if (ret > s) ret = s; +/* +* raw_data[2] is a device-supplied length; also clamp it to +* what picolcd_raw_event() actually stored (raw_size), or a +* hostile device overruns the raw_data[] buffer. +*/ +if (ret > resp->raw_size -3 ) + ret = resp->raw_size -3 ; +if (ret <0 ) + ret =0 ;if (copy_to_user (u, resp->raw_data+3 , ret)) ret = -EFAULT ;else
Greg Kroah-Hartman
maintainerPATCH 54/798 HID: roccat: free buffered reports when destroying device
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xu Rao <[email protected]>
commit bbff0ccbff360a5498075525005f6a913239a3d7 upstream.
roccat_report_event() duplicates each report with kmemdup() and stores the allocation in a circular-buffer slot. The allocation is released only when that slot is reused.
The device destruction paths free struct roccat_device without releasing reports still stored in cbuf[]. This makes those allocations unreachable and leaks up to ROCCAT_CBUF_SIZE report buffers per device.
Add a small destructor that frees every buffered report before freeing the device, and use it in both paths that can destroy a registered device.
--- drivers/hid/hid-roccat.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)
drivers/hid/hid-roccat.c +11 -2
@@ -70,6 +70,15 @@ static struct roccat_device *devices[ROC/* protects modifications of devices array */ static DEFINE_MUTEX (devices_lock); +static void roccat_free_device (struct roccat_device *device) +{ +int i; + +for (i =0 ; i <ROCCAT_CBUF_SIZE ; i++) +kfree (device->cbuf[i].value); +kfree (device); +} +static ssize_t roccat_read (struct file *file,char __user *buffer,size_t count,loff_t *ppos) {
@@ -226,7 +235,7 @@ static int roccat_release(struct inode *hid_hw_power (device->hid,PM_HINT_NORMAL );hid_hw_close (device->hid); }else { -kfree (device); +roccat_free_device (device); } }
@@ -374,7 +383,7 @@ void roccat_disconnect(int minor)hid_hw_close (device->hid);wake_up_interruptible (&device->wait); }else { -kfree (device); +roccat_free_device (device); } }EXPORT_SYMBOL_GPL (roccat_disconnect);
Greg Kroah-Hartman
maintainerPATCH 55/798 HID: sensor: custom: Fix field sysfs group cleanup on failure
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Haoxiang Li <[email protected]>
commit 3789d0802ddb4b3be04062caf4bfadd23496e9a7 upstream.
hid_sensor_custom_add_attributes() creates one sysfs group for each custom sensor field. If sysfs_create_group() fails after some groups have already been created, the function returns the error without removing the previously created groups.
Add a local unwind path to remove the groups that were already created. With enable_sensor exposed only after the field attributes are ready, this path can free sensor_inst->fields without leaving enable_sensor able to access pointers into that array.
--- drivers/hid/hid-sensor-custom.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
drivers/hid/hid-sensor-custom.c +8 -1
@@ -605,7 +605,7 @@ static int hid_sensor_custom_add_attribu &sensor_inst->fields[i]. hid_custom_attribute_group);if (ret) -break ; + goto err_remove_groups;/* For power or report field store indexes */ if (sensor_inst->fields[i].attribute.attrib_id ==
@@ -617,6 +617,13 @@ static int hid_sensor_custom_add_attribu }return ret; + +err_remove_groups: +while (--i >=0 ) +sysfs_remove_group (&sensor_inst->pdev->dev.kobj, + &sensor_inst->fields[i].hid_custom_attribute_group); +kfree (sensor_inst->fields); +return ret; } static void hid_sensor_custom_remove_attributes(struct hid_sensor_custom *
Greg Kroah-Hartman
maintainerPATCH 56/798 HID: mcp2221: validate report size in mcp2221_raw_event()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiangshan Yi <[email protected]>
commit 2c9a6998c19503626c57a2267bf279e204113079 upstream.
mcp2221_raw_event() never validates the size of incoming HID reports. In the MCP2221_I2C_GET_DATA path it trusts the device-supplied data[3] as the copy length without checking that 4 + data[3] bytes actually exist in the received report. A malicious or misbehaving USB device can send a short report with a large data[3], causing the memcpy to read past the valid report data in the HID transfer buffer and leak uninitialized kernel memory back to userspace through the I2C/SMBus read path.
Add a minimum size check at entry and validate that the source range fits within the received report before the copy.
--- drivers/hid/hid-mcp2221.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/hid/hid-mcp2221.c +7 -0
@@ -739,6 +739,9 @@ static int mcp2221_raw_event(struct hid_u8 *buf;struct mcp2221 *mcp =hid_get_drvdata (hdev); +if (size <4 ) +return 0 ; +switch (data[0 ]) {case MCP2221_I2C_WR_DATA :
@@ -797,6 +800,10 @@ static int mcp2221_raw_event(struct hid_ mcp->status = -EINVAL ;break ; } +if (4 + data[3 ] > size) { + mcp->status = -EINVAL ; +break ; + } buf = mcp->rxbuf;memcpy (&buf[mcp->rxbuf_idx], &data[4 ], data[3 ]); mcp->rxbuf_idx = mcp->rxbuf_idx + data[3 ];
Greg Kroah-Hartman
maintainerPATCH 57/798 eCryptfs: bound the packet-length peek to the user buffer
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pengpeng Hou <[email protected]>
commit 95540462e630edbc8504e9537d16453d6942d143 upstream.
ecryptfs_miscdev_write() accepts the minimum one-byte packet-length encoding, but always copies the maximum two-byte encoding from userspace before parsing it. A six-byte message therefore reads one byte beyond the submitted user buffer.
Zero-initialize the peek buffer and copy only the packet-length bytes present. The existing exact packet-size check still rejects truncated two-byte encodings after the parser determines their encoded length.
--- fs/ecryptfs/miscdev.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
fs/ecryptfs/miscdev.c +3 -2
@@ -356,7 +356,7 @@ ecryptfs_miscdev_write(struct file *fileu32 seq;size_t packet_size, packet_size_length;char *data; -unsigned char packet_size_peek[ECRYPTFS_MAX_PKT_LEN_SIZE ]; +unsigned char packet_size_peek[ECRYPTFS_MAX_PKT_LEN_SIZE ] = { };ssize_t rc;if (count ==0 ) {
@@ -372,7 +372,8 @@ ecryptfs_miscdev_write(struct file *file }if (copy_from_user (packet_size_peek, &buf[PKT_LEN_OFFSET ], -sizeof (packet_size_peek))) { +min_t (size_t, count -PKT_LEN_OFFSET , +sizeof (packet_size_peek)))) {printk (KERN_WARNING "%s: Error while inspecting packet size\n" , __func__);return -EFAULT ;
Greg Kroah-Hartman
maintainerPATCH 58/798 ecryptfs: fix tag 11 packet exact-fit size check
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yichong Chen <[email protected]>
commit 8b2ec0f56f55477f547d332526c9ae2a8fabc0a5 upstream.
parse_tag_11_packet() rejects a packet when the already-consumed tag and length bytes plus the packet body exceed the caller supplied maximum packet size. The check currently adds one extra byte, even though *packet_size already includes the tag byte before the length is parsed.
Remove the extra byte so a tag 11 packet that exactly fits the available buffer is accepted while oversized packets are still rejected.
--- fs/ecryptfs/keystore.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/ecryptfs/keystore.c +1 -1
@@ -1575,7 +1575,7 @@ parse_tag_11_packet(unsigned char *data, } (*packet_size) += length_size; (*tag_11_contents_size) = (body_size -14 ); -if (unlikely ((*packet_size) + body_size +1 > max_packet_size)) { +if (unlikely ((*packet_size) + body_size > max_packet_size)) {printk (KERN_ERR "Packet size exceeds max\n" ); rc = -EINVAL ; goto out;
Greg Kroah-Hartman
maintainerPATCH 59/798 ecryptfs: hold msg ctx list lock when cleaning daemon queue
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yichong Chen <[email protected]>
commit 779972513c2fa8c7938e54976f686091dafff22f upstream.
ecryptfs_exorcise_daemon() drops queued messages from a dying daemon without holding ecryptfs_msg_ctx_lists_mux, but ecryptfs_msg_ctx_alloc_to_free() requires that lock.
Take the list lock while moving the queued contexts back to the free list to avoid racing with other global msg ctx list users.
--- fs/ecryptfs/messaging.c | 2 ++ 1 file changed, 2 insertions(+)
fs/ecryptfs/messaging.c +2 -0
@@ -165,6 +165,7 @@ int ecryptfs_exorcise_daemon(struct ecrymutex_unlock (&daemon->mux); goto out; } +mutex_lock (&ecryptfs_msg_ctx_lists_mux);list_for_each_entry_safe (msg_ctx, msg_ctx_tmp, &daemon->msg_ctx_out_queue, daemon_out_list) {list_del (&msg_ctx->daemon_out_list);
@@ -173,6 +174,7 @@ int ecryptfs_exorcise_daemon(struct ecry "the out queue of a dying daemon\n", __func__);ecryptfs_msg_ctx_alloc_to_free (msg_ctx); } +mutex_unlock (&ecryptfs_msg_ctx_lists_mux);hlist_del (&daemon->euid_chain);mutex_unlock (&daemon->mux);kfree_sensitive (daemon);
Greg Kroah-Hartman
maintainerPATCH 60/798 ecryptfs: pass packet set buffer size to parser
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yichong Chen <[email protected]>
commit 2602b79c5b3e2f6fce12e38a670f8e3fda4e46a2 upstream.
ecryptfs_parse_packet_set() receives a pointer into the file header, but it calculates the remaining packet buffer size from PAGE_SIZE - 8. For version 1 headers the packet set starts later in the header, so this can overstate the available buffer.
Pass the actual packet set buffer length from the caller and calculate per-packet limits from the remaining bytes in that buffer. Recompute the remaining length after consuming a tag 3 packet before parsing the following tag 11 packet.
--- fs/ecryptfs/crypto.c | 2 +- fs/ecryptfs/ecryptfs_kernel.h | 3 ++- fs/ecryptfs/keystore.c | 23 ++++++++++++++++++++--- 3 files changed, 23 insertions(+), 5 deletions(-)
fs/ecryptfs/crypto.c +1 -1
@@ -1309,7 +1309,7 @@ static int ecryptfs_read_headers_virt(ch }else set_default_header_data (crypt_stat); rc =ecryptfs_parse_packet_set (crypt_stat, (page_virt + offset), - ecryptfs_dentry); +PAGE_SIZE - offset, ecryptfs_dentry); out:return rc; }
fs/ecryptfs/ecryptfs_kernel.h +2 -1
@@ -605,7 +605,8 @@ int ecryptfs_generate_key_packet_set(cha size_t *len, size_t max);int ecryptfs_parse_packet_set (struct ecryptfs_crypt_stat *crypt_stat, -unsigned char *src,struct dentry *ecryptfs_dentry); +unsigned char *src,size_t src_size, +struct dentry *ecryptfs_dentry);int ecryptfs_truncate (struct dentry *dentry,loff_t new_length); ssize_t ecryptfs_getxattr_lower(struct dentry *lower_dentry, struct inode *lower_inode,
fs/ecryptfs/keystore.c +20 -3
@@ -1742,6 +1742,7 @@ out:* ecryptfs_parse_packet_set * @crypt_stat: The cryptographic context * @src: Virtual address of region of memory containing the packets +* @src_size: Size of the packet set buffer * @ecryptfs_dentry: The eCryptfs dentry associated with the packet set * * Get crypt_stat to have the file's session key if the requisite key
@@ -1752,7 +1753,7 @@ out:* conditions. */ int ecryptfs_parse_packet_set (struct ecryptfs_crypt_stat *crypt_stat, -unsigned char *src, +unsigned char *src,size_t src_size,struct dentry *ecryptfs_dentry) {size_t i =0 ;
@@ -1776,7 +1777,11 @@ int ecryptfs_parse_packet_set(struct ecr* added the our &auth_tok_list */ next_packet_is_auth_tok_packet =1 ;while (next_packet_is_auth_tok_packet) { -size_t max_packet_size = ((PAGE_SIZE -8 ) - i); +size_t max_packet_size; + +if (i >= src_size) +break ; + max_packet_size = src_size - i;switch (src[i]) {case ECRYPTFS_TAG_3_PACKET_TYPE :
@@ -1791,12 +1796,16 @@ int ecryptfs_parse_packet_set(struct ecr goto out_wipe_list; } i += packet_size; +if (i > src_size) { + rc = -EIO ; + goto out_wipe_list; + } rc =parse_tag_11_packet ((unsigned char *)&src[i], sig_tmp_space,ECRYPTFS_SIG_SIZE , &tag_11_contents_size, &tag_11_packet_size, - max_packet_size); + src_size - i);if (rc) {ecryptfs_printk (KERN_ERR ,"No valid " "(ecryptfs-specific) literal "
@@ -1808,6 +1817,10 @@ int ecryptfs_parse_packet_set(struct ecr goto out_wipe_list; } i += tag_11_packet_size; +if (i > src_size) { + rc = -EIO ; + goto out_wipe_list; + }if (ECRYPTFS_SIG_SIZE != tag_11_contents_size) {ecryptfs_printk (KERN_ERR ,"Expected " "signature of size [%d]; "
@@ -1835,6 +1848,10 @@ int ecryptfs_parse_packet_set(struct ecr goto out_wipe_list; } i += packet_size; +if (i > src_size) { + rc = -EIO ; + goto out_wipe_list; + } crypt_stat->flags |=ECRYPTFS_ENCRYPTED ;break ;case ECRYPTFS_TAG_11_PACKET_TYPE :
Greg Kroah-Hartman
maintainerPATCH 61/798 ecryptfs: reject oversized encrypted_key_size in parse_tag_3_packet
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: HanQuan <[email protected]>
commit 5babe9c177c364521e3e682b949c5a8c47f4a441 upstream.
parse_tag_3_packet() set encrypted_key_size from the Tag 3 packet body without bounding it against ECRYPTFS_MAX_KEY_BYTES (64). When encrypted_key_size > 64, decrypt_passphrase_encrypted_session_key() sets decrypted_key_size = encrypted_key_size and performs two out-of-bounds writes:
1. crypto_skcipher_decrypt() writes encrypted_key_size bytes into decrypted_key[64] via scatterlist, overflowing into the parent ecryptfs_auth_tok struct.
2. memcpy(crypt_stat->key, decrypted_key, decrypted_key_size) writes into crypt_stat->key[64], corrupting root_iv, keysig_list, and mutexes in ecryptfs_crypt_stat.
Only AES-192 (cipher code 0x08) enables this because it sets crypt_stat->key_size = 24 independently of encrypted_key_size, allowing crypto_skcipher_setkey() to succeed while encrypted_key_size exceeds ECRYPTFS_MAX_KEY_BYTES.
The PKI decryption path (parse_tag_65_packet) already validates decrypted_key_size <= ECRYPTFS_MAX_KEY_BYTES; the passphrase path omits this check.
Bound encrypted_key_size against ECRYPTFS_MAX_KEY_BYTES (64) rather than ECRYPTFS_MAX_ENCRYPTED_KEY_BYTES (512). The 64-byte limit also protects the 512-byte encrypted_key[] buffer, so the former 512-byte check is removed as redundant.
[tyhicks: Adjust the code comment to refer to macros representing the
buffer sizes rather than mentioning the buffer size values since they may change in the future]
--- fs/ecryptfs/keystore.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)
fs/ecryptfs/keystore.c +12 -2
@@ -1423,10 +1423,20 @@ parse_tag_3_packet(struct ecryptfs_crypt } (*new_auth_tok)->session_key.encrypted_key_size = (body_size - (ECRYPTFS_SALT_SIZE +5 )); +/* +* Although encrypted_key_size is copied into the +* encrypted_key[ECRYPTFS_MAX_ENCRYPTED_KEY_BYTES] buffer here, +* it later bounds operations on a smaller buffer: +* decrypt_passphrase_encrypted_session_key() sets decrypted_key_size = +* encrypted_key_size and decrypts into +* decrypted_key[ECRYPTFS_MAX_KEY_BYTES], then memcpy's into +* crypt_stat->key[ECRYPTFS_MAX_KEY_BYTES]. Limit to +* ECRYPTFS_MAX_KEY_BYTES to protect those smaller buffers. +*/ if ((*new_auth_tok)->session_key.encrypted_key_size - >ECRYPTFS_MAX_ENCRYPTED_KEY_BYTES ) { + >ECRYPTFS_MAX_KEY_BYTES ) {printk (KERN_WARNING "Tag 3 packet contains key larger " -"than ECRYPTFS_MAX_ENCRYPTED_KEY_BYTES\n" ); +"than ECRYPTFS_MAX_KEY_BYTES\n" ); rc = -EINVAL ; goto out_free; }
Greg Kroah-Hartman
maintainerPATCH 62/798 ecryptfs: reject too-small tag 70 packets
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yichong Chen <[email protected]>
commit e97bbe1b2bd82ec2ae37ad2e4965b4d3e78bbf7f upstream.
ecryptfs_parse_tag_70_packet() subtracts fixed metadata fields from the parsed packet body size to derive the encrypted filename size. A malformed packet with a body smaller than those fixed fields can underflow that size calculation.
Reject tag 70 packets before the subtraction unless the body contains the signature, cipher code, and at least one byte of encrypted filename data.
--- fs/ecryptfs/keystore.c | 6 ++++++ 1 file changed, 6 insertions(+)
fs/ecryptfs/keystore.c +6 -0
@@ -936,6 +936,12 @@ ecryptfs_parse_tag_70_packet(char **file "rc = [%d]\n", __func__, rc); goto out; } +if (s->parsed_tag_70_packet_size < (ECRYPTFS_SIG_SIZE +2 )) { +ecryptfs_printk (KERN_WARNING ,"Invalid packet size [%zd]\n" , + s->parsed_tag_70_packet_size); + rc = -EINVAL ; + goto out; + } s->block_aligned_filename_size = (s->parsed_tag_70_packet_size -ECRYPTFS_SIG_SIZE -1 ); if ((1 + s->packet_size_len + s->parsed_tag_70_packet_size)
Greg Kroah-Hartman
maintainerPATCH 63/798 ecryptfs: release message context on send failure
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yichong Chen <[email protected]>
commit 219644a3ad5518217b2d62cad6d2c36a2308c949 upstream.
ecryptfs_send_message_locked() moves a message context from the free list to the allocated list before sending the request to the userspace daemon.
If ecryptfs_send_miscdev() fails, the context is left on the allocated list and cannot be reused. Move it back to the free list on failure and clear the caller's pointer.
--- fs/ecryptfs/messaging.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
fs/ecryptfs/messaging.c +8 -1
@@ -283,9 +283,16 @@ ecryptfs_send_message_locked(char *data,mutex_unlock (&ecryptfs_msg_ctx_lists_mux); rc =ecryptfs_send_miscdev (data, data_len, *msg_ctx, msg_type,0 , daemon); -if (rc) +if (rc) {printk (KERN_ERR "%s: Error attempting to send message to " "userspace daemon; rc = [%d]\n" , __func__, rc); +mutex_lock (&ecryptfs_msg_ctx_lists_mux); +mutex_lock (&(*msg_ctx)->mux); +ecryptfs_msg_ctx_alloc_to_free (*msg_ctx); +mutex_unlock (&(*msg_ctx)->mux); +mutex_unlock (&ecryptfs_msg_ctx_lists_mux); + *msg_ctx =NULL ; + } out:return rc; }
Greg Kroah-Hartman
maintainerPATCH 64/798 ecryptfs: show filename encryption options
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yichong Chen <[email protected]>
commit 496ec2d0852a02d2e631771b5c439130b9c7dce7 upstream.
ecryptfs_show_options() prints most user-visible mount options but omits the filename encryption cipher and key size.
Print ecryptfs_fn_cipher and ecryptfs_fn_key_bytes when filename encryption is enabled so that the displayed mount options reflect the active filename encryption settings.
--- fs/ecryptfs/super.c | 7 +++++++ 1 file changed, 7 insertions(+)
fs/ecryptfs/super.c +7 -0
@@ -153,6 +153,13 @@ static int ecryptfs_show_options(structif (mount_crypt_stat->global_default_cipher_key_size)seq_printf (m,",ecryptfs_key_bytes=%zd" , mount_crypt_stat->global_default_cipher_key_size); +if (mount_crypt_stat->flags &ECRYPTFS_GLOBAL_ENCRYPT_FILENAMES ) { +seq_printf (m,",ecryptfs_fn_cipher=%s" , + mount_crypt_stat->global_default_fn_cipher_name); +if (mount_crypt_stat->global_default_fn_cipher_key_bytes) +seq_printf (m,",ecryptfs_fn_key_bytes=%zd" , + mount_crypt_stat->global_default_fn_cipher_key_bytes); + }if (mount_crypt_stat->flags &ECRYPTFS_PLAINTEXT_PASSTHROUGH_ENABLED )seq_printf (m,",ecryptfs_passthrough" );if (mount_crypt_stat->flags &ECRYPTFS_XATTR_METADATA_ENABLED )
Greg Kroah-Hartman
maintainerPATCH 65/798 fat: restore original value when fat_ent_write failed
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yemu Lu <[email protected]>
commit 64d9183203eebe33de6188b70a8c1e91f52885db upstream.
fat_ent_write() may have committed the new link to the primary FAT but then failed on the mirror copy, leaving the chain pointing to new_dclus even though the caller will free it. Restore the original value to keep the chain consistent.
--- fs/fat/misc.c | 4 ++++ 1 file changed, 4 insertions(+)
fs/fat/misc.c +4 -0
@@ -127,7 +127,11 @@ int fat_chain_add(struct inode *inode, i ret =fat_ent_read (inode, &fatent, last);if (ret >=0 ) {int wait =inode_needs_sync (inode); +int old = ret; + ret =fat_ent_write (inode, &fatent, new_dclus, wait); +if (ret <0 ) +fat_ent_write (inode, &fatent, old, wait);fatent_brelse (&fatent); }if (ret <0 )
Greg Kroah-Hartman
maintainerPATCH 66/798 fbdev: omapfb: panel-dsi-cm: initialize lock before registering display
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Runyu Xiao <[email protected]>
commit f8e43fe0f22b7137ce456e6fe3581d3098174f74 upstream.
dsicm_probe() registers the display before initializing ddata->lock. Once omapdss_register_display() publishes the display, another consumer can reach a dsicm callback that takes this mutex while it is still uninitialized.
Initialize the mutex before registering the display so the published callbacks always see a valid lock.
--- drivers/video/fbdev/omap2/omapfb/displays/panel-dsi-cm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/video/fbdev/omap2/omapfb/displays/panel-dsi-cm.c +2 -2
@@ -1190,14 +1190,14 @@ static int dsicm_probe(struct platform_d dssdev->caps =OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE |OMAP_DSS_DISPLAY_CAP_TEAR_ELIM ; +mutex_init (&ddata->lock); + r =omapdss_register_display (dssdev);if (r) {dev_err (dev,"Failed to register panel\n" ); goto err_reg; } -mutex_init (&ddata->lock); -atomic_set (&ddata->do_update,0 );if (gpio_is_valid (ddata->reset_gpio)) {
Greg Kroah-Hartman
maintainerPATCH 67/798 fbdev: pvr2fb: correct user pointer annotation and sentinel initializer
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Florian Fuchs <[email protected]>
commit 5dc2e70dd74b1f03e2e13bfb6922111d9e0adf90 upstream.
Add __user annotation to buf, as it is passed as a user pointer in pin_user_pages_fast(). Use an empty initializer for the sentinel board-table entry to avoid initializing a function pointer with an integer literal.
--- drivers/video/fbdev/pvr2fb.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/video/fbdev/pvr2fb.c +2 -2
@@ -638,7 +638,7 @@ static irqreturn_t __maybe_unused pvr2fb }#ifdef CONFIG_PVR2_DMA -static ssize_t pvr2fb_write (struct fb_info *info,const char *buf, +static ssize_t pvr2fb_write (struct fb_info *info,const char __user *buf,size_t count,loff_t *ppos) {unsigned long dst, start, end, len;
@@ -1068,7 +1068,7 @@ static struct pvr2_board { #ifdef CONFIG_PCI { pvr2fb_pci_init, pvr2fb_pci_exit, "PCI PVR2" }, #endif - { 0, }, + { }, }; static int __init pvr2fb_init(void)
Greg Kroah-Hartman
maintainerPATCH 68/798 fbdev: uvesafb: unregister connector callback on init failure
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Myeonghun Pak <[email protected]>
commit de8db23aa7c337e606fca9faf48b3ba72968597a upstream.
uvesafb_init() registers the v86d connector callback before registering the platform driver. If platform_driver_register() fails, the function returns the error directly and leaves the connector callback registered.
The later platform-device failure path already unregisters the callback. Add the same cleanup before the final return when platform-driver registration fails.
This issue was identified during our ongoing static-analysis research while reviewing kernel code.
--- drivers/video/fbdev/uvesafb.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/video/fbdev/uvesafb.c +2 -0
@@ -1915,6 +1915,8 @@ static int uvesafb_init(void) err =0 ; } } +if (err) +cn_del_callback (&uvesafb_cn_id);return err; }
Greg Kroah-Hartman
maintainerPATCH 69/798 forcedeth: fix off-by-one when saving/restoring non-PCI config space
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marek Czernohous <[email protected]>
commit 9393f1d656a79693e0c123ff7bc7c5c0f708046d upstream.
nv_suspend() and nv_resume() walk the non-PCI configuration space with
for (i = 0; i <= np->register_size/sizeof(u32); i++)
which runs one iteration too many. saved_config_space is declared as
u32 saved_config_space[NV_PCI_REGSZ_MAX/4];
and NV_PCI_REGSZ_VER3 is equal to NV_PCI_REGSZ_MAX (0x604), so on a VER3 device register_size/sizeof(u32) is exactly the array length and the last iteration addresses one element past the end.
The element it lands on is np->name_rx[0..3]: saved_config_space[] is followed immediately by char name_rx[IFNAMSIZ + 3], and char needs no padding. Nothing observable is corrupted by that, because nv_request_irq() rewrites name_rx with sprintf() before it is ever passed to request_irq(). The bug is the out-of-bounds access itself, which UBSAN reports and which CONFIG_UBSAN_TRAP=y turns into a trap that aborts the running kernel code, plus an MMIO read and, on resume, an MMIO writel() to base + 0x604, one dword past the range the driver mapped:
np->base = ioremap(addr, np->register_size);
VER1 and VER2 devices stay inside the array, but they too get the stray read and the stray write one dword past their own window.
Caught by UBSAN on an Apple Macmini3,1 (MCP79) during a deep S3 cycle. The splat below is trimmed: the build path in the file name, the CPU and taint lines, the Workqueue line, the "?" hint frames, and the frames below device_suspend are all cut. The kernel was tainted, with an out-of-tree nouveau and CPU_OUT_OF_SPEC; forcedeth itself was the stock module.
UBSAN: array-index-out-of-bounds in drivers/net/ethernet/nvidia/forcedeth.c:6225:25 index 385 is out of range for type 'u32 [385]' Call Trace: dump_stack_lvl+0x5d/0x80 ubsan_epilogue+0x5/0x2b __ubsan_handle_out_of_bounds.cold+0x54/0x59 __this_module+0xe398c/0xe9010 [forcedeth] pci_pm_suspend+0x80/0x170 dpm_run_callback+0x51/0x160 device_suspend+0x1a2/0x4a0 ...
Both loops are hit. UBSAN reports each source location only once per module load (__ubsan_handle_out_of_bounds() calls suppress_report(), which does test_and_set_bit(REPORTED_BIT, ...) on the struct source_location), so the two splats land in the first S3 cycle after the module is loaded and later cycles are silent even though the access still runs off the end every time. In that first cycle line 6225 is reported from pci_pm_suspend and line 6240 from pci_pm_resume.
The same off-by-one was fixed in nv_get_regs() by commit ba9aa134287f ("forcedeth: fix buffer overflow") in 2012; these two loops were missed. The suspend and resume side was reported on LKML in September 2013 by Marc Weber, with the same analysis and the same one-character fix, but the patch was attached rather than sent inline and the thread ended there.
Use < instead of <=, which saves and restores exactly register_size bytes.
--- drivers/net/ethernet/nvidia/forcedeth.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/nvidia/forcedeth.c +2 -2
@@ -6233,7 +6233,7 @@ static int nv_suspend(struct device *devnetif_device_detach (dev);/* save non-pci configuration space */ -for (i =0 ; i <= np->register_size/sizeof (u32); i++) +for (i =0 ; i < np->register_size/sizeof (u32); i++) np->saved_config_space[i] =readl (base + i*sizeof (u32));return 0 ;
@@ -6248,7 +6248,7 @@ static int nv_resume(struct device *deviint i, rc =0 ;/* restore non-pci configuration space */ -for (i =0 ; i <= np->register_size/sizeof (u32); i++) +for (i =0 ; i < np->register_size/sizeof (u32); i++)writel (np->saved_config_space[i], base+i*sizeof (u32));if (np->driver_data &DEV_NEED_MSI_FIX )
Greg Kroah-Hartman
maintainerPATCH 70/798 fpga: stratix10-soc: Fix SVC mailbox handling during reconfiguration
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tien Sung Ang <[email protected]>
commit c14a8b15c87b49efc3ef898cec8ac7c30336a080 upstream.
Fix incorrect stratix10_svc_done() usage during FPGA reconfiguration.
Do not call stratix10_svc_done() at the end of write_init() on success, so the SVC session remains active through write() and write_complete(). Call stratix10_svc_done() on failure in write_init() and write() so the shared SVC mailbox is released when reconfiguration aborts, allowing coexistence with other SVC clients such as soc64-hwmon.
--- drivers/fpga/stratix10-soc.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-)
drivers/fpga/stratix10-soc.c +12 -9
@@ -194,20 +194,18 @@ static int s10_ops_write_init(struct fpg ret =s10_svc_send_msg (priv,COMMAND_RECONFIG , &ctype,sizeof (ctype));if (ret <0 ) - goto init_done; + goto init_error; - ret =wait_for_completion_timeout ( - &priv->status_return_completion,S10_RECONFIG_TIMEOUT ); -if (!ret) { +if (!wait_for_completion_timeout (&priv->status_return_completion, +S10_RECONFIG_TIMEOUT )) {dev_err (dev,"timeout waiting for RECONFIG_REQUEST\n" ); ret = -ETIMEDOUT ; - goto init_done; + goto init_error; } - ret =0 ;if (!test_and_clear_bit (SVC_STATUS_OK , &priv->status)) { ret = -ETIMEDOUT ; - goto init_done; + goto init_error; }/* Allocate buffers from the service layer's pool. */
@@ -216,14 +214,16 @@ static int s10_ops_write_init(struct fpgif (IS_ERR (kbuf)) {s10_free_buffers (mgr); ret =PTR_ERR (kbuf); - goto init_done; + goto init_error; } priv->svc_bufs[i].buf = kbuf; priv->svc_bufs[i].lock =0 ; } -init_done: +return 0 ; + +init_error:stratix10_svc_done (priv->chan);return ret; }
@@ -341,6 +341,9 @@ static int s10_ops_write(struct fpga_manif (!s10_free_buffers (mgr))dev_err (dev,"%s not all buffers were freed\n" , __func__); +if (ret <0 ) +stratix10_svc_done (priv->chan); +return ret; }
Greg Kroah-Hartman
maintainerPATCH 71/798 hsi: omap_ssi_core: fix missing DMA mask setup for SSI controller device
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ivaylo Dimitrov <[email protected]>
commit e81250ec6b69248b00d38c523dc6a13efaf38aab upstream.
The OMAP SSI driver uses a synthetic HSI controller device allocated via hsi_alloc_controller(), which does not go through the normal OF/platform device initialization path.
As a result, the embedded struct device does not have a DMA mask initialized by default.
After recent DMA API hardening changes, dma_map_sg() and related helpers now require a valid dma_mask to be present, otherwise the driver may crash or trigger warnings when attempting DMA mapping operations.
Fix this by explicitly initializing the DMA mask for the SSI controller device and setting a 32-bit DMA mask, which matches the hardware capabilities.
--- drivers/hsi/controllers/omap_ssi_core.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/hsi/controllers/omap_ssi_core.c +6 -0
@@ -509,6 +509,12 @@ static int ssi_probe(struct platform_devpm_runtime_enable (&pd->dev); + ssi->device.dma_mask = &ssi->device.coherent_dma_mask; + + err =dma_set_mask_and_coherent (&ssi->device,DMA_BIT_MASK (32 )); +if (err) + goto out2; + err =ssi_hw_init (ssi);if (err <0 ) goto out2;
Greg Kroah-Hartman
maintainerPATCH 72/798 alpha/PCI: Fix I/O port accessor argument order in pci_legacy_write()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krzysztof Wilczyński <[email protected]>
commit 651fb94aaf245430590216d497fb8b02dd73d5f9 upstream.
pci_legacy_write() in arch/alpha/kernel/pci-sysfs.c passes its arguments to outb(), outw() and outl() in the wrong order:
outb(port, val);
The Alpha I/O accessors in arch/alpha/include/asm/io.h take the value first and the port second:
extern void outb(u8 b, unsigned long port);
So the port number is written as data to the I/O address taken from the user-supplied value, and the intended write to the requested port never happens.
The arguments have been reversed since the file was added, and the function returns the access size regardless, so the caller sees success while the requested port is left untouched.
--- arch/alpha/kernel/pci-sysfs.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
arch/alpha/kernel/pci-sysfs.c +3 -3
@@ -360,17 +360,17 @@ int pci_legacy_write(struct pci_bus *busswitch (size) {case 1 : -outb (port, val); +outb (val, port);return 1 ;case 2 :if (port &1 )return -EINVAL ; -outw (port, val); +outw (val, port);return 2 ;case 4 :if (port &3 )return -EINVAL ; -outl (port, val); +outl (val, port);return 4 ; }return -EINVAL ;
Greg Kroah-Hartman
maintainerPATCH 73/798 alpha: marvel: Fix irq_set_status_flags to use correct IRQ number
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matt Turner <[email protected]>
commit 3a3ac1f6c6a67b3803f2643584310f78301e58a8 upstream.
Pass base + i to irq_set_status_flags() to match the IRQ number used in irq_set_chip_and_handler(). Previously, IRQ_LEVEL was set on the wrong (low-numbered) IRQ descriptors rather than the IO7 IRQs at base + i.
--- arch/alpha/kernel/sys_marvel.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/alpha/kernel/sys_marvel.c +2 -2
@@ -275,7 +275,7 @@ init_io7_irqs(struct io7 *io7,/* Set up the lsi irqs. */ for (i =0 ; i <128 ; ++i) {irq_set_chip_and_handler (base + i, lsi_ops, handle_level_irq); -irq_set_status_flags (i,IRQ_LEVEL ); +irq_set_status_flags (base + i,IRQ_LEVEL ); }/* Disable the implemented irqs in hardware. */
@@ -289,7 +289,7 @@ init_io7_irqs(struct io7 *io7,/* Set up the msi irqs. */ for (i =128 ; i < (128 +512 ); ++i) {irq_set_chip_and_handler (base + i, msi_ops, handle_level_irq); -irq_set_status_flags (i,IRQ_LEVEL ); +irq_set_status_flags (base + i,IRQ_LEVEL ); }for (i =0 ; i <16 ; ++i)
Greg Kroah-Hartman
maintainerPATCH 74/798 alpha: marvel: Fix lock ordering in init_io7_irqs()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matt Turner <[email protected]>
commit 24d68db713d63dfe3660c56b50e887784844baea upstream.
Move irq_set_chip_and_handler() and irq_set_status_flags() calls outside the io7->irq_lock raw spinlock. These functions take sparse_irq_lock, which is a mutex, and taking a sleeping lock while holding a raw spinlock is invalid. The raw spinlock only needs to protect the hardware CSR accesses.
This fixes the following lockdep splat during boot:
[ BUG: Invalid wait context ]
swapper/0/0 is trying to lock:
sparse_irq_lock{....}-{4:4}, at: irq_mark_irq
other info that might help us debug this:
context-{5:5}
1 lock held by swapper/0/0:
#0: &io7->irq_lock{....}-{2:2}, at: init_io7_irqs.constprop.0
--- arch/alpha/kernel/sys_marvel.c | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-)
arch/alpha/kernel/sys_marvel.c +12 -13
@@ -263,6 +263,18 @@ init_io7_irqs(struct io7 *io7,*/ printk (" Interrupts reported to CPU at PE %u\n" , boot_cpuid); +/* Set up the lsi irqs. */ +for (i =0 ; i <128 ; ++i) { +irq_set_chip_and_handler (base + i, lsi_ops, handle_level_irq); +irq_set_status_flags (base + i,IRQ_LEVEL ); + } + +/* Set up the msi irqs. */ +for (i =128 ; i < (128 +512 ); ++i) { +irq_set_chip_and_handler (base + i, msi_ops, handle_level_irq); +irq_set_status_flags (base + i,IRQ_LEVEL ); + } +raw_spin_lock (&io7->irq_lock);/* set up the error irqs */
@@ -272,12 +284,6 @@ init_io7_irqs(struct io7 *io7,io7_redirect_irq (io7, &io7->csrs->STV_CTL.csr, boot_cpuid);io7_redirect_irq (io7, &io7->csrs->HEI_CTL.csr, boot_cpuid); -/* Set up the lsi irqs. */ -for (i =0 ; i <128 ; ++i) { -irq_set_chip_and_handler (base + i, lsi_ops, handle_level_irq); -irq_set_status_flags (base + i,IRQ_LEVEL ); - } -/* Disable the implemented irqs in hardware. */ for (i =0 ; i <0x60 ; ++i)init_one_io7_lsi (io7, i, boot_cpuid);
@@ -285,13 +291,6 @@ init_io7_irqs(struct io7 *io7,init_one_io7_lsi (io7,0x74 , boot_cpuid);init_one_io7_lsi (io7,0x75 , boot_cpuid); - -/* Set up the msi irqs. */ -for (i =128 ; i < (128 +512 ); ++i) { -irq_set_chip_and_handler (base + i, msi_ops, handle_level_irq); -irq_set_status_flags (base + i,IRQ_LEVEL ); - } -for (i =0 ; i <16 ; ++i)init_one_io7_msi (io7, i, boot_cpuid);
Greg Kroah-Hartman
maintainerPATCH 75/798 ata: libata-scsi: fix DSM TRIM for sector sizes larger than 2048 bytes
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Niklas Cassel <[email protected]>
commit 79cce911e623c0baa0fde307ce3a434e084b881a upstream.
ata_scsi_write_same_xlat() translates a SCSI WRITE SAME command with the UNMAP bit set into an ATA DATA SET MANAGEMENT TRIM command. The TRIM descriptor is built by ata_format_dsm_trim_descr() into the 2048-byte ata_scsi_rbuf staging buffer, and the number of bytes copied is compared against the logical sector size by the caller:
size = ata_format_dsm_trim_descr(scmd, trmax, block, n_block); if (size != len) /* len == sdp->sector_size */ goto invalid_param_len;
ata_format_dsm_trim_descr() clamps the copy length to ATA_SCSI_RBUF_SIZE (2048). On a device whose logical sector size exceeds that (e.g. a 4Kn device, where sector_size == 4096) the function can never return more than 2048, while the caller expects it to return sector_size. The comparison therefore always fails, so every TRIM is rejected with "Parameter list length error" and WARN_ON() splats on each attempt. TRIM / discard is thus completely broken on such devices.
The descriptor was incorrectly sized from the logical sector size. A DSM TRIM payload is a list of 512-byte pages, each holding up to ATA_MAX_TRIM_RNUM (64) LBA Range Entries, and is independent of the logical sector size. The Block Limits VPD page already advertises a single such page as the maximum WRITE SAME length (65535 * ATA_MAX_TRIM_RNUM logical blocks), so the block layer never sends a request that needs more than one page.
Emit exactly one 512-byte page, independent of the logical sector size, and transfer only that page (COUNT == 1). For a 512-byte-sector device this is unchanged; devices with larger logical sectors now work instead of failing every TRIM.
--- drivers/ata/libata-scsi.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-)
drivers/ata/libata-scsi.c +14 -14
@@ -3149,17 +3149,13 @@ static unsigned int ata_scsi_pass_thru(sstatic size_t ata_format_dsm_trim_descr (struct scsi_cmnd *cmd,u32 trmax,u64 sector,u32 count) { -struct scsi_device *sdp = cmd->device; -size_t len = sdp->sector_size; +size_t len =ATA_SECT_SIZE ;size_t r;__le64 *buf;u32 i =0 ;unsigned long flags; -WARN_ON (len >ATA_SCSI_RBUF_SIZE ); - -if (len >ATA_SCSI_RBUF_SIZE ) - len =ATA_SCSI_RBUF_SIZE ; +BUILD_BUG_ON (ATA_SECT_SIZE >ATA_SCSI_RBUF_SIZE );spin_lock_irqsave (&ata_scsi_rbuf_lock, flags); buf = ((void *)ata_scsi_rbuf);
@@ -3194,13 +3190,11 @@ static unsigned int ata_scsi_write_same_ {struct ata_taskfile *tf = &qc->tf;struct scsi_cmnd *scmd = qc->scsicmd; -struct scsi_device *sdp = scmd->device; -size_t len = sdp->sector_size;struct ata_device *dev = qc->dev;const u8 *cdb = scmd->cmnd;u64 block;u32 n_block; -const u32 trmax = len >>3 ; +const u32 trmax =ATA_MAX_TRIM_RNUM ;u32 size;u16 fp;u8 bp =0xff ;
@@ -3245,13 +3239,13 @@ static unsigned int ata_scsi_write_same_ goto invalid_param_len;/* -* size must match sector size in bytes -* For DATA SET MANAGEMENT TRIM in ACS-2 nsect (aka count) -* is defined as number of 512 byte blocks to be transferred. +* The TRIM descriptor is a single 512-byte page, which is the maximum +* WRITE SAME length advertised in the Block Limits VPD page. For DATA +* SET MANAGEMENT TRIM the COUNT field (aka nsect) is the number of +* 512-byte blocks to be transferred. */ - size =ata_format_dsm_trim_descr (scmd, trmax, block, n_block); -if (size != len) +if (size !=ATA_SECT_SIZE ) goto invalid_param_len;if (ata_ncq_enabled (dev) &&ata_fpdma_dsm_supported (dev)) {
@@ -3277,6 +3271,12 @@ static unsigned int ata_scsi_write_same_ATA_TFLAG_WRITE ;ata_qc_set_pc_nbytes (qc); +/* +* The DSM TRIM payload is a single 512-byte page, which may be smaller +* than the WRITE SAME data-out buffer (one logical block); only +* transfer that page so the length matches the COUNT field. +*/ + qc->nbytes = size;return 0 ;
Greg Kroah-Hartman
maintainerPATCH 76/798 Bluetooth: btusb: Add ASUS USB-BT540 for Realtek 8761CU
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christoph Zwerschke <[email protected]>
commit 980084de4d9b25193398d89a1c0430ba3501b683 upstream.
Add the vendor/product ID (0x0b05, 0x1bef) to the usb_device_id table for the Realtek RTL8761CU-based ASUS USB-BT540 adapter. It binds via the generic Bluetooth class today, so BTUSB_REALTEK is never set and the rtl8761cu firmware is not loaded, leaving the controller non-functional. With the entry the driver loads rtl_bt/rtl8761cu_fw.bin (already shipped by linux-firmware) and the adapter works (tested: A2DP and ASHA).
Similar to commit bc597f0cc44f
("Bluetooth: btusb: Add TP-Link UB600 for Realtek 8761BUV").
Device info from /sys/kernel/debug/usb/devices:
T: Bus=01 Lev=01 Prnt=01 Port=01 Cnt=01 Dev#= 22 Spd=12 MxCh= 0 D: Ver= 1.10 Cls=e0(wlcon) Sub=01 Prot=01 MxPS=64 #Cfgs= 1 P: Vendor=0b05 ProdID=1bef Rev= 2.00 S: Manufacturer=Realtek S: Product=Bluetooth Controller C:* #Ifs= 2 Cfg#= 1 Atr=e0 MxPwr=100mA I:* If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=81(I) Atr=03(Int.) MxPS= 64 Ivl=1ms E: Ad=02(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms E: Ad=82(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms I:* If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 0 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 0 Ivl=1ms I: If#= 1 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 9 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 9 Ivl=1ms I: If#= 1 Alt= 2 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 17 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 17 Ivl=1ms I: If#= 1 Alt= 3 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 25 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 25 Ivl=1ms I: If#= 1 Alt= 4 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 33 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 33 Ivl=1ms I: If#= 1 Alt= 5 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 49 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 49 Ivl=1ms I: If#= 1 Alt= 6 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 63 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 63 Ivl=1ms
--- drivers/bluetooth/btusb.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/bluetooth/btusb.c +4 -0
@@ -481,6 +481,10 @@ static const struct usb_device_id blackl { USB_DEVICE(0x0bda, 0xb009), .driver_info = BTUSB_REALTEK }, { USB_DEVICE(0x2ff8, 0xb011), .driver_info = BTUSB_REALTEK }, + /* Additional Realtek 8761CU Bluetooth devices */ + { USB_DEVICE(0x0b05, 0x1bef), .driver_info = BTUSB_REALTEK | + BTUSB_WIDEBAND_SPEECH }, + /* Additional Realtek 8821AE Bluetooth devices */ { USB_DEVICE(0x0b05, 0x17dc), .driver_info = BTUSB_REALTEK }, { USB_DEVICE(0x13d3, 0x3414), .driver_info = BTUSB_REALTEK },
Greg Kroah-Hartman
maintainerPATCH 77/798 Bluetooth: btusb: Add ASUS USB-BT600 for Realtek 8761CU
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christoph Zwerschke <[email protected]>
commit 6f0624b4427e38c3bb63a951c536cf8adaee1238 upstream.
Add the vendor/product ID (0x0b05, 0x1d70) to the usb_device_id table for the Realtek RTL8761CU-based ASUS USB-BT600 adapter. It binds via the generic Bluetooth class today, so BTUSB_REALTEK is never set and the rtl8761cu firmware is not loaded, leaving the controller non-functional. With the entry the driver loads rtl_bt/rtl8761cu_fw.bin (already shipped by linux-firmware) and the adapter works (tested: A2DP and ASHA).
Similar to commit bc597f0cc44f
("Bluetooth: btusb: Add TP-Link UB600 for Realtek 8761BUV").
Device info from /sys/kernel/debug/usb/devices:
T: Bus=01 Lev=01 Prnt=01 Port=01 Cnt=01 Dev#= 23 Spd=12 MxCh= 0 D: Ver= 1.10 Cls=e0(wlcon) Sub=01 Prot=01 MxPS=64 #Cfgs= 1 P: Vendor=0b05 ProdID=1d70 Rev= 2.00 S: Manufacturer=Realtek S: Product=Bluetooth Controller C:* #Ifs= 2 Cfg#= 1 Atr=e0 MxPwr=100mA I:* If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=81(I) Atr=03(Int.) MxPS= 64 Ivl=1ms E: Ad=02(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms E: Ad=82(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms I:* If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 0 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 0 Ivl=1ms I: If#= 1 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 9 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 9 Ivl=1ms I: If#= 1 Alt= 2 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 17 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 17 Ivl=1ms I: If#= 1 Alt= 3 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 25 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 25 Ivl=1ms I: If#= 1 Alt= 4 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 33 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 33 Ivl=1ms I: If#= 1 Alt= 5 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 49 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 49 Ivl=1ms I: If#= 1 Alt= 6 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 63 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 63 Ivl=1ms
--- drivers/bluetooth/btusb.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/bluetooth/btusb.c +2 -0
@@ -484,6 +484,8 @@ static const struct usb_device_id blackl/* Additional Realtek 8761CU Bluetooth devices */ { USB_DEVICE(0x0b05, 0x1bef), .driver_info = BTUSB_REALTEK | BTUSB_WIDEBAND_SPEECH }, + { USB_DEVICE(0x0b05, 0x1d70), .driver_info = BTUSB_REALTEK | + BTUSB_WIDEBAND_SPEECH }, /* Additional Realtek 8821AE Bluetooth devices */ { USB_DEVICE(0x0b05, 0x17dc), .driver_info = BTUSB_REALTEK },
Greg Kroah-Hartman
maintainerPATCH 78/798 bnx2x: fix double free in bnx2x_init_firmware() error path
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiangshan Yi <[email protected]>
commit d2796ffe38cb4155afe0eab23636295b096c27a5 upstream.
bnx2x_init_firmware() frees bp->init_ops, bp->init_data and bp->init_ops_offsets in its error path without setting them to NULL. The cleanup function bnx2x_release_firmware() frees the same three pointers unconditionally, so if init_firmware fails and release_firmware is later called (e.g. from __bnx2x_remove or through the function state machine), all three are freed a second time.
Set each pointer to NULL after kfree() in the error path so that the subsequent kfree(NULL) in bnx2x_release_firmware() is a safe no-op.
--- drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +3 -0
@@ -13548,10 +13548,13 @@ static int bnx2x_init_firmware(struct bn iro_alloc_err:kfree (bp->init_ops_offsets); + bp->init_ops_offsets =NULL ; init_offsets_alloc_err:kfree (bp->init_ops); + bp->init_ops =NULL ; init_ops_alloc_err:kfree (bp->init_data); + bp->init_data =NULL ; request_firmware_exit:release_firmware (bp->firmware); bp->firmware =NULL ;
Greg Kroah-Hartman
maintainerPATCH 79/798 dm-era: fix shadowed superblock leak on take-snap failure
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: liyouhong <[email protected]>
commit 39c5aa3bd8ec3912d2cd0b3fe092642b0d2b0713 upstream.
metadata_take_snap() bumps the live superblock refcount and then dm_tm_shadow_block() allocates a new block for the metadata snapshot. If the subsequent dm_sm_inc_block() of writeset_tree_root or era_array_root fails, the function only unlocks the clone and returns. The newly allocated shadow block is never returned to the metadata space map, so each failed take-snap permanently leaks one metadata block.
Free the clone with dm_sm_dec_block() on those error paths, matching the final step of metadata_drop_snap().
--- drivers/md/dm-era-target.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/md/dm-era-target.c +5 -0
@@ -1015,6 +1015,7 @@ static int metadata_checkpoint(struct erstatic int metadata_take_snap (struct era_metadata *md) {int r, inc; +dm_block_t location;struct dm_block *clone;if (md->metadata_snap !=SUPERBLOCK_LOCATION ) {
@@ -1052,7 +1053,9 @@ static int metadata_take_snap(struct era r =dm_sm_inc_block (md->sm, md->writeset_tree_root);if (r) {DMERR ("%s: couldn't inc writeset tree root" , __func__); + location =dm_block_location (clone);dm_tm_unlock (md->tm, clone); +dm_sm_dec_block (md->sm, location);return r; }
@@ -1060,7 +1063,9 @@ static int metadata_take_snap(struct eraif (r) {DMERR ("%s: couldn't inc era tree root" , __func__);dm_sm_dec_block (md->sm, md->writeset_tree_root); + location =dm_block_location (clone);dm_tm_unlock (md->tm, clone); +dm_sm_dec_block (md->sm, location);return r; }
Greg Kroah-Hartman
maintainerPATCH 80/798 dm raid1: reserve space for NUL-terminator in build_constructor_string()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ilya Krutskih <[email protected]>
commit 73c37fe54cd056d07461b142ab0b8b81e1ef6ad8 upstream.
Reserve space for the termination NUL after the maximum 20 decimal digits of a long long value to avoid buffer overflow in sprintf().
--- drivers/md/dm-log-userspace-base.c | 1 + 1 file changed, 1 insertion(+)
drivers/md/dm-log-userspace-base.c +1 -0
@@ -138,6 +138,7 @@ static int build_constructor_string(stru str_size +=strlen (argv[i]) +1 ;/* +1 for space between args */ str_size +=20 ;/* Max number of chars in a printed u64 number */ + str_size++;/* For NUL-terminator */ str =kzalloc (str_size,GFP_KERNEL );if (!str) {
Greg Kroah-Hartman
maintainerPATCH 81/798 dm array: reject an array block whose value size is not the callers
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bryam Vargas <[email protected]>
commit 4538a287bdf5d0f9a379c678e5262b9f5783f547 upstream.
array_block_check() can only compare the header against itself, so a block with value_size 4 and max_entries 1018 is internally consistent and passes. dm-cache keeps two arrays -- mappings at 8 bytes and hints at 4 -- and the roots for both live in the superblock. Point the mappings root at a hint block and __load_mappings() walks it through an info whose value size is 8, so element_at() strides 8 bytes over 4-byte entries and reaches offset 8160 of a 4096-byte block.
get_ablock() and __shadow_ablock() are the two places that hold the block and the caller at once. Reject there when the two value sizes disagree. Arrays only ever read their own blocks, so this fires on crafted metadata only.
--- drivers/md/persistent-data/dm-array.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)
drivers/md/persistent-data/dm-array.c +16 -0
@@ -227,6 +227,14 @@ static int get_ablock(struct dm_array_inreturn r; *ab =dm_block_data (*block); +if (le32_to_cpu ((*ab)->value_size) != info->value_type.size) { +DMERR_LIMIT ("%s failed: value_size %u != wanted %u" , __func__, +le32_to_cpu ((*ab)->value_size), + info->value_type.size); +dm_tm_unlock (info->btree_info.tm, *block); +return -EILSEQ ; + } +return 0 ; }
@@ -289,6 +297,14 @@ static int __shadow_ablock(struct dm_arrreturn r; *ab =dm_block_data (*block); +if (le32_to_cpu ((*ab)->value_size) != info->value_type.size) { +DMERR_LIMIT ("%s failed: value_size %u != wanted %u" , __func__, +le32_to_cpu ((*ab)->value_size), + info->value_type.size); +dm_tm_unlock (info->btree_info.tm, *block); +return -EILSEQ ; + } +if (inc)inc_ablock_entries (info, *ab);
Greg Kroah-Hartman
maintainerPATCH 82/798 cpufreq: schedutil: Fix rate limit overflow
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hui Su <[email protected]>
commit 3bff8f8e95fdc6ad19c8a1a8f87029094747e4bf upstream.
rate_limit_us is an unsigned int, while NSEC_PER_USEC is defined as 1000L. On 32-bit systems, the multiplication is therefore performed using 32-bit unsigned arithmetic before the result is assigned to freq_update_delay_ns.
For example, writing 4294968 to rate_limit_us wraps the delay from 4294968000 ns to 704 ns. This makes schedutil update far more often than configured.
Add sugov_update_rate_limit_us() to widen rate_limit_us to s64 before converting it to nanoseconds. Use the helper when updating the tunable through sysfs and when starting the governor, so both paths perform the conversion without overflow.
--- kernel/sched/cpufreq_schedutil.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-)
kernel/sched/cpufreq_schedutil.c +13 -2
@@ -66,6 +66,17 @@ static DEFINE_PER_CPU(struct sugov_cpu,/************************ Governor internals ***********************/ +static void sugov_update_rate_limit_us (struct sugov_policy *sg_policy) +{ +/* +* Cast rate_limit_us before multiplication to force 64-bit arithmetic. +* Otherwise, on 32-bit platforms, both operands are converted to +* 32-bit unsigned long and the multiplication may overflow. +*/ + sg_policy->freq_update_delay_ns = + (s64 )sg_policy->tunables->rate_limit_us *NSEC_PER_USEC ; +} +static bool sugov_should_update_freq (struct sugov_policy *sg_policy,u64 time) {s64 delta_ns;
@@ -618,7 +629,7 @@ rate_limit_us_store(struct gov_attr_set tunables->rate_limit_us = rate_limit_us;list_for_each_entry (sg_policy, &attr_set->policy_list, tunables_hook) - sg_policy->freq_update_delay_ns = rate_limit_us *NSEC_PER_USEC ; +sugov_update_rate_limit_us (sg_policy);return count; }
@@ -848,7 +859,7 @@ static int sugov_start(struct cpufreq_postruct sugov_policy *sg_policy = policy->governor_data;unsigned int cpu; - sg_policy->freq_update_delay_ns = sg_policy->tunables->rate_limit_us *NSEC_PER_USEC ; +sugov_update_rate_limit_us (sg_policy); sg_policy->last_freq_update_time =0 ; sg_policy->next_freq =0 ; sg_policy->work_in_progress = false;
Greg Kroah-Hartman
maintainerPATCH 83/798 Bluetooth: hci_bcm: fix usage_count leak when autosuspend_delay is negative
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guangshuo Li <[email protected]>
commit dc6b7c771a963e20aedf4a21ffa22543b9837ba8 upstream.
bcm_request_irq() calls pm_runtime_use_autosuspend(), but bcm_close() does not call the matching pm_runtime_dont_use_autosuspend() when tearing down runtime PM.
If the autosuspend delay is set to a negative value while autosuspend is enabled, the runtime PM core increments usage_count to prevent runtime suspend. Without calling pm_runtime_dont_use_autosuspend() during driver teardown, this reference is not dropped and usage_count remains unbalanced.
Add the missing pm_runtime_dont_use_autosuspend() call before disabling runtime PM.
This issue was found by manual code inspection.
--- drivers/bluetooth/hci_bcm.c | 1 + 1 file changed, 1 insertion(+)
drivers/bluetooth/hci_bcm.c +1 -0
@@ -520,6 +520,7 @@ static int bcm_close(struct hci_uart *huif (IS_ENABLED (CONFIG_PM ) && bdev->irq_acquired) {devm_free_irq (bdev->dev, bdev->irq, bdev);device_init_wakeup (bdev->dev, false); +pm_runtime_dont_use_autosuspend (bdev->dev);pm_runtime_disable (bdev->dev); }
Greg Kroah-Hartman
maintainerPATCH 84/798 Bluetooth: hci_uart: Fix false success return in hci_uart_setup()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gongwei Li <[email protected]>
commit a9355799343e10014f2acfd4b6844d2335ecafea upstream.
When reading the local version information for vendor detection fails, the error is only printed and 0 is returned, which masks the setup failure from the HCI core.
Return PTR_ERR(skb) instead.
--- drivers/bluetooth/hci_ldisc.c | 2 +- drivers/bluetooth/hci_serdev.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
drivers/bluetooth/hci_ldisc.c +1 -1
@@ -445,7 +445,7 @@ static int hci_uart_setup(struct hci_devif (IS_ERR (skb)) {BT_ERR ("%s: Reading local version information failed (%ld)" , hdev->name,PTR_ERR (skb)); -return 0 ; +return PTR_ERR (skb); }if (skb->len !=sizeof (*ver)) {
drivers/bluetooth/hci_serdev.c +1 -1
@@ -221,7 +221,7 @@ static int hci_uart_setup(struct hci_devif (IS_ERR (skb)) {bt_dev_err (hdev,"Reading local version info failed (%ld)" ,PTR_ERR (skb)); -return 0 ; +return PTR_ERR (skb); }if (skb->len !=sizeof (*ver))
Greg Kroah-Hartman
maintainerPATCH 85/798 Bluetooth: RFCOMM: serialize security confirmation handling
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chengfeng Ye <[email protected]>
commit 759c185d0bbdb131357408f50b8735e04ed3caff upstream.
rfcomm_security_cfm() looks up a session on session_list and then walks its DLC list without holding rfcomm_mutex. Since RFCOMM session teardown uses rfcomm_mutex, krfcommd can close and free the same session and DLCs concurrently:
hci_rx_work krfcommd
----------- ---------
rfcomm_session_get()
rfcomm_lock() rfcomm_session_close()
rfcomm_dlc_unlink() rfcomm_session_del()
kfree(s)
rfcomm_unlock()
walk s->dlcs
The callback can then read a freed session list head and touch freed DLCs while updating their flags or timers.
Serialize the session lookup and DLC traversal in rfcomm_security_cfm() with rfcomm_mutex. This matches the existing RFCOMM session lifetime rules and prevents concurrent rfcomm_session_del() / rfcomm_dlc_unlink() from tearing the objects down while the callback is using them.
KASAN reported:
BUG: KASAN: slab-use-after-free in rfcomm_security_cfm+0x41c/0x440 Read of size 8 at addr ffff888111fb3960 by task kworker/u17:1/89 Workqueue: hci0 hci_rx_work Call Trace: rfcomm_security_cfm+0x41c/0x440 hci_encrypt_cfm+0x139/0x590 hci_encrypt_change_evt+0x37b/0xc40 hci_event_packet+0x71b/0xb20 hci_rx_work+0x293/0x730 Allocated by task 69: rfcomm_session_add+0x9e/0x2f0 rfcomm_run+0x44b/0x41e0 Freed by task 69: kfree+0x131/0x3c0 rfcomm_session_del+0x188/0x220 rfcomm_run+0x1985/0x41e0
--- net/bluetooth/rfcomm/core.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
net/bluetooth/rfcomm/core.c +7 -1
@@ -2172,9 +2172,13 @@ static void rfcomm_security_cfm(struct hBT_DBG ("conn %p status 0x%02x encrypt 0x%02x" , conn, status, encrypt); +rfcomm_lock (); + s =rfcomm_session_get (&conn->hdev->bdaddr, &conn->dst); -if (!s) +if (!s) { +rfcomm_unlock ();return ; + }list_for_each_entry_safe (d, n, &s->dlcs, list) {if (test_and_clear_bit (RFCOMM_SEC_PENDING , &d->flags)) {
@@ -2206,6 +2210,8 @@ static void rfcomm_security_cfm(struct hset_bit (RFCOMM_AUTH_REJECT , &d->flags); } +rfcomm_unlock (); +rfcomm_schedule (); }
Greg Kroah-Hartman
maintainerPATCH 86/798 Bluetooth: hci_event: clear HCI_LE_ADV only on a created connection
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Valentin Kindschi <[email protected]>
commit 941929abe5feaed672b9a52e330e547d333240c6 upstream.
le_conn_complete_evt() clears HCI_LE_ADV before looking at the event status, on the premise stated in its comment that all controllers stop advertising when a connection is created.
That premise only holds when a connection was actually created. On a non-zero status none was, and the controller is still advertising: after the host issues LE Create Connection Cancel the event arrives with Unknown Connection Identifier (0x02), and a connection timeout behaves the same way. Clearing the flag there leaves the host believing advertising is off while the controller has it on.
It is also wrong for extended advertising, where several sets can be advertising at once. hci_cc_le_set_ext_adv_enable() is careful about this - on disabling one set it walks hdev->adv_instances and only clears HCI_LE_ADV once no instance is still enabled. The unconditional clear here discards that bookkeeping, so one set connecting drops the flag while the others keep advertising.
The direction of the error matters. A flag left set is self-correcting:hci_disable_advertising_sync() sends LE Set Advertising Enable(0) and the command complete puts the state back. A flag left clear is not, because that same function returns early without sending anything while the flag is clear:
- LE Set Advertising Parameters is then sent to a controller that is still advertising, and is correctly rejected with Command Disallowed (0x0c);
- hci_enable_advertising_sync() returns at that point, before the LE Set Advertising Enable that would set HCI_LE_ADV again.
On a controller without LE Extended Advertising that is reachable from
here: hci_schedule_adv_instance_sync() re-arms adv_instance_expire every HCI_DEFAULT_ADV_DURATION (2 s) and its "already advertising" shortcut tests HCI_LE_ADV, which can no longer become true, so the parameter write is retried for as long as advertising is configured:
Bluetooth: hci0: Opcode 0x2006 failed: -16
Only clear the flag when a connection was established.
Note this is not on its own sufficient to stop that retry loop - the redundant enable queued by hci_le_conn_failed() clears HCI_LE_ADV itself and recreates the same mismatch, which patch 1 addresses. This patch fixes the event handler reporting a state the controller is not in.
Verified on the affected device (BCM43455, legacy advertising only) with this patch and patch 1 applied. A 221 s btmon capture with an out-of-range peer at -90 dBm contains two outgoing connection attempts that the host cancelled, each producing exactly the event this patch changes:
< LE Set Advertising Parameters 0x2006 Success < LE Set Advertising Enable 0x200a Success < LE Create Connection Cancel 0x200e Success
Quoted 1 line
LE Connection Complete Unknown Connection Identifier (
0x02), central
Nothing follows either one; the next command is an unrelated scan restart 70 ms later. Over the whole capture: 7 LE Set Advertising Parameters sent, all Success; 10 LE Set Advertising Enable, all Success; no Command Disallowed of any opcode, and no 2 s cadence anywhere. Two central connections to other peers completed normally afterwards, with feature exchange and a connection parameter update, so advertising was still live across the cancelled attempts.
The extended advertising case above is a code argument, not a measurement:
this controller has no LE Extended Advertising, so that path is not exercised by the capture.
--- net/bluetooth/hci_event.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
net/bluetooth/hci_event.c +4 -3
@@ -5225,10 +5225,11 @@ static void le_conn_complete_evt(structhci_dev_lock (hdev); -/* All controllers implicitly stop advertising in the event of a -* connection, so ensure that the state bit is cleared. +/* Advertising stops when a connection is created. On a failed +* connection it keeps running, so leave the state bit alone. */ -hci_dev_clear_flag (hdev,HCI_LE_ADV ); +if (!status) +hci_dev_clear_flag (hdev,HCI_LE_ADV ); conn =hci_lookup_le_connect (hdev);if (!conn) {
Greg Kroah-Hartman
maintainerPATCH 87/798 Bluetooth: hci_intel: fix usage_count leak when autosuspend_delay is negative
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guangshuo Li <[email protected]>
commit c7e9a8cb6918656884a0757c92465075c7555ffa upstream.
intel_set_power() calls pm_runtime_use_autosuspend() when powering on the device, but the power-off path does not call the matching pm_runtime_dont_use_autosuspend() before disabling runtime PM.
If the autosuspend delay is set to a negative value while autosuspend is enabled, the runtime PM core increments usage_count to prevent runtime suspend. Without calling pm_runtime_dont_use_autosuspend() during teardown, this reference is not dropped and usage_count remains unbalanced.
Add the missing pm_runtime_dont_use_autosuspend() call before disabling runtime PM.
This issue was found by manual code inspection.
--- drivers/bluetooth/hci_intel.c | 1 + 1 file changed, 1 insertion(+)
drivers/bluetooth/hci_intel.c +1 -0
@@ -348,6 +348,7 @@ static int intel_set_power(struct hci_uadevm_free_irq (&idev->pdev->dev, idev->irq, idev);device_wakeup_disable (&idev->pdev->dev); +pm_runtime_dont_use_autosuspend (&idev->pdev->dev);pm_runtime_disable (&idev->pdev->dev); } }
Greg Kroah-Hartman
maintainerPATCH 88/798 ip6_tunnel: use skb_cow_head() in ip6_tnl_xmit()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhiling Zou <[email protected]>
commit 87f21b59ddc618eff9670c174842964ad65fdade upstream.
ip6_tnl_xmit() may need to expand headroom before it can push the outer IPv6 and optional encap headers. It currently does that with skb_realloc_headroom(), copies skb->sk ownership, consumes the original skb, and then continues processing with the replacement skb kept only in its local variable.
That is safe only if the helper cannot fail afterwards. But this helper still has post-reallocation error exits. collect_md tunnels reject non-NONE encap after the replacement, and ip6_tnl_encap() can also fail later. In those cases the helper returns an error to its callers while the caller still only has the original skb pointer.
Both ip6_tnl_start_xmit() and the IPv6 GRE paths free the caller skb on error, so they can end up freeing an skb that ip6_tnl_xmit() already consumed.
Use skb_cow_head() instead. It provides the required headroom and writability without privately replacing the caller-owned skb, so later error returns cannot leave callers with a stale pointer.
The Ethernet users, ip6gretap and ip6erspan, clear IFF_TX_SKB_SHARING and already call skb_cow_head() before entering ip6_tnl_xmit(). They do not rely on the removed skb_shared() reallocation. This also makes the IPv6 tunnel path consistent with ip_tunnel_xmit().
--- net/ipv6/ip6_tunnel.c | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-)
net/ipv6/ip6_tunnel.c +2 -13
@@ -1248,19 +1248,8 @@ route_lookup:*/ max_headroom +=LL_RESERVED_SPACE (tdev); -if (skb_headroom (skb) < max_headroom ||skb_shared (skb) || - (skb_cloned (skb) && !skb_clone_writable (skb,0 ))) { -struct sk_buff *new_skb; - - new_skb =skb_realloc_headroom (skb, max_headroom); -if (!new_skb) - goto tx_err_dst_release; - -if (skb->sk) -skb_set_owner_w (new_skb, skb->sk); -consume_skb (skb); - skb = new_skb; - } +if (skb_cow_head (skb, max_headroom)) + goto tx_err_dst_release;if (t->parms.collect_md) {if (t->encap.type !=TUNNEL_ENCAP_NONE )
Greg Kroah-Hartman
maintainerPATCH 89/798 ip6_gre: fix hardware header length for NBMA tunnels
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhiling Zou <[email protected]>
commit 505b6d296c486ef7d1274f279d4c43a172f63224 upstream.
ip6gre_tnl_link_config_route() accumulates the lower device's hardware header length into dev->hard_header_len whenever header_ops is set. This is incorrect for both users of header_ops.
ip6gretap and ip6erspan have a fixed Ethernet hardware header length. For an NBMA ip6gre tunnel, ip6gre_header() creates only the GRE header, the optional FOU or GUE header, and the outer IPv6 header. The lower device header is headroom needed later, not part of the tunnel device's hardware header.
Keep the lower device header in needed_headroom. Set hard_header_len to the tunnel header length only for ARPHRD_IP6GRE devices with header_ops, and leave the fixed Ethernet header length unchanged for tap and erspan devices.
--- net/ipv6/ip6_gre.c | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-)
net/ipv6/ip6_gre.c +4 -9
@@ -1151,13 +1151,8 @@ static void ip6gre_tnl_link_config_routereturn ;if (rt->dst.dev) { -unsigned short dst_len = rt->dst.dev->hard_header_len + - t_hlen; - -if (t->dev->header_ops) - dev->hard_header_len = dst_len; -else - dev->needed_headroom = dst_len; + dev->needed_headroom = rt->dst.dev->hard_header_len + + t_hlen;if (set_mtu) {int mtu = rt->dst.dev->mtu - t_hlen;
@@ -1185,8 +1180,8 @@ static int ip6gre_calc_hlen(struct ip6_t t_hlen = tunnel->hlen +sizeof (struct ipv6hdr ); -if (tunnel->dev->header_ops) - tunnel->dev->hard_header_len =LL_MAX_HEADER + t_hlen; +if (tunnel->dev->header_ops && tunnel->dev->type ==ARPHRD_IP6GRE ) + tunnel->dev->hard_header_len = t_hlen;else tunnel->dev->needed_headroom =LL_MAX_HEADER + t_hlen;
Greg Kroah-Hartman
maintainerPATCH 90/798 ipv6: use RCU iterator to dump route exceptions
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yuyang Huang <[email protected]>
commit 47cdab0d51aaa9bd85f8e4904585bd5bd4df4488 upstream.
rt6_nh_dump_exceptions() uses hlist_for_each_entry() to iterate over RCU-protected exception lists. The caller holds rcu_read_lock(), but does not hold rt6_exception_lock, so rt6_insert_exception() can concurrently add an entry with hlist_add_head_rcu().
KCSAN reports this race (irrelevant details omitted):
==================================================================
BUG: KCSAN: data-race in rt6_insert_exception / rt6_nh_dump_exceptions
write (marked) to 0xffff8a7c44c59620 of 8 bytes by interrupt on cpu 5:
rt6_insert_exception+0x3bb/0x760
__ip6_rt_update_pmtu+0x4fe/0x750
ip6_sk_update_pmtu+0x19a/0x3b0
udpv6_err+0x3ff/0x800
icmpv6_notify+0x1e1/0x440
icmpv6_rcv+0x8c0/0xab0
ip6_protocol_deliver_rcu+0x616/0x840
ip6_input_finish+0xb9/0x160
...
entry_SYSCALL_64_after_hwframe+0x77/0x7f read to 0xffff8a7c44c59620 of 8 bytes by task 549 on cpu 14:
rt6_nh_dump_exceptions+0xb3/0x260
rt6_dump_route+0x53e/0x5f0
fib6_dump_node+0x6d/0xf0
fib6_walk_continue+0x290/0x2d0
fib6_dump_table+0x28d/0x360
inet6_dump_fib+0x37d/0x620
rtnl_dumpit+0x7b/0xd0
netlink_dump+0x3ae/0x7e0
...
entry_SYSCALL_64_after_hwframe+0x77/0x7f4 locks held by dumper/549:
...
#1: (rcu_read_lock){....}-{1:3}, at: inet6_dump_fib+0x88/0x620
#2: (&tb->tb6_lock){+.-.}-{3:3}, at: fib6_dump_table+0x1e9/0x360
#3: (rcu_read_lock){....}-{1:3}, at: rt6_dump_route+0x483/0x5f0 value changed: 0xffff8a7c44e05700 -> 0xffff8a7c45d60100
Reported by Kernel Concurrency Sanitizer on:
CPU: 14 UID: 0 PID: 549 Comm: dumper Not tainted 7.2.0-rc7-virtme #38 PREEMPT(lazy) ...
Use hlist_for_each_entry_rcu() to safely iterate over the exception list.
--- net/ipv6/route.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv6/route.c +1 -1
@@ -5734,7 +5734,7 @@ static int rt6_nh_dump_exceptions(structreturn 0 ;for (i =0 ; i <FIB6_EXCEPTION_BUCKET_SIZE ; i++) { -hlist_for_each_entry (rt6_ex, &bucket->chain, hlist) { +hlist_for_each_entry_rcu (rt6_ex, &bucket->chain, hlist) {if (w->skip) { w->skip--;continue ;
Greg Kroah-Hartman
maintainerPATCH 91/798 libnvdimm/labels: Prevent integer overflow in __nd_label_validate()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bryam Vargas <[email protected]>
commit 037770686126155eafc44501312989e2837b9659 upstream.
The on-media namespace index field nslot is a u32 read from the DIMM label storage area. __nd_label_validate() bounds it against the config area size, but sizeof_namespace_label() returns unsigned, so the product nslot * label_size is evaluated in 32-bit and wraps modulo 2^32 before the comparison. A crafted nslot passes the bound and is then used as the loop trip count in nd_label_data_init(), whose memset() walks off the end of the config_size buffer: an out-of-bounds write.
The field is not trusted -- it comes from the medium, or from userspace via ND_CMD_SET_CONFIG_DATA. Evaluate the product in 64-bit so the bound check is exact; conforming labels are unaffected.
The check was safe when introduced by commit 4a826c83db4e ("libnvdimm:
namespace indices: read and validate"): it multiplied by sizeof(struct nd_namespace_label), a size_t, so on a 64-bit build the product did not wrap. Commit 564e871aa66f ("libnvdimm, label: add v1.2 nvdimm label definitions") narrowed it to 32 bits when the label size became a runtime value read via sizeof_namespace_label().
--- drivers/nvdimm/label.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/nvdimm/label.c +1 -1
@@ -194,7 +194,7 @@ static int __nd_label_validate(struct nv } nslot =__le32_to_cpu (nsindex[i]->nslot); -if (nslot *sizeof_namespace_label (ndd) +if ((u64 )nslot *sizeof_namespace_label (ndd) +2 *sizeof_namespace_index (ndd) > ndd->nsarea.config_size) { dev_dbg(dev, "nsindex%d nslot: %u invalid, config_size: %#x\n",
Greg Kroah-Hartman
maintainerPATCH 92/798 md: do overflow check for sb->bblog_shift in super_1_load()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Coly Li <[email protected]>
commit 35d522bd32462afcf1981dab6da8a9256c26c1e0 upstream.
In super_1_load(), sb->bblog_shift is an __u8 type value loaded from on- disk superblock. It is used for badblocks API badblocks_set() by the following sequence,
1930 rdev->badblocks.shift = sb->bblog_shift;
1931 for (i = 0 ; i < (sectors << (9-3)) ; i++, bbp++) {
1932 u64 bb = le64_to_cpu(*bbp); 1933 int count = bb & (0x3ff); 1934 u64 sector = bb >> 10; 1935 sector <<= sb->bblog_shift; 1936 count <<= sb->bblog_shift; 1937 if (bb + 1 == 0)
1938 break;
1939 if (!badblocks_set(&rdev->badblocks, sector, count, 1))
1940 return -EINVAL;
1941 }
bb->bblog_shit is in range of 0-255, variable sector is 64bit width, for an invalid bb->bblog_shit, it is possible to make sector be overflowed by the following calculation,
1935 sector <<= sb->bblog_shift;
Then in turn when call badblocks_set() at line 1939 with the invalid rdev->badblocks.shift set at line 1930, may result an overflow inside _badblocks_clear() in block/badblocks.c.
Although there are many places to call badblocks APIs, the non-zero shift value is only used in super_1_load(), other places always use 0 as the shift value. Therefore it is unnecessary to do a general shift value overflow check inside badblock API, and just check here as the caller.
This may avoid unnecessary check, make the badblocks API code more simple and elegant.
--- drivers/md/md.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/md/md.c +7 -0
@@ -1763,6 +1763,13 @@ static int super_1_load(struct md_rdev * rdev->bb_page, REQ_OP_READ, 0, true))return -EIO ; bbp = (__le64 *)page_address (rdev->bb_page); + +/* check for badblocks api. */ +if (sb->bblog_shift >=BITS_PER_TYPE (sector_t)) { +pr_err ("md: %pg: bogus bblog_shift %u for badblocks.\n" , + rdev->bdev, sb->bblog_shift); +return -EINVAL ; + } rdev->badblocks.shift = sb->bblog_shift;for (i =0 ; i < (sectors << (9 -3 )) ; i++, bbp++) {u64 bb =le64_to_cpu (*bbp);
Greg Kroah-Hartman
maintainerPATCH 93/798 mpls: reload header after pskb_may_pull()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Qing Ming <[email protected]>
commit 29e63b8d9fc150cc191b1c6eb7e16e1247e1b650 upstream.
mpls_select_multipath() calls mpls_multipath_hash() to choose a nexthop when an MPLS route has multiple nexthops. While walking the MPLS label stack, the hash routine caches hdr for the current label. After finding the bottom-of-stack label, it calls pskb_may_pull() before reading the inner IP header.
If an skb is constructed with the inner IP header in nonlinear data and insufficient tailroom in the linear head, pskb_may_pull() calls pskb_expand_head() to replace the skb head and free the old one. This leaves hdr pointing to freed memory. The IPv6 path can invalidate hdr again when it performs a second pull for the larger header.
The issue was found through static analysis. A reproducer sending a legal Geneve packet through a bareudp/MPLS multipath setup triggered the same KASAN report in 2 of 2 unpatched runs:
BUG: KASAN: slab-use-after-free in mpls_select_multipath Read of size 1 at addr ffff88800ecc6e20 by task ksoftirqd/1/23 Call Trace: mpls_select_multipath mpls_forward __netif_receive_skb_list_core netif_receive_skb_list_internal napi_complete_done gro_cell_poll __napi_poll net_rx_action Freed by task 23: kfree pskb_expand_head __pskb_pull_tail mpls_select_multipath
Reload hdr from the current skb head after each successful pull before deriving the inner IPv4 or IPv6 header pointer.
--- net/mpls/af_mpls.c | 2 ++ 1 file changed, 2 insertions(+)
net/mpls/af_mpls.c +2 -0
@@ -197,6 +197,7 @@ static u32 mpls_multipath_hash(struct mpif (pskb_may_pull (skb, mpls_hdr_len +sizeof (struct iphdr ))) {const struct iphdr *v4hdr; + hdr =mpls_hdr (skb) + label_index; v4hdr = (const struct iphdr *)(hdr +1 );if (v4hdr->version ==4 ) { hash = jhash_3words(ntohl(v4hdr->saddr),
@@ -207,6 +208,7 @@ static u32 mpls_multipath_hash(struct mp sizeof(struct ipv6hdr))) {const struct ipv6hdr *v6hdr; + hdr =mpls_hdr (skb) + label_index; v6hdr = (const struct ipv6hdr *)(hdr +1 ); hash =__ipv6_addr_jhash (&v6hdr->saddr, hash); hash =__ipv6_addr_jhash (&v6hdr->daddr, hash);
Greg Kroah-Hartman
maintainerPATCH 94/798 mptcp: fix uninitialized local_id in syncookie MP_JOIN reconstruction
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Harshit Varu <[email protected]>
commit b878dfdd12d7a5b8722a78d35e313506140ca3d9 upstream.
mptcp_token_join_cookie_init_state() restores remote_nonce, local_nonce, backup, join_id, token and msk from the saved cookie entry when rebuilding the request socket for a MP_JOIN 4th-ACK handled under SYN cookies, but it does not restore local_id, even though the SYN path saved it. subflow_ulp_clone() then reads that uninitialized field and stores it as the joined subflow's address-ID. Because the request-sock slab is SLAB_TYPESAFE_BY_RCU and not zeroed on allocation, the value is the stale byte of a previously freed request socket, which an off-path peer can influence by sending concurrent MP_JOIN SYNs. This corrupts the path manager's id-based subflow bookkeeping for the connection.
Restore subflow_req->local_id from the cookie entry, as done for the other fields.
--- net/mptcp/syncookies.c | 1 + 1 file changed, 1 insertion(+)
net/mptcp/syncookies.c +1 -0
@@ -118,6 +118,7 @@ bool mptcp_token_join_cookie_init_state( subflow_req->local_nonce = e->local_nonce; subflow_req->backup = e->backup; subflow_req->remote_id = e->join_id; + subflow_req->local_id = e->local_id; subflow_req->token = e->token; subflow_req->msk = msk;spin_unlock_bh (&join_entry_locks[i]);
Greg Kroah-Hartman
maintainerPATCH 95/798 SUNRPC: xdr_buf_trim: clamp buf->len to avoid underflow
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Mason <[email protected]>
commit 3f491306dcb673ff5e78e1044ba450c58978774e upstream.
xdr_buf_trim() trims len bytes from the tail of an xdr_buf by walking the tail, pages, and head iovecs. Each per-section step uses min_t() so it never removes more bytes than that section holds, but the final accounting at the fix_len label subtracts the total bytes actually consumed from buf->len without any clamp:
fix_len:
buf->len -= (len - trim);When the caller has set buf->len to a value smaller than the sum of the iov_lens, (len - trim) can exceed buf->len and the unsigned subtraction wraps to near UINT_MAX. gss_krb5_unwrap_v2() reaches xdr_buf_trim() in exactly that state:
buf->head[0].iov_len -= GSS_KRB5_TOK_HDR_LEN + headskip;
buf->len = len - (GSS_KRB5_TOK_HDR_LEN + headskip);
xdr_buf_trim(buf, ec + GSS_KRB5_TOK_HDR_LEN + tailskip);buf->len is a small wire-derived value while the iov_lens are at page scale, so the per-section loops legitimately consume far more bytes than buf->len records. The wrapped buf->len then propagates as the authoritative stream bound into every downstream XDR decoder.
Fix by clamping the decrement so buf->len bottoms out at zero:
buf->len -= min_t(unsigned int, buf->len, len - trim);
On the normal path where the iov_lens sum to buf->len, (len - trim) is always <= buf->len and the result is identical to before. No callers change behavior outside the underflow case.
--- net/sunrpc/xdr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/sunrpc/xdr.c +1 -1
@@ -1519,7 +1519,7 @@ void xdr_buf_trim(struct xdr_buf *buf, u trim -= cur; } fix_len: - buf->len -= (len - trim); + buf->len -= min_t(unsigned int, buf->len, len - trim); }EXPORT_SYMBOL_GPL (xdr_buf_trim);
Greg Kroah-Hartman
maintainerPATCH 96/798 sunrpc: route to a populated pool in svc_pool_for_cpu()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeff Layton <[email protected]>
commit f6310491c4cdb88af73aa551ec9df1f10a90c709 upstream.
svc_set_num_threads() spreads the requested threads evenly across the service's pools (base = nrservs / sv_nrpools). When a service runs fewer threads than it has pools -- e.g. an nfsd configured with fewer threads than the host has NUMA nodes while running in "pernode" or "percpu" mode -- the trailing pools are left with no threads at all.
svc_xprt_enqueue() selects a pool from the CPU servicing the transport, queues the transport on that pool's sp_xprts, and only wakes a thread from the same pool. Each thread services exclusively its own pool, so a transport that lands on a threadless pool is enqueued on sp_xprts and never picked up: the connection hangs indefinitely.
Have svc_pool_for_cpu() skip pools that currently have no threads, falling back to the next populated pool. This trades NUMA locality for a guarantee that the work is actually serviced. sp_nrthreads is only updated under the service mutex; the lockless read here is a best-effort routing hint, so annotate it with data_race().
--- net/sunrpc/svc.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-)
net/sunrpc/svc.c +28 -1
@@ -364,6 +364,7 @@ svc_pool_for_cpu(struct svc_serv *serv, {struct svc_pool_map *m = &svc_pool_map;unsigned int pidx =0 ; +unsigned int i;if (serv->sv_nrpools <=1 )return serv->sv_pools;
@@ -376,8 +377,34 @@ svc_pool_for_cpu(struct svc_serv *serv, pidx = m->to_pool[cpu_to_node (cpu)];break ; } + pidx %= serv->sv_nrpools; -return &serv->sv_pools[pidx % serv->sv_nrpools]; +/* +* It's possible to have a pool with no threads. Userland can just set +* things up this way directly. Also, when threads are autodistributed +* they are spread evenly across the pools, but when there are fewer +* threads than pools some pools can end up with none. +* +* A transport enqueued on a threadless pool would never be picked up, +* since each thread only services its own pool. Fall back to the next +* populated pool, trading NUMA locality for a guarantee that the +* transport is serviced. +*/ +for (i =0 ; i < serv->sv_nrpools; i++) { +struct svc_pool *pool = &serv->sv_pools[pidx]; + +/* This is set under the service mutex and rarely ever +* changes. A data race here is harmless. +*/ +if (data_race (pool->sp_nrthreads)) +return pool; + +if (++pidx >= serv->sv_nrpools) + pidx =0 ; + } + +/* No pool has any threads; nothing can service the transport. */ +return &serv->sv_pools[pidx]; }int svc_rpcb_setup (struct svc_serv *serv,struct net *net)
Greg Kroah-Hartman
maintainerPATCH 97/798 SUNRPC: always drain cache_cleaner before destroying a cache_detail
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeff Layton <[email protected]>
commit f42d0fda0c67695db6bc704b04b7c10240805377 upstream.
sunrpc_destroy_cache_detail() only cancels the global cache_cleaner delayed_work when cache_list is empty. During per-netns teardown cache_list is never empty because init_net's caches remain registered, so the cancel never fires. After unlink, the caller proceeds to cache_destroy_net() which kfrees the cache_detail while cache_clean() may still hold a dangling pointer to it. The result is a
use-after-free: cache_dequeue() takes cd->queue_lock on freed memory, and cache_put() dereferences cd->cache_put as a function pointer from freed slab.
Drop the list_empty guard so that cancel_delayed_work_sync() always runs, ensuring any in-flight cache_clean() completes before the cache_detail is freed. Re-arm the cleaner afterwards if other caches are still registered.
--- net/sunrpc/cache.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
net/sunrpc/cache.c +3 -4
@@ -410,10 +410,9 @@ void sunrpc_destroy_cache_detail(structlist_del_init (&cd->others);spin_unlock (&cd->hash_lock);spin_unlock (&cache_list_lock); -if (list_empty (&cache_list)) { -/* module must be being unloaded so its safe to kill the worker */ -cancel_delayed_work_sync (&cache_cleaner); - } +cancel_delayed_work_sync (&cache_cleaner); +if (!list_empty (&cache_list)) +queue_delayed_work (system_power_efficient_wq, &cache_cleaner,0 ); }EXPORT_SYMBOL_GPL (sunrpc_destroy_cache_detail);
Greg Kroah-Hartman
maintainerPATCH 98/798 SUNRPC: Guard svcauth_gss_release() dispatch on rq_auth_stat
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Mason <[email protected]>
commit f8870b9b75afb77986bc65940a231d54068ff2b1 upstream.
svcauth_gss_release() reads gc_proc and switches on gc_svc before consulting rq_auth_stat. On the SVC_DENIED path after a failed svcauth_gss_accept(), those fields may hold stale values from a prior request or uninitialized slab residue: svcauth_gss_accept() allocates gss_svc_data with non-zeroing kmalloc and clears only gsd_databody_offset and rsci per request, not clcred.
Because RPC_GSS_PROC_DATA is zero, a zeroed or stale-zero gc_proc passes the existing guard and falls through into the gc_svc switch, which can dispatch to svcauth_gss_wrap_integ() or svcauth_gss_wrap_priv(). Both wrap helpers call svcauth_gss_prepare_to_wrap() before any rsci->mechctx dereference, and that helper already returns early when rq_auth_stat is not rpc_auth_ok, so the downstream NULL dereference is blocked. The dispatch itself remains structurally wrong: it reads scalars that the caller has no contract to have initialized after a failed authentication.
Mirror the existing rq_auth_stat gate in svcauth_gss_prepare_to_wrap() one frame up, so svcauth_gss_release() skips the clcred dispatch entirely when authentication has not succeeded. The cleanup tail that releases rq_client, rq_gssclient, cr_group_info, and rsci still runs.
--- net/sunrpc/auth_gss/svcauth_gss.c | 2 ++ 1 file changed, 2 insertions(+)
net/sunrpc/auth_gss/svcauth_gss.c +2 -0
@@ -1835,6 +1835,8 @@ svcauth_gss_release(struct svc_rqst *rqsif (!gsd) goto out; +if (rqstp->rq_auth_stat != rpc_auth_ok) + goto out; gc = &gsd->clcred;if (gc->gc_proc !=RPC_GSS_PROC_DATA ) goto out;
Greg Kroah-Hartman
maintainerPATCH 99/798 SUNRPC: harden gss_krb5_unwrap_v2 against short tokens
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Mason <[email protected]>
commit 6959297aaa9572783d620a226d73c3fb94494888 upstream.
gss_krb5_unwrap_v2() reads the EC and RRC header fields at ptr+4 and ptr+6 before validating that the token is at least GSS_KRB5_TOK_HDR_LEN
(16) bytes long, and its rotate_left() helper passes buf->len - base to xdr_buf_subsegment() without verifying that base <= buf->len. When a caller hands in a sub-16-byte token, or a token whose declared len leaves base past the end of the buffer, three distinct failures follow:
gss_krb5_unwrap_v2(offset, len, buf)
ptr = buf->head[0].iov_base + offset
ec = *(ptr + 4) /* OOB read on short head */
rrc = *(ptr + 6) /* OOB read on short head */
rotate_left(offset + 16, buf, rrc)
xdr_buf_subsegment(buf, &subbuf,
base, buf->len - base) /* u32 wrap when base > len */
_rotate_left(&subbuf, shift)
shift %= buf->len /* divide-by-zero when base == len */
After decryption, the cleanup arithmetic has the same shape:
movelen = min_t(unsigned int, buf->head[0].iov_len, len);
movelen -= offset + GSS_KRB5_TOK_HDR_LEN + headskip;
BUG_ON(offset + GSS_KRB5_TOK_HDR_LEN + headskip + movelen >
buf->head[0].iov_len);The BUG_ON re-adds the value just subtracted, so it reduces to min(A, B) > A and is permanently false; it cannot catch the unsigned underflow of movelen, which then drives a ~UINT_MAX-byte memmove().
Add four defense-in-depth guards inside the unwrap core so it is safe regardless of what its callers validate:
- reject tokens with len - offset < GSS_KRB5_TOK_HDR_LEN before
touching ptr+4/ptr+6;
- bail from rotate_left() when buf->len <= base, covering both the
underflow and zero-length cases;
- return early from _rotate_left() when buf->len is zero, so the
shift %= buf->len modulo cannot fault; - replace the dead BUG_ON with a live check that returns GSS_S_DEFECTIVE_TOKEN before the movelen subtraction.
--- net/sunrpc/auth_gss/gss_krb5_wrap.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
net/sunrpc/auth_gss/gss_krb5_wrap.c +9 -2
@@ -389,6 +389,8 @@ static void _rotate_left(struct xdr_bufint shifted =0 ;int this_shift; +if (!buf->len) +return ; shift %= buf->len;while (shifted < shift) { this_shift =min (shift - shifted,LOCAL_BUF_LEN );
@@ -401,6 +403,8 @@ static void rotate_left(u32 base, struct {struct xdr_buf subbuf; +if (buf->len <= base) +return ;xdr_buf_subsegment (buf, &subbuf, base, buf->len - base);_rotate_left (&subbuf, shift); }
@@ -476,6 +480,9 @@ gss_unwrap_kerberos_v2(struct krb5_ctx *if (kctx->gk5e->decrypt_v2 ==NULL )return GSS_S_FAILURE ; +if (len - offset <=GSS_KRB5_TOK_HDR_LEN ) +return GSS_S_DEFECTIVE_TOKEN ; + ptr = buf->head[0 ].iov_base + offset;if (be16_to_cpu (*((__be16 *)ptr)) !=KG2_TOK_WRAP )
@@ -542,9 +549,9 @@ gss_unwrap_kerberos_v2(struct krb5_ctx ** head buffer space rather than that actually occupied. */ movelen = min_t(unsigned int, buf->head[0].iov_len, len); +if (movelen < offset +GSS_KRB5_TOK_HDR_LEN + headskip) +return GSS_S_DEFECTIVE_TOKEN ; movelen -= offset +GSS_KRB5_TOK_HDR_LEN + headskip; -BUG_ON (offset +GSS_KRB5_TOK_HDR_LEN + headskip + movelen > - buf->head[0 ].iov_len);memmove (ptr, ptr +GSS_KRB5_TOK_HDR_LEN + headskip, movelen); buf->head[0 ].iov_len -=GSS_KRB5_TOK_HDR_LEN + headskip; buf->len = len - (GSS_KRB5_TOK_HDR_LEN + headskip);
Greg Kroah-Hartman
maintainerPATCH 100/798 SUNRPC: harden gss_unwrap_resp_priv length checks
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Mason <[email protected]>
commit 87831b92112c81db251d46756d65daa4f91af6a2 upstream.
gss_unwrap_resp_priv() validates the RPCSEC_GSS opaque length with
offset = (u8 *)(p) - (u8 *)head->iov_base;
if (offset + opaque_len > rcv_buf->len)
goto unwrap_failed;
maj_stat = gss_unwrap(ctx->gc_gss_ctx, offset,
offset + opaque_len, rcv_buf);Both operands are u32 and the sum is computed in u32. A reply with opaque_len near 0xffffffff makes offset + opaque_len wrap to a small value that is below rcv_buf->len, so the bound check passes and gss_unwrap() is called with end < begin. The check also lacks a lower bound, so any opaque_len in [0, GSS_KRB5_TOK_HDR_LEN) is accepted and forwarded to gss_krb5_unwrap_v2(), whose pre-decrypt header reads at ptr+4 and ptr+6 then run past the token.
A krb5p NFS server returning a crafted RPCSEC_GSS reply can drive the client into out-of-bounds reads in gss_krb5_unwrap_v2() and the rotate_left() loop that follows.
Fix by replacing the single combined check with three guards that are safe in u32 arithmetic and that enforce the RFC 4121 minimum outer token length:
if (offset > rcv_buf->len)
goto unwrap_failed;
if (opaque_len > rcv_buf->len - offset)
goto unwrap_failed;
if (opaque_len < GSS_KRB5_TOK_HDR_LEN)
goto unwrap_failed;The first guard makes the subtraction in the second guard unconditionally safe; offset is derived from a successful xdr_inline_decode() in the head kvec, so in practice it already satisfies the bound. The floor mirrors the server-side check added in commit 5b757c2e57a5 ("SUNRPC: svcauth_gss: enforce krb5 token minimum length").
--- net/sunrpc/auth_gss/auth_gss.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
net/sunrpc/auth_gss/auth_gss.c +5 -1
@@ -2050,7 +2050,11 @@ gss_unwrap_resp_priv(struct rpc_task *ta goto unwrap_failed; opaque_len =be32_to_cpup (p++); offset = (u8 *)(p) - (u8 *)head->iov_base; -if (offset + opaque_len > rcv_buf->len) +if (offset > rcv_buf->len) + goto unwrap_failed; +if (opaque_len > rcv_buf->len - offset) + goto unwrap_failed; +if (opaque_len <=GSS_KRB5_TOK_HDR_LEN ) goto unwrap_failed; maj_stat = gss_unwrap(ctx->gc_gss_ctx, offset,
Greg Kroah-Hartman
maintainerPATCH 101/798 sunrpc: init gssp_lock before publishing proc entry
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Mason <[email protected]>
commit 5ce1ed6159731a41fdd0b03eedbed4e147036a5a upstream.
create_use_gss_proxy_proc_entry() publishes /proc/net/rpc/use-gss-proxy via proc_create_data() before init_gssp_clnt() runs mutex_init() on sn->gssp_lock. Once the dentry is linked under proc_subdir_lock it is immediately reachable from userspace, so a write that lands in the window drives set_gssp_clnt() into mutex_lock() on a zero-initialized struct mutex.
create_use_gss_proxy_proc_entry(net)
proc_create_data("use-gss-proxy", ...) /* dentry live */
init_gssp_clnt(sn)
mutex_init(&sn->gssp_lock) /* too late */
write_gssp()
set_gssp_clnt(net)
mutex_lock(&sn->gssp_lock) /* uninitialized */
gssp_rpc_create(...)
sn->gssp_clnt = clnt
mutex_unlock(&sn->gssp_lock)The window spans only the two statements between proc_create_data() returning and init_gssp_clnt(), so a writer reaches it only if the registering thread is preempted there while another task is already opening the freshly published file. register_pernet_subsys() runs in preemptible context under pernet_ops_rwsem, so that preemption is possible, and the window widens on auth_rpcgss module load, when the proc entry is created for every live net namespace whose tasks are already running. A writer that wins the race locks a zero-filled struct mutex. On CONFIG_DEBUG_MUTEXES the missing magic value trips a "lock used without init" splat; on a production kernel the fast path acquires the lock via CMPXCHG(owner, 0, current). In the latter case a second writer that arrives before init_gssp_clnt() re-zeroes owner can enter set_gssp_clnt() concurrently, shut down the first writer's clnt while it is still in use, and leak the loser's clnt.
Fix by initializing sn->gssp_lock in sunrpc_init_net() so its lifetime matches the sunrpc_net it lives in. sn->gssp_clnt is already NULL from the kzalloc that backs net_generic storage, so the lazy helper is no longer needed; drop init_gssp_clnt(), its prototype, and the call from create_use_gss_proxy_proc_entry(). sunrpc.ko is a build-time dependency of auth_rpcgss.ko, so sunrpc_init_net() has always run on every netns before any auth_gss pernet init can publish the proc entry.
--- net/sunrpc/auth_gss/gss_rpc_upcall.c | 6 ------ net/sunrpc/auth_gss/gss_rpc_upcall.h | 1 - net/sunrpc/auth_gss/svcauth_gss.c | 1 - net/sunrpc/sunrpc_syms.c | 1 + 4 files changed, 1 insertion(+), 8 deletions(-)
net/sunrpc/auth_gss/gss_rpc_upcall.c +0 -6
@@ -120,12 +120,6 @@ out:return result; } -void init_gssp_clnt (struct sunrpc_net *sn) -{ -mutex_init (&sn->gssp_lock); - sn->gssp_clnt =NULL ; -} -int set_gssp_clnt (struct net *net) {struct sunrpc_net *sn =net_generic (net, sunrpc_net_id);
net/sunrpc/auth_gss/gss_rpc_upcall.h +0 -1
@@ -29,7 +29,6 @@ int gssp_accept_sec_context_upcall(struc struct gssp_upcall_data *data);void gssp_free_upcall_data (struct gssp_upcall_data *data); -void init_gssp_clnt (struct sunrpc_net *);int set_gssp_clnt (struct net *);void clear_gssp_clnt (struct sunrpc_net *);
net/sunrpc/auth_gss/svcauth_gss.c +0 -1
@@ -1495,7 +1495,6 @@ static int create_use_gss_proxy_proc_ent &use_gss_proxy_proc_ops, net);if (!*p)return -ENOMEM ; -init_gssp_clnt (sn);return 0 ; }
net/sunrpc/sunrpc_syms.c +1 -0
@@ -53,6 +53,7 @@ static __net_init int sunrpc_init_net(stINIT_LIST_HEAD (&sn->all_clients);spin_lock_init (&sn->rpc_client_lock);spin_lock_init (&sn->rpcb_clnt_lock); +mutex_init (&sn->gssp_lock);return 0 ; err_pipefs:
Greg Kroah-Hartman
maintainerPATCH 102/798 SUNRPC: Reject krb5 v2 wrap tokens with oversized ec field
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chuck Lever <[email protected]>
commit ad484748eec0a66eac0f13ab53b3fbedb7333c91 upstream.
gss_krb5_unwrap_v2() sets buf->len to a logical length, which can be much smaller than head[0].iov_len (the allocated receive-page capacity). It then calls xdr_buf_trim() with a trim length derived from the 16-bit "extra count" (ec) field in the Kerberos v2 token header.
The ec field is authenticated by the post-decrypt memcmp() against the encrypted header copy, so a randomly-mutated value is rejected. However, any peer holding a valid GSS context can legitimately encrypt a token whose ec exceeds the plaintext length. Per RFC 4121, such a token is structurally malformed.
Although xdr_buf_trim() now clamps the buf->len subtraction to avoid unsigned underflow, the buffer is still left in a semantically invalid state (zero length, inconsistent iov lengths) when ec is oversized.
Reject these tokens before calling xdr_buf_trim(), giving callers a well-defined GSS_S_DEFECTIVE_TOKEN error and keeping the xdr_buf internally consistent. The wrapped blob begins at a nonzero offset -- both callers pass len as offset + opaque_len -- so buf->len still counts the offset bytes that precede the blob. Compare the trim length against the remaining wrapped segment, buf->len - offset, rather than the whole buffer; comparing against buf->len alone leaves an offset-wide window in which an oversized ec passes the test and xdr_buf_trim() cuts into the bytes ahead of the blob.
--- net/sunrpc/auth_gss/gss_krb5_wrap.c | 2 ++ 1 file changed, 2 insertions(+)
net/sunrpc/auth_gss/gss_krb5_wrap.c +2 -0
@@ -557,6 +557,8 @@ gss_unwrap_kerberos_v2(struct krb5_ctx * buf->len = len - (GSS_KRB5_TOK_HDR_LEN + headskip);/* Trim off the trailing "extra count" and checksum blob */ +if (ec +GSS_KRB5_TOK_HDR_LEN + tailskip > buf->len - offset) +return GSS_S_DEFECTIVE_TOKEN ;xdr_buf_trim (buf, ec +GSS_KRB5_TOK_HDR_LEN + tailskip); *align =XDR_QUADLEN (GSS_KRB5_TOK_HDR_LEN + headskip);
Greg Kroah-Hartman
maintainerPATCH 103/798 udf: reject VAT indexes equal to the entry count
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Lee <[email protected]>
commit cac0cb07f29ccfb373fd4a36c81e908ef3ce608c upstream.
UDF 1.50 virtual partition mapping uses the VAT as an array of physical block mappings. s_num_entries stores the number of entries in that array, not the highest valid index. The valid VAT indexes are therefore below s_num_entries.
udf_get_pblock_virt15() currently rejects only indexes greater than s_num_entries. A crafted image can request index s_num_entries, pass the bounds check, and make the kernel read one entry past the allocated VAT table.
Change the check to reject block >= s_num_entries, so the count is handled as an exclusive upper bound.
A crafted UDF image reproduced this on origin/master commit 0e35b9b6ec0ffcc5e23cbdec09f5c622ad532b53 with a KASAN slab-out-of-bounds report in udf_get_pblock_virt15().
Trail of Bits has a reproducer that triggers kernel panic demonstrating the bug, and can share it if needed.
--- fs/udf/partition.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/udf/partition.c +1 -1
@@ -58,7 +58,7 @@ uint32_t udf_get_pblock_virt15(struct su map = &sbi->s_partmaps[partition]; vdata = &map->s_type_specific.s_virtual; -if (block > vdata->s_num_entries) { +if (block >= vdata->s_num_entries) {udf_debug ("Trying to access block beyond end of VAT (%u max %u)\n" , block, vdata->s_num_entries);return 0xFFFFFFFF ;
Greg Kroah-Hartman
maintainerPATCH 104/798 wifi: ath6kl: clamp assoc request/response lengths before subtracting IE offsets
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Doruk Tan Ozturk <[email protected]>
commit 3bbd05723d15dd06f0560bcd94fbf9a91b5f5613 upstream.
ath6kl_cfg80211_connect_event() subtracts fixed IE offsets from assoc_req_len (-= 4) and assoc_resp_len (-= 6), both u8, with no lower bound. The aggregate check recently added to ath6kl_wmi_connect_event_rx() bounds the declared lengths from above (their sum must fit the received event), but an assoc request/response shorter than its fixed offset still underflows here: the u8 wraps to ~250, and cfg80211_connect_result() / cfg80211_roamed() then treat that wrapped value as the IE length and copy that many bytes out of the small assoc_info buffer to user space via nl80211, disclosing adjacent slab memory.
Clamp both lengths to their offsets before subtracting.
Found by 0sec (https://0sec.ai) using automated source analysis; the missing lower bound is evident from source. Compile-tested.
--- drivers/net/wireless/ath/ath6kl/cfg80211.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/net/wireless/ath/ath6kl/cfg80211.c +5 -0
@@ -753,6 +753,11 @@ void ath6kl_cfg80211_connect_event(strucu8 *assoc_resp_ie = assoc_info + beacon_ie_len + assoc_req_len + assoc_resp_ie_offset; +if (assoc_req_len < assoc_req_ie_offset) + assoc_req_len = assoc_req_ie_offset; +if (assoc_resp_len < assoc_resp_ie_offset) + assoc_resp_len = assoc_resp_ie_offset; + assoc_req_len -= assoc_req_ie_offset; assoc_resp_len -= assoc_resp_ie_offset;
Greg Kroah-Hartman
maintainerPATCH 105/798 rpmsg: glink: smem: order FIFO read after availability check
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chunkai Deng <[email protected]>
commit 786439ad58763e04b91bc2ec5f590e463939f197 upstream.
glink_smem_rx_peek() reads the RX FIFO payload after the caller has determined data is available via glink_smem_rx_avail(), which reads the remote-updated head index. A control dependency between the head read and the subsequent payload read does not order the two loads, so the CPU may speculatively read the FIFO before observing the head update and consume stale data the remote has not yet published.
Add rmb() in glink_smem_rx_peek() before the memcpy_fromio() so the availability (head) read is ordered ahead of the FIFO payload read, matching the consumer pattern in Documentation/core-api/circular-buffers.rst.
--- drivers/rpmsg/qcom_glink_smem.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/rpmsg/qcom_glink_smem.c +7 -0
@@ -88,6 +88,13 @@ static void glink_smem_rx_peak(struct qcif (tail >= pipe->native.length) tail -= pipe->native.length; +/* +* Order the availability (head) read in glink_smem_rx_avail() +* against the FIFO payload read below, so APPS never consumes +* stale data the remote has not yet published. +*/ +rmb (); + len =min_t (size_t, count, pipe->native.length - tail);if (len)memcpy_fromio (data, pipe->fifo + tail, len);
Greg Kroah-Hartman
maintainerPATCH 106/798 remoteproc: scp: Fix device reference leak on failed lookup
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 22f9efb3ae07f966a1901d929d16df1388cce65c upstream.
Make sure to drop the reference taken to the SCP device when attempting to look up its driver data before the driver has been bound.
Note that holding a reference to a device does not prevent its driver data from going away.
--- drivers/remoteproc/mtk_scp.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
drivers/remoteproc/mtk_scp.c +8 -1
@@ -36,6 +36,7 @@ struct mtk_scp *scp_get(struct platform_struct device *dev = &pdev->dev;struct device_node *scp_node;struct platform_device *scp_pdev; +struct mtk_scp *scp; scp_node =of_parse_phandle (dev->of_node,"mediatek,scp" ,0 );if (!scp_node) {
@@ -51,7 +52,13 @@ struct mtk_scp *scp_get(struct platform_return NULL ; } -return platform_get_drvdata (scp_pdev); + scp =platform_get_drvdata (scp_pdev); +if (!scp) { +put_device (&scp_pdev->dev); +return NULL ; + } + +return scp; }EXPORT_SYMBOL_GPL (scp_get);
Greg Kroah-Hartman
maintainerPATCH 107/798 qede: Fix NULL pointer dereference in TPA fragment processing
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vaibhav Nagare <[email protected]>
commit 06aa3d26327f24edd039ff249672fdf6f2ba5695 upstream.
Under memory pressure, the qede driver encounters NULL pointer dereferences when processing TPA continuation fragments.
Commit 8a8633978b84 ("qede: Add build_skb() support.") accidentally dropped the assignment of tpa_info->buffer.data in qede_tpa_start().
When memory pressure causes an SKB allocation failure in qede_tpa_start(), the driver sets tpa_start_fail = true and attempts to recycle the physical page later in qede_tpa_end() via qede_reuse_page(). However, because buffer.data was left uninitialized (NULL), qede_reuse_page() pushes a "ghost" BD (valid DMA mapping but NULL data pointer) back into the active Rx ring.
The next time the hardware uses this ring slot, it passes a NULL page to qede_fill_frag_skb(), causing a kernel panic.
Example crash from production system:
BUG: unable to handle kernel NULL pointer dereference at 0x8 RIP: qede_fill_frag_skb+0x96/0x430 [qede] Call Trace: qede_rx_int+0xb06/0x1de0 qede_poll+0x2f4/0x6c0 __napi_poll+0x2d/0x130
Fix the root cause by restoring the tpa_info->buffer.data assignment in qede_tpa_start(), ensuring valid pages are correctly tracked and recycled. Additionally, update the stale comment for struct qede_agg_info::buffer to reflect its current usage.
--- drivers/net/ethernet/qlogic/qede/qede.h | 8 ++++---- drivers/net/ethernet/qlogic/qede/qede_fp.c | 1 + 2 files changed, 5 insertions(+), 4 deletions(-)
drivers/net/ethernet/qlogic/qede/qede.h +4 -4
@@ -307,10 +307,10 @@ enum qede_agg_state { };struct qede_agg_info { -/* rx_buf is a data buffer that can be placed / consumed from rx bd -* chain. It has two purposes: We will preallocate the data buffer -* for each aggregation when we open the interface and will place this -* buffer on the rx-bd-ring when we receive TPA_START. We don't want +/* buffer is used to retain the Rx consumer descriptor when a TPA +* session starts. If the SKB allocation fails during TPA_START, +* we use this saved buffer to safely recycle the physical page +* back into the rx-bd-ring via qede_reuse_page(). We don't want * to be in a state where allocation fails, as we can't reuse the * consumer buffer in the rx-chain since FW may still be writing to it * (since header needs to be modified for TPA).
drivers/net/ethernet/qlogic/qede/qede_fp.c +1 -0
@@ -855,6 +855,7 @@ static void qede_tpa_start(struct qede_d pad, false); tpa_info->buffer.page_offset = sw_rx_data_cons->page_offset; tpa_info->buffer.mapping = sw_rx_data_cons->mapping; + tpa_info->buffer.data = sw_rx_data_cons->data;if (unlikely (!tpa_info->skb)) {DP_NOTICE (edev,"Failed to allocate SKB for gro\n" );
Greg Kroah-Hartman
maintainerPATCH 108/798 RDMA/cxgb4: Cancel reg_work before freeing device on remove
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fan Wu <[email protected]>
commit a7100601aa1a39f799a566acce10db20eaf4b7f2 upstream.
c4iw_uld_state_change() queues reg_work to register the RDMA device. c4iw_remove() can free ctx->dev while this work is pending or running, leaving c4iw_register_device() accessing the freed device.
Cancel reg_work before removing the device. The registration work can tear down ctx->dev when registration fails, so do not unregister or deallocate it again in that case.
This issue was found by an in-house static analysis tool.
--- drivers/infiniband/hw/cxgb4/device.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/infiniband/hw/cxgb4/device.c +6 -0
@@ -953,6 +953,12 @@ void c4iw_dealloc(struct uld_ctx *ctx)static void c4iw_remove (struct uld_ctx *ctx) {pr_debug ("c4iw_dev %p\n" , ctx->dev); + +/* c4iw_register_device() may still be using ctx->dev. */ +cancel_work_sync (&ctx->reg_work); +if (!ctx->dev) +return ; +debugfs_remove_recursive (ctx->dev->debugfs_root);c4iw_unregister_device (ctx->dev);c4iw_dealloc (ctx);
Greg Kroah-Hartman
maintainerPATCH 109/798 RDMA/ucma: Lock the handler in ucma_set_ib_path()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Norbert Szetei <[email protected]>
commit ecbe7d36dc2de07e5dfbb4a8ff5b315ab43de820 upstream.
ucma_set_ib_path() calls ucma_event_handler() straight from the write() path, without the handler lock that keeps ctx->file stable while a uevent is queued. The handler re-reads ctx->file for every dereference:
mutex_lock(&ctx->file->mut); /* file A */ list_add_tail(&uevent->list, &ctx->file->event_list); /* file B */ mutex_unlock(&ctx->file->mut); /* file B */ wake_up_interruptible(&ctx->file->poll_wait); /* file B */
A concurrent ucma_migrate_id() reassigns ctx->file while the SET_OPTION caller sleeps in mutex_lock(), so the list_add_tail() lands on file B's event_list while only file A's mutex is held, racing every other user of that list:
BUG: KASAN: slab-use-after-free in __list_add_valid_or_report+0x1aa/0x1c0 Read of size 8 at addr ffff888153c6a418 by task poc_corr/486 Call Trace: __list_add_valid_or_report+0x1aa/0x1c0 ucma_event_handler+0x1be/0xc00 ucma_set_ib_path+0x45e/0x710 ucma_set_option+0x32e/0x590 ucma_write+0x1f9/0x330 Allocated by task 505: ucma_write_cm_event+0x1a1/0x660 Freed by task 505: kfree+0x1da/0x4c0 ucma_get_event+0x5d5/0x7e0
The freed object is a ucma_event that another thread dequeued from file B's list under file B's mutex. File A's mut is left held on top of that, wedging its next writer in uninterruptible sleep.
This path needs a bound and address-resolved cm_id, so it requires an RDMA device to be present.
Take the handler lock around the call.
--- drivers/infiniband/core/ucma.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/infiniband/core/ucma.c +4 -1
@@ -1336,7 +1336,10 @@ static int ucma_set_ib_path(struct ucma_memset (&event,0 ,sizeof event); event.event =RDMA_CM_EVENT_ROUTE_RESOLVED ; -return ucma_event_handler (ctx->cm_id, &event); +rdma_lock_handler (ctx->cm_id); + ret =ucma_event_handler (ctx->cm_id, &event); +rdma_unlock_handler (ctx->cm_id); +return ret; } static int ucma_set_option_ib(struct ucma_context *ctx, int optname,
Greg Kroah-Hartman
maintainerPATCH 110/798 regulator: as3722_get_regulator_dt_data: fix premature of_node_put leaving dangling of_node pointer
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: WenTao Liang <[email protected]>
commit f9324d670ae0b88cbfb0aa48fcaefa5baeb8da4c upstream.
In as3722_get_regulator_dt_data(), of_get_child_by_name() acquires a reference on np, which is then assigned to pdev->dev.of_node. The function immediately calls of_node_put(np), releasing the reference and leaving pdev->dev.of_node as a dangling pointer.
Remove the of_node_put(np) call to let the device hold the reference.
--- drivers/regulator/as3722-regulator.c | 1 - 1 file changed, 1 deletion(-)
drivers/regulator/as3722-regulator.c +0 -1
@@ -599,7 +599,6 @@ static int as3722_get_regulator_dt_data( ret =of_regulator_match (&pdev->dev, np, as3722_regulator_matches,ARRAY_SIZE (as3722_regulator_matches)); -of_node_put (np);if (ret <0 ) {dev_err (&pdev->dev,"Parsing of regulator node failed: %d\n" , ret);
Greg Kroah-Hartman
maintainerPATCH 111/798 regulator: max8998_pmic_dt_parse_pdata: of_node_put on reg_np after ownership transferred to rdata
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: WenTao Liang <[email protected]>
commit 7c8cc25d8d86f9eb3979255935cfdc7d062ad746 upstream.
In max8998_pmic_dt_parse_pdata(), of_get_child_by_name() acquires a reference on reg_np which is then stored in rdata->reg_node, transferring ownership to the regulator data array. The subsequent of_node_put(reg_np) at the end of the function releases the last matched regulator node's reference, leaving rdata->reg_node as a dangling pointer for the last entry.
Remove the spurious of_node_put(reg_np) call.
--- drivers/regulator/max8998.c | 1 - 1 file changed, 1 deletion(-)
drivers/regulator/max8998.c +0 -1
@@ -611,7 +611,6 @@ static int max8998_pmic_dt_parse_pdata(s } pdata->num_regulators = rdata - pdata->regulators; -of_node_put (reg_np);of_node_put (regulators_np); ret =max8998_pmic_dt_parse_dvs_gpio (iodev, pdata, pmic_np);
Greg Kroah-Hartman
maintainerPATCH 112/798 orangefs: fix double-free of trailer_buf on readdir copy failure
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yifei Gao <[email protected]>
commit f574296be7f46eb60beca851240b526df232f480 upstream.
On a readdir downcall, orangefs_devreq_write_iter() frees op->downcall.trailer_buf with vfree() when copy_from_iter_full() fails, but does not clear the pointer before goto Efault. The waiter in do_readdir() is then woken with a negative status and frees the same pointer again on its r < 0 path, causing a deterministic double-free. A client holding /dev/pvfs2-req triggers it by sending a readdir downcall whose declared trailer_size exceeds the bytes it supplies.
Clear the pointer after freeing so the readdir-side vfree() becomes a no-op.
--- fs/orangefs/devorangefs-req.c | 1 + 1 file changed, 1 insertion(+)
fs/orangefs/devorangefs-req.c +1 -0
@@ -474,6 +474,7 @@ static ssize_t orangefs_devreq_write_ite op->downcall.trailer_size, iter)) {gossip_err ("%s: failed to copy trailer.\n" , __func__);vfree (op->downcall.trailer_buf); + op->downcall.trailer_buf =NULL ; goto Efault; }
Greg Kroah-Hartman
maintainerPATCH 113/798 orangefs: skip leading spaces before parsing client debug masks
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhiling Zou <[email protected]>
commit d410cd5303ec59c7cf23dd61423752ce8e9ecb59 upstream.
orangefs_prepare_cdm_array() sizes each client debug keyword buffer with strcspn(cds_head, " "), but then parses the keyword with %s. The %s conversion skips leading whitespace, while strcspn() does not.
If a client debug entry starts with a space, the allocation can be sized for an empty keyword while sscanf() copies the following non-empty token. This can write past the end of the allocated keyword buffer.
Skip leading spaces before computing the keyword length so the allocation matches the string parsed by sscanf().
--- fs/orangefs/orangefs-debugfs.c | 1 + 1 file changed, 1 insertion(+)
fs/orangefs/orangefs-debugfs.c +1 -0
@@ -529,6 +529,7 @@ static int orangefs_prepare_cdm_array(ch cds_delimiter =strchr (cds_head,'\n' ); *cds_delimiter ='\0' ; + cds_head =skip_spaces (cds_head); keyword_len =strcspn (cds_head," " ); cdm_array[i].keyword =kzalloc (keyword_len +1 ,GFP_KERNEL );
Greg Kroah-Hartman
maintainerPATCH 114/798 ocfs2: always run deallocs on copy-on-write completion
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Antipov <[email protected]>
commit 82ea9d4fc05fb7a387db547c6a7c0aa6a3719616 upstream.
Local fuzzing of 6.12.94 has found the following memory leak caused by doing 'copy_file_range()' within the same filesystem:
unreferenced object 0xffff88812192c980 (size 32):
comm "syz.0.49", pid 12095, jiffies 4294964143 hex dump (first 32 bytes):
00 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00 ................
c0 c5 92 21 81 88 ff ff 00 02 00 00 00 06 00 00 ...!............
backtrace (crc 7068d63f):
kmemleak_alloc_recursive include/linux/kmemleak.h:42 [inline]
slab_post_alloc_hook mm/slub.c:4152 [inline]
slab_alloc_node mm/slub.c:4197 [inline]
__kmalloc_cache_noprof+0x168/0x2c0 mm/slub.c:4358
kmalloc_noprof include/linux/slab.h:878 [inline]
ocfs2_find_per_slot_free_list fs/ocfs2/alloc.c:6618 [inline]
ocfs2_cache_block_dealloc+0x155/0x4b0 fs/ocfs2/alloc.c:6786
ocfs2_cache_extent_block_free fs/ocfs2/alloc.c:6819 [inline]
ocfs2_unlink_path+0x286/0x450 fs/ocfs2/alloc.c:2613
ocfs2_rotate_subtree_left fs/ocfs2/alloc.c:2779 [inline]
__ocfs2_rotate_tree_left+0x1f6f/0x2da0 fs/ocfs2/alloc.c:2985
ocfs2_rotate_tree_left+0x283/0xe00 fs/ocfs2/alloc.c:3237
ocfs2_try_to_merge_extent+0xf56/0x1a20 fs/ocfs2/alloc.c:3825
ocfs2_split_extent+0x15f4/0x2940 fs/ocfs2/alloc.c:5138
ocfs2_clear_ext_refcount+0x2f6/0x550 fs/ocfs2/refcounttree.c:3098
ocfs2_replace_clusters fs/ocfs2/refcounttree.c:3131 [inline]
ocfs2_make_clusters_writable fs/ocfs2/refcounttree.c:3255 [inline]
ocfs2_replace_cow+0x991/0x1660 fs/ocfs2/refcounttree.c:3349
ocfs2_refcount_cow_hunk fs/ocfs2/refcounttree.c:3427 [inline]
ocfs2_refcount_cow+0x5e1/0x9f0 fs/ocfs2/refcounttree.c:3470
ocfs2_prepare_inode_for_write fs/ocfs2/file.c:2340 [inline]
ocfs2_file_write_iter+0xbda/0x1880 fs/ocfs2/file.c:2451
iter_file_splice_write+0x890/0xf60 fs/splice.c:743
do_splice_from fs/splice.c:944 [inline]
direct_splice_actor+0x232/0x480 fs/splice.c:1167
splice_direct_to_actor+0x4b4/0xb60 fs/splice.c:1111
do_splice_direct_actor fs/splice.c:1210 [inline]
do_splice_direct+0x10f/0x1c0 fs/splice.c:1236
do_sendfile+0x430/0xbf0 fs/read_write.c:1388unreferenced object 0xffff88812192c5c0 (size 32):
comm "syz.0.49", pid 12095, jiffies 4294964143 hex dump (first 32 bytes):
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
29 70 00 00 00 00 00 00 19 00 00 00 00 00 00 00 )p..............
backtrace (crc afec850f):
kmemleak_alloc_recursive include/linux/kmemleak.h:42 [inline]
slab_post_alloc_hook mm/slub.c:4152 [inline]
slab_alloc_node mm/slub.c:4197 [inline]
__kmalloc_cache_noprof+0x168/0x2c0 mm/slub.c:4358
kmalloc_noprof include/linux/slab.h:878 [inline]
kzalloc_noprof include/linux/slab.h:1014 [inline]
ocfs2_cache_block_dealloc+0x25c/0x4b0 fs/ocfs2/alloc.c:6793
ocfs2_cache_extent_block_free fs/ocfs2/alloc.c:6819 [inline]
ocfs2_unlink_path+0x286/0x450 fs/ocfs2/alloc.c:2613
ocfs2_rotate_subtree_left fs/ocfs2/alloc.c:2779 [inline]
__ocfs2_rotate_tree_left+0x1f6f/0x2da0 fs/ocfs2/alloc.c:2985
ocfs2_rotate_tree_left+0x283/0xe00 fs/ocfs2/alloc.c:3237
ocfs2_try_to_merge_extent+0xf56/0x1a20 fs/ocfs2/alloc.c:3825
ocfs2_split_extent+0x15f4/0x2940 fs/ocfs2/alloc.c:5138
ocfs2_clear_ext_refcount+0x2f6/0x550 fs/ocfs2/refcounttree.c:3098
ocfs2_replace_clusters fs/ocfs2/refcounttree.c:3131 [inline]
ocfs2_make_clusters_writable fs/ocfs2/refcounttree.c:3255 [inline]
ocfs2_replace_cow+0x991/0x1660 fs/ocfs2/refcounttree.c:3349
ocfs2_refcount_cow_hunk fs/ocfs2/refcounttree.c:3427 [inline]
ocfs2_refcount_cow+0x5e1/0x9f0 fs/ocfs2/refcounttree.c:3470
ocfs2_prepare_inode_for_write fs/ocfs2/file.c:2340 [inline]
ocfs2_file_write_iter+0xbda/0x1880 fs/ocfs2/file.c:2451
iter_file_splice_write+0x890/0xf60 fs/splice.c:743
do_splice_from fs/splice.c:944 [inline]
direct_splice_actor+0x232/0x480 fs/splice.c:1167
splice_direct_to_actor+0x4b4/0xb60 fs/splice.c:1111
do_splice_direct_actor fs/splice.c:1210 [inline]
do_splice_direct+0x10f/0x1c0 fs/splice.c:1236
do_sendfile+0x430/0xbf0 fs/read_write.c:1388This happens when 'ocfs2_cache_block_dealloc()' called from 'ocfs2_cache_extent_block_free()' uses the suballocator to schedule extent removal, so 'ocfs2_run_deallocs()' should be run unconditionally to complete the removal with 'ocfs2_free_cached_blocks()'. An extra semi-automated static analysis [1] suspects that the same scenario looks possible in 'ocfs2_attach_refcount_tree()' and 'ocfs2_reflink_remap_blocks()' as well, but, since 'ocfs2_run_deallocs()' is a safe no-op for an empty dealloc context, 'ocfs2_create_reflink_node()' and 'ocfs2_reflink_xattrs()' may be adjusted in the same way too, thus keeping the code pattern consistent.
--- fs/ocfs2/refcounttree.c | 20 ++++++++------------ fs/ocfs2/xattr.c | 5 ++--- 2 files changed, 10 insertions(+), 15 deletions(-)
fs/ocfs2/refcounttree.c +8 -12
@@ -3394,10 +3394,9 @@ static int ocfs2_replace_cow(struct ocfs cow_start += num_clusters; } -if (ocfs2_dealloc_has_cluster (&context->dealloc)) { +if (ocfs2_dealloc_has_cluster (&context->dealloc))ocfs2_schedule_truncate_log_flush (osb,1 ); -ocfs2_run_deallocs (osb, &context->dealloc); - } +ocfs2_run_deallocs (osb, &context->dealloc);return ret; }
@@ -3880,10 +3879,9 @@ unlock:ocfs2_unlock_refcount_tree (osb, ref_tree,1 );brelse (ref_root_bh); -if (!ret &&ocfs2_dealloc_has_cluster (&dealloc)) { +if (!ret &&ocfs2_dealloc_has_cluster (&dealloc))ocfs2_schedule_truncate_log_flush (osb,1 ); -ocfs2_run_deallocs (osb, &dealloc); - } +ocfs2_run_deallocs (osb, &dealloc); out:/* * Empty the extent map so that we may get the right extent
@@ -4169,10 +4167,9 @@ out_unlock_refcount:ocfs2_unlock_refcount_tree (osb, ref_tree,1 );brelse (ref_root_bh); out: -if (ocfs2_dealloc_has_cluster (&dealloc)) { +if (ocfs2_dealloc_has_cluster (&dealloc))ocfs2_schedule_truncate_log_flush (osb,1 ); -ocfs2_run_deallocs (osb, &dealloc); - } +ocfs2_run_deallocs (osb, &dealloc);return ret; }
@@ -4725,10 +4722,9 @@ loff_t ocfs2_reflink_remap_blocks(struct } out: -if (ocfs2_dealloc_has_cluster (&dealloc)) { +if (ocfs2_dealloc_has_cluster (&dealloc))ocfs2_schedule_truncate_log_flush (osb,1 ); -ocfs2_run_deallocs (osb, &dealloc); - } +ocfs2_run_deallocs (osb, &dealloc);return ret; }
fs/ocfs2/xattr.c +2 -3
@@ -7202,10 +7202,9 @@ out_unlock: ref_tree, 1);brelse (ref_root_bh); -if (ocfs2_dealloc_has_cluster (&dealloc)) { +if (ocfs2_dealloc_has_cluster (&dealloc))ocfs2_schedule_truncate_log_flush (OCFS2_SB (old_inode->i_sb),1 ); -ocfs2_run_deallocs (OCFS2_SB (old_inode->i_sb), &dealloc); - } +ocfs2_run_deallocs (OCFS2_SB (old_inode->i_sb), &dealloc); out:return ret;
Greg Kroah-Hartman
maintainerPATCH 115/798 ocfs2: bound namelen in dlm_migrate_request_handler
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bryam Vargas <[email protected]>
commit ea5b5609305a8437bc955a0834a530c12246d78f upstream.
Patch series "ocfs2/dlm: bound peer-controlled lengths in the o2dlm".
The o2dlm receive handlers trust u8 length and count fields from the wire without bounding them, so a node in a DLM domain can corrupt or panic any other node with a malformed message. Three defects:
- dlm_migrate_request_handler() passes migrate->namelen unchecked to dlm_init_mle(), which memcpy()s it into the 32-byte mname[] of an o2dlm_mle slab object: a heap out-of-bounds write of up to ~215 attacker-controlled bytes.
- dlm_mig_lockres_handler() passes mres->lockname_len unchecked to dlm_init_lockres(), which memcpy()s it into the 32-byte o2dlm_lockname slab object: a heap out-of-bounds write of up to ~223 bytes.
- the same handler trusts mres->num_locks without checking that the message is large enough to hold that many entries, so dlm_process_recovery_data() walks mres->ml[] past the kmalloc(data_len) copy and trips a BUG_ON (an out-of-bounds read ending in a panic).
The other o2dlm receive handlers already reject an oversized name; the migration and recovery handlers have omitted it since the DLM was added (see the Fixes tags). Patch 1 bounds namelen; patch 2 validates lockname_len, num_locks, and the payload size. Conforming recovery and migration traffic is unaffected.
o2net authenticates peers only by the DLM domain key, so any node that has joined the domain -- including a compromised or malicious member -- can send these messages. There is no local trigger; the attacker must already be a member of the cluster.
Each sink was confirmed under KASAN with an out-of-tree module mirroring it exactly -- a kmem_cache/kmalloc of the real destination size, then the same unclamped memcpy/loop: slab-out-of-bounds Write for the two writes, Read for the recovery walk, and a panic. A userspace AddressSanitizer build faults identically under -m32 and -m64. Scrubbed logs are available on request.
I reported this privately to [email protected] and the ocfs2 maintainers on 2026-06-20; with no response after the standard embargo period I am posting the fix publicly. I have no embargo requirement.
This patch (of 2):
A node receiving a DLM_MIGRATE_REQUEST message trusts the peer-supplied name length (migrate->namelen) without bounding it. dlm_init_mle() then copies that many bytes into the fixed DLM_LOCKID_NAME_MAX-byte mname[] array of an o2dlm_mle slab object, so a malformed message from a cluster peer overflows the slab object by up to ~215 bytes: a heap out-of-bounds write of attacker-controlled data, reachable by any node in the domain.
Reject an oversized name, the way dlm_master_request_handler() and the other o2dlm receive handlers already do; the migration handler omits the check entirely. Conforming messages are unaffected.
--- fs/ocfs2/dlm/dlmmaster.c | 6 ++++++ 1 file changed, 6 insertions(+)
fs/ocfs2/dlm/dlmmaster.c +6 -0
@@ -3114,6 +3114,12 @@ int dlm_migrate_request_handler(struct o name = migrate->name; namelen = migrate->namelen; +if (namelen >DLM_LOCKID_NAME_MAX ) { +mlog (ML_ERROR ,"%s: invalid name length %u in migrate request\n" , + dlm->name, namelen); + ret = -EINVAL ; + goto leave; + } hash =dlm_lockid_hash (name, namelen);/* preallocate.. if this fails, abort */
Greg Kroah-Hartman
maintainerPATCH 116/798 ocfs2: validate lengths in dlm_mig_lockres_handler
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bryam Vargas <[email protected]>
commit b54e03d9b3697d25f4a0063cf717d459c5e3ad94 upstream.
A node receiving a DLM_MIG_LOCKRES message trusts several fields of the peer-supplied dlm_migratable_lockres without validation. num_locks and lockname_len are bounded only on the sending side, and the message is never checked to actually carry num_locks migratable_lock entries. As a result dlm_process_recovery_data() walks mres->ml[0..num_locks) past the kmalloc(data_len) copy of the message (an out-of-bounds read that ends in a BUG_ON panic), and dlm_init_lockres() copies lockname_len bytes into the fixed 32-byte o2dlm_lockname slab object (a heap out-of-bounds write). Both are reachable by any node in the domain.
Validate these fields right after dlm_grab(), before anything uses them -- including the not-joined error path, which already prints mres->lockname with the unbounded lockname_len as a %.*s precision. Reject the message unless lockname_len <= DLM_LOCKID_NAME_MAX, num_locks <= DLM_MAX_MIGRATABLE_LOCKS (the bound the sender already asserts), and the payload is large enough to hold the claimed locks. Conforming recovery and migration messages are unaffected.
--- fs/ocfs2/dlm/dlmrecovery.c | 9 +++++++++ 1 file changed, 9 insertions(+)
fs/ocfs2/dlm/dlmrecovery.c +9 -0
@@ -1368,6 +1368,15 @@ int dlm_mig_lockres_handler(struct o2netif (!dlm_grab (dlm))return -EINVAL ; +if (mres->lockname_len >DLM_LOCKID_NAME_MAX || + mres->num_locks >DLM_MAX_MIGRATABLE_LOCKS || +be16_to_cpu (msg->data_len) <struct_size (mres, ml, mres->num_locks)) { +mlog (ML_ERROR ,"%s: invalid lockres migration message from %u\n" , + dlm->name, mres->master); +dlm_put (dlm); +return -EINVAL ; + } +if (!dlm_joined (dlm)) { mlog(ML_ERROR, "Domain %s not joined! " "lockres %.*s, master %u\n",
Greg Kroah-Hartman
maintainerPATCH 117/798 ocfs2: validate rl_used against rl_count in refcount block validator
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ibrahim Hashimov <[email protected]>
commit 4ca62df6bc0708947b48da3f6a712ecb8e73929c upstream.
ocfs2_find_refcount_rec_in_rl() walks the on-disk refcount record array with:
for (; i < le16_to_cpu(rb->rf_records.rl_used); i++) {
rec = &rb->rf_records.rl_recs[i];
...rl_recs[] lives in a single metadata block (4096 bytes on the common configuration), so its real capacity is fixed by ocfs2_refcount_recs_per_rb(sb) (247 records for a 4K block with the 16-byte ocfs2_refcount_rec). rl_used and rl_count are both read directly off disk by ocfs2_validate_refcount_block() and are never checked against that capacity, nor against each other, before any refcount/reflink/CoW operation walks the array.
A crafted (or corrupted) refcount block with rl_used == 0xffff makes the loop above walk far past the end of the block, dereferencing rl_recs[i] for i up to 65534. The resulting index is then handed to the sibling ocfs2_insert_refcount_rec(), whose insert-shift does:
if (index < le16_to_cpu(rf_list->rl_used)) memmove(&rf_list->rl_recs[index + 1], &rf_list->rl_recs[index], (le16_to_cpu(rf_list->rl_used) - index) * sizeof(struct ocfs2_refcount_rec));
i.e. a memmove() of up to (0xffff - index) * 16 bytes (~1 MiB) from an offset already past the block. This is reachable from an ordinary reflink (FICLONE) against a crafted/corrupted ocfs2 image: attaching an extent whose cpos sorts past every real record in the leaf forces the lookup to run off the end instead of returning early on a match. The attacker model is local: CAP_SYS_ADMIN mounting a crafted or corrupted ocfs2 image, or a raw write to the block device backing an already-mounted ocfs2 filesystem.
ocfs2_validate_refcount_block() already validates the block's ECC, signature, rf_blkno and rf_fs_generation, but never rl_count/rl_used against the block's actual on-disk capacity. This is the same class of gap that ocfs2_validate_extent_block() (fs/ocfs2/alloc.c) already closes for the sibling extent-list header, which checks both the record capacity and the "used" bound before any code walks h_list.l_recs[]:
if (le16_to_cpu(eb->h_list.l_count) != ocfs2_extent_recs_per_eb(sb)) {
rc = ocfs2_error(...);
goto bail;
}
if (le16_to_cpu(eb->h_list.l_next_free_rec) >
le16_to_cpu(eb->h_list.l_count)) {
rc = ocfs2_error(...);
goto bail;
}Add the equivalent pair of checks to ocfs2_validate_refcount_block():
reject a refcount block whose rl_count does not match the fixed per-block capacity returned by ocfs2_refcount_recs_per_rb(), and reject rl_used > rl_count. Both checks are skipped when OCFS2_REFCOUNT_TREE_FL is set, because in that case the same union bytes hold an ocfs2_extent_list (rf_list), not the refcount record list (rf_records) -- that layout is already validated separately by ocfs2_validate_extent_block() when the referenced extent block is read. This mirrors the existing "!(rb->rf_flags & OCFS2_REFCOUNT_TREE_FL)" guard used elsewhere in this file (e.g. ocfs2_get_refcount_rec()) to decide whether rf_records or rf_list is the live member of the union.
With this in place, a forged rl_used/rl_count is caught at block validation time (ocfs2_error()), consistent with every other corruption check in this function, instead of driving an out-of-bounds read in ocfs2_find_refcount_rec_in_rl() and a subsequent out-of-bounds memmove() in ocfs2_insert_refcount_rec().
Verified against a crafted image on a v6.19 KASAN (KASAN_GENERIC) build:
replaying the same reflink (FICLONE) reliably hit a KASAN report in __ocfs2_increase_refcount()/ocfs2_insert_refcount_rec() before this patch, and triggers no report once ocfs2_validate_refcount_block() rejects the forged rl_used/rl_count.
--- fs/ocfs2/refcounttree.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+)
fs/ocfs2/refcounttree.c +27 -0
@@ -118,6 +118,33 @@ static int ocfs2_validate_refcount_block le32_to_cpu(rb->rf_fs_generation)); goto out; } + +/* +* rf_records (rl_count/rl_used/rl_recs[]) is only meaningful when +* this block is not an interior tree block (OCFS2_REFCOUNT_TREE_FL); +* in that case the same union bytes hold an extent list (rf_list) +* instead, which is validated by ocfs2_validate_extent_block(). +*/ +if (!(le32_to_cpu (rb->rf_flags) &OCFS2_REFCOUNT_TREE_FL )) { +if (le16_to_cpu (rb->rf_records.rl_count) != +ocfs2_refcount_recs_per_rb (sb)) { + rc =ocfs2_error (sb, +"Refcount block #%llu has an invalid rl_count of %u\n" , + (unsigned long long )bh->b_blocknr, +le16_to_cpu (rb->rf_records.rl_count)); + goto out; + } + +if (le16_to_cpu (rb->rf_records.rl_used) > +le16_to_cpu (rb->rf_records.rl_count)) { + rc =ocfs2_error (sb, +"Refcount block #%llu has an invalid rl_used of %u (rl_count %u)\n" , + (unsigned long long )bh->b_blocknr, +le16_to_cpu (rb->rf_records.rl_used), +le16_to_cpu (rb->rf_records.rl_count)); + goto out; + } + } out:return rc; }
Greg Kroah-Hartman
maintainerPATCH 118/798 ocfs2: cluster: dont sleep while holding o2hb_live_lock in o2hb_region_pin()
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joseph Qi <[email protected]>
commit af09df89db9a68a1d76df0f75667998135bc8d65 upstream.
Patch series "ocfs2: cluster: o2hb_region_pin() fixes", v2.
This series fixes three related issues in o2hb_region_pin(), all are from the original implementation in commit: 58a3158a5d17 ("ocfs2/cluster:
Pin/unpin o2hb regions"):
1) It is called with o2hb_live_lock (a spinlock) held, but the underlying configfs_depend_item() sleeps (takes inode rwsem and pins the filesystem). This triggers BUG under CONFIG_DEBUG_ATOMIC_SLEEP.
2) When called from the configfs drop_item callback, it creates a lock order inversion: parent inode_lock -> configfs root inode_lock, which can deadlock against subsystem unregistration paths taking root -> parent.
3) If pinning fails partway through o2hb_region_inc_user(), the o2hb_dependent_users counter is leaked and partially-pinned regions are never released, leaving heartbeat regions unprotected on subsequent mounts.
Patch 1 reworks o2hb_region_pin() to drop o2hb_live_lock across each sleeping configfs_depend_item() call, using a config_item reference to keep the region alive while unlocked.
Patch 2 adds a from_callback parameter to select configfs_depend_item_unlocked() when called from configfs context, avoiding the inode_lock nesting.
Patch 3 fixes the error path in o2hb_region_inc_user() to unpin and decrement the counter on failure.
This patch (of 3):
o2hb_region_pin() is always called with the o2hb_live_lock spinlock held (from o2hb_region_inc_user() and o2hb_heartbeat_group_drop_item()), but it calls o2nm_depend_item() -> configfs_depend_item(), which sleeps: it pins the configfs filesystem and takes the configfs root inode rwsem. Under CONFIG_DEBUG_ATOMIC_SLEEP this triggers:
BUG: sleeping function called from invalid context at kernel/locking/rwsem.c
in_atomic(): 1, ... name: mount.ocfs2
down_write
configfs_depend_item
o2hb_region_pin
o2hb_region_inc_user
o2hb_register_callback
dlm_register_domain_handlers
...
ocfs2_dlm_init
ocfs2_mount_volume
ocfs2_fill_superRework o2hb_region_pin() to pin one region at a time with the lock dropped across the sleeping call: under o2hb_live_lock find the next eligible region and take a config_item reference to keep it alive, drop the lock, call o2nm_depend_item(), then retake the lock and record the pin. The config_item_put() is done with the lock released as well, since o2hb_region_release() also acquires o2hb_live_lock and can sleep. The region list may change while unlocked, so the scan restarts from the top after each pin. Local heartbeat still pins only the matching region; global heartbeat pins all eligible regions.
The unpin path is unaffected: configfs_undepend_item() only takes a spinlock and does not sleep.
--- fs/ocfs2/cluster/heartbeat.c | 126 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 101 insertions(+), 25 deletions(-)
fs/ocfs2/cluster/heartbeat.c +101 -25
@@ -44,6 +44,14 @@ static DECLARE_RWSEM(o2hb_callback_sem);* whenever any of the threads sees activity from the node in its region. */ static DEFINE_SPINLOCK (o2hb_live_lock); +/* +* Serializes region pin/unpin dependency management (o2hb_dependent_users +* and the o2nm_depend_item()/o2nm_undepend_item() calls). o2hb_region_pin() +* has to drop o2hb_live_lock across the sleeping o2nm_depend_item(), so the +* spinlock alone can no longer keep pin and unpin mutually exclusive; this +* mutex, taken outside o2hb_live_lock, does. +*/ +static DEFINE_MUTEX (o2hb_dependency_mutex);static struct list_head o2hb_live_slots[O2NM_MAX_NODES ];static unsigned long o2hb_live_node_bitmap[BITS_TO_LONGS (O2NM_MAX_NODES )];static LIST_HEAD (o2hb_node_events);
@@ -2118,6 +2126,7 @@ static void o2hb_heartbeat_group_drop_it* If global heartbeat active and there are dependent users, * pin all regions if quorum region count <= CUT_OFF */ +mutex_lock (&o2hb_dependency_mutex);spin_lock (&o2hb_live_lock);if (!o2hb_dependent_users)
@@ -2129,6 +2138,7 @@ static void o2hb_heartbeat_group_drop_it unlock:spin_unlock (&o2hb_live_lock); +mutex_unlock (&o2hb_dependency_mutex); } static ssize_t o2hb_heartbeat_group_dead_threshold_show(struct config_item *item,
@@ -2267,46 +2277,108 @@ EXPORT_SYMBOL_GPL(o2hb_setup_callback);*/ static int o2hb_region_pin (const char *region_uuid) { -int ret =0 , found =0 ; -struct o2hb_region *reg; +int ret =0 , found; +struct o2hb_region *reg, *pinned;char *uuid;assert_spin_locked (&o2hb_live_lock); -list_for_each_entry (reg, &o2hb_all_regions, hr_all_item) { -if (reg->hr_item_dropped) -continue ; +do { + found =0 ; + pinned =NULL ; - uuid =config_item_name (®->hr_item); +list_for_each_entry (reg, &o2hb_all_regions, hr_all_item) { +if (reg->hr_item_dropped) +continue ; -/* local heartbeat */ -if (region_uuid) { -if (strcmp (region_uuid, uuid)) + uuid =config_item_name (®->hr_item); + +/* local heartbeat */ +if (region_uuid) { +if (strcmp (region_uuid, uuid)) +continue ; + found =1 ; + } + +if (reg->hr_item_pinned || reg->hr_item_dropped) { +if (found) +break ;continue ; - found =1 ; + } + +/* +* Found a region that needs pinning. Take a reference +* so it stays alive while we drop the lock below. +*/ + pinned = reg; +config_item_get (®->hr_item); +break ; } -if (reg->hr_item_pinned || reg->hr_item_dropped) - goto skip_pin; +if (!pinned) +break ; + + uuid =config_item_name (&pinned->hr_item); + +/* +* o2nm_depend_item() -> configfs_depend_item() can sleep (it +* takes the configfs root inode rwsem), so it must not run +* under o2hb_live_lock. Drop the lock across it; @pinned is +* kept alive by the reference taken above. The region list may +* change while unlocked, so we rescan from the top afterwards. +*/ +spin_unlock (&o2hb_live_lock);/* Ignore ENOENT only for local hb (userdlm domain) */ - ret =o2nm_depend_item (®->hr_item); + ret =o2nm_depend_item (&pinned->hr_item); + +spin_lock (&o2hb_live_lock);if (!ret) { -mlog (ML_CLUSTER ,"Pin region %s\n" , uuid); - reg->hr_item_pinned =1 ; - }else { -if (ret == -ENOENT && found) - ret =0 ; -else { -mlog (ML_ERROR ,"Pin region %s fails with %d\n" , - uuid, ret); +/* +* o2hb_live_lock was dropped across o2nm_depend_item(). +* o2hb_set_quorum_device() runs in the heartbeat thread +* without o2hb_dependency_mutex, so for global heartbeat +* it may have crossed O2HB_PIN_CUT_OFF and unpinned the +* regions while we slept. If that happened this pin is +* no longer wanted; undo it and stop rather than +* resurrecting it on the rescan below. +*/ +if (!region_uuid && +bitmap_weight (o2hb_quorum_region_bitmap, +O2NM_MAX_REGIONS ) >O2HB_PIN_CUT_OFF ) { +o2nm_undepend_item (&pinned->hr_item); +spin_unlock (&o2hb_live_lock); +config_item_put (&pinned->hr_item); +spin_lock (&o2hb_live_lock);break ; } +mlog (ML_CLUSTER ,"Pin region %s\n" , uuid); + pinned->hr_item_pinned =1 ; + }else if (ret == -ENOENT && (found || !region_uuid)) { +/* +* For local hb (found): ignore ENOENT from userdlm +* domains as before. For global hb (!region_uuid): +* the region may have been detached from configfs +* while the lock was dropped — skip it and continue +* pinning the remaining regions. +*/ + ret =0 ; + }else { +mlog (ML_ERROR ,"Pin region %s fails with %d\n" , + uuid, ret); } -skip_pin: -if (found) -break ; - } + +/* +* config_item_put() may drop the last reference and run +* o2hb_region_release(), which also grabs o2hb_live_lock and +* can sleep, so it must happen with the lock released. +*/ +spin_unlock (&o2hb_live_lock); +config_item_put (&pinned->hr_item); +spin_lock (&o2hb_live_lock); + +/* local hb pins a single matching region */ + }while (!ret && !region_uuid);return ret; }
@@ -2351,6 +2423,7 @@ static int o2hb_region_inc_user(const ch {int ret =0 ; +mutex_lock (&o2hb_dependency_mutex);spin_lock (&o2hb_live_lock);/* local heartbeat */
@@ -2373,11 +2446,13 @@ static int o2hb_region_inc_user(const ch unlock:spin_unlock (&o2hb_live_lock); +mutex_unlock (&o2hb_dependency_mutex);return ret; }static void o2hb_region_dec_user (const char *region_uuid) { +mutex_lock (&o2hb_dependency_mutex);spin_lock (&o2hb_live_lock);/* local heartbeat */
@@ -2396,6 +2471,7 @@ static void o2hb_region_dec_user(const c unlock:spin_unlock (&o2hb_live_lock); +mutex_unlock (&o2hb_dependency_mutex); } int o2hb_register_callback(const char *region_uuid,
Greg Kroah-Hartman
maintainerPATCH 119/798 ocfs2: cluster: avoid lock order inversion in o2hb_region_pin() from drop_item
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joseph Qi <[email protected]>
commit cd789996db3c87427343f54f509d17810bd7ba7c upstream.
o2hb_heartbeat_group_drop_item() is called from configfs rmdir with the parent directory's inode_lock held. It calls o2hb_region_pin() -> o2nm_depend_item() -> configfs_depend_item(), which acquires the configfs root inode_lock. This creates a parent -> root inode_lock nesting that could deadlock against paths taking root -> parent (e.g. subsystem unregistration).
Fix this by using configfs_depend_item_unlocked() when o2hb_region_pin() is called from a configfs callback context. This variant skips the root inode_lock when caller and target are in the same subsystem, which is safe because VFS already holds a lock preventing unregistration.
Add o2nm_depend_item_unlocked() wrapper and a from_callback parameter to o2hb_region_pin() to select the appropriate variant.
--- fs/ocfs2/cluster/heartbeat.c | 17 ++++++++++------- fs/ocfs2/cluster/nodemanager.c | 6 ++++++ fs/ocfs2/cluster/nodemanager.h | 1 + 3 files changed, 17 insertions(+), 7 deletions(-)
fs/ocfs2/cluster/heartbeat.c +10 -7
@@ -147,7 +147,7 @@ static unsigned int o2hb_dependent_users* In global heartbeat mode, we pin/unpin all o2hb regions. This solution * works for both file system and userdlm domains. */ -static int o2hb_region_pin (const char *region_uuid); +static int o2hb_region_pin (const char *region_uuid,bool from_callback);static void o2hb_region_unpin (const char *region_uuid);/* Only sets a new threshold if there are no active regions.
@@ -2134,7 +2134,7 @@ static void o2hb_heartbeat_group_drop_itif (bitmap_weight (o2hb_quorum_region_bitmap,O2NM_MAX_REGIONS ) <=O2HB_PIN_CUT_OFF ) -o2hb_region_pin (NULL ); +o2hb_region_pin (NULL , true); unlock:spin_unlock (&o2hb_live_lock);
@@ -2275,7 +2275,7 @@ EXPORT_SYMBOL_GPL(o2hb_setup_callback);* In local, we only pin the matching region. In global we pin all the active * regions. */ -static int o2hb_region_pin (const char *region_uuid) +static int o2hb_region_pin (const char *region_uuid,bool from_callback) {int ret =0 , found;struct o2hb_region *reg, *pinned;
@@ -2330,7 +2330,10 @@ static int o2hb_region_pin(const char *rspin_unlock (&o2hb_live_lock);/* Ignore ENOENT only for local hb (userdlm domain) */ - ret =o2nm_depend_item (&pinned->hr_item); +if (from_callback) + ret =o2nm_depend_item_unlocked (&pinned->hr_item); +else + ret =o2nm_depend_item (&pinned->hr_item);spin_lock (&o2hb_live_lock);if (!ret) {
@@ -2428,8 +2431,8 @@ static int o2hb_region_inc_user(const ch/* local heartbeat */ if (!o2hb_global_heartbeat_active ()) { - ret =o2hb_region_pin (region_uuid); - goto unlock; + ret =o2hb_region_pin (region_uuid, false); + goto unlock; }/*
@@ -2442,7 +2445,7 @@ static int o2hb_region_inc_user(const chif (bitmap_weight (o2hb_quorum_region_bitmap,O2NM_MAX_REGIONS ) <=O2HB_PIN_CUT_OFF ) - ret =o2hb_region_pin (NULL ); + ret =o2hb_region_pin (NULL , false); unlock:spin_unlock (&o2hb_live_lock);
fs/ocfs2/cluster/nodemanager.c +6 -0
@@ -778,6 +778,12 @@ int o2nm_depend_item(struct config_itemreturn configfs_depend_item (&o2nm_cluster_group.cs_subsys, item); } +int o2nm_depend_item_unlocked (struct config_item *item) +{ +return configfs_depend_item_unlocked (&o2nm_cluster_group.cs_subsys, + item); +} +void o2nm_undepend_item (struct config_item *item) {configfs_undepend_item (item);
fs/ocfs2/cluster/nodemanager.h +1 -0
@@ -66,6 +66,7 @@ void o2nm_node_get(struct o2nm_node *nodvoid o2nm_node_put (struct o2nm_node *node);int o2nm_depend_item (struct config_item *item); +int o2nm_depend_item_unlocked (struct config_item *item);void o2nm_undepend_item (struct config_item *item);int o2nm_depend_this_node (void );void o2nm_undepend_this_node (void );
Greg Kroah-Hartman
maintainerPATCH 120/798 ocfs2: cluster: fix o2hb_dependent_users leak on pin failure
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joseph Qi <[email protected]>
commit 12c2ab42dbe227956c765e2674364bfca5de0533 upstream.
In o2hb_region_inc_user(), o2hb_dependent_users is incremented unconditionally before calling o2hb_region_pin(). If the pin fails, the counter is never decremented and any partially-pinned regions are never unpinned, since the caller does not call o2hb_region_dec_user() on error.
The leaked counter causes subsequent o2hb_region_inc_user() calls to skip pinning entirely (the > 1 check), leaving heartbeat regions unprotected.
Fix by rolling back on failure: call o2hb_region_unpin(NULL) to release any partially-pinned regions and decrement o2hb_dependent_users to restore the pre-increment state.
--- fs/ocfs2/cluster/heartbeat.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
fs/ocfs2/cluster/heartbeat.c +6 -1
@@ -2444,8 +2444,13 @@ static int o2hb_region_inc_user(const ch goto unlock;if (bitmap_weight (o2hb_quorum_region_bitmap, -O2NM_MAX_REGIONS ) <=O2HB_PIN_CUT_OFF ) +O2NM_MAX_REGIONS ) <=O2HB_PIN_CUT_OFF ) { ret =o2hb_region_pin (NULL , false); +if (ret) { +o2hb_region_unpin (NULL ); + o2hb_dependent_users--; + } + } unlock:spin_unlock (&o2hb_live_lock);
Greg Kroah-Hartman
maintainerPATCH 121/798 ocfs2: fix readdir position truncation on 32-bit kernels
In reply to Greg Kroah-Hartman5.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhan Xusheng <[email protected]>
commit a63308ab426f3a3c7e33b02c150ea59054620261 upstream.
In ocfs2_dir_foreach_blk_el(), the directory cookie position is rebuilt with
ctx->pos = (ctx->pos & ~(sb->s_blocksize - 1)) | offset;
ctx->pos is loff_t (signed 64-bit), while sb->s_blocksize is unsigned long. On 32-bit kernels unsigned long is 32-bit, so the mask
~(sb->s_blocksize - 1)
is computed as a 32-bit unsigned value (e.g. 0xfffff000 for a 4 KiB block size). In the AND expression with the 64-bit ctx->pos, that unsigned operand is zero-extended to 64 bits per the usual arithmetic conversions, yielding 0x00000000fffff000. The high 32 bits of ctx->pos are silently cleared, even though directory size is allowed to exceed 4 GiB.
When readdir() crosses the 4 GiB boundary on a 32-bit kernel the position is reset back into the first 4 GiB block, making the re-validation path re-enumerate already-returned dirents indefinitely.
This is ocfs2_dir_foreach_blk_el(), the extent-list readdir path taken for all non-inline directories, so a directory large enough to cross 4 GiB reaches it.
This is the same class of bug that commit 3dce5bb82c97 ("exfat: Fix bitwise operation having different size") fixed in exfat, and the fix mirrors the equivalent ext4 fix in this series. Cast the operand to loff_t so the mask is 64-bit before the AND:
ctx->pos = (ctx->pos & ~((loff_t)sb->s_blocksize - 1)) | offset;
64-bit kernels are unaffected.
--- fs/ocfs2/dir.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/ocfs2/dir.c +1 -1
@@ -1884,7 +1884,7 @@ static int ocfs2_dir_foreach_blk_el(stru i +=le16_to_cpu (de->rec_len); } offset = i; - ctx->pos = (ctx->pos & ~(sb->s_blocksize -1 )) + ctx->pos = (ctx->pos & ~((loff_t )sb->s_blocksize -1 )) | offset; *f_version =inode_query_iversion (inode); }