linux/drivers/media
Ricardo Ribalda 619d9b710c media: uvcvideo: Fix race condition with usb_kill_urb
usb_kill_urb warranties that all the handlers are finished when it
returns, but does not protect against threads that might be handling
asynchronously the urb.

For UVC, the function uvc_ctrl_status_event_async() takes care of
control changes asynchronously.

If the code is executed in the following order:

CPU 0					CPU 1
===== 					=====
uvc_status_complete()
					uvc_status_stop()
uvc_ctrl_status_event_work()
					uvc_status_start() -> FAIL

Then uvc_status_start will keep failing and this error will be shown:

<4>[    5.540139] URB 0000000000000000 submitted while active
drivers/usb/core/urb.c:378 usb_submit_urb+0x4c3/0x528

Let's improve the current situation, by not re-submiting the urb if
we are stopping the status event. Also process the queued work
(if any) during stop.

CPU 0					CPU 1
===== 					=====
uvc_status_complete()
					uvc_status_stop()
					uvc_status_start()
uvc_ctrl_status_event_work() -> FAIL

Hopefully, with the usb layer protection this should be enough to cover
all the cases.

Cc: stable@vger.kernel.org
Fixes: e5225c820c ("media: uvcvideo: Send a control event when a Control Change interrupt arrives")
Reviewed-by: Yunke Cao <yunkec@chromium.org>
Signed-off-by: Ricardo Ribalda <ribalda@chromium.org>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2023-01-15 23:45:15 +02:00
..
cec media: Switch to use dev_err_probe() helper 2022-12-07 17:58:46 +01:00
common MM patches for 6.2-rc1. 2022-12-13 19:29:45 -08:00
dvb-core Driver Core changes for 6.2-rc1 2022-12-16 03:54:54 -08:00
dvb-frontends media updates for v6.2-rc1 2022-12-13 11:36:58 -08:00
firewire media: Makefiles: remove extra spaces 2022-03-12 16:59:52 +01:00
i2c Merge tag 'br-v6.2i' of git://linuxtv.org/hverkuil/media_tree into media_stage 2022-12-07 17:58:47 +01:00
mc media: mc: convert pipeline funcs to take media_pad 2022-09-24 09:22:30 +02:00
mmc media: media/*/Kconfig: sort entries 2022-03-18 05:58:35 +01:00
pci treewide: Convert del_timer*() to timer_shutdown*() 2022-12-25 13:38:09 -08:00
platform media updates for v6.2-rc1 2022-12-21 09:44:41 -08:00
radio media: si470x: Fix use-after-free in si470x_int_in_callback() 2022-12-07 17:58:47 +01:00
rc Driver Core changes for 6.2-rc1 2022-12-16 03:54:54 -08:00
spi media updates for v5.18-rc1 2022-03-23 14:51:35 -07:00
test-drivers media updates for v6.2-rc1 2022-12-13 11:36:58 -08:00
tuners Tag branch 2022-11-25 07:55:21 +00:00
usb media: uvcvideo: Fix race condition with usb_kill_urb 2023-01-15 23:45:15 +02:00
v4l2-core media updates for v6.2-rc1 2022-12-21 09:44:41 -08:00
Kconfig media: Kconfig: Make DVB_CORE=m possible when MEDIA_SUPPORT=y 2022-12-07 17:58:46 +01:00
Makefile media: Makefiles: remove extra spaces 2022-03-12 16:59:52 +01:00