Patch "media: dvb-core: Fix ignored return value in dvb_register_frontend()" has been added to the 4.19-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    media: dvb-core: Fix ignored return value in dvb_register_frontend()

to the 4.19-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     media-dvb-core-fix-ignored-return-value-in-dvb_regis.patch
and it can be found in the queue-4.19 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 6f9625999b5d9dccc48b3e6932359f08fc72a8c4
Author: Chen Zhongjin <chenzhongjin@xxxxxxxxxx>
Date:   Tue Nov 8 03:30:05 2022 +0000

    media: dvb-core: Fix ignored return value in dvb_register_frontend()
    
    [ Upstream commit a574359e2e71ce16be212df3a082ed60a4bd2c5f ]
    
    In dvb_register_frontend(), dvb_register_device() is possible to fail
    but its return value is ignored.
    
    It will cause use-after-free when module is removed, because in
    dvb_unregister_frontend() it tries to unregister a not registered
    device.
    
    BUG: KASAN: use-after-free in dvb_remove_device+0x18b/0x1f0 [dvb_core]
    Read of size 4 at addr ffff88800dff4824 by task rmmod/428
    CPU: 3 PID: 428 Comm: rmmod
    Call Trace:
     <TASK>
     ...
     dvb_remove_device+0x18b/0x1f0 [dvb_core]
     dvb_unregister_frontend+0x7b/0x130 [dvb_core]
     vidtv_bridge_remove+0x6e/0x160 [dvb_vidtv_bridge]
     ...
    
    Fix this by catching return value of dvb_register_device().
    However the fe->refcount can't be put to zero immediately, because
    there are still modules calling dvb_frontend_detach() when
    dvb_register_frontend() fails.
    
    Link: https://lore.kernel.org/linux-media/20221108033005.169095-1-chenzhongjin@xxxxxxxxxx
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Signed-off-by: Chen Zhongjin <chenzhongjin@xxxxxxxxxx>
    Signed-off-by: Mauro Carvalho Chehab <mchehab@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/media/dvb-core/dvb_frontend.c b/drivers/media/dvb-core/dvb_frontend.c
index 8a61150ee249..1768c1b515b3 100644
--- a/drivers/media/dvb-core/dvb_frontend.c
+++ b/drivers/media/dvb-core/dvb_frontend.c
@@ -2956,6 +2956,7 @@ int dvb_register_frontend(struct dvb_adapter *dvb,
 		.name = fe->ops.info.name,
 #endif
 	};
+	int ret;
 
 	dev_dbg(dvb->device, "%s:\n", __func__);
 
@@ -2989,8 +2990,13 @@ int dvb_register_frontend(struct dvb_adapter *dvb,
 		 "DVB: registering adapter %i frontend %i (%s)...\n",
 		 fe->dvb->num, fe->id, fe->ops.info.name);
 
-	dvb_register_device(fe->dvb, &fepriv->dvbdev, &dvbdev_template,
+	ret = dvb_register_device(fe->dvb, &fepriv->dvbdev, &dvbdev_template,
 			    fe, DVB_DEVICE_FRONTEND, 0);
+	if (ret) {
+		dvb_frontend_put(fe);
+		mutex_unlock(&frontend_mutex);
+		return ret;
+	}
 
 	/*
 	 * Initialize the cache to the proper values according with the



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux