1303 files changed, 32187 insertions, 57138 deletions
diff --git a/util-linux/setarch.c b/util-linux/setarch.c index 7b9421a..ec473e9 100644 --- a/util-linux/setarch.c +++ b/util-linux/setarch.c @@ -6,13 +6,46 @@ * * Licensed under GPLv2 or later, see file LICENSE in this source tree. */ +//config:config SETARCH +//config: bool "setarch" +//config: default y +//config: select PLATFORM_LINUX +//config: help +//config: The linux32 utility is used to create a 32bit environment for the +//config: specified program (usually a shell). It only makes sense to have +//config: this util on a system that supports both 64bit and 32bit userland +//config: (like amd64/x86, ppc64/ppc, sparc64/sparc, etc...). +//config: +//config:config LINUX32 +//config: bool "linux32" +//config: default y +//config: select PLATFORM_LINUX +//config: help +//config: Alias to "setarch linux32". +//config: +//config:config LINUX64 +//config: bool "linux64" +//config: default y +//config: select PLATFORM_LINUX +//config: help +//config: Alias to "setarch linux64". + +//applet:IF_SETARCH(APPLET(setarch, BB_DIR_BIN, BB_SUID_DROP)) +//applet:IF_LINUX32(APPLET_ODDNAME(linux32, setarch, BB_DIR_BIN, BB_SUID_DROP, linux32)) +//applet:IF_LINUX64(APPLET_ODDNAME(linux64, setarch, BB_DIR_BIN, BB_SUID_DROP, linux64)) + +//kbuild:lib-$(CONFIG_SETARCH) += setarch.o +//kbuild:lib-$(CONFIG_LINUX32) += setarch.o +//kbuild:lib-$(CONFIG_LINUX64) += setarch.o //usage:#define setarch_trivial_usage -//usage: "personality PROG ARGS" +//usage: "PERSONALITY [-R] PROG ARGS" //usage:#define setarch_full_usage "\n\n" -//usage: "Personality may be:\n" -//usage: " linux32 Set 32bit uname emulation\n" -//usage: " linux64 Set 64bit uname emulation" +//usage: "PERSONALITY may be:" +//usage: "\n"" linux32 Set 32bit uname emulation" +//usage: "\n"" linux64 Set 64bit uname emulation" +//usage: "\n" +//usage: "\n"" -R Disable address space randomization" //usage: //usage:#define linux32_trivial_usage NOUSAGE_STR //usage:#define linux32_full_usage "" @@ -20,14 +53,18 @@ //usage:#define linux64_trivial_usage NOUSAGE_STR //usage:#define linux64_full_usage "" +#include "libbb.h" #include <sys/personality.h> -#include "libbb.h" +#ifndef ADDR_NO_RANDOMIZE +# define ADDR_NO_RANDOMIZE 0x0040000 +#endif int setarch_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; int setarch_main(int argc UNUSED_PARAM, char **argv) { - int pers; + unsigned opts; + unsigned long pers; /* Figure out what personality we are supposed to switch to ... * we can be invoked as either: @@ -35,27 +72,33 @@ int setarch_main(int argc UNUSED_PARAM, char **argv) * argv[0] == "personality" */ if (ENABLE_SETARCH && applet_name[0] == 's' - && argv[1] && strncpy(argv[1], "linux", 5) + && argv[1] && is_prefixed_with(argv[1], "linux") ) { - applet_name = argv[1]; argv++; + applet_name = argv[0]; } - if (applet_name[5] == '6') /* linux64 */ + if ((!ENABLE_SETARCH && !ENABLE_LINUX32) || applet_name[5] == '6') + /* linux64 */ pers = PER_LINUX; - else if (applet_name[5] == '3') /* linux32 */ + else + if ((!ENABLE_SETARCH && !ENABLE_LINUX64) || applet_name[5] == '3') + /* linux32 */ pers = PER_LINUX32; else bb_show_usage(); - argv++; - if (argv[0] == NULL) - bb_show_usage(); + opts = getopt32(argv, "+R"); /* '+': stop at first non-option */ + if (opts) + pers |= ADDR_NO_RANDOMIZE; /* Try to set personality */ - if (personality(pers) >= 0) { - /* Try to execute the program */ - BB_EXECVP(argv[0], argv); - } + if (personality(pers) < 0) + bb_perror_msg_and_die("personality(0x%lx)", pers); + + argv += optind; + if (!argv[0]) + (--argv)[0] = (char*)"/bin/sh"; - bb_simple_perror_msg_and_die(argv[0]); + /* Try to execute the program */ + BB_EXECVP_or_die(argv); } |