[PATCH v2] usb: gadget: f_tcm: avoid NULL dereference in usbg_make_tpg()

From: pavankumaryalagada

Date: Tue Sep 15 2026 - 04:16:28 EST


From: Yalagada Pavan Kumar <pavankumaryalagada@xxxxxxxxx>

usbg_make_tpg() can race with creation of USB gadget function
instance. tcm_alloc_inst() adds the function instance to
tpg_instances before configfs links the item to its parent group.

As a result, usbg_make_tpg() can find the instance while its
ci_group is still NULL. Passing this item to
configfs_depend_item_unlocked() then causes a NULL pointer
dereference.

Verify that ci_group is set before calling configfs_depend_item_unlocked()
and fail TPG creation if the item has not been linked yet.

keep this validation in f_tcm instead of changing the configfs API to
accept unlinked items.

Reported-by: syzbot+a9efa71b884a23e74153@xxxxxxxxxxxxxxxxxxxxxxxxx
Closes: https://syzkaller.appspot.com/bug?extid=a9efa71b884a23e74153
Fixes: 4bb8548df632 ("usb: gadget: f_tcm: add configfs support")
Cc: stable@xxxxxxxxxxxxxxx
Signed-off-by: Yalagada Pavan Kumar <pavankumaryalagada@xxxxxxxxx>
---
Changes in v2:
- Move the NULL check from configfs to f_tcm.
- Restore configfs_depend_item_unlocked() to its original behaviour

v1: https://lore.kernel.org/all/20260914094426.25595-1-pavankumaryalagada@xxxxxxxxx/T/
---
drivers/usb/gadget/function/f_tcm.c | 3 +++
1 file changed, 3 insertions(+)

diff --git a/drivers/usb/gadget/function/f_tcm.c b/drivers/usb/gadget/function/f_tcm.c
index 9e6d4f39900a..2c2cf1164edf 100644
--- a/drivers/usb/gadget/function/f_tcm.c
+++ b/drivers/usb/gadget/function/f_tcm.c
@@ -1682,6 +1682,9 @@ static struct se_portal_group *usbg_make_tpg(struct se_wwn *wwn,
if (!try_module_get(opts->dependent))
goto unlock_inst;
} else {
+ if (!READ_ONCE(opts->func_inst.group.cg_item.ci_group))
+ goto unlock_inst;
+
/*
* configfs_depend_item_unlocked() may acquire the configfs
* root inode lock when the target belongs to a different
--
2.43.0