mirror of
https://github.com/torvalds/linux.git
synced 2026-05-24 15:12:13 +02:00
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> |
||
|---|---|---|
| .. | ||
| a800.c | ||
| af9005-fe.c | ||
| af9005-remote.c | ||
| af9005-script.h | ||
| af9005.c | ||
| af9005.h | ||
| az6027.c | ||
| az6027.h | ||
| cinergyT2-core.c | ||
| cinergyT2-fe.c | ||
| cinergyT2.h | ||
| cxusb-analog.c | ||
| cxusb.c | ||
| cxusb.h | ||
| dib07x0.h | ||
| dib0700_core.c | ||
| dib0700_devices.c | ||
| dib0700.h | ||
| dibusb-common.c | ||
| dibusb-mb.c | ||
| dibusb-mc-common.c | ||
| dibusb-mc.c | ||
| dibusb.h | ||
| digitv.c | ||
| digitv.h | ||
| dtt200u-fe.c | ||
| dtt200u.c | ||
| dtt200u.h | ||
| dtv5100.c | ||
| dtv5100.h | ||
| dvb-usb-common.h | ||
| dvb-usb-dvb.c | ||
| dvb-usb-firmware.c | ||
| dvb-usb-i2c.c | ||
| dvb-usb-init.c | ||
| dvb-usb-remote.c | ||
| dvb-usb-urb.c | ||
| dvb-usb.h | ||
| dw2102.c | ||
| dw2102.h | ||
| gp8psk.c | ||
| gp8psk.h | ||
| Kconfig | ||
| m920x.c | ||
| m920x.h | ||
| Makefile | ||
| nova-t-usb2.c | ||
| opera1.c | ||
| pctv452e.c | ||
| technisat-usb2.c | ||
| ttusb2.c | ||
| ttusb2.h | ||
| umt-010.c | ||
| usb-urb.c | ||
| vp702x-fe.c | ||
| vp702x.c | ||
| vp702x.h | ||
| vp7045-fe.c | ||
| vp7045.c | ||
| vp7045.h | ||