All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/4] Venus driver fixes to avoid possible OOB accesses
@ 2023-07-27  4:34 Vikash Garodia
  2023-07-27  4:34 ` [PATCH 1/4] venus: hfi: add checks to perform sanity on queue pointers Vikash Garodia
                   ` (3 more replies)
  0 siblings, 4 replies; 10+ messages in thread
From: Vikash Garodia @ 2023-07-27  4:34 UTC (permalink / raw)
  To: stanimir.k.varbanov, bryan.odonoghue, agross, andersson,
	konrad.dybcio, mchehab, hans.verkuil, tfiga
  Cc: linux-media, linux-arm-msm, linux-kernel, stable, Vikash Garodia

This series primarily adds check at relevant places in venus driver where there
are possible OOB accesses due to unexpected payload from venus firmware. The
patches describes the specific OOB possibility.

Please review and share your feedback.

Vikash Garodia (4):
  venus: hfi: add checks to perform sanity on queue pointers
  venus: hfi: fix the check to handle session buffer requirement
  venus: hfi: add checks to handle capabilities from firmware
  venus: hfi_parser: Add check to keep the number of codecs within range

 drivers/media/platform/qcom/venus/hfi_msgs.c   |  2 +-
 drivers/media/platform/qcom/venus/hfi_parser.c | 27 ++++++++++++++++++++++++++
 drivers/media/platform/qcom/venus/hfi_venus.c  |  8 ++++++++
 3 files changed, 36 insertions(+), 1 deletion(-)

-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 1/4] venus: hfi: add checks to perform sanity on queue pointers
  2023-07-27  4:34 [PATCH 0/4] Venus driver fixes to avoid possible OOB accesses Vikash Garodia
@ 2023-07-27  4:34 ` Vikash Garodia
  2023-07-27 17:08   ` Konrad Dybcio
  2023-07-27  4:34 ` [PATCH 2/4] venus: hfi: fix the check to handle session buffer requirement Vikash Garodia
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 10+ messages in thread
From: Vikash Garodia @ 2023-07-27  4:34 UTC (permalink / raw)
  To: stanimir.k.varbanov, bryan.odonoghue, agross, andersson,
	konrad.dybcio, mchehab, hans.verkuil, tfiga
  Cc: linux-media, linux-arm-msm, linux-kernel, stable, Vikash Garodia

Read and write pointers are used to track the packet index in the memory
shared between video driver and firmware. There is a possibility of OOB
access if the read or write pointer goes beyond the queue memory size.
Add checks for the read and write pointer to avoid OOB access.

Cc: stable@vger.kernel.org
Fixes: d96d3f30c0f2 ("[media] media: venus: hfi: add Venus HFI files")
Signed-off-by: Vikash Garodia <quic_vgarodia@quicinc.com>
---
 drivers/media/platform/qcom/venus/hfi_venus.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/drivers/media/platform/qcom/venus/hfi_venus.c b/drivers/media/platform/qcom/venus/hfi_venus.c
index f0b4638..dc228c4 100644
--- a/drivers/media/platform/qcom/venus/hfi_venus.c
+++ b/drivers/media/platform/qcom/venus/hfi_venus.c
@@ -206,6 +206,10 @@ static int venus_write_queue(struct venus_hfi_device *hdev,
 
 	new_wr_idx = wr_idx + dwords;
 	wr_ptr = (u32 *)(queue->qmem.kva + (wr_idx << 2));
+
+	if (wr_ptr < (u32 *)queue->qmem.kva || wr_ptr > (u32 *)(queue->qmem.kva + queue->qmem.size))
+		return -EINVAL;
+
 	if (new_wr_idx < qsize) {
 		memcpy(wr_ptr, packet, dwords << 2);
 	} else {
@@ -273,6 +277,10 @@ static int venus_read_queue(struct venus_hfi_device *hdev,
 	}
 
 	rd_ptr = (u32 *)(queue->qmem.kva + (rd_idx << 2));
+
+	if (rd_ptr < (u32 *)queue->qmem.kva || rd_ptr > (u32 *)(queue->qmem.kva + queue->qmem.size))
+		return -EINVAL;
+
 	dwords = *rd_ptr >> 2;
 	if (!dwords)
 		return -EINVAL;
-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 2/4] venus: hfi: fix the check to handle session buffer requirement
  2023-07-27  4:34 [PATCH 0/4] Venus driver fixes to avoid possible OOB accesses Vikash Garodia
  2023-07-27  4:34 ` [PATCH 1/4] venus: hfi: add checks to perform sanity on queue pointers Vikash Garodia
@ 2023-07-27  4:34 ` Vikash Garodia
  2023-07-28 19:12   ` Nathan Hebert
  2023-07-27  4:34 ` [PATCH 3/4] venus: hfi: add checks to handle capabilities from firmware Vikash Garodia
  2023-07-27  4:34 ` [PATCH 4/4] venus: hfi_parser: Add check to keep the number of codecs within range Vikash Garodia
  3 siblings, 1 reply; 10+ messages in thread
From: Vikash Garodia @ 2023-07-27  4:34 UTC (permalink / raw)
  To: stanimir.k.varbanov, bryan.odonoghue, agross, andersson,
	konrad.dybcio, mchehab, hans.verkuil, tfiga
  Cc: linux-media, linux-arm-msm, linux-kernel, stable, Vikash Garodia

Buffer requirement, for different buffer type, comes from video firmware.
While copying these requirements, there is an OOB possibility when the
payload from firmware is more than expected size. Fix the check to avoid
the OOB possibility.

Cc: stable@vger.kernel.org
Fixes: 09c2845e8fe4 ("[media] media: venus: hfi: add Host Firmware Interface (HFI)")
Signed-off-by: Vikash Garodia <quic_vgarodia@quicinc.com>
---
 drivers/media/platform/qcom/venus/hfi_msgs.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/media/platform/qcom/venus/hfi_msgs.c b/drivers/media/platform/qcom/venus/hfi_msgs.c
index 3d5dadf..3e85bd8 100644
--- a/drivers/media/platform/qcom/venus/hfi_msgs.c
+++ b/drivers/media/platform/qcom/venus/hfi_msgs.c
@@ -398,7 +398,7 @@ session_get_prop_buf_req(struct hfi_msg_session_property_info_pkt *pkt,
 		memcpy(&bufreq[idx], buf_req, sizeof(*bufreq));
 		idx++;
 
-		if (idx > HFI_BUFFER_TYPE_MAX)
+		if (idx >= HFI_BUFFER_TYPE_MAX)
 			return HFI_ERR_SESSION_INVALID_PARAMETER;
 
 		req_bytes -= sizeof(struct hfi_buffer_requirements);
-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 3/4] venus: hfi: add checks to handle capabilities from firmware
  2023-07-27  4:34 [PATCH 0/4] Venus driver fixes to avoid possible OOB accesses Vikash Garodia
  2023-07-27  4:34 ` [PATCH 1/4] venus: hfi: add checks to perform sanity on queue pointers Vikash Garodia
  2023-07-27  4:34 ` [PATCH 2/4] venus: hfi: fix the check to handle session buffer requirement Vikash Garodia
@ 2023-07-27  4:34 ` Vikash Garodia
  2023-07-28 21:14   ` Nathan Hebert
  2023-07-27  4:34 ` [PATCH 4/4] venus: hfi_parser: Add check to keep the number of codecs within range Vikash Garodia
  3 siblings, 1 reply; 10+ messages in thread
From: Vikash Garodia @ 2023-07-27  4:34 UTC (permalink / raw)
  To: stanimir.k.varbanov, bryan.odonoghue, agross, andersson,
	konrad.dybcio, mchehab, hans.verkuil, tfiga
  Cc: linux-media, linux-arm-msm, linux-kernel, stable, Vikash Garodia

The hfi parser, parses the capabilities received from venus firmware and
copies them to core capabilities. Consider below api, for example,
fill_caps - In this api, caps in core structure gets updated with the
number of capabilities received in firmware data payload. If the same api
is called multiple times, there is a possibility of copying beyond the max
allocated size in core caps.
Similar possibilities in fill_raw_fmts and fill_profile_level functions.

Cc: stable@vger.kernel.org
Fixes: 1a73374a04e5 ("media: venus: hfi_parser: add common capability parser")
Signed-off-by: Vikash Garodia <quic_vgarodia@quicinc.com>
---
 drivers/media/platform/qcom/venus/hfi_parser.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/drivers/media/platform/qcom/venus/hfi_parser.c b/drivers/media/platform/qcom/venus/hfi_parser.c
index 6cf74b2..ec73cac 100644
--- a/drivers/media/platform/qcom/venus/hfi_parser.c
+++ b/drivers/media/platform/qcom/venus/hfi_parser.c
@@ -86,6 +86,9 @@ static void fill_profile_level(struct hfi_plat_caps *cap, const void *data,
 {
 	const struct hfi_profile_level *pl = data;
 
+	if (cap->num_pl > HFI_MAX_PROFILE_COUNT)
+		return;
+
 	memcpy(&cap->pl[cap->num_pl], pl, num * sizeof(*pl));
 	cap->num_pl += num;
 }
@@ -111,6 +114,9 @@ fill_caps(struct hfi_plat_caps *cap, const void *data, unsigned int num)
 {
 	const struct hfi_capability *caps = data;
 
+	if (cap->num_caps > MAX_CAP_ENTRIES)
+		return;
+
 	memcpy(&cap->caps[cap->num_caps], caps, num * sizeof(*caps));
 	cap->num_caps += num;
 }
@@ -137,6 +143,9 @@ static void fill_raw_fmts(struct hfi_plat_caps *cap, const void *fmts,
 {
 	const struct raw_formats *formats = fmts;
 
+	if (cap->num_fmts > MAX_FMT_ENTRIES)
+		return;
+
 	memcpy(&cap->fmts[cap->num_fmts], formats, num_fmts * sizeof(*formats));
 	cap->num_fmts += num_fmts;
 }
@@ -159,6 +168,9 @@ parse_raw_formats(struct venus_core *core, u32 codecs, u32 domain, void *data)
 		rawfmts[i].buftype = fmt->buffer_type;
 		i++;
 
+		if (i >= MAX_FMT_ENTRIES)
+			return;
+
 		if (pinfo->num_planes > MAX_PLANES)
 			break;
 
-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 4/4] venus: hfi_parser: Add check to keep the number of codecs within range
  2023-07-27  4:34 [PATCH 0/4] Venus driver fixes to avoid possible OOB accesses Vikash Garodia
                   ` (2 preceding siblings ...)
  2023-07-27  4:34 ` [PATCH 3/4] venus: hfi: add checks to handle capabilities from firmware Vikash Garodia
@ 2023-07-27  4:34 ` Vikash Garodia
  2023-07-27 17:11   ` Konrad Dybcio
  3 siblings, 1 reply; 10+ messages in thread
From: Vikash Garodia @ 2023-07-27  4:34 UTC (permalink / raw)
  To: stanimir.k.varbanov, bryan.odonoghue, agross, andersson,
	konrad.dybcio, mchehab, hans.verkuil, tfiga
  Cc: linux-media, linux-arm-msm, linux-kernel, stable, Vikash Garodia

Supported codec bitmask is populated from the payload from venus firmware.
There is a possible case when all the bits in the codec bitmask is set. In
such case, core cap for decoder is filled  and MAX_CODEC_NUM is utilized.
Now while filling the caps for encoder, it can lead to access the caps
array beyong 32 index. Hence leading to OOB write.
The fix counts the supported encoder and decoder. If the count is more than
max, then it skips accessing the caps.

Cc: stable@vger.kernel.org
Fixes: 1a73374a04e5 ("media: venus: hfi_parser: add common capability parser")
Signed-off-by: Vikash Garodia <quic_vgarodia@quicinc.com>
---
 drivers/media/platform/qcom/venus/hfi_parser.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/drivers/media/platform/qcom/venus/hfi_parser.c b/drivers/media/platform/qcom/venus/hfi_parser.c
index ec73cac..651e215 100644
--- a/drivers/media/platform/qcom/venus/hfi_parser.c
+++ b/drivers/media/platform/qcom/venus/hfi_parser.c
@@ -14,11 +14,26 @@
 typedef void (*func)(struct hfi_plat_caps *cap, const void *data,
 		     unsigned int size);
 
+static int count_setbits(u32 input)
+{
+	u32 count = 0;
+
+	while (input > 0) {
+		if ((input & 1) == 1)
+			count++;
+		input >>= 1;
+	}
+	return count;
+}
+
 static void init_codecs(struct venus_core *core)
 {
 	struct hfi_plat_caps *caps = core->caps, *cap;
 	unsigned long bit;
 
+	if ((count_setbits(core->dec_codecs) + count_setbits(core->enc_codecs)) > MAX_CODEC_NUM)
+		return;
+
 	for_each_set_bit(bit, &core->dec_codecs, MAX_CODEC_NUM) {
 		cap = &caps[core->codecs_count++];
 		cap->codec = BIT(bit);
-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH 1/4] venus: hfi: add checks to perform sanity on queue pointers
  2023-07-27  4:34 ` [PATCH 1/4] venus: hfi: add checks to perform sanity on queue pointers Vikash Garodia
@ 2023-07-27 17:08   ` Konrad Dybcio
  2023-07-28  7:56     ` Vikash Garodia
  0 siblings, 1 reply; 10+ messages in thread
From: Konrad Dybcio @ 2023-07-27 17:08 UTC (permalink / raw)
  To: Vikash Garodia, stanimir.k.varbanov, bryan.odonoghue, agross,
	andersson, mchehab, hans.verkuil, tfiga
  Cc: linux-media, linux-arm-msm, linux-kernel, stable

On 27.07.2023 06:34, Vikash Garodia wrote:
> Read and write pointers are used to track the packet index in the memory
> shared between video driver and firmware. There is a possibility of OOB
> access if the read or write pointer goes beyond the queue memory size.
> Add checks for the read and write pointer to avoid OOB access.
> 
> Cc: stable@vger.kernel.org
> Fixes: d96d3f30c0f2 ("[media] media: venus: hfi: add Venus HFI files")
> Signed-off-by: Vikash Garodia <quic_vgarodia@quicinc.com>
> ---
>  drivers/media/platform/qcom/venus/hfi_venus.c | 8 ++++++++
>  1 file changed, 8 insertions(+)
> 
> diff --git a/drivers/media/platform/qcom/venus/hfi_venus.c b/drivers/media/platform/qcom/venus/hfi_venus.c
> index f0b4638..dc228c4 100644
> --- a/drivers/media/platform/qcom/venus/hfi_venus.c
> +++ b/drivers/media/platform/qcom/venus/hfi_venus.c
> @@ -206,6 +206,10 @@ static int venus_write_queue(struct venus_hfi_device *hdev,
>  
>  	new_wr_idx = wr_idx + dwords;
>  	wr_ptr = (u32 *)(queue->qmem.kva + (wr_idx << 2));
> +
> +	if (wr_ptr < (u32 *)queue->qmem.kva || wr_ptr > (u32 *)(queue->qmem.kva + queue->qmem.size))
Shouldn't the cases on the right side of the OR operator include a
"- 1"?

Konrad

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 4/4] venus: hfi_parser: Add check to keep the number of codecs within range
  2023-07-27  4:34 ` [PATCH 4/4] venus: hfi_parser: Add check to keep the number of codecs within range Vikash Garodia
@ 2023-07-27 17:11   ` Konrad Dybcio
  0 siblings, 0 replies; 10+ messages in thread
From: Konrad Dybcio @ 2023-07-27 17:11 UTC (permalink / raw)
  To: Vikash Garodia, stanimir.k.varbanov, bryan.odonoghue, agross,
	andersson, mchehab, hans.verkuil, tfiga
  Cc: linux-media, linux-arm-msm, linux-kernel, stable

On 27.07.2023 06:34, Vikash Garodia wrote:
> Supported codec bitmask is populated from the payload from venus firmware.
> There is a possible case when all the bits in the codec bitmask is set. In
> such case, core cap for decoder is filled  and MAX_CODEC_NUM is utilized.
> Now while filling the caps for encoder, it can lead to access the caps
> array beyong 32 index. Hence leading to OOB write.
> The fix counts the supported encoder and decoder. If the count is more than
> max, then it skips accessing the caps.
> 
> Cc: stable@vger.kernel.org
> Fixes: 1a73374a04e5 ("media: venus: hfi_parser: add common capability parser")
> Signed-off-by: Vikash Garodia <quic_vgarodia@quicinc.com>
> ---
>  drivers/media/platform/qcom/venus/hfi_parser.c | 15 +++++++++++++++
>  1 file changed, 15 insertions(+)
> 
> diff --git a/drivers/media/platform/qcom/venus/hfi_parser.c b/drivers/media/platform/qcom/venus/hfi_parser.c
> index ec73cac..651e215 100644
> --- a/drivers/media/platform/qcom/venus/hfi_parser.c
> +++ b/drivers/media/platform/qcom/venus/hfi_parser.c
> @@ -14,11 +14,26 @@
>  typedef void (*func)(struct hfi_plat_caps *cap, const void *data,
>  		     unsigned int size);
>  
> +static int count_setbits(u32 input)
hweight_long()?

Konrad

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 1/4] venus: hfi: add checks to perform sanity on queue pointers
  2023-07-27 17:08   ` Konrad Dybcio
@ 2023-07-28  7:56     ` Vikash Garodia
  0 siblings, 0 replies; 10+ messages in thread
From: Vikash Garodia @ 2023-07-28  7:56 UTC (permalink / raw)
  To: Konrad Dybcio, stanimir.k.varbanov, bryan.odonoghue, agross,
	andersson, mchehab, hans.verkuil, tfiga
  Cc: linux-media, linux-arm-msm, linux-kernel, stable


On 7/27/2023 10:38 PM, Konrad Dybcio wrote:
> On 27.07.2023 06:34, Vikash Garodia wrote:
>> Read and write pointers are used to track the packet index in the memory
>> shared between video driver and firmware. There is a possibility of OOB
>> access if the read or write pointer goes beyond the queue memory size.
>> Add checks for the read and write pointer to avoid OOB access.
>>
>> Cc: stable@vger.kernel.org
>> Fixes: d96d3f30c0f2 ("[media] media: venus: hfi: add Venus HFI files")
>> Signed-off-by: Vikash Garodia <quic_vgarodia@quicinc.com>
>> ---
>>  drivers/media/platform/qcom/venus/hfi_venus.c | 8 ++++++++
>>  1 file changed, 8 insertions(+)
>>
>> diff --git a/drivers/media/platform/qcom/venus/hfi_venus.c b/drivers/media/platform/qcom/venus/hfi_venus.c
>> index f0b4638..dc228c4 100644
>> --- a/drivers/media/platform/qcom/venus/hfi_venus.c
>> +++ b/drivers/media/platform/qcom/venus/hfi_venus.c
>> @@ -206,6 +206,10 @@ static int venus_write_queue(struct venus_hfi_device *hdev,
>>  
>>  	new_wr_idx = wr_idx + dwords;
>>  	wr_ptr = (u32 *)(queue->qmem.kva + (wr_idx << 2));
>> +
>> +	if (wr_ptr < (u32 *)queue->qmem.kva || wr_ptr > (u32 *)(queue->qmem.kva + queue->qmem.size))
> Shouldn't the cases on the right side of the OR operator include a
> "- 1"?

I see your point here. Possibly subtracting with sizeof(*wr_ptr) instead of "1"
would be appropriate. Similarly for read queue handling.

- Vikash

> Konrad

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 2/4] venus: hfi: fix the check to handle session buffer requirement
  2023-07-27  4:34 ` [PATCH 2/4] venus: hfi: fix the check to handle session buffer requirement Vikash Garodia
@ 2023-07-28 19:12   ` Nathan Hebert
  0 siblings, 0 replies; 10+ messages in thread
From: Nathan Hebert @ 2023-07-28 19:12 UTC (permalink / raw)
  To: Vikash Garodia
  Cc: stanimir.k.varbanov, bryan.odonoghue, agross, andersson,
	konrad.dybcio, mchehab, hans.verkuil, tfiga, linux-media,
	linux-arm-msm, linux-kernel, stable

On Wed, Jul 26, 2023 at 9:35 PM Vikash Garodia
<quic_vgarodia@quicinc.com> wrote:
>
> Buffer requirement, for different buffer type, comes from video firmware.
> While copying these requirements, there is an OOB possibility when the
> payload from firmware is more than expected size. Fix the check to avoid
> the OOB possibility.
>
> Cc: stable@vger.kernel.org
> Fixes: 09c2845e8fe4 ("[media] media: venus: hfi: add Host Firmware Interface (HFI)")
> Signed-off-by: Vikash Garodia <quic_vgarodia@quicinc.com>
> ---
>  drivers/media/platform/qcom/venus/hfi_msgs.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/media/platform/qcom/venus/hfi_msgs.c b/drivers/media/platform/qcom/venus/hfi_msgs.c
> index 3d5dadf..3e85bd8 100644
> --- a/drivers/media/platform/qcom/venus/hfi_msgs.c
> +++ b/drivers/media/platform/qcom/venus/hfi_msgs.c
> @@ -398,7 +398,7 @@ session_get_prop_buf_req(struct hfi_msg_session_property_info_pkt *pkt,
>                 memcpy(&bufreq[idx], buf_req, sizeof(*bufreq));
>                 idx++;
>
> -               if (idx > HFI_BUFFER_TYPE_MAX)
> +               if (idx >= HFI_BUFFER_TYPE_MAX)
>                         return HFI_ERR_SESSION_INVALID_PARAMETER;
>
>                 req_bytes -= sizeof(struct hfi_buffer_requirements);
> --
> The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
> a Linux Foundation Collaborative Project
>
The fix makes sense to me.
Reviewed-by: Nathan Hebert <nhebert@chromium.org>

Best regards,
Nathan Hebert

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 3/4] venus: hfi: add checks to handle capabilities from firmware
  2023-07-27  4:34 ` [PATCH 3/4] venus: hfi: add checks to handle capabilities from firmware Vikash Garodia
@ 2023-07-28 21:14   ` Nathan Hebert
  0 siblings, 0 replies; 10+ messages in thread
From: Nathan Hebert @ 2023-07-28 21:14 UTC (permalink / raw)
  To: Vikash Garodia
  Cc: stanimir.k.varbanov, bryan.odonoghue, agross, andersson,
	konrad.dybcio, mchehab, hans.verkuil, tfiga, linux-media,
	linux-arm-msm, linux-kernel, stable

On Wed, Jul 26, 2023 at 9:35 PM Vikash Garodia
<quic_vgarodia@quicinc.com> wrote:
>
> The hfi parser, parses the capabilities received from venus firmware and
> copies them to core capabilities. Consider below api, for example,
> fill_caps - In this api, caps in core structure gets updated with the
> number of capabilities received in firmware data payload. If the same api
> is called multiple times, there is a possibility of copying beyond the max
> allocated size in core caps.
> Similar possibilities in fill_raw_fmts and fill_profile_level functions.
>
> Cc: stable@vger.kernel.org
> Fixes: 1a73374a04e5 ("media: venus: hfi_parser: add common capability parser")
> Signed-off-by: Vikash Garodia <quic_vgarodia@quicinc.com>
> ---
>  drivers/media/platform/qcom/venus/hfi_parser.c | 12 ++++++++++++
>  1 file changed, 12 insertions(+)
>
> diff --git a/drivers/media/platform/qcom/venus/hfi_parser.c b/drivers/media/platform/qcom/venus/hfi_parser.c
> index 6cf74b2..ec73cac 100644
> --- a/drivers/media/platform/qcom/venus/hfi_parser.c
> +++ b/drivers/media/platform/qcom/venus/hfi_parser.c
> @@ -86,6 +86,9 @@ static void fill_profile_level(struct hfi_plat_caps *cap, const void *data,
>  {
>         const struct hfi_profile_level *pl = data;
>
> +       if (cap->num_pl > HFI_MAX_PROFILE_COUNT)
> +               return;
> +
This check does not fully prevent out of bounds writes. Should the
return condition be on |cap->num_pl + num > HFI_MAX_PROFILE_COUNT|, so
the last byte won't be written past the end of the array?

Similarly for the patches to |fill_caps| and |fill_raw_fmts|.
>         memcpy(&cap->pl[cap->num_pl], pl, num * sizeof(*pl));
>         cap->num_pl += num;
>  }
> @@ -111,6 +114,9 @@ fill_caps(struct hfi_plat_caps *cap, const void *data, unsigned int num)
>  {
>         const struct hfi_capability *caps = data;
>
> +       if (cap->num_caps > MAX_CAP_ENTRIES)
> +               return;
> +
>         memcpy(&cap->caps[cap->num_caps], caps, num * sizeof(*caps));
>         cap->num_caps += num;
>  }
> @@ -137,6 +143,9 @@ static void fill_raw_fmts(struct hfi_plat_caps *cap, const void *fmts,
>  {
>         const struct raw_formats *formats = fmts;
>
> +       if (cap->num_fmts > MAX_FMT_ENTRIES)
> +               return;
> +
>         memcpy(&cap->fmts[cap->num_fmts], formats, num_fmts * sizeof(*formats));
>         cap->num_fmts += num_fmts;
>  }
> @@ -159,6 +168,9 @@ parse_raw_formats(struct venus_core *core, u32 codecs, u32 domain, void *data)
>                 rawfmts[i].buftype = fmt->buffer_type;
>                 i++;
>
> +               if (i >= MAX_FMT_ENTRIES)
> +                       return;
> +
>                 if (pinfo->num_planes > MAX_PLANES)
>                         break;
>
> --
> The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
> a Linux Foundation Collaborative Project
>

Best regards,
Nathan Hebert

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2023-07-28 21:14 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-07-27  4:34 [PATCH 0/4] Venus driver fixes to avoid possible OOB accesses Vikash Garodia
2023-07-27  4:34 ` [PATCH 1/4] venus: hfi: add checks to perform sanity on queue pointers Vikash Garodia
2023-07-27 17:08   ` Konrad Dybcio
2023-07-28  7:56     ` Vikash Garodia
2023-07-27  4:34 ` [PATCH 2/4] venus: hfi: fix the check to handle session buffer requirement Vikash Garodia
2023-07-28 19:12   ` Nathan Hebert
2023-07-27  4:34 ` [PATCH 3/4] venus: hfi: add checks to handle capabilities from firmware Vikash Garodia
2023-07-28 21:14   ` Nathan Hebert
2023-07-27  4:34 ` [PATCH 4/4] venus: hfi_parser: Add check to keep the number of codecs within range Vikash Garodia
2023-07-27 17:11   ` Konrad Dybcio

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.