]> git.ipfire.org Git - thirdparty/kernel/linux.git/commit
media: rc: fix race between unregister and urb/irq callbacks
authorSean Young <sean@mess.org>
Sat, 20 Dec 2025 10:33:26 +0000 (10:33 +0000)
committerHans Verkuil <hverkuil+cisco@kernel.org>
Tue, 17 Mar 2026 13:43:56 +0000 (14:43 +0100)
commitdccc0c3ddf8f16071736f98a7d6dd46a2d43e037
tree9a0fd3d7a95072afd56a5e56c5e580693700c7da
parenta5dcbff7d50a89bf0376e7f2fb1ba3163a6dac0a
media: rc: fix race between unregister and urb/irq callbacks

Some rc device drivers have a race condition between rc_unregister_device()
and irq or urb callbacks. This is because rc_unregister_device() does two
things, it marks the device as unregistered so no new commands can be
issued and then it calls rc_free_device(). This means the driver has no
chance to cancel any pending urb callbacks or interrupts after the device
has been marked as unregistered. Those callbacks may access struct rc_dev
or its members (e.g. struct ir_raw_event_ctrl), which have been freed by
rc_free_device().

This change removes the implicit call to rc_free_device() from
rc_unregister_device(). This means that device drivers can call
rc_unregister_device() in their remove or disconnect function, then cancel
all the urbs and interrupts before explicitly calling rc_free_device().

Note this is an alternative fix for an issue found by Haotian Zhang, see
the Closes: tags.

Reported-by: Haotian Zhang <vulab@iscas.ac.cn>
Closes: https://lore.kernel.org/linux-media/20251114101432.2566-1-vulab@iscas.ac.cn/
Closes: https://lore.kernel.org/linux-media/20251114101418.2548-1-vulab@iscas.ac.cn/
Closes: https://lore.kernel.org/linux-media/20251114101346.2530-1-vulab@iscas.ac.cn/
Closes: https://lore.kernel.org/linux-media/20251114090605.2413-1-vulab@iscas.ac.cn/
Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com>
Signed-off-by: Sean Young <sean@mess.org>
Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org>
41 files changed:
drivers/gpu/drm/bridge/sil-sii8620.c
drivers/hid/hid-picolcd_cir.c
drivers/media/cec/core/cec-core.c
drivers/media/common/siano/smsir.c
drivers/media/i2c/ir-kbd-i2c.c
drivers/media/pci/bt8xx/bttv-input.c
drivers/media/pci/cx23885/cx23885-input.c
drivers/media/pci/cx88/cx88-input.c
drivers/media/pci/dm1105/dm1105.c
drivers/media/pci/mantis/mantis_input.c
drivers/media/pci/saa7134/saa7134-input.c
drivers/media/pci/smipcie/smipcie-ir.c
drivers/media/pci/ttpci/budget-ci.c
drivers/media/rc/ati_remote.c
drivers/media/rc/ene_ir.c
drivers/media/rc/fintek-cir.c
drivers/media/rc/igorplugusb.c
drivers/media/rc/iguanair.c
drivers/media/rc/img-ir/img-ir-hw.c
drivers/media/rc/img-ir/img-ir-raw.c
drivers/media/rc/imon.c
drivers/media/rc/ir-hix5hd2.c
drivers/media/rc/ir_toy.c
drivers/media/rc/ite-cir.c
drivers/media/rc/mceusb.c
drivers/media/rc/rc-ir-raw.c
drivers/media/rc/rc-loopback.c
drivers/media/rc/rc-main.c
drivers/media/rc/redrat3.c
drivers/media/rc/st_rc.c
drivers/media/rc/streamzap.c
drivers/media/rc/sunxi-cir.c
drivers/media/rc/ttusbir.c
drivers/media/rc/winbond-cir.c
drivers/media/rc/xbox_remote.c
drivers/media/usb/au0828/au0828-input.c
drivers/media/usb/dvb-usb-v2/dvb_usb_core.c
drivers/media/usb/dvb-usb/dvb-usb-remote.c
drivers/media/usb/em28xx/em28xx-input.c
drivers/staging/media/av7110/av7110_ir.c
include/media/rc-core.h