mirror of
https://github.com/smaeul/u-boot.git
synced 2025-10-14 04:46:01 +01:00
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:
parent
e9de8c8c64
commit
5f46c6eba5
90
cmd/net.c
90
cmd/net.c
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user