Re: memory leak in zr364xx_probe

From: Andy Shevchenko
Date: Wed Dec 30 2020 - 16:12:09 EST


On Wed, Dec 23, 2020 at 5:26 PM syzbot
<syzbot+b4d54814b339b5c6bbd4@xxxxxxxxxxxxxxxxxxxxxxxxx> wrote:
>
> Hello,
>
> syzbot found the following issue on:
>
> HEAD commit: 3644e2d2 mm/filemap: fix infinite loop in generic_file_buf..
> git tree: upstream
> console output: https://syzkaller.appspot.com/x/log.txt?x=16f80eff500000
> kernel config: https://syzkaller.appspot.com/x/.config?x=37c889fb8b2761af
> dashboard link: https://syzkaller.appspot.com/bug?extid=b4d54814b339b5c6bbd4
> compiler: gcc (GCC) 10.1.0-syz 20200507
> syz repro: https://syzkaller.appspot.com/x/repro.syz?x=1089df07500000
> C reproducer: https://syzkaller.appspot.com/x/repro.c?x=1671c77f500000
>
> IMPORTANT: if you fix the issue, please add the following tag to the commit:
> Reported-by: syzbot+b4d54814b339b5c6bbd4@xxxxxxxxxxxxxxxxxxxxxxxxx
>
> BUG: memory leak
> unreferenced object 0xffffc90000e71000 (size 200704):
> comm "kworker/0:2", pid 3653, jiffies 4294942426 (age 13.820s)
> 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:
> [<00000000110a155e>] __vmalloc_node_range+0x3a5/0x410 mm/vmalloc.c:2585
> [<000000008a1ee970>] __vmalloc_node mm/vmalloc.c:2617 [inline]
> [<000000008a1ee970>] vmalloc+0x49/0x50 mm/vmalloc.c:2650
> [<00000000a6a3abfa>] zr364xx_board_init drivers/media/usb/zr364xx/zr364xx.c:1348 [inline]
> [<00000000a6a3abfa>] zr364xx_probe+0x60b/0x833 drivers/media/usb/zr364xx/zr364xx.c:1509
> [<0000000014a572f5>] usb_probe_interface+0x177/0x370 drivers/usb/core/driver.c:396
> [<00000000f30ee977>] really_probe+0x159/0x480 drivers/base/dd.c:561
> [<00000000ddb29374>] driver_probe_device+0x84/0x100 drivers/base/dd.c:745
> [<0000000073c89cb9>] __device_attach_driver+0xee/0x110 drivers/base/dd.c:851
> [<000000009f56a99c>] bus_for_each_drv+0xb7/0x100 drivers/base/bus.c:431
> [<00000000848d591a>] __device_attach+0x122/0x250 drivers/base/dd.c:919
> [<00000000168be5bb>] bus_probe_device+0xc6/0xe0 drivers/base/bus.c:491
> [<00000000464f40a6>] device_add+0x5be/0xc30 drivers/base/core.c:3091
> [<000000008c75a2b5>] usb_set_configuration+0x9d9/0xb90 drivers/usb/core/message.c:2164
> [<00000000071d14a5>] usb_generic_driver_probe+0x8c/0xc0 drivers/usb/core/generic.c:238
> [<00000000f325b973>] usb_probe_device+0x5c/0x140 drivers/usb/core/driver.c:293
> [<00000000f30ee977>] really_probe+0x159/0x480 drivers/base/dd.c:561
> [<00000000ddb29374>] driver_probe_device+0x84/0x100 drivers/base/dd.c:745

If I am not mistaken the following should work and fix the issue (can
somebody in syzcaller test below patch, sorry it may be mangled?):

--- a/drivers/media/usb/zr364xx/zr364xx.c
+++ b/drivers/media/usb/zr364xx/zr364xx.c
@@ -1533,9 +1533,7 @@ static int zr364xx_probe(struct usb_interface *intf,
return 0;

fail:
- v4l2_ctrl_handler_free(hdl);
- v4l2_device_unregister(&cam->v4l2_dev);
- kfree(cam);
+ v4l2_device_put(&cam->v4l2_dev);
return err;
}

--
With Best Regards,
Andy Shevchenko