diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-08-23 23:15:17 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-08-23 23:15:17 +0000 |
commit | 7fe21c69cdfbe3863aa69f40df6bbbe7abe4af8d (patch) | |
tree | 6c31b5c3afac40894ce0fc1ed563c5be02c82258 | |
parent | 6cd36bc2dab71646582564ad7c64494e05fd2af4 (diff) |
setarch: do not try to use non-existent data in argv[]
-rw-r--r-- | util-linux/setarch.c | 30 |
1 files changed, 15 insertions, 15 deletions
diff --git a/util-linux/setarch.c b/util-linux/setarch.c index 250a93823..8213382e4 100644 --- a/util-linux/setarch.c +++ b/util-linux/setarch.c @@ -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); } |