Make sure that argv[] argument pointers are not modified.
The hush shell dynamically allocates (and re-allocates) memory for the
argument strings in the "char *argv[]" argument vector passed to
commands. Any code that modifies these pointers will cause serious
corruption of the malloc data structures and crash U-Boot, so make
sure the compiler can check that no such modifications are being done
by changing the code into "char * const argv[]".
This modification is the result of debugging a strange crash caused
after adding a new command, which used the following argument
processing code which has been working perfectly fine in all Unix
systems since version 6 - but not so in U-Boot:
int main (int argc, char **argv)
{
while (--argc > 0 && **++argv == '-') {
/* ====> */ while (*++*argv) {
switch (**argv) {
case 'd':
debug++;
break;
...
default:
usage ();
}
}
}
...
}
The line marked "====>" will corrupt the malloc data structures and
usually cause U-Boot to crash when the next command gets executed by
the shell. With the modification, the compiler will prevent this with
an
error: increment of read-only location '*argv'
N.B.: The code above can be trivially rewritten like this:
while (--argc > 0 && **++argv == '-') {
char *arg = *argv;
while (*++arg) {
switch (*arg) {
...
Signed-off-by: Wolfgang Denk <wd@denx.de>
Acked-by: Mike Frysinger <vapier@gentoo.org>
This commit is contained in:
@@ -78,7 +78,7 @@ static int image_info (unsigned long addr);
|
||||
#if defined(CONFIG_CMD_IMLS)
|
||||
#include <flash.h>
|
||||
extern flash_info_t flash_info[]; /* info for FLASH chips */
|
||||
static int do_imls (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
|
||||
static int do_imls (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SILENT_CONSOLE
|
||||
@@ -90,9 +90,9 @@ static image_header_t *image_get_kernel (ulong img_addr, int verify);
|
||||
static int fit_check_kernel (const void *fit, int os_noffset, int verify);
|
||||
#endif
|
||||
|
||||
static void *boot_get_kernel (cmd_tbl_t *cmdtp, int flag,int argc, char *argv[],
|
||||
static void *boot_get_kernel (cmd_tbl_t *cmdtp, int flag,int argc, char * const argv[],
|
||||
bootm_headers_t *images, ulong *os_data, ulong *os_len);
|
||||
extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
|
||||
extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
|
||||
|
||||
/*
|
||||
* Continue booting an OS image; caller already has:
|
||||
@@ -102,7 +102,7 @@ extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
|
||||
* - loaded (first part of) image to header load address,
|
||||
* - disabled interrupts.
|
||||
*/
|
||||
typedef int boot_os_fn (int flag, int argc, char *argv[],
|
||||
typedef int boot_os_fn (int flag, int argc, char * const argv[],
|
||||
bootm_headers_t *images); /* pointers to os/initrd/fdt */
|
||||
|
||||
#ifdef CONFIG_BOOTM_LINUX
|
||||
@@ -121,8 +121,8 @@ static boot_os_fn do_bootm_rtems;
|
||||
#if defined(CONFIG_CMD_ELF)
|
||||
static boot_os_fn do_bootm_vxworks;
|
||||
static boot_os_fn do_bootm_qnxelf;
|
||||
int do_bootvx (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
|
||||
int do_bootelf (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
|
||||
int do_bootvx (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
|
||||
int do_bootelf (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
|
||||
#endif
|
||||
#if defined(CONFIG_INTEGRITY)
|
||||
static boot_os_fn do_bootm_integrity;
|
||||
@@ -206,7 +206,7 @@ static void bootm_start_lmb(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
static int bootm_start(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
||||
static int bootm_start(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||
{
|
||||
void *os_hdr;
|
||||
int ret;
|
||||
@@ -438,10 +438,10 @@ static int bootm_load_os(image_info_t os, ulong *load_end, int boot_progress)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int bootm_start_standalone(ulong iflag, int argc, char *argv[])
|
||||
static int bootm_start_standalone(ulong iflag, int argc, char * const argv[])
|
||||
{
|
||||
char *s;
|
||||
int (*appl)(int, char *[]);
|
||||
int (*appl)(int, char * const []);
|
||||
|
||||
/* Don't start if "autostart" is set to "no" */
|
||||
if (((s = getenv("autostart")) != NULL) && (strcmp(s, "no") == 0)) {
|
||||
@@ -450,7 +450,7 @@ static int bootm_start_standalone(ulong iflag, int argc, char *argv[])
|
||||
setenv("filesize", buf);
|
||||
return 0;
|
||||
}
|
||||
appl = (int (*)(int, char *[]))ntohl(images.ep);
|
||||
appl = (int (*)(int, char * const []))ntohl(images.ep);
|
||||
(*appl)(argc-1, &argv[1]);
|
||||
|
||||
return 0;
|
||||
@@ -473,7 +473,7 @@ static cmd_tbl_t cmd_bootm_sub[] = {
|
||||
U_BOOT_CMD_MKENT(go, 0, 1, (void *)BOOTM_STATE_OS_GO, "", ""),
|
||||
};
|
||||
|
||||
int do_bootm_subcommand (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
||||
int do_bootm_subcommand (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||
{
|
||||
int ret = 0;
|
||||
int state;
|
||||
@@ -576,7 +576,7 @@ int do_bootm_subcommand (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
||||
/* bootm - boot application image from image in memory */
|
||||
/*******************************************************************/
|
||||
|
||||
int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
||||
int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||
{
|
||||
ulong iflag;
|
||||
ulong load_end = 0;
|
||||
@@ -811,7 +811,7 @@ static int fit_check_kernel (const void *fit, int os_noffset, int verify)
|
||||
* pointer to image header if valid image was found, plus kernel start
|
||||
* address and length, otherwise NULL
|
||||
*/
|
||||
static void *boot_get_kernel (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
|
||||
static void *boot_get_kernel (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
|
||||
bootm_headers_t *images, ulong *os_data, ulong *os_len)
|
||||
{
|
||||
image_header_t *hdr;
|
||||
@@ -1012,7 +1012,7 @@ U_BOOT_CMD(
|
||||
/* bootd - boot default image */
|
||||
/*******************************************************************/
|
||||
#if defined(CONFIG_CMD_BOOTD)
|
||||
int do_bootd (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
||||
int do_bootd (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||
{
|
||||
int rcode = 0;
|
||||
|
||||
@@ -1047,7 +1047,7 @@ U_BOOT_CMD(
|
||||
/* iminfo - print header info for a requested image */
|
||||
/*******************************************************************/
|
||||
#if defined(CONFIG_CMD_IMI)
|
||||
int do_iminfo (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
||||
int do_iminfo (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||
{
|
||||
int arg;
|
||||
ulong addr;
|
||||
@@ -1134,7 +1134,7 @@ U_BOOT_CMD(
|
||||
/* imls - list all images found in flash */
|
||||
/*******************************************************************/
|
||||
#if defined(CONFIG_CMD_IMLS)
|
||||
int do_imls (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
||||
int do_imls (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||
{
|
||||
flash_info_t *info;
|
||||
int i, j;
|
||||
@@ -1237,7 +1237,7 @@ static void fixup_silent_linux ()
|
||||
/*******************************************************************/
|
||||
|
||||
#ifdef CONFIG_BOOTM_NETBSD
|
||||
static int do_bootm_netbsd (int flag, int argc, char *argv[],
|
||||
static int do_bootm_netbsd (int flag, int argc, char * const argv[],
|
||||
bootm_headers_t *images)
|
||||
{
|
||||
void (*loader)(bd_t *, image_header_t *, char *, char *);
|
||||
@@ -1325,7 +1325,7 @@ static int do_bootm_netbsd (int flag, int argc, char *argv[],
|
||||
#endif /* CONFIG_BOOTM_NETBSD*/
|
||||
|
||||
#ifdef CONFIG_LYNXKDI
|
||||
static int do_bootm_lynxkdi (int flag, int argc, char *argv[],
|
||||
static int do_bootm_lynxkdi (int flag, int argc, char * const argv[],
|
||||
bootm_headers_t *images)
|
||||
{
|
||||
image_header_t *hdr = &images->legacy_hdr_os_copy;
|
||||
@@ -1347,7 +1347,7 @@ static int do_bootm_lynxkdi (int flag, int argc, char *argv[],
|
||||
#endif /* CONFIG_LYNXKDI */
|
||||
|
||||
#ifdef CONFIG_BOOTM_RTEMS
|
||||
static int do_bootm_rtems (int flag, int argc, char *argv[],
|
||||
static int do_bootm_rtems (int flag, int argc, char * const argv[],
|
||||
bootm_headers_t *images)
|
||||
{
|
||||
void (*entry_point)(bd_t *);
|
||||
@@ -1380,7 +1380,7 @@ static int do_bootm_rtems (int flag, int argc, char *argv[],
|
||||
#endif /* CONFIG_BOOTM_RTEMS */
|
||||
|
||||
#if defined(CONFIG_CMD_ELF)
|
||||
static int do_bootm_vxworks (int flag, int argc, char *argv[],
|
||||
static int do_bootm_vxworks (int flag, int argc, char * const argv[],
|
||||
bootm_headers_t *images)
|
||||
{
|
||||
char str[80];
|
||||
@@ -1402,7 +1402,7 @@ static int do_bootm_vxworks (int flag, int argc, char *argv[],
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int do_bootm_qnxelf(int flag, int argc, char *argv[],
|
||||
static int do_bootm_qnxelf(int flag, int argc, char * const argv[],
|
||||
bootm_headers_t *images)
|
||||
{
|
||||
char *local_args[2];
|
||||
@@ -1428,7 +1428,7 @@ static int do_bootm_qnxelf(int flag, int argc, char *argv[],
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_INTEGRITY
|
||||
static int do_bootm_integrity (int flag, int argc, char *argv[],
|
||||
static int do_bootm_integrity (int flag, int argc, char * const argv[],
|
||||
bootm_headers_t *images)
|
||||
{
|
||||
void (*entry_point)(void);
|
||||
|
||||
Reference in New Issue
Block a user