diff options
author | Mauro Carvalho Chehab <mchehab+huawei@kernel.org> | 2021-06-09 14:32:29 +0200 |
---|---|---|
committer | Sasha Levin <sashal@kernel.org> | 2024-03-26 18:22:38 -0400 |
commit | a30cf94eaf5dd3ffd8d13c3a8c303d04357b01c1 (patch) | |
tree | ffe0a0fc5f07dc4cb36b1e5d9981f4f0dcbe1545 | |
parent | 085f36c317cba8b8955c5da5f59c7486345d2bbb (diff) | |
download | linux-stable-a30cf94eaf5dd3ffd8d13c3a8c303d04357b01c1.tar.gz linux-stable-a30cf94eaf5dd3ffd8d13c3a8c303d04357b01c1.tar.bz2 linux-stable-a30cf94eaf5dd3ffd8d13c3a8c303d04357b01c1.zip |
media: dvbdev: fix error logic at dvb_register_device()
[ Upstream commit 1fec2ecc252301110e4149e6183fa70460d29674 ]
As reported by smatch:
drivers/media/dvb-core/dvbdev.c: drivers/media/dvb-core/dvbdev.c:510 dvb_register_device() warn: '&dvbdev->list_head' not removed from list
drivers/media/dvb-core/dvbdev.c: drivers/media/dvb-core/dvbdev.c:530 dvb_register_device() warn: '&dvbdev->list_head' not removed from list
drivers/media/dvb-core/dvbdev.c: drivers/media/dvb-core/dvbdev.c:545 dvb_register_device() warn: '&dvbdev->list_head' not removed from list
The error logic inside dvb_register_device() doesn't remove
devices from the dvb_adapter_list in case of errors.
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
Stable-dep-of: 8c64f4cdf4e6 ("media: edia: dvbdev: fix a use-after-free")
Signed-off-by: Sasha Levin <sashal@kernel.org>
-rw-r--r-- | drivers/media/dvb-core/dvbdev.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/drivers/media/dvb-core/dvbdev.c b/drivers/media/dvb-core/dvbdev.c index 8273c969358e..cf0c428f5776 100644 --- a/drivers/media/dvb-core/dvbdev.c +++ b/drivers/media/dvb-core/dvbdev.c @@ -513,6 +513,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev, break; if (minor == MAX_DVB_MINORS) { + list_del (&dvbdev->list_head); kfree(dvbdevfops); kfree(dvbdev); up_write(&minor_rwsem); @@ -533,6 +534,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev, __func__); dvb_media_device_free(dvbdev); + list_del (&dvbdev->list_head); kfree(dvbdevfops); kfree(dvbdev); mutex_unlock(&dvbdev_register_lock); @@ -548,6 +550,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev, pr_err("%s: failed to create device dvb%d.%s%d (%ld)\n", __func__, adap->num, dnames[type], id, PTR_ERR(clsdev)); dvb_media_device_free(dvbdev); + list_del (&dvbdev->list_head); kfree(dvbdevfops); kfree(dvbdev); return PTR_ERR(clsdev); |