Skip to content

Commit 54841ab

Browse files
committed
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>
1 parent b218ccb commit 54841ab

File tree

295 files changed

+671
-670
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

295 files changed

+671
-670
lines changed

api/api.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
#undef DEBUG
3838

3939
/* U-Boot routines needed */
40-
extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
40+
extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
4141

4242
/*****************************************************************************
4343
*

arch/arm/cpu/arm_cortexa8/mx51/clock.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ u32 imx_get_fecclk(void)
269269
/*
270270
* Dump some core clockes.
271271
*/
272-
int do_mx51_showclocks(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
272+
int do_mx51_showclocks(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
273273
{
274274
u32 freq;
275275

arch/arm/cpu/arm_cortexa8/omap3/board.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ void abort(void)
282282
/******************************************************************************
283283
* OMAP3 specific command to switch between NAND HW and SW ecc
284284
*****************************************************************************/
285-
static int do_switch_ecc(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
285+
static int do_switch_ecc(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
286286
{
287287
if (argc != 2)
288288
goto usage;

arch/arm/lib/bootm.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ static void setup_end_tag (bd_t *bd);
5050
static struct tag *params;
5151
#endif /* CONFIG_SETUP_MEMORY_TAGS || CONFIG_CMDLINE_TAG || CONFIG_INITRD_TAG */
5252

53-
int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
53+
int do_bootm_linux(int flag, int argc, char * const argv[], bootm_headers_t *images)
5454
{
5555
bd_t *bd = gd->bd;
5656
char *s;

arch/arm/lib/reset.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939

4040
#include <common.h>
4141

42-
int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
42+
int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
4343
{
4444
puts ("resetting ...\n");
4545

arch/avr32/cpu/cpu.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ void prepare_to_boot(void)
7676
"sync 0" : : "r"(0) : "memory");
7777
}
7878

79-
int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
79+
int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
8080
{
8181
/* This will reset the CPU core, caches, MMU and all internal busses */
8282
__builtin_mtdr(8, 1 << 13); /* set DC:DBE */

arch/avr32/lib/bootm.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ static void setup_end_tag(struct tag *params)
171171
params->hdr.size = 0;
172172
}
173173

174-
int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
174+
int do_bootm_linux(int flag, int argc, char * const argv[], bootm_headers_t *images)
175175
{
176176
void (*theKernel)(int magic, void *tagtable);
177177
struct tag *params, *params_start;

arch/blackfin/cpu/bootrom-asm-offsets.c.in

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,4 @@
99
#define _DEFINE(sym, val) asm volatile("\n->" #sym " %0 " #val : : "i" (val))
1010
#define DEFINE(s, m) _DEFINE(offset_##s##_##m, offsetof(s, m))
1111

12-
int main(int argc, char *argv[])
12+
int main(int argc, char * const argv[])

arch/blackfin/cpu/reset.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ void bfin_reset_or_hang(void)
9999
#endif
100100
}
101101

102-
int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
102+
int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
103103
{
104104
bfin_reset_trampoline();
105105
return 0;

arch/blackfin/lib/boot.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ static char *make_command_line(void)
3333

3434
extern ulong bfin_poweron_retx;
3535

36-
int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
36+
int do_bootm_linux(int flag, int argc, char * const argv[], bootm_headers_t *images)
3737
{
3838
int (*appl) (char *cmdline);
3939
char *cmdline;

arch/blackfin/lib/cmd_cache_dump.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ static int check_limit(const char *type, size_t start_limit, size_t end_limit, s
2525
return 1;
2626
}
2727

28-
int do_icache_dump(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
28+
int do_icache_dump(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
2929
{
3030
int cache_status = icache_status();
3131

@@ -97,7 +97,7 @@ U_BOOT_CMD(icache_dump, 4, 0, do_icache_dump,
9797
"icache_dump - dump current instruction cache\n",
9898
"[way] [subbank] [set]");
9999

100-
int do_dcache_dump(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
100+
int do_dcache_dump(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
101101
{
102102
u32 way, bank, subbank, set;
103103
u32 status, addr;

arch/blackfin/lib/kgdb.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -417,7 +417,7 @@ void kgdb_putregs(struct pt_regs *regs, char *buf, int length)
417417

418418
}
419419

420-
void kgdb_breakpoint(int argc, char *argv[])
420+
void kgdb_breakpoint(int argc, char * const argv[])
421421
{
422422
asm volatile ("excpt 0x1\n");
423423
}

arch/i386/cpu/cpu.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ int cpu_init_r(void)
5656
return 0;
5757
}
5858

59-
int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
59+
int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
6060
{
6161
printf ("resetting ...\n");
6262
udelay(50000); /* wait 50 ms */

arch/i386/lib/board.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,7 @@ void hang (void)
431431
for (;;);
432432
}
433433

434-
unsigned long do_go_exec (ulong (*entry)(int, char *[]), int argc, char *argv[])
434+
unsigned long do_go_exec (ulong (*entry)(int, char *[]), int argc, char * const argv[])
435435
{
436436
/*
437437
* x86 does not use a dedicated register to pass the pointer

arch/i386/lib/bootm.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
#include <asm/zimage.h>
3030

3131
/*cmd_boot.c*/
32-
int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
32+
int do_bootm_linux(int flag, int argc, char * const argv[], bootm_headers_t *images)
3333
{
3434
void *base_ptr;
3535
ulong os_data, os_len;

arch/i386/lib/interrupts.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ void do_irq(int hw_irq)
136136
}
137137

138138
#if defined(CONFIG_CMD_IRQ)
139-
int do_irqinfo(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
139+
int do_irqinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
140140
{
141141
int irq;
142142

arch/i386/lib/zimage.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ void boot_zimage(void *setup_base)
245245
enter_realmode(((u32)setup_base+SETUP_START_OFFSET)>>4, 0, &regs, &regs);
246246
}
247247

248-
int do_zboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
248+
int do_zboot (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
249249
{
250250
void *base_ptr;
251251
void *bzImage_addr;

arch/m68k/cpu/mcf5227x/cpu.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333

3434
DECLARE_GLOBAL_DATA_PTR;
3535

36-
int do_reset(cmd_tbl_t * cmdtp, bd_t * bd, int flag, int argc, char *argv[])
36+
int do_reset(cmd_tbl_t * cmdtp, bd_t * bd, int flag, int argc, char * const argv[])
3737
{
3838
volatile rcm_t *rcm = (rcm_t *) (MMAP_RCM);
3939
udelay(1000);

arch/m68k/cpu/mcf523x/cpu.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434

3535
DECLARE_GLOBAL_DATA_PTR;
3636

37-
int do_reset(cmd_tbl_t * cmdtp, bd_t * bd, int flag, int argc, char *argv[])
37+
int do_reset(cmd_tbl_t * cmdtp, bd_t * bd, int flag, int argc, char * const argv[])
3838
{
3939
volatile ccm_t *ccm = (ccm_t *) MMAP_CCM;
4040

arch/m68k/cpu/mcf52x2/cpu.c

+7-7
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
DECLARE_GLOBAL_DATA_PTR;
3939

4040
#ifdef CONFIG_M5208
41-
int do_reset(cmd_tbl_t *cmdtp, bd_t *bd, int flag, int argc, char *argv[])
41+
int do_reset(cmd_tbl_t *cmdtp, bd_t *bd, int flag, int argc, char * const argv[])
4242
{
4343
volatile rcm_t *rcm = (rcm_t *)(MMAP_RCM);
4444

@@ -142,7 +142,7 @@ int checkcpu(void)
142142
return 0;
143143
}
144144

145-
int do_reset(cmd_tbl_t * cmdtp, bd_t * bd, int flag, int argc, char *argv[])
145+
int do_reset(cmd_tbl_t * cmdtp, bd_t * bd, int flag, int argc, char * const argv[])
146146
{
147147
/* Call the board specific reset actions first. */
148148
if(board_reset) {
@@ -177,7 +177,7 @@ int watchdog_init(void)
177177
#endif
178178

179179
#ifdef CONFIG_M5272
180-
int do_reset(cmd_tbl_t * cmdtp, bd_t * bd, int flag, int argc, char *argv[])
180+
int do_reset(cmd_tbl_t * cmdtp, bd_t * bd, int flag, int argc, char * const argv[])
181181
{
182182
volatile wdog_t *wdp = (wdog_t *) (MMAP_WDOG);
183183

@@ -257,7 +257,7 @@ int watchdog_init(void)
257257
#endif /* #ifdef CONFIG_M5272 */
258258

259259
#ifdef CONFIG_M5275
260-
int do_reset(cmd_tbl_t *cmdtp, bd_t *bd, int flag, int argc, char *argv[])
260+
int do_reset(cmd_tbl_t *cmdtp, bd_t *bd, int flag, int argc, char * const argv[])
261261
{
262262
volatile rcm_t *rcm = (rcm_t *)(MMAP_RCM);
263263

@@ -337,7 +337,7 @@ int checkcpu(void)
337337
return 0;
338338
}
339339

340-
int do_reset(cmd_tbl_t * cmdtp, bd_t * bd, int flag, int argc, char *argv[])
340+
int do_reset(cmd_tbl_t * cmdtp, bd_t * bd, int flag, int argc, char * const argv[])
341341
{
342342
MCFRESET_RCR = MCFRESET_RCR_SOFTRST;
343343
return 0;
@@ -354,7 +354,7 @@ int checkcpu(void)
354354
return 0;
355355
}
356356

357-
int do_reset(cmd_tbl_t * cmdtp, bd_t * bd, int flag, int argc, char *argv[])
357+
int do_reset(cmd_tbl_t * cmdtp, bd_t * bd, int flag, int argc, char * const argv[])
358358
{
359359
/* enable watchdog, set timeout to 0 and wait */
360360
mbar_writeByte(MCFSIM_SYPCR, 0xc0);
@@ -384,7 +384,7 @@ int checkcpu(void)
384384
return 0;
385385
}
386386

387-
int do_reset(cmd_tbl_t * cmdtp, bd_t * bd, int flag, int argc, char *argv[])
387+
int do_reset(cmd_tbl_t * cmdtp, bd_t * bd, int flag, int argc, char * const argv[])
388388
{
389389
/* enable watchdog, set timeout to 0 and wait */
390390
mbar_writeByte(SIM_SYPCR, 0xc0);

arch/m68k/cpu/mcf532x/cpu.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434

3535
DECLARE_GLOBAL_DATA_PTR;
3636

37-
int do_reset(cmd_tbl_t * cmdtp, bd_t * bd, int flag, int argc, char *argv[])
37+
int do_reset(cmd_tbl_t * cmdtp, bd_t * bd, int flag, int argc, char * const argv[])
3838
{
3939
volatile rcm_t *rcm = (rcm_t *) (MMAP_RCM);
4040

arch/m68k/cpu/mcf5445x/cpu.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434

3535
DECLARE_GLOBAL_DATA_PTR;
3636

37-
int do_reset(cmd_tbl_t * cmdtp, bd_t * bd, int flag, int argc, char *argv[])
37+
int do_reset(cmd_tbl_t * cmdtp, bd_t * bd, int flag, int argc, char * const argv[])
3838
{
3939
volatile rcm_t *rcm = (rcm_t *) (MMAP_RCM);
4040
udelay(1000);

arch/m68k/cpu/mcf547x_8x/cpu.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434

3535
DECLARE_GLOBAL_DATA_PTR;
3636

37-
int do_reset(cmd_tbl_t * cmdtp, bd_t * bd, int flag, int argc, char *argv[])
37+
int do_reset(cmd_tbl_t * cmdtp, bd_t * bd, int flag, int argc, char * const argv[])
3838
{
3939
volatile gptmr_t *gptmr = (gptmr_t *) (MMAP_GPTMR);
4040

arch/m68k/lib/bootm.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ void arch_lmb_reserve(struct lmb *lmb)
6464
lmb_reserve(lmb, sp, (CONFIG_SYS_SDRAM_BASE + gd->ram_size - sp));
6565
}
6666

67-
int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
67+
int do_bootm_linux(int flag, int argc, char * const argv[], bootm_headers_t *images)
6868
{
6969
ulong rd_len;
7070
ulong initrd_start, initrd_end;

arch/microblaze/cpu/interrupts.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ void interrupt_handler (void)
173173

174174
#if defined(CONFIG_CMD_IRQ)
175175
#ifdef CONFIG_SYS_INTC_0
176-
int do_irqinfo (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
176+
int do_irqinfo (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
177177
{
178178
int i;
179179
struct irq_action *act = vecs;
@@ -193,7 +193,7 @@ int do_irqinfo (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
193193
return (0);
194194
}
195195
#else
196-
int do_irqinfo (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
196+
int do_irqinfo (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
197197
{
198198
puts ("Undefined interrupt controller\n");
199199
}

arch/microblaze/lib/bootm.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232

3333
DECLARE_GLOBAL_DATA_PTR;
3434

35-
int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
35+
int do_bootm_linux(int flag, int argc, char * const argv[], bootm_headers_t *images)
3636
{
3737
/* First parameter is mapped to $r5 for kernel boot args */
3838
void (*theKernel) (char *, ulong, ulong);

arch/mips/cpu/cpu.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ void __attribute__((weak)) _machine_restart(void)
4242
{
4343
}
4444

45-
int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
45+
int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
4646
{
4747
_machine_restart();
4848

arch/mips/lib/bootm.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ static int linux_env_idx;
4343
static void linux_params_init (ulong start, char * commandline);
4444
static void linux_env_set (char * env_name, char * env_val);
4545

46-
int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
46+
int do_bootm_linux(int flag, int argc, char * const argv[], bootm_headers_t *images)
4747
{
4848
void (*theKernel) (int, char **, char **, int *);
4949
char *commandline = getenv ("bootargs");

arch/mips/lib/bootm_qemu_mips.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929

3030
DECLARE_GLOBAL_DATA_PTR;
3131

32-
int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
32+
int do_bootm_linux(int flag, int argc, char * const argv[], bootm_headers_t *images)
3333
{
3434
void (*theKernel) (int, char **, char **, int *);
3535
char *bootargs = getenv ("bootargs");

arch/nios2/cpu/epcs.c

+7-7
Original file line numberDiff line numberDiff line change
@@ -472,7 +472,7 @@ static int epcs_sect_erased (int sect, unsigned *offset,
472472
* Commands
473473
***********************************************************************/
474474
static
475-
void do_epcs_info (struct epcs_devinfo_t *dev, int argc, char *argv[])
475+
void do_epcs_info (struct epcs_devinfo_t *dev, int argc, char * const argv[])
476476
{
477477
int i;
478478
unsigned char stat;
@@ -519,7 +519,7 @@ void do_epcs_info (struct epcs_devinfo_t *dev, int argc, char *argv[])
519519
}
520520

521521
static
522-
void do_epcs_erase (struct epcs_devinfo_t *dev, int argc, char *argv[])
522+
void do_epcs_erase (struct epcs_devinfo_t *dev, int argc, char * const argv[])
523523
{
524524
unsigned start,end;
525525

@@ -549,7 +549,7 @@ void do_epcs_erase (struct epcs_devinfo_t *dev, int argc, char *argv[])
549549
}
550550

551551
static
552-
void do_epcs_protect (struct epcs_devinfo_t *dev, int argc, char *argv[])
552+
void do_epcs_protect (struct epcs_devinfo_t *dev, int argc, char * const argv[])
553553
{
554554
unsigned char stat;
555555

@@ -585,7 +585,7 @@ void do_epcs_protect (struct epcs_devinfo_t *dev, int argc, char *argv[])
585585
}
586586

587587
static
588-
void do_epcs_read (struct epcs_devinfo_t *dev, int argc, char *argv[])
588+
void do_epcs_read (struct epcs_devinfo_t *dev, int argc, char * const argv[])
589589
{
590590
ulong addr,off,cnt;
591591
ulong sz;
@@ -617,7 +617,7 @@ void do_epcs_read (struct epcs_devinfo_t *dev, int argc, char *argv[])
617617
}
618618

619619
static
620-
void do_epcs_write (struct epcs_devinfo_t *dev, int argc, char *argv[])
620+
void do_epcs_write (struct epcs_devinfo_t *dev, int argc, char * const argv[])
621621
{
622622
ulong addr,off,cnt;
623623
ulong sz;
@@ -656,7 +656,7 @@ void do_epcs_write (struct epcs_devinfo_t *dev, int argc, char *argv[])
656656
}
657657

658658
static
659-
void do_epcs_verify (struct epcs_devinfo_t *dev, int argc, char *argv[])
659+
void do_epcs_verify (struct epcs_devinfo_t *dev, int argc, char * const argv[])
660660
{
661661
ulong addr,off,cnt;
662662
ulong sz;
@@ -690,7 +690,7 @@ void do_epcs_verify (struct epcs_devinfo_t *dev, int argc, char *argv[])
690690
}
691691

692692
/*-----------------------------------------------------------------------*/
693-
int do_epcs (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
693+
int do_epcs (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
694694
{
695695
int len;
696696
struct epcs_devinfo_t *dev = epcs_dev_find ();

0 commit comments

Comments
 (0)