* [syzbot] [usb?] memory leak in hidg_bind
@ 2026-08-09 19:13 syzbot
2026-08-10 10:25 ` [PATCH] USB: gadget: f_hid: Release get report req upon unsetup Edward Adam Davis
0 siblings, 1 reply; 2+ messages in thread
From: syzbot @ 2026-08-09 19:13 UTC (permalink / raw)
To: gregkh, linux-kernel, linux-usb, syzkaller-bugs
Hello,
syzbot found the following issue on:
HEAD commit: 9a143525f62b Merge tag 'ata-7.2-rc7' of git://git.kernel.o..
git tree: upstream
console output: https://syzkaller.appspot.com/x/log.txt?x=17edefb9580000
kernel config: https://syzkaller.appspot.com/x/.config?x=6843f8fd2336602d
dashboard link: https://syzkaller.appspot.com/bug?extid=60740c6a17a5b5eb1f5a
compiler: gcc (Debian 14.2.0-19) 14.2.0, GNU ld (GNU Binutils for Debian) 2.44
syz repro: https://syzkaller.appspot.com/x/repro.syz?x=1061fe49580000
C reproducer: https://syzkaller.appspot.com/x/repro.c?x=10c06fb9580000
Downloadable assets:
disk image: https://storage.googleapis.com/syzbot-assets/689093bae5bf/disk-9a143525.raw.xz
vmlinux: https://storage.googleapis.com/syzbot-assets/a57b87e6032d/vmlinux-9a143525.xz
kernel image: https://storage.googleapis.com/syzbot-assets/508c649c8b0f/bzImage-9a143525.xz
IMPORTANT: if you fix the issue, please add the following tag to the commit:
Reported-by: syzbot+60740c6a17a5b5eb1f5a@syzkaller.appspotmail.com
2026/08/08 09:35:22 executed programs: 5
BUG: memory leak
unreferenced object 0xffff888112450300 (size 128):
comm "syz.0.18", pid 5923, jiffies 4294943868
hex dump (first 32 bytes):
00 03 45 12 81 88 ff ff 00 03 45 12 81 88 ff ff ..E.......E.....
30 00 b2 03 81 88 ff ff 00 00 00 00 00 00 00 00 0...............
backtrace (crc 18381426):
kmemleak_alloc_recursive include/linux/kmemleak.h:44 [inline]
slab_post_alloc_hook mm/slub.c:4597 [inline]
slab_alloc_node mm/slub.c:4917 [inline]
__kmalloc_cache_noprof+0x356/0x440 mm/slub.c:5485
_kmalloc_noprof include/linux/slab.h:988 [inline]
_kzalloc_noprof include/linux/slab.h:1309 [inline]
dummy_alloc_request+0x65/0xf0 drivers/usb/gadget/udc/dummy_hcd.c:693
usb_ep_alloc_request+0x2e/0xd0 drivers/usb/gadget/udc/core.c:197
hidg_bind+0x2b/0x490 drivers/usb/gadget/function/f_hid.c:1154
usb_add_function+0xca/0x270 drivers/usb/gadget/composite.c:333
configfs_composite_bind+0x667/0x9b0 drivers/usb/gadget/configfs.c:1802
gadget_bind_driver+0xed/0x390 drivers/usb/gadget/udc/core.c:1662
call_driver_probe drivers/base/dd.c:628 [inline]
really_probe+0x12f/0x3a0 drivers/base/dd.c:706
__driver_probe_device+0xe9/0x1a0 drivers/base/dd.c:868
driver_probe_device+0x28/0xf0 drivers/base/dd.c:898
__driver_attach drivers/base/dd.c:1292 [inline]
__driver_attach+0x10a/0x200 drivers/base/dd.c:1232
bus_for_each_dev+0xb8/0x120 drivers/base/bus.c:383
bus_add_driver+0x122/0x280 drivers/base/bus.c:763
driver_register+0xb1/0x140 drivers/base/driver.c:174
usb_gadget_register_driver_owner+0x69/0xe0 drivers/usb/gadget/udc/core.c:1752
gadget_dev_desc_UDC_store+0x153/0x1e0 drivers/usb/gadget/configfs.c:300
BUG: memory leak
unreferenced object 0xffff888112c7bf00 (size 128):
comm "syz.0.20", pid 5967, jiffies 4294944502
hex dump (first 32 bytes):
00 bf c7 12 81 88 ff ff 00 bf c7 12 81 88 ff ff ................
30 00 b2 03 81 88 ff ff 00 00 00 00 00 00 00 00 0...............
backtrace (crc cd50bb2e):
kmemleak_alloc_recursive include/linux/kmemleak.h:44 [inline]
slab_post_alloc_hook mm/slub.c:4597 [inline]
slab_alloc_node mm/slub.c:4917 [inline]
__kmalloc_cache_noprof+0x356/0x440 mm/slub.c:5485
_kmalloc_noprof include/linux/slab.h:988 [inline]
_kzalloc_noprof include/linux/slab.h:1309 [inline]
dummy_alloc_request+0x65/0xf0 drivers/usb/gadget/udc/dummy_hcd.c:693
usb_ep_alloc_request+0x2e/0xd0 drivers/usb/gadget/udc/core.c:197
hidg_bind+0x2b/0x490 drivers/usb/gadget/function/f_hid.c:1154
usb_add_function+0xca/0x270 drivers/usb/gadget/composite.c:333
configfs_composite_bind+0x667/0x9b0 drivers/usb/gadget/configfs.c:1802
gadget_bind_driver+0xed/0x390 drivers/usb/gadget/udc/core.c:1662
call_driver_probe drivers/base/dd.c:628 [inline]
really_probe+0x12f/0x3a0 drivers/base/dd.c:706
__driver_probe_device+0xe9/0x1a0 drivers/base/dd.c:868
driver_probe_device+0x28/0xf0 drivers/base/dd.c:898
__driver_attach drivers/base/dd.c:1292 [inline]
__driver_attach+0x10a/0x200 drivers/base/dd.c:1232
bus_for_each_dev+0xb8/0x120 drivers/base/bus.c:383
bus_add_driver+0x122/0x280 drivers/base/bus.c:763
driver_register+0xb1/0x140 drivers/base/driver.c:174
usb_gadget_register_driver_owner+0x69/0xe0 drivers/usb/gadget/udc/core.c:1752
gadget_dev_desc_UDC_store+0x153/0x1e0 drivers/usb/gadget/configfs.c:300
connection error: failed to recv *flatrpc.ExecutorMessageRawT: EOF
---
This report is generated by a bot. It may contain errors.
See https://goo.gl/tpsmEJ for more information about syzbot.
syzbot engineers can be reached at syzkaller@googlegroups.com.
syzbot will keep track of this issue. See:
https://goo.gl/tpsmEJ#status for how to communicate with syzbot.
If the report is already addressed, let syzbot know by replying with:
#syz fix: exact-commit-title
If you want syzbot to run the reproducer, reply with:
#syz test: git://repo/address.git branch-or-commit-hash
If you attach or paste a git patch, syzbot will apply it before testing.
If you want to overwrite report's subsystems, reply with:
#syz set subsystems: new-subsystem
(See the list of subsystem names on the web dashboard)
If the report is a duplicate of another one, reply with:
#syz dup: exact-subject-of-another-report
If you want to undo deduplication, reply with:
#syz undup
^ permalink raw reply [flat|nested] 2+ messages in thread* [PATCH] USB: gadget: f_hid: Release get report req upon unsetup
2026-08-09 19:13 [syzbot] [usb?] memory leak in hidg_bind syzbot
@ 2026-08-10 10:25 ` Edward Adam Davis
0 siblings, 0 replies; 2+ messages in thread
From: Edward Adam Davis @ 2026-08-10 10:25 UTC (permalink / raw)
To: syzbot+60740c6a17a5b5eb1f5a
Cc: gregkh, david.sands, chris.wulff, linux-kernel, linux-usb,
syzkaller-bugs
The GET_REPORT request instance (hidg->get_req) is freed only within
hidg_disable() after successful binding, and only if Condition [1] is met.
Since userspace does not execute the setup, get_report_workqueue_handler()
is never invoked; consequently, Condition [1] is never met, leading to the
memory leak reported in [2].
The solution is to add memory reclamation for get_req in hidg_unbind(),
using `get_req->length` to determine whether Condition [1] applies.
Additionally, a failure in usb_gstrings_attach() also triggers the issue
reported in [2], so this is fixed at the same time.
[1]
The report is not in the list or should not be sent immediately
[2]
BUG: memory leak
unreferenced object 0xffff888112450300 (size 128):
backtrace (crc 18381426):
usb_ep_alloc_request+0x2e/0xd0 drivers/usb/gadget/udc/core.c:197
hidg_bind+0x2b/0x490 drivers/usb/gadget/function/f_hid.c:1154
usb_add_function+0xca/0x270 drivers/usb/gadget/composite.c:333
configfs_composite_bind+0x667/0x9b0 drivers/usb/gadget/configfs.c:1802
gadget_bind_driver+0xed/0x390 drivers/usb/gadget/udc/core.c:1662
Fixes: a139c98f760e ("USB: gadget: f_hid: Add GET_REPORT via userspace IOCTL")
Reported-by: syzbot+60740c6a17a5b5eb1f5a@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=60740c6a17a5b5eb1f5a
Tested-by: syzbot+60740c6a17a5b5eb1f5a@syzkaller.appspotmail.com
Signed-off-by: Edward Adam Davis <eadavis@qq.com>
---
drivers/usb/gadget/function/f_hid.c | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/drivers/usb/gadget/function/f_hid.c b/drivers/usb/gadget/function/f_hid.c
index 3c6b43d06a6d..8d739e052e68 100644
--- a/drivers/usb/gadget/function/f_hid.c
+++ b/drivers/usb/gadget/function/f_hid.c
@@ -1163,8 +1163,10 @@ static int hidg_bind(struct usb_configuration *c, struct usb_function *f)
/* maybe allocate device-global string IDs, and patch descriptors */
us = usb_gstrings_attach(c->cdev, ct_func_strings,
ARRAY_SIZE(ct_func_string_defs));
- if (IS_ERR(us))
- return PTR_ERR(us);
+ if (IS_ERR(us)) {
+ status = PTR_ERR(us);
+ goto fail;
+ }
hidg_interface_desc.iInterface = us[CT_FUNC_HID_IDX].id;
/* allocate instance-specific interface IDs, and patch descriptors */
@@ -1585,10 +1587,18 @@ static void hidg_free(struct usb_function *f)
static void hidg_unbind(struct usb_configuration *c, struct usb_function *f)
{
struct f_hidg *hidg = func_to_hidg(f);
+ unsigned long flags;
cdev_device_del(hidg->cdev, &hidg->dev);
destroy_workqueue(hidg->workqueue);
usb_free_all_descriptors(f);
+
+ spin_lock_irqsave(&hidg->get_report_spinlock, flags);
+ if (hidg->get_req && !hidg->get_req->length) {
+ usb_ep_free_request(f->config->cdev->gadget->ep0, hidg->get_req);
+ hidg->get_req = NULL;
+ }
+ spin_unlock_irqrestore(&hidg->get_report_spinlock, flags);
}
static struct usb_function *hidg_alloc(struct usb_function_instance *fi)
--
2.43.0
^ permalink raw reply related [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-08-10 10:25 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-09 19:13 [syzbot] [usb?] memory leak in hidg_bind syzbot
2026-08-10 10:25 ` [PATCH] USB: gadget: f_hid: Release get report req upon unsetup Edward Adam Davis
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox