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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 20 Apr 2025 08:15:33 +0000 (10:15 +0200)
commit f4b211714bcc70effa60c34d9fa613d182e3ef1e upstream.

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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/media/platform/qcom/venus/hfi_venus.c

index f9437b6412b91c2483670a2b11f4fd43f3206404..cfd9471560cce8a1b3e546bcc4ae28f84904ed86 100644 (file)
@@ -1035,18 +1035,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);
 }