[U-Boot] [PATCH] cmd: fastboot: Validate user input
Sam Protsenko
semen.protsenko at linaro.org
Fri Jun 29 19:02:14 UTC 2018
Hi Simon,
On 27 June 2018 at 02:18, Simon Glass <sjg at chromium.org> wrote:
> Hi Sam,
>
> On 26 June 2018 at 10:20, Sam Protsenko <semen.protsenko at linaro.org> wrote:
>> In case when user provides '-' as USB controller index, like this:
>>
>> => fastboot -
>>
>> data abort occurs in strcmp() function in do_fastboot(), here:
>>
>> if (!strcmp(argv[1], "udp"))
>>
>> That's because argv[1] is NULL when user types in the '-', and null
>> pointer dereference occurs in strcmp() (which is ok according to C
>> standard specification). So we must validate user input to prevent such
>> behavior.
>>
>> While at it, check also the result of strtoul() function and handle
>> error cases properly.
>>
>> Signed-off-by: Sam Protsenko <semen.protsenko at linaro.org>
>> ---
>> cmd/fastboot.c | 13 ++++++++++++-
>> 1 file changed, 12 insertions(+), 1 deletion(-)
>
> Reviewed-by: Simon Glass <sjg at chromium.org>
>
> Question below.
>
>>
>> diff --git a/cmd/fastboot.c b/cmd/fastboot.c
>> index e6ae0570d5..dab686eef4 100644
>> --- a/cmd/fastboot.c
>> +++ b/cmd/fastboot.c
>> @@ -38,13 +38,18 @@ static int do_fastboot_usb(int argc, char *const argv[],
>> #if CONFIG_IS_ENABLED(USB_FUNCTION_FASTBOOT)
>> int controller_index;
>> char *usb_controller;
>> + char *endp;
>> int ret;
>>
>> if (argc < 2)
>> return CMD_RET_USAGE;
>>
>> usb_controller = argv[1];
>> - controller_index = simple_strtoul(usb_controller, NULL, 0);
>> + controller_index = simple_strtoul(usb_controller, &endp, 0);
>> + if (*endp != '\0') {
>> + pr_err("Error: Wrong USB controller index format\n");
>> + return CMD_RET_FAILURE;
>> + }
>>
>> ret = board_usb_init(controller_index, USB_INIT_DEVICE);
>> if (ret) {
>> @@ -120,6 +125,12 @@ NXTARG:
>> ;
>> }
>>
>> + /* Handle case when USB controller param is just '-' */
>> + if (!argv[1]) {
>
> Can you check argc instead? I think that is nicer.
>
You are right. Code above my changes modifies the argc w.r.t. argv, so
we can check if argc == 1, and this would be the error case. I just
sent the v2. Thanks for reviewing.
>> + pr_err("Error: Incorrect USB controller index\n");
>> + return CMD_RET_USAGE;
>> + }
>> +
>> fastboot_init((void *)buf_addr, buf_size);
>>
>> if (!strcmp(argv[1], "udp"))
>> --
>> 2.17.1
>>
More information about the U-Boot
mailing list