On 8/10/26 10:08, ngotra2710 wrote:
> From: Ngo Luong Thanh Tra <[email protected]>
> 
> stm32mp1_ddr_subcmd() formats a rejected argument into a 50-byte stack
> buffer with an unbounded sprintf():
> 
>       char string[50] = "";
>       ...
>       sprintf(string, "invalid argument %s", argv[1]);
> 
> argv[1] comes from cli_simple_parse_line() over a console line held in
> buffer[CONFIG_SYS_CBSIZE], which is commonly 256 bytes or more. The
> fixed prefix takes 17 bytes, leaving 32 for the argument and its NUL, so
> any invalid argument longer than 32 characters writes past the end of
> string and corrupts the stack of the DDR interactive console.
> 
> Use snprintf() with sizeof(string). The sibling call a few lines below
> formats only integers and cannot overflow, so it is left alone.
> 
> Fixes: 0d447524425e ("stm32mp1: ram: add tests in DDR interactive mode")
> Signed-off-by: Ngo Luong Thanh Tra <[email protected]>
> Cc: Patrick Delaunay <[email protected]>
> Cc: Patrice Chotard <[email protected]>
> Cc: Tom Rini <[email protected]>
> ---
> Note, not for the commit message: the same 50-byte buffer is handed to the
> test functions in drivers/ram/stm32mp1/stm32mp1_tests.c, which write into it
> with further unbounded sprintf() calls, several of them formatting %s from
> argv (lines 28, 33, 38, 60, 81, 86, 90 and 113). Those cannot be fixed the
> same way because the buffer arrives there as a char * parameter, so sizeof()
> is not available at the call site. Fixing them properly needs either a size
> parameter alongside the pointer or a shared constant for the buffer length,
> which seemed like a separate change rather than something to fold in here.
> Happy to follow up with that if you would like it done in one go.

Hi Ngo

Feel free to submit another fix regarding the issue found in stm32mp1_tests.c

> 
>  drivers/ram/stm32mp1/stm32mp1_interactive.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/ram/stm32mp1/stm32mp1_interactive.c 
> b/drivers/ram/stm32mp1/stm32mp1_interactive.c
> index 6340afbb87..3154fde6bf 100644
> --- a/drivers/ram/stm32mp1/stm32mp1_interactive.c
> +++ b/drivers/ram/stm32mp1/stm32mp1_interactive.c
> @@ -334,8 +334,8 @@ static void stm32mp1_ddr_subcmd(struct ddr_info *priv,
>  
>       if ((strict_strtoul(argv[1], 0, &value) <  0) ||
>           value >= array_nb) {
> -             sprintf(string, "invalid argument %s",
> -                     argv[1]);
> +             snprintf(string, sizeof(string), "invalid argument %s",
> +                      argv[1]);
>               result = TEST_FAILED;
>               goto end;
>       }
> 
> base-commit: ece349ade2973e220f524ce59e59711cc919263f
> prerequisite-patch-id: 53e6ea149bf19676d9f2becfa13157b07bee89fc

Reviewed-by: Patrice Chotard <[email protected]>

Thanks
Patrice

Reply via email to