linux-imx/drivers
Lukas Wunner 2cc8973bdc PCI/DPC: Fix use-after-free on concurrent DPC and hot-removal
commit 11a1f4bc47 upstream.

Keith reports a use-after-free when a DPC event occurs concurrently to
hot-removal of the same portion of the hierarchy:

The dpc_handler() awaits readiness of the secondary bus below the
Downstream Port where the DPC event occurred.  To do so, it polls the
config space of the first child device on the secondary bus.  If that
child device is concurrently removed, accesses to its struct pci_dev
cause the kernel to oops.

That's because pci_bridge_wait_for_secondary_bus() neglects to hold a
reference on the child device.  Before v6.3, the function was only
called on resume from system sleep or on runtime resume.  Holding a
reference wasn't necessary back then because the pciehp IRQ thread
could never run concurrently.  (On resume from system sleep, IRQs are
not enabled until after the resume_noirq phase.  And runtime resume is
always awaited before a PCI device is removed.)

However starting with v6.3, pci_bridge_wait_for_secondary_bus() is also
called on a DPC event.  Commit 53b54ad074 ("PCI/DPC: Await readiness
of secondary bus after reset"), which introduced that, failed to
appreciate that pci_bridge_wait_for_secondary_bus() now needs to hold a
reference on the child device because dpc_handler() and pciehp may
indeed run concurrently.  The commit was backported to v5.10+ stable
kernels, so that's the oldest one affected.

Add the missing reference acquisition.

Abridged stack trace:

  BUG: unable to handle page fault for address: 00000000091400c0
  CPU: 15 PID: 2464 Comm: irq/53-pcie-dpc 6.9.0
  RIP: pci_bus_read_config_dword+0x17/0x50
  pci_dev_wait()
  pci_bridge_wait_for_secondary_bus()
  dpc_reset_link()
  pcie_do_recovery()
  dpc_handler()

Fixes: 53b54ad074 ("PCI/DPC: Await readiness of secondary bus after reset")
Closes: https://lore.kernel.org/r/20240612181625.3604512-3-kbusch@meta.com/
Link: https://lore.kernel.org/linux-pci/8e4bcd4116fd94f592f2bf2749f168099c480ddf.1718707743.git.lukas@wunner.de
Reported-by: Keith Busch <kbusch@kernel.org>
Tested-by: Keith Busch <kbusch@kernel.org>
Signed-off-by: Lukas Wunner <lukas@wunner.de>
Signed-off-by: Krzysztof Wilczyński <kwilczynski@kernel.org>
Reviewed-by: Keith Busch <kbusch@kernel.org>
Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Cc: stable@vger.kernel.org # v5.10+
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2024-08-03 08:54:34 +02:00
..
accel kthread: add kthread_stop_put 2024-06-12 11:12:52 +02:00
accessibility speakup: Fix sizeof() vs ARRAY_SIZE() bug 2024-06-12 11:11:18 +02:00
acpi ACPI: EC: Avoid returning AE_OK on errors in address space handler 2024-07-25 09:50:40 +02:00
amba
android binder: fix hang of unregistered readers 2024-08-03 08:54:21 +02:00
ata ata: libata-scsi: Honor the D_SENSE bit for CK_COND=1 and no error 2024-08-03 08:54:15 +02:00
atm
auxdisplay
base devres: Fix memory leakage caused by driver API devm_free_percpu() 2024-08-03 08:54:25 +02:00
bcma
block rbd: don't assume RBD_LOCK_STATE_LOCKED for exclusive mappings 2024-08-03 08:54:32 +02:00
bluetooth Bluetooth: btusb: Add Realtek RTL8852BE support ID 0x13d3:0x3591 2024-08-03 08:54:33 +02:00
bus
cache
cdrom cdrom: rearrange last_media_change check to avoid unintentional overflow 2024-07-11 12:49:10 +02:00
cdx
char hwrng: amd - Convert PCIBIOS_* return codes to errnos 2024-08-03 08:54:21 +02:00
clk clk: davinci: da8xx-cfgchip: Initialize clk_init_data before use 2024-08-03 08:54:23 +02:00
clocksource
comedi
connector
counter counter: ti-eqep: enable clock at probe 2024-07-05 09:33:56 +02:00
cpufreq cpufreq/amd-pstate: Fix the scaling_max_freq setting on shared memory CPPC systems 2024-08-03 08:53:34 +02:00
cpuidle
crypto crypto: qat - extend scope of lock in adf_cfg_add_key_value_param() 2024-08-03 08:54:01 +02:00
cxl cxl/region: check interleave capability 2024-07-05 09:34:07 +02:00
dax
dca
devfreq
dio
dma dmaengine: ioatdma: Fix missing kmem_cache_destroy() 2024-06-27 13:49:09 +02:00
dma-buf dma-buf: handle testing kthreads creation failure 2024-06-21 14:38:40 +02:00
edac EDAC, i10nm: make skx_common.o a separate module 2024-08-03 08:53:19 +02:00
eisa
extcon extcon: max8997: select IRQ_DOMAIN instead of depending on it 2024-06-12 11:12:27 +02:00
firewire firewire: ohci: fulfill timestamp for some local asynchronous transaction 2024-05-17 12:02:30 +02:00
firmware efi/libstub: Zero initialize heap allocated struct screen_info 2024-08-03 08:54:22 +02:00
fpga fpga: region: add owner module and take its refcount 2024-06-12 11:12:23 +02:00
fsi
gnss
gpio gpio: pca953x: fix pca953x_irq_bus_sync_unlock race 2024-07-25 09:50:50 +02:00
gpu drm/panfrost: Mark simple_ondemand governor as softdep 2024-08-03 08:54:32 +02:00
greybus greybus: Fix use-after-free bug in gb_interface_release due to race condition. 2024-06-21 14:38:48 +02:00
hid HID: Ignore battery for ELAN touchscreens 2F2C and 4116 2024-07-25 09:50:44 +02:00
hsi
hte
hv Drivers: hv: vmbus: Don't free ring buffers that couldn't be re-encrypted 2024-05-17 12:02:17 +02:00
hwmon hwmon: (max6697) Fix swapped temp{1,8} critical alarms 2024-08-03 08:53:23 +02:00
hwspinlock
hwtracing coresight: Fix ref leak when of_coresight_parse_endpoint() fails 2024-08-03 08:53:57 +02:00
i2c i2c: rcar: fix error code in probe() 2024-07-18 13:21:27 +02:00
i3c i3c: master: svc: fix invalidate IBI type and miss call client IBI handler 2024-06-16 13:47:46 +02:00
idle
iio iio: frequency: adrf6780: rm clk provider include 2024-08-03 08:53:56 +02:00
infiniband RDMA/iwcm: Fix a use-after-free related to destroying CM IDs 2024-08-03 08:54:30 +02:00
input Input: elan_i2c - do not leave interrupt disabled on suspend failure 2024-08-03 08:54:00 +02:00
interconnect interconnect: qcom: qcm2290: Fix mas_snoc_bimc RPM master ID 2024-08-03 08:53:58 +02:00
iommu iommu/vt-d: Fix identity map bounds in si_domain_init() 2024-08-03 08:54:03 +02:00
ipack
irqchip irqchip/imx-irqsteer: Handle runtime power management correctly 2024-08-03 08:54:25 +02:00
isdn
leds leds: mt6360: Fix memory leak in mt6360_init_isnk_properties() 2024-08-03 08:54:18 +02:00
macintosh macintosh/therm_windtunnel: fix module unload. 2024-08-03 08:54:02 +02:00
mailbox
mcb
md dm-verity: fix dm_is_verity_target() when dm-verity is builtin 2024-08-03 08:54:30 +02:00
media media: ivsc: csi: don't count privacy on as error 2024-08-03 08:54:19 +02:00
memory memory: fsl_ifc: Make FSL_IFC config visible and selectable 2024-08-03 08:53:27 +02:00
memstick
message
mfd mfd: omap-usb-tll: Use struct_size to allocate tll 2024-08-03 08:53:54 +02:00
misc mei: demote client disconnect warning on suspend to debug 2024-07-25 09:50:45 +02:00
mmc mmc: sdhci: Do not lock spinlock around mmc_gpio_get_ro() 2024-07-05 09:33:55 +02:00
most
mtd ubi: eba: properly rollback inside self_check_eba 2024-08-03 08:54:23 +02:00
mux
net ice: Add a per-VF limit on number of FDIR filters 2024-08-03 08:54:25 +02:00
nfc nfc/nci: Add the inconsistency check between the input data length and count 2024-07-11 12:49:21 +02:00
ntb
nubus
nvdimm
nvme nvmet-auth: fix nvmet_auth hash error handling 2024-08-03 08:53:22 +02:00
nvmem nvmem: rockchip-otp: set add_legacy_fixed_of_cells config option 2024-08-03 08:54:01 +02:00
of of/irq: Disable "interrupt-map" parsing for PASEMI Nemo 2024-07-25 09:50:57 +02:00
opp OPP: ti: Fix ti_opp_supply_probe wrong return values 2024-08-03 08:53:27 +02:00
parisc
parport dev/parport: fix the array out-of-bounds risk 2024-08-03 08:54:22 +02:00
pci PCI/DPC: Fix use-after-free on concurrent DPC and hot-removal 2024-08-03 08:54:34 +02:00
pcmcia
peci
perf drivers/perf: riscv: Reset the counter to hpmevent mapping while starting cpus 2024-07-25 09:50:55 +02:00
phy phy: qcom: qmp-combo: fix duplicate return in qmp_v4_configure_dp_phy 2024-06-12 11:12:14 +02:00
pinctrl pinctrl: renesas: r8a779g0: Fix TPU suffixes 2024-08-03 08:54:09 +02:00
platform platform: mips: cpu_hwmon: Disable driver on unsupported hardware 2024-08-03 08:54:30 +02:00
pmdomain pmdomain: qcom: rpmhpd: Skip retention level for Power Domains 2024-07-18 13:21:22 +02:00
pnp
power power: supply: cros_usbpd: provide ID table for avoiding fallback match 2024-06-27 13:49:03 +02:00
powercap
pps
ps3
ptp ptp: fix integer overflow in max_vclocks_store 2024-06-27 13:49:07 +02:00
pwm pwm: atmel-tcb: Fix race condition and convert to guards 2024-08-03 08:53:23 +02:00
rapidio
ras
regulator regulator: bd71815: fix ramp values 2024-06-27 13:49:09 +02:00
remoteproc remoteproc: imx_rproc: Fix refcount mistake in imx_rproc_addr_init 2024-08-03 08:54:31 +02:00
reset
rpmsg
rtc rtc: abx80x: Fix return value of nvmem callback on read 2024-08-03 08:54:29 +02:00
s390 s390/dasd: fix error checks in dasd_copy_pair_store() 2024-08-03 08:54:10 +02:00
sbus
scsi minmax: scsi: fix mis-use of 'clamp()' in sr.c 2024-08-03 08:54:33 +02:00
sh
siox
slimbus slimbus: qcom-ngd-ctrl: Add timeout for wait operation 2024-05-17 12:02:33 +02:00
soc drivers: soc: xilinx: check return status of get_api_version() 2024-08-03 08:54:18 +02:00
soundwire soundwire: cadence: fix invalid PDI offset 2024-06-12 11:12:15 +02:00
spi spi: atmel-quadspi: Add missing check for clk_prepare 2024-08-03 08:53:19 +02:00
spmi spmi: hisi-spmi-controller: Do not override device identifier 2024-06-21 14:38:40 +02:00
ssb ssb: Fix potential NULL pointer dereference in ssb_device_uevent() 2024-06-27 13:49:01 +02:00
staging greybus: arche-ctrl: move device table to its right location 2024-06-12 11:12:17 +02:00
target scsi: target: Fix SELinux error when systemd-modules loads the target module 2024-05-17 12:02:15 +02:00
tc
tee tee: optee: ffa: Fix missing-field-initializers warning 2024-07-25 09:50:53 +02:00
thermal thermal/drivers/mediatek/lvts_thermal: Check NULL ptr on lvts_data 2024-07-11 12:49:07 +02:00
thunderbolt thunderbolt: debugfs: Fix margin debugfs node creation condition 2024-06-21 14:38:25 +02:00
tty tty: serial: ma35d1: Add a NULL check for of_node 2024-07-18 13:21:21 +02:00
ufs scsi: ufs: mcq: Fix missing argument 'hba' in MCQ_OPR_OFFSET_n 2024-08-03 08:53:56 +02:00
uio uio_hv_generic: Don't free decrypted memory 2024-05-17 12:02:17 +02:00
usb usb: typec-mux: nb7vpq904m: unregister typec switch on probe error and remove 2024-08-03 08:53:57 +02:00
vdpa vduse: Temporarily fail if control queue feature requested 2024-07-05 09:33:50 +02:00
vfio vfio/pci: Init the count variable in collecting hot-reset devices 2024-07-18 13:21:10 +02:00
vhost vhost/vsock: always initialize seqpacket_allow 2024-08-03 08:54:01 +02:00
video video: logo: Drop full path of the input filename in generated file 2024-08-03 08:54:32 +02:00
virt drivers/virt/acrn: fix PFNMAP PTE checks in acrn_vm_ram_map() 2024-06-12 11:12:09 +02:00
virtio virtio: delete vq in vp_find_vqs_msix() when request_irq() fails 2024-06-12 11:12:49 +02:00
vlynq
w1 nvmem: add explicit config option to read old syntax fixed OF cells 2024-05-17 12:01:55 +02:00
watchdog watchdog: rti_wdt: Set min_hw_heartbeat_ms to accommodate a safety margin 2024-06-16 13:47:43 +02:00
xen drivers/xen: Improve the late XenStore init protocol 2024-06-12 11:12:51 +02:00
zorro
Kconfig
Makefile