memory leak in __usbhid_submit_report

26 views
Skip to first unread message

syzbot

unread,
Nov 11, 2020, 8:55:28 AM11/11/20
to benjamin....@redhat.com, ji...@kernel.org, linux...@vger.kernel.org, linux-...@vger.kernel.org, linu...@vger.kernel.org, syzkall...@googlegroups.com
Hello,

syzbot found the following issue on:

HEAD commit: f8394f23 Linux 5.10-rc3
git tree: upstream
console output: https://syzkaller.appspot.com/x/log.txt?x=12ebbdc6500000
kernel config: https://syzkaller.appspot.com/x/.config?x=a3f13716fa0212fd
dashboard link: https://syzkaller.appspot.com/bug?extid=47b26cd837ececfc666d
compiler: gcc (GCC) 10.1.0-syz 20200507
syz repro: https://syzkaller.appspot.com/x/repro.syz?x=14497b82500000
C reproducer: https://syzkaller.appspot.com/x/repro.c?x=1586ff14500000

IMPORTANT: if you fix the issue, please add the following tag to the commit:
Reported-by: syzbot+47b26c...@syzkaller.appspotmail.com

BUG: memory leak
unreferenced object 0xffff8881097e5ec0 (size 32):
comm "kworker/0:1", pid 7, jiffies 4294949214 (age 33.520s)
hex dump (first 32 bytes):
04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
backtrace:
[<000000008296eaa1>] __usbhid_submit_report+0x116/0x490 drivers/hid/usbhid/hid-core.c:588
[<00000000fe39f007>] usbhid_submit_report drivers/hid/usbhid/hid-core.c:638 [inline]
[<00000000fe39f007>] usbhid_request+0x59/0xa0 drivers/hid/usbhid/hid-core.c:1272
[<00000000428a854b>] hidinput_led_worker+0x59/0x160 drivers/hid/hid-input.c:1507
[<000000001bb8d86d>] process_one_work+0x27d/0x590 kernel/workqueue.c:2272
[<000000005d9a2f9c>] worker_thread+0x59/0x5d0 kernel/workqueue.c:2418
[<00000000dc999b29>] kthread+0x178/0x1b0 kernel/kthread.c:292
[<0000000099d5a9ee>] ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:296

BUG: memory leak
unreferenced object 0xffff8881120200c0 (size 32):
comm "kworker/0:1", pid 7, jiffies 4294949214 (age 33.520s)
hex dump (first 32 bytes):
04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
backtrace:
[<000000008296eaa1>] __usbhid_submit_report+0x116/0x490 drivers/hid/usbhid/hid-core.c:588
[<00000000fe39f007>] usbhid_submit_report drivers/hid/usbhid/hid-core.c:638 [inline]
[<00000000fe39f007>] usbhid_request+0x59/0xa0 drivers/hid/usbhid/hid-core.c:1272
[<00000000428a854b>] hidinput_led_worker+0x59/0x160 drivers/hid/hid-input.c:1507
[<000000001bb8d86d>] process_one_work+0x27d/0x590 kernel/workqueue.c:2272
[<000000005d9a2f9c>] worker_thread+0x59/0x5d0 kernel/workqueue.c:2418
[<00000000dc999b29>] kthread+0x178/0x1b0 kernel/kthread.c:292
[<0000000099d5a9ee>] ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:296

BUG: memory leak
unreferenced object 0xffff888107fa9420 (size 32):
comm "kworker/0:1", pid 7, jiffies 4294949214 (age 33.520s)
hex dump (first 32 bytes):
04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
backtrace:
[<000000008296eaa1>] __usbhid_submit_report+0x116/0x490 drivers/hid/usbhid/hid-core.c:588
[<00000000fe39f007>] usbhid_submit_report drivers/hid/usbhid/hid-core.c:638 [inline]
[<00000000fe39f007>] usbhid_request+0x59/0xa0 drivers/hid/usbhid/hid-core.c:1272
[<00000000428a854b>] hidinput_led_worker+0x59/0x160 drivers/hid/hid-input.c:1507
[<000000001bb8d86d>] process_one_work+0x27d/0x590 kernel/workqueue.c:2272
[<000000005d9a2f9c>] worker_thread+0x59/0x5d0 kernel/workqueue.c:2418
[<00000000dc999b29>] kthread+0x178/0x1b0 kernel/kthread.c:292
[<0000000099d5a9ee>] ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:296

BUG: memory leak
unreferenced object 0xffff888112020b60 (size 32):
comm "kworker/1:4", pid 8569, jiffies 4294949237 (age 33.290s)
hex dump (first 32 bytes):
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
backtrace:
[<000000008296eaa1>] __usbhid_submit_report+0x116/0x490 drivers/hid/usbhid/hid-core.c:588
[<00000000fe39f007>] usbhid_submit_report drivers/hid/usbhid/hid-core.c:638 [inline]
[<00000000fe39f007>] usbhid_request+0x59/0xa0 drivers/hid/usbhid/hid-core.c:1272
[<00000000428a854b>] hidinput_led_worker+0x59/0x160 drivers/hid/hid-input.c:1507
[<000000001bb8d86d>] process_one_work+0x27d/0x590 kernel/workqueue.c:2272
[<000000005d9a2f9c>] worker_thread+0x59/0x5d0 kernel/workqueue.c:2418
[<00000000dc999b29>] kthread+0x178/0x1b0 kernel/kthread.c:292
[<0000000099d5a9ee>] ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:296

BUG: memory leak
unreferenced object 0xffff888107fa9a20 (size 32):
comm "kworker/1:3", pid 8559, jiffies 4294949241 (age 33.250s)
hex dump (first 32 bytes):
04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
backtrace:
[<000000008296eaa1>] __usbhid_submit_report+0x116/0x490 drivers/hid/usbhid/hid-core.c:588
[<00000000fe39f007>] usbhid_submit_report drivers/hid/usbhid/hid-core.c:638 [inline]
[<00000000fe39f007>] usbhid_request+0x59/0xa0 drivers/hid/usbhid/hid-core.c:1272
[<00000000428a854b>] hidinput_led_worker+0x59/0x160 drivers/hid/hid-input.c:1507
[<000000001bb8d86d>] process_one_work+0x27d/0x590 kernel/workqueue.c:2272
[<000000005d9a2f9c>] worker_thread+0x59/0x5d0 kernel/workqueue.c:2418
[<00000000dc999b29>] kthread+0x178/0x1b0 kernel/kthread.c:292
[<0000000099d5a9ee>] ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:296

BUG: memory leak
unreferenced object 0xffff888112020940 (size 32):
comm "kworker/1:3", pid 8559, jiffies 4294949241 (age 33.250s)
hex dump (first 32 bytes):
04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
backtrace:
[<000000008296eaa1>] __usbhid_submit_report+0x116/0x490 drivers/hid/usbhid/hid-core.c:588
[<00000000fe39f007>] usbhid_submit_report drivers/hid/usbhid/hid-core.c:638 [inline]
[<00000000fe39f007>] usbhid_request+0x59/0xa0 drivers/hid/usbhid/hid-core.c:1272
[<00000000428a854b>] hidinput_led_worker+0x59/0x160 drivers/hid/hid-input.c:1507
[<000000001bb8d86d>] process_one_work+0x27d/0x590 kernel/workqueue.c:2272
[<000000005d9a2f9c>] worker_thread+0x59/0x5d0 kernel/workqueue.c:2418
[<00000000dc999b29>] kthread+0x178/0x1b0 kernel/kthread.c:292
[<0000000099d5a9ee>] ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:296

executing program
executing program
executing program
executing program
executing program
executing program
executing program


---
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 syzk...@googlegroups.com.

syzbot will keep track of this issue. See:
https://goo.gl/tpsmEJ#status for how to communicate with syzbot.
syzbot can test patches for this issue, for details see:
https://goo.gl/tpsmEJ#testing-patches

Zhang, Qiang

unread,
Nov 13, 2020, 3:35:34 AM11/13/20
to syzbot, benjamin....@redhat.com, ji...@kernel.org, linux...@vger.kernel.org, linux-...@vger.kernel.org, linu...@vger.kernel.org, syzkall...@googlegroups.com

________________________________________
发件人: syzbot <syzbot+47b26c...@syzkaller.appspotmail.com>
发送时间: 2020年11月11日 21:55
收件人: benjamin....@redhat.com; ji...@kernel.org; linux...@vger.kernel.org; linux-...@vger.kernel.org; linu...@vger.kernel.org; syzkall...@googlegroups.com
主题: memory leak in __usbhid_submit_report

[Please note this e-mail is from an EXTERNAL e-mail address]

Hello,

When usb device disconnect the "raw_report" should be free in usbhid_stop.
can we release it in this function, as shown below:

usbhid_stop(struct hid_device *hid) {
........
for (index = 0; index < HID_CONTROL_FIFO_SIZE; index++) {
if (usbhid->ctrl[index].raw_report)
kfree(usbhid->ctrl[index].raw_report);
if (usbhid->out[index].raw_report)
kfree(usbhid->out[index].raw_report);
}
...............

Hillf Danton

unread,
Nov 13, 2020, 8:46:48 PM11/13/20
to syzbot, benjamin....@redhat.com, ji...@kernel.org, linux...@vger.kernel.org, linux-...@vger.kernel.org, linu...@vger.kernel.org, syzkall...@googlegroups.com
Wed, 11 Nov 2020 05:55:26 -0800
Fix 6db3dfefa287 ("USB HID: move usbhid code from drivers/usb/input to
drivers/hid/usbhid") by releasing the raw report buff before updating
the head and tail pointers.

--- a/drivers/hid/usbhid/hid-core.c
+++ b/drivers/hid/usbhid/hid-core.c
@@ -492,7 +492,7 @@ static void hid_ctrl(struct urb *urb)
case -EILSEQ: /* protocol error or unplug */
case -EPROTO: /* protocol error or unplug */
case -ECONNRESET: /* unlink */
- case -ENOENT:
+ case -ENOENT: /* urb got killed */
case -EPIPE: /* report not available */
break;
default: /* error */
@@ -502,6 +502,15 @@ static void hid_ctrl(struct urb *urb)
spin_lock_irqsave(&usbhid->lock, flags);

if (unplug) {
+ unsigned char tail = usbhid->ctrltail;
+
+ while (tail != usbhid->ctrlhead) {
+ if (usbhid->ctrl[tail].dir == USB_DIR_OUT) {
+ kfree(usbhid->ctrl[tail].raw_report);
+ usbhid->ctrl[tail].raw_report = NULL;
+ }
+ tail = (tail + 1) & (HID_CONTROL_FIFO_SIZE - 1);
+ }
usbhid->ctrltail = usbhid->ctrlhead;
} else {
usbhid->ctrltail = (usbhid->ctrltail + 1) & (HID_CONTROL_FIFO_SIZE - 1);
Reply all
Reply to author
Forward
0 new messages