[PATCH] media: rkvdec: fix use after free bug in rkvdec_remove

Zheng Wang zyytlz.wz at 163.com
Tue Mar 7 09:39:00 PST 2023

In rkvdec_probe, rkvdec->watchdog_work is bound with
rkvdec_watchdog_func. Then rkvdec_vp9_run may
be called to start the work.

If we remove the module which will call rkvdec_remove
 to make cleanup, there may be a unfinished work.
 The possible sequence is as follows, which will
 cause a typical UAF bug.

Fix it by canceling the work before cleanup in rkvdec_remove.

CPU0                  CPU1

rkvdec_remove       |
  v4l2_m2m_release  |
    kfree(m2m_dev); |
                    | v4l2_m2m_get_curr_priv
                    |   m2m_dev->curr_ctx //use

Signed-off-by: Zheng Wang <zyytlz.wz at 163.com>
 drivers/staging/media/rkvdec/rkvdec.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/staging/media/rkvdec/rkvdec.c b/drivers/staging/media/rkvdec/rkvdec.c
index 7bab7586918c..6b14655a8e2c 100644
--- a/drivers/staging/media/rkvdec/rkvdec.c
+++ b/drivers/staging/media/rkvdec/rkvdec.c
@@ -1066,6 +1066,7 @@ static int rkvdec_remove(struct platform_device *pdev)
 	struct rkvdec_dev *rkvdec = platform_get_drvdata(pdev);
+	cancel_delayed_work(&rkvdec->watchdog_work);

More information about the Linux-rockchip mailing list