Patch "media: stm32: Potential NULL pointer dereference in dcmi_irq_thread()" has been added to the 5.14-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: stm32: Potential NULL pointer dereference in dcmi_irq_thread()

to the 5.14-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-stm32-potential-null-pointer-dereference-in-dc.patch
and it can be found in the queue-5.14 subdirectory.

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



commit d0438e9e837b0fe4c8554dd77a9969d675486c19
Author: Dmitriy Ulitin <ulitin@xxxxxxxxx>
Date:   Thu May 27 17:06:26 2021 +0200

    media: stm32: Potential NULL pointer dereference in dcmi_irq_thread()
    
    [ Upstream commit 548fa43a58696450c15b8f5564e99589c5144664 ]
    
    At the moment of enabling irq handling:
    
    1922 ret = devm_request_threaded_irq(&pdev->dev, irq, dcmi_irq_callback,
    1923                    dcmi_irq_thread, IRQF_ONESHOT,
    1924                    dev_name(&pdev->dev), dcmi);
    
    there is still uninitialized field sd_format of struct stm32_dcmi *dcmi.
    If an interrupt occurs in the interval between the installation of the
    interrupt handler and the initialization of this field, NULL pointer
    dereference happens.
    
    This field is dereferenced in the handler function without any check:
    
    457 if (dcmi->sd_format->fourcc == V4L2_PIX_FMT_JPEG &&
    458         dcmi->misr & IT_FRAME) {
    
    The patch moves interrupt handler installation
    after initialization of the sd_format field that happens in
    dcmi_graph_notify_complete() via dcmi_set_default_fmt().
    
    Found by Linux Driver Verification project (linuxtesting.org).
    
    Signed-off-by: Dmitriy Ulitin <ulitin@xxxxxxxxx>
    Signed-off-by: Alexey Khoroshilov <khoroshilov@xxxxxxxxx>
    Signed-off-by: Sakari Ailus <sakari.ailus@xxxxxxxxxxxxxxx>
    Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/media/platform/stm32/stm32-dcmi.c b/drivers/media/platform/stm32/stm32-dcmi.c
index d914ccef98317..6110718645a4f 100644
--- a/drivers/media/platform/stm32/stm32-dcmi.c
+++ b/drivers/media/platform/stm32/stm32-dcmi.c
@@ -128,6 +128,7 @@ struct stm32_dcmi {
 	int				sequence;
 	struct list_head		buffers;
 	struct dcmi_buf			*active;
+	int			irq;
 
 	struct v4l2_device		v4l2_dev;
 	struct video_device		*vdev;
@@ -1759,6 +1760,14 @@ static int dcmi_graph_notify_complete(struct v4l2_async_notifier *notifier)
 		return ret;
 	}
 
+	ret = devm_request_threaded_irq(dcmi->dev, dcmi->irq, dcmi_irq_callback,
+					dcmi_irq_thread, IRQF_ONESHOT,
+					dev_name(dcmi->dev), dcmi);
+	if (ret) {
+		dev_err(dcmi->dev, "Unable to request irq %d\n", dcmi->irq);
+		return ret;
+	}
+
 	return 0;
 }
 
@@ -1914,6 +1923,8 @@ static int dcmi_probe(struct platform_device *pdev)
 	if (irq <= 0)
 		return irq ? irq : -ENXIO;
 
+	dcmi->irq = irq;
+
 	dcmi->res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	if (!dcmi->res) {
 		dev_err(&pdev->dev, "Could not get resource\n");
@@ -1926,14 +1937,6 @@ static int dcmi_probe(struct platform_device *pdev)
 		return PTR_ERR(dcmi->regs);
 	}
 
-	ret = devm_request_threaded_irq(&pdev->dev, irq, dcmi_irq_callback,
-					dcmi_irq_thread, IRQF_ONESHOT,
-					dev_name(&pdev->dev), dcmi);
-	if (ret) {
-		dev_err(&pdev->dev, "Unable to request irq %d\n", irq);
-		return ret;
-	}
-
 	mclk = devm_clk_get(&pdev->dev, "mclk");
 	if (IS_ERR(mclk)) {
 		if (PTR_ERR(mclk) != -EPROBE_DEFER)



[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