mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-08-24 02:48:51 +09:00
![Wolfgang Denk](/assets/img/avatar_default.png)
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>
214 lines
4.2 KiB
C
214 lines
4.2 KiB
C
#include <common.h>
|
|
|
|
#include <config.h>
|
|
#include <command.h>
|
|
|
|
#ifdef YAFFS2_DEBUG
|
|
#define PRINTF(fmt,args...) printf (fmt ,##args)
|
|
#else
|
|
#define PRINTF(fmt,args...)
|
|
#endif
|
|
|
|
extern void cmd_yaffs_mount(char *mp);
|
|
extern void cmd_yaffs_umount(char *mp);
|
|
extern void cmd_yaffs_read_file(char *fn);
|
|
extern void cmd_yaffs_write_file(char *fn,char bval,int sizeOfFile);
|
|
extern void cmd_yaffs_ls(const char *mountpt, int longlist);
|
|
extern void cmd_yaffs_mwrite_file(char *fn, char *addr, int size);
|
|
extern void cmd_yaffs_mread_file(char *fn, char *addr);
|
|
extern void cmd_yaffs_mkdir(const char *dir);
|
|
extern void cmd_yaffs_rmdir(const char *dir);
|
|
extern void cmd_yaffs_rm(const char *path);
|
|
extern void cmd_yaffs_mv(const char *oldPath, const char *newPath);
|
|
|
|
extern int yaffs_DumpDevStruct(const char *path);
|
|
|
|
|
|
int do_ymount (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
{
|
|
char *mtpoint = argv[1];
|
|
cmd_yaffs_mount(mtpoint);
|
|
|
|
return(0);
|
|
}
|
|
|
|
int do_yumount (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
{
|
|
char *mtpoint = argv[1];
|
|
cmd_yaffs_umount(mtpoint);
|
|
|
|
return(0);
|
|
}
|
|
|
|
int do_yls (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
{
|
|
char *dirname = argv[argc-1];
|
|
|
|
cmd_yaffs_ls(dirname, (argc>2)?1:0);
|
|
|
|
return(0);
|
|
}
|
|
|
|
int do_yrd (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
{
|
|
char *filename = argv[1];
|
|
printf ("Reading file %s ", filename);
|
|
|
|
cmd_yaffs_read_file(filename);
|
|
|
|
printf ("done\n");
|
|
return(0);
|
|
}
|
|
|
|
int do_ywr (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
{
|
|
char *filename = argv[1];
|
|
ulong value = simple_strtoul(argv[2], NULL, 16);
|
|
ulong numValues = simple_strtoul(argv[3], NULL, 16);
|
|
|
|
printf ("Writing value (%x) %x times to %s... ", value, numValues, filename);
|
|
|
|
cmd_yaffs_write_file(filename,value,numValues);
|
|
|
|
printf ("done\n");
|
|
return(0);
|
|
}
|
|
|
|
int do_yrdm (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
{
|
|
char *filename = argv[1];
|
|
ulong addr = simple_strtoul(argv[2], NULL, 16);
|
|
|
|
cmd_yaffs_mread_file(filename, (char *)addr);
|
|
|
|
return(0);
|
|
}
|
|
|
|
int do_ywrm (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
{
|
|
char *filename = argv[1];
|
|
ulong addr = simple_strtoul(argv[2], NULL, 16);
|
|
ulong size = simple_strtoul(argv[3], NULL, 16);
|
|
|
|
cmd_yaffs_mwrite_file(filename, (char *)addr, size);
|
|
|
|
return(0);
|
|
}
|
|
|
|
int do_ymkdir (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
{
|
|
char *dirname = argv[1];
|
|
|
|
cmd_yaffs_mkdir(dirname);
|
|
|
|
return(0);
|
|
}
|
|
|
|
int do_yrmdir (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
{
|
|
char *dirname = argv[1];
|
|
|
|
cmd_yaffs_rmdir(dirname);
|
|
|
|
return(0);
|
|
}
|
|
|
|
int do_yrm (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
{
|
|
char *path = argv[1];
|
|
|
|
cmd_yaffs_rm(path);
|
|
|
|
return(0);
|
|
}
|
|
|
|
int do_ymv (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
{
|
|
char *oldPath = argv[1];
|
|
char *newPath = argv[2];
|
|
|
|
cmd_yaffs_mv(newPath, oldPath);
|
|
|
|
return(0);
|
|
}
|
|
|
|
int do_ydump (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
{
|
|
char *dirname = argv[1];
|
|
if (yaffs_DumpDevStruct(dirname) != 0)
|
|
printf("yaffs_DumpDevStruct returning error when dumping path: , %s\n", dirname);
|
|
return 0;
|
|
}
|
|
|
|
U_BOOT_CMD(
|
|
ymount, 3, 0, do_ymount,
|
|
"mount yaffs",
|
|
""
|
|
);
|
|
|
|
U_BOOT_CMD(
|
|
yumount, 3, 0, do_yumount,
|
|
"unmount yaffs",
|
|
""
|
|
);
|
|
|
|
U_BOOT_CMD(
|
|
yls, 4, 0, do_yls,
|
|
"yaffs ls",
|
|
"[-l] name"
|
|
);
|
|
|
|
U_BOOT_CMD(
|
|
yrd, 2, 0, do_yrd,
|
|
"read file from yaffs",
|
|
"filename"
|
|
);
|
|
|
|
U_BOOT_CMD(
|
|
ywr, 4, 0, do_ywr,
|
|
"write file to yaffs",
|
|
"filename value num_vlues"
|
|
);
|
|
|
|
U_BOOT_CMD(
|
|
yrdm, 3, 0, do_yrdm,
|
|
"read file to memory from yaffs",
|
|
"filename offset"
|
|
);
|
|
|
|
U_BOOT_CMD(
|
|
ywrm, 4, 0, do_ywrm,
|
|
"write file from memory to yaffs",
|
|
"filename offset size"
|
|
);
|
|
|
|
U_BOOT_CMD(
|
|
ymkdir, 2, 0, do_ymkdir,
|
|
"YAFFS mkdir",
|
|
"dirname"
|
|
);
|
|
|
|
U_BOOT_CMD(
|
|
yrmdir, 2, 0, do_yrmdir,
|
|
"YAFFS rmdir",
|
|
"dirname"
|
|
);
|
|
|
|
U_BOOT_CMD(
|
|
yrm, 2, 0, do_yrm,
|
|
"YAFFS rm",
|
|
"path"
|
|
);
|
|
|
|
U_BOOT_CMD(
|
|
ymv, 4, 0, do_ymv,
|
|
"YAFFS mv",
|
|
"oldPath newPath"
|
|
);
|
|
|
|
U_BOOT_CMD(
|
|
ydump, 2, 0, do_ydump,
|
|
"YAFFS device struct",
|
|
"dirname"
|
|
);
|