From 7fe21c69cdfbe3863aa69f40df6bbbe7abe4af8d Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Sat, 23 Aug 2008 23:15:17 +0000 Subject: [PATCH] setarch: do not try to use non-existent data in argv[] --- util-linux/setarch.c | 30 +++++++++++++++--------------- 1 file 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); } -- 2.25.1