Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

media: em28xx: fix memory leak in em28xx_init_dev

In the em28xx_init_rev, if em28xx_audio_setup fails, this function fails
to deallocate the media_dev allocated in the em28xx_media_device_init.

Fix this by adding em28xx_unregister_media_device to free media_dev.

BTW, this patch is tested in my local syzkaller instance, and it can
prevent the memory leak from occurring again.

CC: Pavel Skripkin <paskripkin@gmail.com>
Fixes: 37ecc7b1278f ("[media] em28xx: add media controller support")
Signed-off-by: Dongliang Mu <mudongliangabcd@gmail.com>
Reported-by: syzkaller <syzkaller@googlegroups.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>

authored by

Dongliang Mu and committed by
Mauro Carvalho Chehab
22be5a10 91bd11a4

+12 -6
+12 -6
drivers/media/usb/em28xx/em28xx-cards.c
··· 3630 3630 3631 3631 if (dev->is_audio_only) { 3632 3632 retval = em28xx_audio_setup(dev); 3633 - if (retval) 3634 - return -ENODEV; 3633 + if (retval) { 3634 + retval = -ENODEV; 3635 + goto err_deinit_media; 3636 + } 3635 3637 em28xx_init_extension(dev); 3636 3638 3637 3639 return 0; ··· 3652 3650 dev_err(&dev->intf->dev, 3653 3651 "%s: em28xx_i2c_register bus 0 - error [%d]!\n", 3654 3652 __func__, retval); 3655 - return retval; 3653 + goto err_deinit_media; 3656 3654 } 3657 3655 3658 3656 /* register i2c bus 1 */ ··· 3668 3666 "%s: em28xx_i2c_register bus 1 - error [%d]!\n", 3669 3667 __func__, retval); 3670 3668 3671 - em28xx_i2c_unregister(dev, 0); 3672 - 3673 - return retval; 3669 + goto err_unreg_i2c; 3674 3670 } 3675 3671 } 3676 3672 ··· 3676 3676 em28xx_card_setup(dev); 3677 3677 3678 3678 return 0; 3679 + 3680 + err_unreg_i2c: 3681 + em28xx_i2c_unregister(dev, 0); 3682 + err_deinit_media: 3683 + em28xx_unregister_media_device(dev); 3684 + return retval; 3679 3685 } 3680 3686 3681 3687 static int em28xx_duplicate_dev(struct em28xx *dev)