diff options
Diffstat (limited to 'util-linux')
-rw-r--r-- | util-linux/Config.src | 10 | ||||
-rw-r--r-- | util-linux/Kbuild.src | 1 | ||||
-rw-r--r-- | util-linux/setarch.c | 54 |
3 files changed, 39 insertions, 26 deletions
diff --git a/util-linux/Config.src b/util-linux/Config.src index 854b368..922cabd 100644 --- a/util-linux/Config.src +++ b/util-linux/Config.src @@ -489,16 +489,6 @@ config SCRIPTREPLAY This program replays a typescript, using timing information given by script -t. -config SETARCH - bool "setarch" - default y - select PLATFORM_LINUX - help - The linux32 utility is used to create a 32bit environment for the - specified program (usually a shell). It only makes sense to have - this util on a system that supports both 64bit and 32bit userland - (like amd64/x86, ppc64/ppc, sparc64/sparc, etc...). - config SWAPONOFF bool "swaponoff" default y diff --git a/util-linux/Kbuild.src b/util-linux/Kbuild.src index 468fc6b..0b87c52 100644 --- a/util-linux/Kbuild.src +++ b/util-linux/Kbuild.src @@ -40,7 +40,6 @@ lib-$(CONFIG_READPROFILE) += readprofile.o lib-$(CONFIG_RTCWAKE) += rtcwake.o lib-$(CONFIG_SCRIPT) += script.o lib-$(CONFIG_SCRIPTREPLAY) += scriptreplay.o -lib-$(CONFIG_SETARCH) += setarch.o lib-$(CONFIG_SWAPONOFF) += swaponoff.o lib-$(CONFIG_SWITCH_ROOT) += switch_root.o lib-$(CONFIG_UMOUNT) += umount.o diff --git a/util-linux/setarch.c b/util-linux/setarch.c index 7b9421a..2e989ec 100644 --- a/util-linux/setarch.c +++ b/util-linux/setarch.c @@ -6,13 +6,30 @@ * * 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...). + +//applet:IF_SETARCH(APPLET(setarch, BB_DIR_BIN, BB_SUID_DROP)) +//applet:IF_SETARCH(APPLET_ODDNAME(linux32, setarch, BB_DIR_BIN, BB_SUID_DROP, linux32)) +//applet:IF_SETARCH(APPLET_ODDNAME(linux64, setarch, BB_DIR_BIN, BB_SUID_DROP, linux64)) + +//kbuild:lib-$(CONFIG_SETARCH) += 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 +37,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,7 +56,7 @@ 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++; @@ -47,15 +68,18 @@ int setarch_main(int argc UNUSED_PARAM, char **argv) 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); } |