[PATCH] mailbox: riscv-sbi-mpxy: Validate notification data length

Anup Patel anup at brainfault.org
Mon Aug 24 10:50:54 PDT 2026


On Sat, Aug 22, 2026 at 11:11 PM liutong <liutong at iscas.ac.cn> wrote:
>
> mpxy_get_notifications() copies data from shared memory using a
> length derived from the SBI return value:
>
>   memcpy(notif_data, mpxy->shmem, sret.value + 16);
>
> sret.value is not validated against the shared memory buffer size.
> A buggy firmware returning a value larger than mpxy_shmem_size - 16
> would cause memcpy to read beyond the shared memory mapping.

Well, if a firmware is buggy then it can corrupt any part of the
S-mode memory and not just the MPXY shared memory.

I think it is okay to have this additional check but this does
not cover all possible corruptions by buggy firmware.

>
> Add a bounds check before the memcpy.
>
> Fixes: bf3022a4eb11 ("mailbox: Add RISC-V SBI message proxy (MPXY) based mailbox driver")
> Signed-off-by: liutong <liutong at iscas.ac.cn>

Reviewed-by: Anup Patel <anup at brainfault.org>

Regards,
Anup

> ---
>  drivers/mailbox/riscv-sbi-mpxy-mbox.c | 5 +++++
>  1 file changed, 5 insertions(+)
>
> diff --git a/drivers/mailbox/riscv-sbi-mpxy-mbox.c b/drivers/mailbox/riscv-sbi-mpxy-mbox.c
> index 18da9efcc..3a2d52bbc 100644
> --- a/drivers/mailbox/riscv-sbi-mpxy-mbox.c
> +++ b/drivers/mailbox/riscv-sbi-mpxy-mbox.c
> @@ -315,6 +315,11 @@ static int mpxy_get_notifications(u32 channel_id,
>         if (sret.error)
>                 goto err_put_cpu;
>
> +       if (sret.value + 16 > mpxy_shmem_size) {
> +               put_cpu();
> +               return -EIO;
> +       }
> +
>         memcpy(notif_data, mpxy->shmem, sret.value + 16);
>         *events_data_len = sret.value;
>
> --
> 2.34.1
>



More information about the linux-riscv mailing list