]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
media: venus: Add a check for packet size after reading from shared memory
authorVedang Nagar <quic_vnagar@quicinc.com>
Mon, 19 May 2025 07:12:21 +0000 (12:42 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 28 Aug 2025 14:22:50 +0000 (16:22 +0200)
commit 49befc830daa743e051a65468c05c2ff9e8580e6 upstream.

Add a check to ensure that the packet size does not exceed the number of
available words after reading the packet header from shared memory. This
ensures that the size provided by the firmware is safe to process and
prevent potential out-of-bounds memory access.

Fixes: d96d3f30c0f2 ("[media] media: venus: hfi: add Venus HFI files")
Cc: stable@vger.kernel.org
Signed-off-by: Vedang Nagar <quic_vnagar@quicinc.com>
Co-developed-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Signed-off-by: Bryan O'Donoghue <bod@kernel.org>
Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/media/platform/qcom/venus/hfi_venus.c

index 91584d197af99efaa357ec445250c3eae843d2f8..df6264d03226ccb06f7ef4dc1b875d76359ea1d8 100644 (file)
@@ -240,6 +240,7 @@ static int venus_write_queue(struct venus_hfi_device *hdev,
 static int venus_read_queue(struct venus_hfi_device *hdev,
                            struct iface_queue *queue, void *pkt, u32 *tx_req)
 {
+       struct hfi_pkt_hdr *pkt_hdr = NULL;
        struct hfi_queue_header *qhdr;
        u32 dwords, new_rd_idx;
        u32 rd_idx, wr_idx, type, qsize;
@@ -305,6 +306,9 @@ static int venus_read_queue(struct venus_hfi_device *hdev,
                        memcpy(pkt, rd_ptr, len);
                        memcpy(pkt + len, queue->qmem.kva, new_rd_idx << 2);
                }
+               pkt_hdr = (struct hfi_pkt_hdr *)(pkt);
+               if ((pkt_hdr->size >> 2) != dwords)
+                       return -EINVAL;
        } else {
                /* bad packet received, dropping */
                new_rd_idx = qhdr->write_idx;