Takashi Iwai 32c7d2
From c8c80c996182239ff9b05eda4db50184cf3b2e99 Mon Sep 17 00:00:00 2001
Takashi Iwai 32c7d2
From: Jiasheng Jiang <jiasheng@iscas.ac.cn>
Takashi Iwai 32c7d2
Date: Thu, 13 Jan 2022 07:59:28 +0100
Takashi Iwai 32c7d2
Subject: [PATCH] media: meson: vdec: potential dereference of null pointer
Takashi Iwai 32c7d2
Git-commit: c8c80c996182239ff9b05eda4db50184cf3b2e99
Takashi Iwai 32c7d2
Patch-mainline: v5.18-rc1
Takashi Iwai 32c7d2
References: CVE-2022-3112 bsc#1206399
Takashi Iwai 32c7d2
Takashi Iwai 32c7d2
As the possible failure of the kzalloc(), the 'new_ts' could be NULL
Takashi Iwai 32c7d2
pointer.
Takashi Iwai 32c7d2
Therefore, it should be better to check it in order to avoid the
Takashi Iwai 32c7d2
dereference of the NULL pointer.
Takashi Iwai 32c7d2
Also, the caller esparser_queue() needs to deal with the return value of
Takashi Iwai 32c7d2
the amvdec_add_ts().
Takashi Iwai 32c7d2
Takashi Iwai 32c7d2
Fixes: 876f123b8956 ("media: meson: vdec: bring up to compliance")
Takashi Iwai 32c7d2
Signed-off-by: Jiasheng Jiang <jiasheng@iscas.ac.cn>
Takashi Iwai 32c7d2
Suggested-by: Neil Armstrong <narmstrong@baylibre.com>
Takashi Iwai 32c7d2
Reviewed-by: Neil Armstrong <narmstrong@baylibre.com>
Takashi Iwai 32c7d2
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Takashi Iwai 32c7d2
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
Takashi Iwai 32c7d2
Acked-by: Takashi Iwai <tiwai@suse.de>
Takashi Iwai 32c7d2
Takashi Iwai 32c7d2
---
Takashi Iwai 32c7d2
 drivers/staging/media/meson/vdec/esparser.c     |    7 ++++++-
Takashi Iwai 32c7d2
 drivers/staging/media/meson/vdec/vdec_helpers.c |    8 ++++++--
Takashi Iwai 32c7d2
 drivers/staging/media/meson/vdec/vdec_helpers.h |    2 +-
Takashi Iwai 32c7d2
 3 files changed, 13 insertions(+), 4 deletions(-)
Takashi Iwai 32c7d2
Takashi Iwai 32c7d2
--- a/drivers/staging/media/meson/vdec/esparser.c
Takashi Iwai 32c7d2
+++ b/drivers/staging/media/meson/vdec/esparser.c
Takashi Iwai 32c7d2
@@ -200,7 +200,12 @@ esparser_queue(struct amvdec_session *se
Takashi Iwai 32c7d2
 
Takashi Iwai 32c7d2
 	offset = esparser_get_offset(sess);
Takashi Iwai 32c7d2
 
Takashi Iwai 32c7d2
-	amvdec_add_ts_reorder(sess, vb->timestamp, offset);
Takashi Iwai 32c7d2
+	ret = amvdec_add_ts_reorder(sess, vb->timestamp, offset);
Takashi Iwai 32c7d2
+	if (ret) {
Takashi Iwai 32c7d2
+		v4l2_m2m_buf_done(vbuf, VB2_BUF_STATE_ERROR);
Takashi Iwai 32c7d2
+		return ret;
Takashi Iwai 32c7d2
+	}
Takashi Iwai 32c7d2
+
Takashi Iwai 32c7d2
 	dev_dbg(core->dev, "esparser: ts = %llu pld_size = %u offset = %08X\n",
Takashi Iwai 32c7d2
 		vb->timestamp, payload_size, offset);
Takashi Iwai 32c7d2
 
Takashi Iwai 32c7d2
--- a/drivers/staging/media/meson/vdec/vdec_helpers.c
Takashi Iwai 32c7d2
+++ b/drivers/staging/media/meson/vdec/vdec_helpers.c
Takashi Iwai 32c7d2
@@ -200,12 +200,15 @@ int amvdec_set_canvases(struct amvdec_se
Takashi Iwai 32c7d2
 }
Takashi Iwai 32c7d2
 EXPORT_SYMBOL_GPL(amvdec_set_canvases);
Takashi Iwai 32c7d2
 
Takashi Iwai 32c7d2
-void amvdec_add_ts_reorder(struct amvdec_session *sess, u64 ts, u32 offset)
Takashi Iwai 32c7d2
+int amvdec_add_ts_reorder(struct amvdec_session *sess, u64 ts, u32 offset)
Takashi Iwai 32c7d2
 {
Takashi Iwai 32c7d2
 	struct amvdec_timestamp *new_ts, *tmp;
Takashi Iwai 32c7d2
 	unsigned long flags;
Takashi Iwai 32c7d2
 
Takashi Iwai 32c7d2
-	new_ts = kmalloc(sizeof(*new_ts), GFP_KERNEL);
Takashi Iwai 32c7d2
+	new_ts = kzalloc(sizeof(*new_ts), GFP_KERNEL);
Takashi Iwai 32c7d2
+	if (!new_ts)
Takashi Iwai 32c7d2
+		return -ENOMEM;
Takashi Iwai 32c7d2
+
Takashi Iwai 32c7d2
 	new_ts->ts = ts;
Takashi Iwai 32c7d2
 	new_ts->offset = offset;
Takashi Iwai 32c7d2
 
Takashi Iwai 32c7d2
@@ -225,6 +228,7 @@ add_tail:
Takashi Iwai 32c7d2
 	list_add_tail(&new_ts->list, &sess->timestamps);
Takashi Iwai 32c7d2
 unlock:
Takashi Iwai 32c7d2
 	spin_unlock_irqrestore(&sess->ts_spinlock, flags);
Takashi Iwai 32c7d2
+	return 0;
Takashi Iwai 32c7d2
 }
Takashi Iwai 32c7d2
 EXPORT_SYMBOL_GPL(amvdec_add_ts_reorder);
Takashi Iwai 32c7d2
 
Takashi Iwai 32c7d2
--- a/drivers/staging/media/meson/vdec/vdec_helpers.h
Takashi Iwai 32c7d2
+++ b/drivers/staging/media/meson/vdec/vdec_helpers.h
Takashi Iwai 32c7d2
@@ -50,7 +50,7 @@ void amvdec_dst_buf_done_offset(struct a
Takashi Iwai 32c7d2
  * @ts: timestamp to add
Takashi Iwai 32c7d2
  * @offset: offset in the VIFIFO where the associated packet was written
Takashi Iwai 32c7d2
  */
Takashi Iwai 32c7d2
-void amvdec_add_ts_reorder(struct amvdec_session *sess, u64 ts, u32 offset);
Takashi Iwai 32c7d2
+int amvdec_add_ts_reorder(struct amvdec_session *sess, u64 ts, u32 offset);
Takashi Iwai 32c7d2
 void amvdec_remove_ts(struct amvdec_session *sess, u64 ts);
Takashi Iwai 32c7d2
 
Takashi Iwai 32c7d2
 /**