From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: harperchen <harperchen1110@gmail.com>,
Hans Verkuil <hverkuil-cisco@xs4all.nl>,
Mauro Carvalho Chehab <mchehab@kernel.org>,
Sasha Levin <sashal@kernel.org>,
daniel.lee.kruse@proton.me, linux-media@vger.kernel.org
Subject: [PATCH AUTOSEL 6.2 13/37] media: cx23885: Fix a null-ptr-deref bug in buffer_prepare() and buffer_finish()
Date: Sun, 30 Apr 2023 22:59:21 -0400 [thread overview]
Message-ID: <20230501025945.3253774-13-sashal@kernel.org> (raw)
In-Reply-To: <20230501025945.3253774-1-sashal@kernel.org>
From: harperchen <harperchen1110@gmail.com>
[ Upstream commit 47e8b73bc35d7c54642f78e498697692f6358996 ]
When the driver calls cx23885_risc_buffer() to prepare the buffer, the
function call dma_alloc_coherent may fail, resulting in a empty buffer
risc->cpu. Later when we free the buffer or access the buffer, null ptr
deref is triggered.
This bug is similar to the following one:
https://git.linuxtv.org/media_stage.git/commit/?id=2b064d91440b33fba5b452f2d1b31f13ae911d71.
We believe the bug can be also dynamically triggered from user side.
Similarly, we fix this by checking the return value of cx23885_risc_buffer()
and the value of risc->cpu before buffer free.
Signed-off-by: harperchen <harperchen1110@gmail.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
drivers/media/pci/cx23885/cx23885-core.c | 4 +++-
drivers/media/pci/cx23885/cx23885-video.c | 13 +++++++------
2 files changed, 10 insertions(+), 7 deletions(-)
diff --git a/drivers/media/pci/cx23885/cx23885-core.c b/drivers/media/pci/cx23885/cx23885-core.c
index 9232a966bcabb..2ce2914576cf2 100644
--- a/drivers/media/pci/cx23885/cx23885-core.c
+++ b/drivers/media/pci/cx23885/cx23885-core.c
@@ -1325,7 +1325,9 @@ void cx23885_free_buffer(struct cx23885_dev *dev, struct cx23885_buffer *buf)
{
struct cx23885_riscmem *risc = &buf->risc;
- dma_free_coherent(&dev->pci->dev, risc->size, risc->cpu, risc->dma);
+ if (risc->cpu)
+ dma_free_coherent(&dev->pci->dev, risc->size, risc->cpu, risc->dma);
+ memset(risc, 0, sizeof(*risc));
}
static void cx23885_tsport_reg_dump(struct cx23885_tsport *port)
diff --git a/drivers/media/pci/cx23885/cx23885-video.c b/drivers/media/pci/cx23885/cx23885-video.c
index 3d03f5e95786a..671fc0588e431 100644
--- a/drivers/media/pci/cx23885/cx23885-video.c
+++ b/drivers/media/pci/cx23885/cx23885-video.c
@@ -342,6 +342,7 @@ static int queue_setup(struct vb2_queue *q,
static int buffer_prepare(struct vb2_buffer *vb)
{
+ int ret;
struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
struct cx23885_dev *dev = vb->vb2_queue->drv_priv;
struct cx23885_buffer *buf =
@@ -358,12 +359,12 @@ static int buffer_prepare(struct vb2_buffer *vb)
switch (dev->field) {
case V4L2_FIELD_TOP:
- cx23885_risc_buffer(dev->pci, &buf->risc,
+ ret = cx23885_risc_buffer(dev->pci, &buf->risc,
sgt->sgl, 0, UNSET,
buf->bpl, 0, dev->height);
break;
case V4L2_FIELD_BOTTOM:
- cx23885_risc_buffer(dev->pci, &buf->risc,
+ ret = cx23885_risc_buffer(dev->pci, &buf->risc,
sgt->sgl, UNSET, 0,
buf->bpl, 0, dev->height);
break;
@@ -391,21 +392,21 @@ static int buffer_prepare(struct vb2_buffer *vb)
line0_offset = 0;
line1_offset = buf->bpl;
}
- cx23885_risc_buffer(dev->pci, &buf->risc,
+ ret = cx23885_risc_buffer(dev->pci, &buf->risc,
sgt->sgl, line0_offset,
line1_offset,
buf->bpl, buf->bpl,
dev->height >> 1);
break;
case V4L2_FIELD_SEQ_TB:
- cx23885_risc_buffer(dev->pci, &buf->risc,
+ ret = cx23885_risc_buffer(dev->pci, &buf->risc,
sgt->sgl,
0, buf->bpl * (dev->height >> 1),
buf->bpl, 0,
dev->height >> 1);
break;
case V4L2_FIELD_SEQ_BT:
- cx23885_risc_buffer(dev->pci, &buf->risc,
+ ret = cx23885_risc_buffer(dev->pci, &buf->risc,
sgt->sgl,
buf->bpl * (dev->height >> 1), 0,
buf->bpl, 0,
@@ -418,7 +419,7 @@ static int buffer_prepare(struct vb2_buffer *vb)
buf, buf->vb.vb2_buf.index,
dev->width, dev->height, dev->fmt->depth, dev->fmt->fourcc,
(unsigned long)buf->risc.dma);
- return 0;
+ return ret;
}
static void buffer_finish(struct vb2_buffer *vb)
--
2.39.2
next prev parent reply other threads:[~2023-05-01 3:06 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-05-01 2:59 [PATCH AUTOSEL 6.2 01/37] drm/displayid: add displayid_get_header() and check bounds better Sasha Levin
2023-05-01 2:59 ` [PATCH AUTOSEL 6.2 02/37] drm/amd/display: populate subvp cmd info only for the top pipe Sasha Levin
2023-05-01 2:59 ` [PATCH AUTOSEL 6.2 03/37] drm/amd/display: Correct DML calculation to align HW formula Sasha Levin
2023-05-01 2:59 ` [PATCH AUTOSEL 6.2 04/37] drm/amd/display: enable DPG when disabling plane for phantom pipe Sasha Levin
2023-05-01 2:59 ` [PATCH AUTOSEL 6.2 05/37] platform/x86: x86-android-tablets: Add Acer Iconia One 7 B1-750 data Sasha Levin
2023-05-01 2:59 ` [PATCH AUTOSEL 6.2 06/37] drm/amd/display: Enable HostVM based on rIOMMU active Sasha Levin
2023-05-01 2:59 ` [PATCH AUTOSEL 6.2 07/37] drm/amd/display: Use DC_LOG_DC in the trasform pixel function Sasha Levin
2023-05-01 2:59 ` [PATCH AUTOSEL 6.2 08/37] regmap: cache: Return error in cache sync operations for REGCACHE_NONE Sasha Levin
2023-05-01 2:59 ` [PATCH AUTOSEL 6.2 09/37] remoteproc: imx_dsp_rproc: Add custom memory copy implementation for i.MX DSP Cores Sasha Levin
2023-05-01 2:59 ` [PATCH AUTOSEL 6.2 10/37] arm64: dts: qcom: msm8996: Add missing DWC3 quirks Sasha Levin
2023-05-01 2:59 ` [PATCH AUTOSEL 6.2 11/37] accel/habanalabs: postpone mem_mgr IDR destruction to hpriv_release() Sasha Levin
2023-05-01 2:59 ` [PATCH AUTOSEL 6.2 12/37] media: imx-jpeg: Bounds check sizeimage access Sasha Levin
2023-05-01 2:59 ` Sasha Levin [this message]
2023-05-01 2:59 ` [PATCH AUTOSEL 6.2 14/37] media: pci: tw68: Fix null-ptr-deref bug in buf prepare and finish Sasha Levin
2023-05-01 2:59 ` [PATCH AUTOSEL 6.2 15/37] media: pvrusb2: VIDEO_PVRUSB2 depends on DVB_CORE to use dvb_* symbols Sasha Levin
2023-05-01 2:59 ` [PATCH AUTOSEL 6.2 16/37] ACPI: processor: Check for null return of devm_kzalloc() in fch_misc_setup() Sasha Levin
2023-05-01 2:59 ` [PATCH AUTOSEL 6.2 17/37] drm/rockchip: dw_hdmi: cleanup drm encoder during unbind Sasha Levin
2023-05-01 2:59 ` [PATCH AUTOSEL 6.2 18/37] memstick: r592: Fix UAF bug in r592_remove due to race condition Sasha Levin
2023-05-01 2:59 ` [PATCH AUTOSEL 6.2 19/37] arm64: dts: imx8mq-librem5: Remove dis_u3_susphy_quirk from usb_dwc3_0 Sasha Levin
2023-05-01 2:59 ` [PATCH AUTOSEL 6.2 20/37] firmware: arm_sdei: Fix sleep from invalid context BUG Sasha Levin
2023-05-01 2:59 ` [PATCH AUTOSEL 6.2 21/37] ACPI: EC: Fix oops when removing custom query handlers Sasha Levin
2023-05-01 2:59 ` [PATCH AUTOSEL 6.2 22/37] drm/amd/display: fixed dcn30+ underflow issue Sasha Levin
2023-05-01 2:59 ` [PATCH AUTOSEL 6.2 23/37] remoteproc: stm32_rproc: Add mutex protection for workqueue Sasha Levin
2023-05-01 2:59 ` [PATCH AUTOSEL 6.2 24/37] drm/tegra: Avoid potential 32-bit integer overflow Sasha Levin
2023-05-01 2:59 ` [PATCH AUTOSEL 6.2 25/37] drm/msm/dp: Clean up handling of DP AUX interrupts Sasha Levin
2023-05-01 2:59 ` [PATCH AUTOSEL 6.2 26/37] ACPICA: Avoid undefined behavior: applying zero offset to null pointer Sasha Levin
2023-05-01 2:59 ` [PATCH AUTOSEL 6.2 27/37] ACPICA: ACPICA: check null return of ACPI_ALLOCATE_ZEROED in acpi_db_display_objects Sasha Levin
2023-05-01 2:59 ` [PATCH AUTOSEL 6.2 28/37] arm64: dts: qcom: sdm845-polaris: Drop inexistent properties Sasha Levin
2023-05-01 2:59 ` [PATCH AUTOSEL 6.2 29/37] irqchip/gicv3: Workaround for NVIDIA erratum T241-FABRIC-4 Sasha Levin
2023-05-01 2:59 ` [PATCH AUTOSEL 6.2 30/37] media: cros-ec-cec: Don't exit early in .remove() callback Sasha Levin
2023-05-01 2:59 ` [PATCH AUTOSEL 6.2 31/37] ACPI: video: Remove desktops without backlight DMI quirks Sasha Levin
2023-05-01 2:59 ` [PATCH AUTOSEL 6.2 32/37] drm/amd/display: Correct DML calculation to follow HW SPEC Sasha Levin
2023-05-01 2:59 ` [PATCH AUTOSEL 6.2 33/37] drm/amd: Fix an out of bounds error in BIOS parser Sasha Levin
2023-05-01 2:59 ` [PATCH AUTOSEL 6.2 34/37] drm/amdgpu: Fix sdma v4 sw fini error Sasha Levin
2023-05-01 2:59 ` [PATCH AUTOSEL 6.2 35/37] media: Prefer designated initializers over memset for subdev pad ops Sasha Levin
2023-05-01 2:59 ` [PATCH AUTOSEL 6.2 36/37] drm/amdgpu: Enable IH retry CAM on GFX9 Sasha Levin
2023-05-01 2:59 ` [PATCH AUTOSEL 6.2 37/37] media: mediatek: vcodec: Fix potential array out-of-bounds in decoder queue_setup Sasha Levin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230501025945.3253774-13-sashal@kernel.org \
--to=sashal@kernel.org \
--cc=daniel.lee.kruse@proton.me \
--cc=harperchen1110@gmail.com \
--cc=hverkuil-cisco@xs4all.nl \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=mchehab@kernel.org \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).