[PATCH] media: dvbdev: fix uaf in dvb_remove_device()
Jeffin Philip <[email protected]>
| Newsgroups | org.kernel.vger.linux-media,org.kernel.vger.linux-kernel,org.kernel.vger.stable |
|---|---|
| Message-ID | <[email protected]> |
In dvb_remove_device(), dvb_media_device_free(), device_destroy() and list_del() all dereference dvbdev regardless of its refcount. Thus, if refcount for dvbdev is 1, it can be freed and we operate on freed memory causing a UAF. Fix this by moving dvb_device_put() at the end of dvb_remove_device() so dvbdev members can be safely freed and assigned NULL when dvbdev is alive. Reported-by: [email protected] Closes: https://syzkaller.appspot.com/bug?extid=37578f730d38898f4b74 Fixes: 0fc044b2b5e2 ("media: dvbdev: adopts refcnt to avoid UAF") Cc: [email protected] Signed-off-by: Jeffin Philip <[email protected]> --- drivers/media/dvb-core/dvbdev.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/media/dvb-core/dvbdev.c b/drivers/media/dvb-core/dvbdev.c index d753d329502a..9aa4b8fd7379 100644 --- a/drivers/media/dvb-core/dvbdev.c +++ b/drivers/media/dvb-core/dvbdev.c @@ -598,7 +598,6 @@ void dvb_remove_device(struct dvb_device *dvbdev) down_write(&minor_rwsem); dvb_minors[dvbdev->minor] = NULL; - dvb_device_put(dvbdev); up_write(&minor_rwsem); dvb_media_device_free(dvbdev); @@ -606,6 +605,8 @@ void dvb_remove_device(struct dvb_device *dvbdev) device_destroy(dvb_class, MKDEV(DVB_MAJOR, dvbdev->minor)); list_del(&dvbdev->list_head); + + dvb_device_put(dvbdev); } EXPORT_SYMBOL(dvb_remove_device); -- 2.55.0