Daniel Vetter
380c7ceabd
drm/atomic: Fix potential use-after-free in nonblocking commits
...
commit 4e076c73e4f6e90816b30fcd4a0d7ab365087255 upstream.
This requires a bit of background. Properly done a modeset driver's
unload/remove sequence should be
drm_dev_unplug();
drm_atomic_helper_shutdown();
drm_dev_put();
The trouble is that the drm_dev_unplugged() checks are by design racy,
they do not synchronize against all outstanding ioctl. This is because
those ioctl could block forever (both for modeset and for driver
specific ioctls), leading to deadlocks in hotunplug. Instead the code
sections that touch the hardware need to be annotated with
drm_dev_enter/exit, to avoid accessing hardware resources after the
unload/remove has finished.
To avoid use-after-free issues all the involved userspace visible
objects are supposed to hold a reference on the underlying drm_device,
like drm_file does.
The issue now is that we missed one, the atomic modeset ioctl can be run
in a nonblocking fashion, and in that case it cannot rely on the implied
drm_device reference provided by the ioctl calling context. This can
result in a use-after-free if an nonblocking atomic commit is carefully
raced against a driver unload.
Fix this by unconditionally grabbing a drm_device reference for any
drm_atomic_state structures. Strictly speaking this isn't required for
blocking commits and TEST_ONLY calls, but it's the simpler approach.
Thanks to shanzhulig for the initial idea of grabbing an unconditional
reference, I just added comments, a condensed commit message and fixed a
minor potential issue in where exactly we drop the final reference.
Reported-by: shanzhulig <shanzhulig@gmail.com>
Suggested-by: shanzhulig <shanzhulig@gmail.com>
Reviewed-by: Maxime Ripard <mripard@kernel.org>
Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Cc: Thomas Zimmermann <tzimmermann@suse.de>
Cc: David Airlie <airlied@gmail.com>
Cc: stable@kernel.org
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2023-07-27 08:37:40 +02:00
..
accessibility
acpi
treewide: Remove uninitialized_var() usage
2023-06-09 10:29:01 +02:00
amba
android
binder: fix UAF caused by faulty buffer cleanup
2023-06-05 08:17:33 +02:00
ata
treewide: Remove uninitialized_var() usage
2023-06-09 10:29:01 +02:00
atm
treewide: Remove uninitialized_var() usage
2023-06-09 10:29:01 +02:00
auxdisplay
base
PM: domains: fix integer overflow issues in genpd_parse_state()
2023-07-27 08:37:06 +02:00
bcma
block
xen/blkfront: Only check REQ_FUA for writes
2023-06-21 15:44:09 +02:00
bluetooth
Revert "Bluetooth: btsdio: fix use after free bug in btsdio_remove due to unfinished work"
2023-05-17 11:35:45 +02:00
bus
bus: imx-weim: fix branch condition evaluates to a garbage value
2023-04-05 11:16:42 +02:00
cdrom
char
hwrng: imx-rngc - fix the timeout for init and self check
2023-07-27 08:37:38 +02:00
clk
clk: keystone: sci-clk: check return value of kasprintf()
2023-07-27 08:37:15 +02:00
clocksource
clocksource/drivers/cadence-ttc: Fix memory leak in ttc_timer_probe
2023-07-27 08:37:05 +02:00
connector
counter
counter: 104-quad-8: Fix race condition between FLAG and CNTR reads
2023-05-17 11:35:31 +02:00
cpufreq
cpufreq: armada-37xx: stop using 0 as NULL pointer
2023-02-06 07:52:41 +01:00
cpuidle
crypto
crypto: marvell/cesa - Fix type mismatch warning
2023-07-27 08:37:18 +02:00
dax
dca
devfreq
PM/devfreq: governor: Add a private governor_data for governor
2023-01-18 11:41:52 +01:00
dio
dma
dmaengine: pl330: rename _start to prevent build error
2023-06-09 10:28:52 +02:00
dma-buf
edac
EDAC/skx: Fix overflows on the DRAM row address mapping arrays
2023-05-17 11:35:35 +02:00
eisa
extcon
extcon: Fix kernel doc of property capability fields to avoid warnings
2023-07-27 08:37:20 +02:00
firewire
treewide: Remove uninitialized_var() usage
2023-06-09 10:29:01 +02:00
firmware
firmware: stratix10-svc: Fix a potential resource leak in svc_create_memory_pool()
2023-07-27 08:37:37 +02:00
fpga
fpga: bridge: fix kernel-doc parameter description
2023-05-17 11:35:46 +02:00
fsi
WRITE is "data source", not destination...
2023-02-22 12:50:23 +01:00
gnss
gpio
gpio: mockup: Fix mode of debugfs files
2023-05-30 12:44:09 +01:00
gpu
drm/atomic: Fix potential use-after-free in nonblocking commits
2023-07-27 08:37:40 +02:00
greybus
hid
HID: wacom: Use ktime_t rather than int when dealing with timestamps
2023-07-27 08:37:03 +02:00
hsi
hv
Drivers: hv: vmbus: Fix vmbus_wait_for_unload() to scan present CPUs
2023-06-28 10:18:36 +02:00
hwmon
hwmon (it87): Fix voltage scaling for chips with 10.9mV ADCs
2023-04-05 11:16:38 +02:00
hwspinlock
hwtracing
coresight: Fix signedness bug in tmc_etr_buf_insert_barrier_packet()
2023-05-30 12:44:10 +01:00
i2c
i2c: xiic: Don't try to handle more interrupt events after error
2023-07-27 08:37:24 +02:00
i3c
ide
treewide: Remove uninitialized_var() usage
2023-06-09 10:29:01 +02:00
idle
iio
meson saradc: fix clock divider mask length
2023-07-27 08:37:38 +02:00
infiniband
IB/hfi1: Fix sdma.h tx->num_descs off-by-one errors
2023-07-27 08:37:14 +02:00
input
Input: adxl34x - do not hardcode interrupt trigger type
2023-07-27 08:37:13 +02:00
interconnect
interconnect: fix mem leak when freeing nodes
2023-03-22 13:28:08 +01:00
iommu
iommu/amd: Don't block updates to GATag if guest mode is on
2023-06-09 10:28:52 +02:00
ipack
irqchip
irqchip/jcore-aic: Fix missing allocation of IRQ descriptors
2023-07-27 08:37:05 +02:00
isdn
leds
leds: TI_LMU_COMMON: select REGMAP instead of depending on it
2023-05-17 11:35:53 +02:00
lightnvm
macintosh
macintosh: via-pmu-led: requires ATA to be set
2023-05-17 11:35:50 +02:00
mailbox
mailbox: ti-msgmgr: Fill non-message tx data fields with 0x0
2023-07-27 08:37:23 +02:00
mcb
mcb-pci: Reallocate memory region to avoid memory overlapping
2023-05-30 12:44:04 +01:00
md
md/raid0: add discard support for the 'original' layout
2023-07-27 08:37:37 +02:00
media
media: usb: siano: Fix warning due to null work_func_t function pointer
2023-07-27 08:37:20 +02:00
memory
memory: brcmstb_dpfe: fix testing array offset after use
2023-07-27 08:37:14 +02:00
memstick
memstick r592: make memstick_debug_get_tpc_name() static
2023-07-27 08:37:10 +02:00
message
scsi: message: mptlan: Fix use after free bug in mptlan_remove() due to race condition
2023-05-30 12:44:03 +01:00
mfd
mfd: stmpe: Only disable the regulators if they are enabled
2023-07-27 08:37:22 +02:00
misc
misc: pci_endpoint_test: Re-init completion for every test
2023-07-27 08:37:37 +02:00
mmc
mmc: sdhci: fix DMA configure compatibility issue when 64bit DMA mode is used.
2023-07-27 08:37:25 +02:00
mtd
mtd: rawnand: meson: fix unaligned DMA buffers handling
2023-07-27 08:37:34 +02:00
mux
net
net: bcmgenet: Ensure MDIO unregistration has clocks enabled
2023-07-27 08:37:34 +02:00
nfc
nfcsim.c: Fix error checking for debugfs_create_dir
2023-06-28 10:18:41 +02:00
ntb
NTB: ntb_tool: Add check for devm_kcalloc
2023-07-27 08:37:32 +02:00
nubus
nvdimm
nvme
nvme-fcloop: fix "inconsistent {IN-HARDIRQ-W} -> {HARDIRQ-ON-W} usage"
2023-05-17 11:35:43 +02:00
nvmem
nvmem: core: fix cell removal on error
2023-02-22 12:50:28 +01:00
of
of: Fix modalias string generation
2023-05-17 11:35:47 +02:00
opp
OPP: fix error checking in opp_migrate_dentry()
2023-03-11 16:43:41 +01:00
oprofile
parisc
parport
pci
PCI: rockchip: Set address alignment for endpoint mode
2023-07-27 08:37:36 +02:00
pcmcia
perf
phy
phy: st: miphy28lp: use _poll_timeout functions for waits
2023-05-30 12:44:04 +01:00
pinctrl
pinctrl: amd: Only use special debounce behavior for GPIO 0
2023-07-27 08:37:34 +02:00
platform
platform/x86: wmi: Break possible infinite loop when parsing GUID
2023-07-27 08:37:33 +02:00
pnp
power
power: supply: Fix logic checking if system is running from battery
2023-06-21 15:44:09 +02:00
powercap
powercap: RAPL: Fix CONFIG_IOSF_MBI dependency
2023-07-27 08:37:06 +02:00
pps
ps3
ptp
ptp_qoriq: fix memory leak in probe()
2023-04-05 11:16:43 +02:00
pwm
pwm: sysfs: Do not apply state to already disabled PWMs
2023-07-27 08:37:22 +02:00
rapidio
ras
regulator
regulator: core: Streamline debugfs operations
2023-07-27 08:37:07 +02:00
remoteproc
remoteproc: st: Call of_node_put() on iteration error
2023-05-17 11:36:01 +02:00
reset
rpmsg
rpmsg: glink: Avoid infinite loop on intent for missing channel
2023-03-11 16:43:53 +01:00
rtc
rtc: st-lpc: Release some resources in st_rtc_probe() in case of error
2023-07-27 08:37:22 +02:00
s390
s390/cio: unregister device when the only path is gone
2023-06-28 10:18:41 +02:00
sbus
scsi
scsi: qla2xxx: Remove unused nvme_ls_waitq wait queue
2023-07-27 08:37:40 +02:00
sfi
sh
siox
slimbus
soc
soc/fsl/qe: fix usb.c build errors
2023-07-27 08:37:14 +02:00
soundwire
spi
spi: bcm-qspi: return error if neither hif_mspi nor mspi is available
2023-07-27 08:37:22 +02:00
spmi
spmi: Add a check for remove callback when removing a SPMI driver
2023-05-17 11:35:49 +02:00
ssb
treewide: Remove uninitialized_var() usage
2023-06-09 10:29:01 +02:00
staging
Revert "staging: rtl8192e: Replace macro RTL_PCI_DEVICE with PCI_DEVICE"
2023-06-14 11:00:00 +02:00
target
scsi: target: iscsi: Prevent login threads from racing between each other
2023-06-28 10:18:40 +02:00
tc
tee
thermal
thermal: intel: BXT_PMIC: select REGMAP instead of depending on it
2023-03-11 16:44:13 +01:00
thunderbolt
thunderbolt: Use const qualifier for ring_interrupt_index
2023-04-05 11:16:39 +02:00
tty
tty: serial: samsung_tty: Fix a memory leak in s3c24xx_serial_getclk() when iterating clk
2023-07-27 08:37:38 +02:00
uio
usb
usb: dwc3: qcom: Release the correct resources in dwc3_qcom_remove()
2023-07-27 08:37:21 +02:00
vfio
vhost
treewide: Remove uninitialized_var() usage
2023-06-09 10:29:01 +02:00
video
fbdev: omapfb: lcd_mipid: Fix an error handling path in mipid_spi_probe()
2023-07-27 08:37:15 +02:00
virt
virtio
treewide: Remove uninitialized_var() usage
2023-06-09 10:29:01 +02:00
visorbus
vlynq
vme
w1
w1: fix loop in w1_fini()
2023-07-27 08:37:19 +02:00
watchdog
watchdog: menz069_wdt: fix watchdog initialisation
2023-06-09 10:28:55 +02:00
xen
xen/pvcalls-back: fix double frees with pvcalls_new_active_socket()
2023-05-30 12:44:10 +01:00
zorro
Kconfig
Makefile