]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
media: venus: hfi: add a check to handle OOB in sfr region
authorVikash Garodia <quic_vgarodia@quicinc.com>
Thu, 20 Feb 2025 17:20:11 +0000 (22:50 +0530)
committerHans Verkuil <hverkuil@xs4all.nl>
Mon, 3 Mar 2025 17:21:55 +0000 (18:21 +0100)
sfr->buf_size is in shared memory and can be modified by malicious user.
OOB write is possible when the size is made higher than actual sfr data
buffer. Cap the size to allocated size for such cases.

Cc: stable@vger.kernel.org
Fixes: d96d3f30c0f2 ("[media] media: venus: hfi: add Venus HFI files")
Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Signed-off-by: Vikash Garodia <quic_vgarodia@quicinc.com>
Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
drivers/media/platform/qcom/venus/hfi_venus.c

index 36d3a37db4e8a7967ec5209e78a455cc53eb4933..b5f2ea8799507f9b83f1529e70061ea89a9cc5c8 100644 (file)
@@ -1041,18 +1041,26 @@ static void venus_sfr_print(struct venus_hfi_device *hdev)
 {
        struct device *dev = hdev->core->dev;
        struct hfi_sfr *sfr = hdev->sfr.kva;
+       u32 size;
        void *p;
 
        if (!sfr)
                return;
 
-       p = memchr(sfr->data, '\0', sfr->buf_size);
+       size = sfr->buf_size;
+       if (!size)
+               return;
+
+       if (size > ALIGNED_SFR_SIZE)
+               size = ALIGNED_SFR_SIZE;
+
+       p = memchr(sfr->data, '\0', size);
        /*
         * SFR isn't guaranteed to be NULL terminated since SYS_ERROR indicates
         * that Venus is in the process of crashing.
         */
        if (!p)
-               sfr->data[sfr->buf_size - 1] = '\0';
+               sfr->data[size - 1] = '\0';
 
        dev_err_ratelimited(dev, "SFR message from FW: %s\n", sfr->data);
 }