• Wolfgang Denk's avatar
    Make sure that argv[] argument pointers are not modified. · 54841ab5
    Wolfgang Denk authored
    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: default avatarWolfgang Denk <wd@denx.de>
    Acked-by: default avatarMike Frysinger <vapier@gentoo.org>
    54841ab5
Name
Last commit
Last update
api Loading commit data...
arch Loading commit data...
board Loading commit data...
common Loading commit data...
disk Loading commit data...
doc Loading commit data...
drivers Loading commit data...
examples Loading commit data...
fs Loading commit data...
include Loading commit data...
lib Loading commit data...
nand_spl Loading commit data...
net Loading commit data...
onenand_ipl Loading commit data...
post Loading commit data...
tools Loading commit data...
.gitignore Loading commit data...
CHANGELOG Loading commit data...
CHANGELOG-before-U-Boot-1.1.5 Loading commit data...
COPYING Loading commit data...
CREDITS Loading commit data...
MAINTAINERS Loading commit data...
MAKEALL Loading commit data...
Makefile Loading commit data...
README Loading commit data...
boards.cfg Loading commit data...
config.mk Loading commit data...
mkconfig Loading commit data...
rules.mk Loading commit data...