cmd: fix tftpput command

Calling tftpput with less than 2 arguments must lead to a failure.

If tftpput is called with two arguments, these are the address and
the size of the file to be transferred.

Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Heinrich Schuchardt 2022-09-03 12:21:09 +00:00
parent e9de8c8c64
commit 5f46c6eba5

View File

@ -189,30 +189,49 @@ static void netboot_update_env(void)
#endif #endif
} }
static int netboot_common(enum proto_t proto, struct cmd_tbl *cmdtp, int argc, /**
char *const argv[]) * parse_addr_size() - parse address and size arguments for tftpput
*
* @argv: command line arguments
* Return: 0 on success
*/
static int parse_addr_size(char * const argv[])
{
if (strict_strtoul(argv[1], 16, &image_save_addr) < 0 ||
strict_strtoul(argv[2], 16, &image_save_size) < 0) {
printf("Invalid address/size\n");
return CMD_RET_USAGE;
}
return 0;
}
/**
* parse_args() - parse command line arguments
*
* @proto: command prototype
* @argc: number of arguments
* @argv: command line arguments
* Return: 0 on success
*/
static int parse_args(enum proto_t proto, int argc, char *const argv[])
{ {
char *s;
char *end;
int rcode = 0;
int size;
ulong addr; ulong addr;
char *end;
net_boot_file_name_explicit = false;
/* pre-set image_load_addr */
s = env_get("loadaddr");
if (s != NULL)
image_load_addr = hextoul(s, NULL);
switch (argc) { switch (argc) {
case 1: case 1:
if (CONFIG_IS_ENABLED(CMD_TFTPPUT) && proto == TFTPPUT)
return 1;
/* refresh bootfile name from env */ /* refresh bootfile name from env */
copy_filename(net_boot_file_name, env_get("bootfile"), copy_filename(net_boot_file_name, env_get("bootfile"),
sizeof(net_boot_file_name)); sizeof(net_boot_file_name));
break; break;
case 2: /* case 2:
if (CONFIG_IS_ENABLED(CMD_TFTPPUT) && proto == TFTPPUT)
return 1;
/*
* Only one arg - accept two forms: * Only one arg - accept two forms:
* Just load address, or just boot file name. The latter * Just load address, or just boot file name. The latter
* form must be written in a format which can not be * form must be written in a format which can not be
@ -232,29 +251,52 @@ static int netboot_common(enum proto_t proto, struct cmd_tbl *cmdtp, int argc,
break; break;
case 3: case 3:
image_load_addr = hextoul(argv[1], NULL); if (CONFIG_IS_ENABLED(CMD_TFTPPUT) && proto == TFTPPUT) {
net_boot_file_name_explicit = true; if (parse_addr_size(argv))
copy_filename(net_boot_file_name, argv[2], return 1;
sizeof(net_boot_file_name)); } else {
image_load_addr = hextoul(argv[1], NULL);
net_boot_file_name_explicit = true;
copy_filename(net_boot_file_name, argv[2],
sizeof(net_boot_file_name));
}
break; break;
#ifdef CONFIG_CMD_TFTPPUT #ifdef CONFIG_CMD_TFTPPUT
case 4: case 4:
if (strict_strtoul(argv[1], 16, &image_save_addr) < 0 || if (parse_addr_size(argv))
strict_strtoul(argv[2], 16, &image_save_size) < 0) { return 1;
printf("Invalid address/size\n");
return CMD_RET_USAGE;
}
net_boot_file_name_explicit = true; net_boot_file_name_explicit = true;
copy_filename(net_boot_file_name, argv[3], copy_filename(net_boot_file_name, argv[3],
sizeof(net_boot_file_name)); sizeof(net_boot_file_name));
break; break;
#endif #endif
default: default:
return 1;
}
return 0;
}
static int netboot_common(enum proto_t proto, struct cmd_tbl *cmdtp, int argc,
char *const argv[])
{
char *s;
int rcode = 0;
int size;
net_boot_file_name_explicit = false;
*net_boot_file_name = '\0';
/* pre-set image_load_addr */
s = env_get("loadaddr");
if (s != NULL)
image_load_addr = hextoul(s, NULL);
if (parse_args(proto, argc, argv)) {
bootstage_error(BOOTSTAGE_ID_NET_START); bootstage_error(BOOTSTAGE_ID_NET_START);
return CMD_RET_USAGE; return CMD_RET_USAGE;
} }
bootstage_mark(BOOTSTAGE_ID_NET_START); bootstage_mark(BOOTSTAGE_ID_NET_START);
size = net_loop(proto); size = net_loop(proto);