setarch: do not try to use non-existent data in argv[]
No binary (build failed)
—
(log yok)
| @@ -1,6 +1,6 @@ | |
| /* vi: set sw=4 ts=4: */ | |
| /* | |
| - | * Linux32/linux64 allows for changing uname emulation. |
| + | * linux32/linux64 allows for changing uname emulation. |
| * | |
| * Copyright 2002 Andi Kleen, SuSE Labs. | |
| * | |
| @@ -14,32 +14,32 @@ | |
| int setarch_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | |
| int setarch_main(int argc UNUSED_PARAM, char **argv) | |
| { | |
| - | int pers = -1; |
| + | int pers; |
| /* Figure out what personality we are supposed to switch to ... | |
| * we can be invoked as either: | |
| - | * argv[0],argv[1] -> "setarch","personality" |
| - | * argv[0] -> "personality" |
| + | * argv[0],argv[1] == "setarch","personality" |
| + | * argv[0] == "personality" |
| */ | |
| - | retry: |
| - | if (argv[0][5] == '6') /* linux64 */ |
| + | if (ENABLE_SETARCH && applet_name[0] == 's' |
| + | && argv[1] && strncpy(argv[1], "linux", 5) |
| + | ) { |
| + | applet_name = argv[1]; |
| + | argv++; |
| + | } |
| + | if (applet_name[5] == '6') /* linux64 */ |
| pers = PER_LINUX; | |
| - | else if (argv[0][5] == '3') /* linux32 */ |
| - | pers = PER_LINUX32; |
| - | else if (pers == -1 && argv[1] != NULL) { |
| + | else if (applet_name[5] == '3') /* linux32 */ |
| pers = PER_LINUX32; | |
| - | ++argv; |
| - | goto retry; |
| - | } |
| + | else |
| + | bb_show_usage(); |
| - | /* make user actually gave us something to do */ |
| - | ++argv; |
| + | argv++; |
| if (argv[0] == NULL) | |
| bb_show_usage(); | |
| /* Try to set personality */ | |
| if (personality(pers) >= 0) { | |
| - | |
| /* Try to execute the program */ | |
| BB_EXECVP(argv[0], argv); | |
| } | |