media: venus: hfi: add checks to perform sanity on queue pointers
authorVikash Garodia <quic_vgarodia@quicinc.com>
Thu, 10 Aug 2023 02:25:01 +0000 (07:55 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 28 Nov 2023 17:19:54 +0000 (17:19 +0000)
commit 5e538fce33589da6d7cb2de1445b84d3a8a692f7 upstream.

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>
Signed-off-by: Stanimir Varbanov <stanimir.k.varbanov@gmail.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/media/platform/qcom/venus/hfi_venus.c

index 19fc657..f9437b6 100644 (file)
@@ -205,6 +205,11 @@ 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 - sizeof(*wr_ptr)))
+               return -EINVAL;
+
        if (new_wr_idx < qsize) {
                memcpy(wr_ptr, packet, dwords << 2);
        } else {
@@ -272,6 +277,11 @@ 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 - sizeof(*rd_ptr)))
+               return -EINVAL;
+
        dwords = *rd_ptr >> 2;
        if (!dwords)
                return -EINVAL;