<feed xmlns='http://www.w3.org/2005/Atom'>
<title>kernel/linux.git/drivers/usb/gadget/function/uvc.h, branch v5.10.264</title>
<subtitle>Linux kernel stable tree (mirror)</subtitle>
<id>https://git.radix-linux.su/kernel/linux.git/atom?h=v5.10.264</id>
<link rel='self' href='https://git.radix-linux.su/kernel/linux.git/atom?h=v5.10.264'/>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/kernel/linux.git/'/>
<updated>2026-04-18T08:31:16+00:00</updated>
<entry>
<title>usb: gadget: uvc: fix NULL pointer dereference during unbind race</title>
<updated>2026-04-18T08:31:16+00:00</updated>
<author>
<name>Jimmy Hu</name>
<email>hhhuuu@google.com</email>
</author>
<published>2026-04-11T16:31:15+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/kernel/linux.git/commit/?id=0c00ec409d7b2bce3fcac73188b79a141db7cfda'/>
<id>urn:sha1:0c00ec409d7b2bce3fcac73188b79a141db7cfda</id>
<content type='text'>
[ Upstream commit eba2936bbe6b752a31725a9eb5c674ecbf21ee7d ]

Commit b81ac4395bbe ("usb: gadget: uvc: allow for application to cleanly
shutdown") introduced two stages of synchronization waits totaling 1500ms
in uvc_function_unbind() to prevent several types of kernel panics.
However, this timing-based approach is insufficient during power
management (PM) transitions.

When the PM subsystem starts freezing user space processes, the
wait_event_interruptible_timeout() is aborted early, which allows the
unbind thread to proceed and nullify the gadget pointer
(cdev-&gt;gadget = NULL):

[  814.123447][  T947] configfs-gadget.g1 gadget.0: uvc: uvc_function_unbind()
[  814.178583][ T3173] PM: suspend entry (deep)
[  814.192487][ T3173] Freezing user space processes
[  814.197668][  T947] configfs-gadget.g1 gadget.0: uvc: uvc_function_unbind no clean disconnect, wait for release

When the PM subsystem resumes or aborts the suspend and tasks are
restarted, the V4L2 release path is executed and attempts to access the
already nullified gadget pointer, triggering a kernel panic:

[  814.292597][    C0] PM: pm_system_irq_wakeup: 479 triggered dhdpcie_host_wake
[  814.386727][ T3173] Restarting tasks ...
[  814.403522][ T4558] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000030
[  814.404021][ T4558] pc : usb_gadget_deactivate+0x14/0xf4
[  814.404031][ T4558] lr : usb_function_deactivate+0x54/0x94
[  814.404078][ T4558] Call trace:
[  814.404080][ T4558]  usb_gadget_deactivate+0x14/0xf4
[  814.404083][ T4558]  usb_function_deactivate+0x54/0x94
[  814.404087][ T4558]  uvc_function_disconnect+0x1c/0x5c
[  814.404092][ T4558]  uvc_v4l2_release+0x44/0xac
[  814.404095][ T4558]  v4l2_release+0xcc/0x130

Address the race condition and NULL pointer dereference by:

1. State Synchronization (flag + mutex)
Introduce a 'func_unbound' flag in struct uvc_device. This allows
uvc_function_disconnect() to safely skip accessing the nullified
cdev-&gt;gadget pointer. As suggested by Alan Stern, this flag is protected
by a new mutex (uvc-&gt;lock) to ensure proper memory ordering and prevent
instruction reordering or speculative loads. This mutex is also used to
protect 'func_connected' for consistent state management.

2. Explicit Synchronization (completion)
Use a completion to synchronize uvc_function_unbind() with the
uvc_vdev_release() callback. This prevents Use-After-Free (UAF) by
ensuring struct uvc_device is freed after all video device resources
are released.

Fixes: b81ac4395bbe ("usb: gadget: uvc: allow for application to cleanly shutdown")
Cc: stable &lt;stable@kernel.org&gt;
Suggested-by: Alan Stern &lt;stern@rowland.harvard.edu&gt;
Suggested-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;
Signed-off-by: Jimmy Hu &lt;hhhuuu@google.com&gt;
Link: https://patch.msgid.link/20260320065427.1374555-1-hhhuuu@google.com
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;
[ replaced guard()/scoped_guard() macros ]
Signed-off-by: Sasha Levin &lt;sashal@kernel.org&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;
</content>
</entry>
<entry>
<title>usb: gadget: uvc: allow for application to cleanly shutdown</title>
<updated>2022-05-18T08:23:48+00:00</updated>
<author>
<name>Dan Vacura</name>
<email>w36195@motorola.com</email>
</author>
<published>2022-05-03T20:10:38+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/kernel/linux.git/commit/?id=1444e0568bc2c70868e7b8da5b46fc2252acc3f5'/>
<id>urn:sha1:1444e0568bc2c70868e7b8da5b46fc2252acc3f5</id>
<content type='text'>
commit b81ac4395bbeaf36e078dea1a48c02dd97b76235 upstream.

Several types of kernel panics can occur due to timing during the uvc
gadget removal. This appears to be a problem with gadget resources being
managed by both the client application's v4l2 open/close and the UDC
gadget bind/unbind. Since the concept of USB_GADGET_DELAYED_STATUS
doesn't exist for unbind, add a wait to allow for the application to
close out.

Some examples of the panics that can occur are:

&lt;1&gt;[ 1147.652313] Unable to handle kernel NULL pointer dereference at
virtual address 0000000000000028
&lt;4&gt;[ 1147.652510] Call trace:
&lt;4&gt;[ 1147.652514]  usb_gadget_disconnect+0x74/0x1f0
&lt;4&gt;[ 1147.652516]  usb_gadget_deactivate+0x38/0x168
&lt;4&gt;[ 1147.652520]  usb_function_deactivate+0x54/0x90
&lt;4&gt;[ 1147.652524]  uvc_function_disconnect+0x14/0x38
&lt;4&gt;[ 1147.652527]  uvc_v4l2_release+0x34/0xa0
&lt;4&gt;[ 1147.652537]  __fput+0xdc/0x2c0
&lt;4&gt;[ 1147.652540]  ____fput+0x10/0x1c
&lt;4&gt;[ 1147.652545]  task_work_run+0xe4/0x12c
&lt;4&gt;[ 1147.652549]  do_notify_resume+0x108/0x168

&lt;1&gt;[  282.950561][ T1472] Unable to handle kernel NULL pointer
dereference at virtual address 00000000000005b8
&lt;6&gt;[  282.953111][ T1472] Call trace:
&lt;6&gt;[  282.953121][ T1472]  usb_function_deactivate+0x54/0xd4
&lt;6&gt;[  282.953134][ T1472]  uvc_v4l2_release+0xac/0x1e4
&lt;6&gt;[  282.953145][ T1472]  v4l2_release+0x134/0x1f0
&lt;6&gt;[  282.953167][ T1472]  __fput+0xf4/0x428
&lt;6&gt;[  282.953178][ T1472]  ____fput+0x14/0x24
&lt;6&gt;[  282.953193][ T1472]  task_work_run+0xac/0x130

&lt;3&gt;[  213.410077][   T29] configfs-gadget gadget: uvc: Failed to queue
request (-108).
&lt;1&gt;[  213.410116][   T29] Unable to handle kernel NULL pointer
dereference at virtual address 0000000000000003
&lt;6&gt;[  213.413460][   T29] Call trace:
&lt;6&gt;[  213.413474][   T29]  uvcg_video_pump+0x1f0/0x384
&lt;6&gt;[  213.413489][   T29]  process_one_work+0x2a4/0x544
&lt;6&gt;[  213.413502][   T29]  worker_thread+0x350/0x784
&lt;6&gt;[  213.413515][   T29]  kthread+0x2ac/0x320
&lt;6&gt;[  213.413528][   T29]  ret_from_fork+0x10/0x30

Signed-off-by: Dan Vacura &lt;w36195@motorola.com&gt;
Cc: stable &lt;stable@vger.kernel.org&gt;
Link: https://lore.kernel.org/r/20220503201039.71720-1-w36195@motorola.com
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;
</content>
</entry>
<entry>
<title>usb: gadget: uvc: fix multiple opens</title>
<updated>2021-12-14T10:32:33+00:00</updated>
<author>
<name>Thomas Haemmerle</name>
<email>thomas.haemmerle@wolfvision.net</email>
</author>
<published>2021-10-03T20:13:55+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/kernel/linux.git/commit/?id=518c3f98e57a8081de3d8bc39d7bf9025326c3bd'/>
<id>urn:sha1:518c3f98e57a8081de3d8bc39d7bf9025326c3bd</id>
<content type='text'>
commit 72ee48ee8925446eaeda8e4ef3f2eb16b4a93d2a upstream.

Currently, the UVC function is activated when open on the corresponding
v4l2 device is called.  On another open the activation of the function
fails since the deactivation counter in `usb_function_activate` equals
0. However the error is not returned to userspace since the open of the
v4l2 device is successful.

On a close the function is deactivated (since deactivation counter still
equals 0) and the video is disabled in `uvc_v4l2_release`, although the
UVC application potentially is streaming.

Move activation of UVC function to subscription on UVC_EVENT_SETUP
because there we can guarantee for a userspace application utilizing
UVC.  Block subscription on UVC_EVENT_SETUP while another application
already is subscribed to it, indicated by `bool func_connected` in
`struct uvc_device`.  Extend the `struct uvc_file_handle` with member
`bool is_uvc_app_handle` to tag it as the handle used by the userspace
UVC application.

With this a process is able to check capabilities of the v4l2 device
without deactivating the function for the actual UVC application.

Reviewed-By: Michael Tretter &lt;m.tretter@pengutronix.de&gt;
Reviewed-by: Laurent Pinchart &lt;laurent.pinchart@ideasonboard.com&gt;
Signed-off-by: Thomas Haemmerle &lt;thomas.haemmerle@wolfvision.net&gt;
Signed-off-by: Michael Tretter &lt;m.tretter@pengutronix.de&gt;
Signed-off-by: Michael Grzeschik &lt;m.grzeschik@pengutronix.de&gt;
Acked-by: Felipe Balbi &lt;balbi@kernel.org&gt;
Link: https://lore.kernel.org/r/20211003201355.24081-1-m.grzeschik@pengutronix.de
Cc: Dan Vacura &lt;W36195@motorola.com&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;
</content>
</entry>
<entry>
<title>usb: gadget: uvc_video: add worker to handle the frame pumping</title>
<updated>2020-05-25T08:09:38+00:00</updated>
<author>
<name>Michael Grzeschik</name>
<email>m.grzeschik@pengutronix.de</email>
</author>
<published>2020-04-21T13:28:14+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/kernel/linux.git/commit/?id=43cd0023872efbb6a86bdc03fb520de3de55c7b0'/>
<id>urn:sha1:43cd0023872efbb6a86bdc03fb520de3de55c7b0</id>
<content type='text'>
This patch changes the function uvc_video_pump to be a separate
scheduled worker. This way the completion handler of each usb request
and every direct caller of the pump has only to schedule the worker
instead of doing the request handling by itself.

Moving the request handling to one thread solves the locking problems
between the three queueing cases in the completion handler, v4l2_qbuf
and video_enable.

Many drivers handle the completion handlers directly in their interrupt
handlers. This patch also reduces the workload on each interrupt.

Signed-off-by: Michael Grzeschik &lt;m.grzeschik@pengutronix.de&gt;
Signed-off-by: Felipe Balbi &lt;balbi@kernel.org&gt;
</content>
</entry>
<entry>
<title>USB: gadget: Use the correct style for SPDX License Identifier</title>
<updated>2020-05-05T07:58:49+00:00</updated>
<author>
<name>Nishad Kamdar</name>
<email>nishadkamdar@gmail.com</email>
</author>
<published>2020-03-28T11:11:15+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/kernel/linux.git/commit/?id=2e75973832abe0c5230fd40ca886d03dc975d1d3'/>
<id>urn:sha1:2e75973832abe0c5230fd40ca886d03dc975d1d3</id>
<content type='text'>
This patch corrects the SPDX License Identifier style in
header files related to USB peripheral controller drivers.
For C header files Documentation/process/license-rules.rst
mandates C-like comments (opposed to C source files where
C++ style should be used).

Changes made by using a script provided by Joe Perches here:
https://lkml.org/lkml/2019/2/7/46.

Suggested-by: Joe Perches &lt;joe@perches.com&gt;
Signed-off-by: Nishad Kamdar &lt;nishadkamdar@gmail.com&gt;
Signed-off-by: Felipe Balbi &lt;balbi@kernel.org&gt;
</content>
</entry>
<entry>
<title>usb: gadget: uvc: add uvcg_warn macro</title>
<updated>2019-01-28T10:51:30+00:00</updated>
<author>
<name>Paul Elder</name>
<email>paul.elder@ideasonboard.com</email>
</author>
<published>2018-12-17T06:03:40+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/kernel/linux.git/commit/?id=e49107d8acfee263b2bd8831d4833c4ead152784'/>
<id>urn:sha1:e49107d8acfee263b2bd8831d4833c4ead152784</id>
<content type='text'>
We only have uvcg_dbg, uvcg_info, and uvcg_err, so add uvcg_warn macro
to print gadget device name and function name along with format.

Signed-off-by: Paul Elder &lt;paul.elder@ideasonboard.com&gt;
Signed-off-by: Felipe Balbi &lt;felipe.balbi@linux.intel.com&gt;
</content>
</entry>
<entry>
<title>usb: gadget: uvc: Replace plain printk() with dev_*()</title>
<updated>2018-09-25T15:41:00+00:00</updated>
<author>
<name>Laurent Pinchart</name>
<email>laurent.pinchart@ideasonboard.com</email>
</author>
<published>2018-08-10T12:48:02+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/kernel/linux.git/commit/?id=dc0f755b421d5aac9052f43c9d0e7285607d446c'/>
<id>urn:sha1:dc0f755b421d5aac9052f43c9d0e7285607d446c</id>
<content type='text'>
Adding device context to the kernel log messages make them more useful.
Add new uvcg_* macros based on dev_*() that print both the gadget device
name and the function name.

While at it, remove a commented out printk statement and an unused
printk-based macro.

Signed-off-by: Laurent Pinchart &lt;laurent.pinchart@ideasonboard.com&gt;
Reviewed-by: Paul Elder &lt;paul.elder@ideasonboard.com&gt;
Tested-by: Paul Elder &lt;paul.elder@ideasonboard.com&gt;
Reviewed-by: Kieran Bingham &lt;kieran.bingham@ideasonboard.com&gt;
</content>
</entry>
<entry>
<title>usb: gadget: uvc: Minimize #include in headers</title>
<updated>2018-07-26T10:33:44+00:00</updated>
<author>
<name>Laurent Pinchart</name>
<email>laurent.pinchart@ideasonboard.com</email>
</author>
<published>2018-05-21T08:28:52+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/kernel/linux.git/commit/?id=284eb1663bed1fe0934d60755443504aeea011f8'/>
<id>urn:sha1:284eb1663bed1fe0934d60755443504aeea011f8</id>
<content type='text'>
In order to speed up compilation, only include the headers that are
strictly required within other headers. To that end, use forward
structure declaration and move #include statements to .c file as
appropriate.

While at it, sort headers alphabetically, and remove unneeded __KERNEL__
guards.

Signed-off-by: Laurent Pinchart &lt;laurent.pinchart@ideasonboard.com&gt;
Signed-off-by: Felipe Balbi &lt;felipe.balbi@linux.intel.com&gt;
</content>
</entry>
<entry>
<title>usb: gadget: uvc: Move userspace API definition to public header</title>
<updated>2018-07-26T10:33:39+00:00</updated>
<author>
<name>Laurent Pinchart</name>
<email>laurent.pinchart@ideasonboard.com</email>
</author>
<published>2018-05-21T08:28:51+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/kernel/linux.git/commit/?id=d396e47fb558a819226955ce5db0149fde88da0f'/>
<id>urn:sha1:d396e47fb558a819226955ce5db0149fde88da0f</id>
<content type='text'>
The UVC gadget userspace API (V4L2 events and custom ioctls) is defined
in a header internal to the kernel. Move it to a new public header to
make it accessible to userspace.

The UVC_INTF_CONTROL and UVC_INTF_STREAMING macros are not used, so
remove them in the process.

Signed-off-by: Laurent Pinchart &lt;laurent.pinchart@ideasonboard.com&gt;
Signed-off-by: Felipe Balbi &lt;felipe.balbi@linux.intel.com&gt;
</content>
</entry>
<entry>
<title>USB: gadget: function: Remove redundant license text</title>
<updated>2017-11-07T14:45:02+00:00</updated>
<author>
<name>Greg Kroah-Hartman</name>
<email>gregkh@linuxfoundation.org</email>
</author>
<published>2017-11-06T14:37:32+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/kernel/linux.git/commit/?id=24ceb9c669bc18c7de3ae38863ffed8b68ceae9b'/>
<id>urn:sha1:24ceb9c669bc18c7de3ae38863ffed8b68ceae9b</id>
<content type='text'>
Now that the SPDX tag is in all USB files, that identifies the license
in a specific and legally-defined manner.  So the extra GPL text wording
can be removed as it is no longer needed at all.

This is done on a quest to remove the 700+ different ways that files in
the kernel describe the GPL license text.  And there's unneeded stuff
like the address (sometimes incorrect) for the FSF which is never
needed.

No copyright headers or other non-license-description text was removed.

Cc: Oliver Neukum &lt;oneukum@suse.com&gt;
Cc: Johan Hovold &lt;johan@kernel.org&gt;
Cc: Jerry Zhang &lt;zhangjerry@google.com&gt;
Cc: John Keeping &lt;john@metanate.com&gt;
Cc: Krzysztof Opasiak &lt;k.opasiak@samsung.com&gt;
Cc: Abdulhadi Mohamed &lt;abdulahhadi2@gmail.com&gt;
Cc: Matthew Wilcox &lt;willy@linux.intel.com&gt;
Cc: Janusz Dziedzic &lt;januszx.dziedzic@linux.intel.com&gt;
Acked-by: Felipe Balbi &lt;felipe.balbi@linux.intel.com&gt;
Acked-by: Michal Nazarewicz &lt;mina86@mina86.com&gt;
Acked-by: Laurent Pinchart &lt;laurent.pinchart@ideasonboard.com&gt;
Acked-by: Vincent Pelletier &lt;plr.vincent@gmail.com&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;
</content>
</entry>
</feed>
