From 92c0b8222eb50dd35c06e2f1265706b388762234 Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Tue, 8 May 2007 17:27:17 +0000 Subject: [PATCH] tail: fix SEGV on "tail -N" config system: clarify PREFER_APPLETS/SH_STANDALONE effects in help text --- Config.in | 9 +++++++-- coreutils/tail.c | 16 +++++++++++----- shell/Config.in | 27 ++++++++++++++++++--------- 3 files changed, 36 insertions(+), 16 deletions(-) diff --git a/Config.in b/Config.in index 94ed109cb..a04e11b5c 100644 --- a/Config.in +++ b/Config.in @@ -244,8 +244,13 @@ config FEATURE_PREFER_APPLETS help This is an experimental option which directs applets about to call 'exec' to try and find an applicable busybox applet before - searching the PATH. This may affect shell, find -exec, xargs and - similar programs. + searching the PATH. This is typically done by exec'ing + /proc/self/exe. + This may affect shell, find -exec, xargs and similar applets. + They will use applets even if /bin/ -> busybox link + is missing (or is not a link to busybox). However, this causes + problems in chroot jails without mounted /proc and with ps/top + (command name can be shown as 'exe' for applets started this way). config BUSYBOX_EXEC_PATH string "Path to BusyBox executable" diff --git a/coreutils/tail.c b/coreutils/tail.c index 629ee2125..32df25914 100644 --- a/coreutils/tail.c +++ b/coreutils/tail.c @@ -79,7 +79,8 @@ int tail_main(int argc, char **argv) unsigned sleep_period = 1; bool from_top; int header_threshhold = 1; - const char *str_c, *str_n, *str_s; + const char *str_c, *str_n; + USE_FEATURE_FANCY_TAIL(const char *str_s;) char *tailbuf; size_t tailbufsize; @@ -96,13 +97,18 @@ int tail_main(int argc, char **argv) if (argc >= 2 && (argv[1][0] == '+' || argv[1][0] == '-') && isdigit(argv[1][1]) ) { - argv[0] = (char*)"-n"; - argv--; - argc++; + /* replacing arg[0] with "-n" can segfault, so... */ + argv[1] = xasprintf("-n%s", argv[1]); +#if 0 /* If we ever decide to make tail NOFORK */ + char *s = alloca(strlen(argv[1]) + 3); + sprintf(s, "-n%s", argv[1]); + argv[1] = s; +#endif } #endif - opt = getopt32(argc, argv, "fc:n:" USE_FEATURE_FANCY_TAIL("qs:v"), &str_c, &str_n, &str_s); + opt = getopt32(argc, argv, "fc:n:" USE_FEATURE_FANCY_TAIL("qs:v"), + &str_c, &str_n USE_FEATURE_FANCY_TAIL(,&str_s)); #define FOLLOW (opt & 0x1) #define COUNT_BYTES (opt & 0x2) //if (opt & 0x1) // -f diff --git a/shell/Config.in b/shell/Config.in index f3726e302..027993483 100644 --- a/shell/Config.in +++ b/shell/Config.in @@ -242,7 +242,7 @@ config FEATURE_SH_STANDALONE default n depends on (MSH || LASH || HUSH || ASH) && FEATURE_PREFER_APPLETS help - This option causes the selected busybox shell to use busybox applets + This option causes busybox shells to use busybox applets in preference to executables in the PATH whenever possible. For example, entering the command 'ifconfig' into the shell would cause busybox to use the ifconfig busybox applet. Specifying the fully @@ -251,14 +251,23 @@ config FEATURE_SH_STANDALONE is generally used when creating a statically linked version of busybox for use as a rescue shell, in the event that you screw up your system. - Note that this will *also* cause applets to take precedence - over shell builtins of the same name. So turning this on will - eliminate any performance gained by turning on the builtin "echo" - and "test" commands in ash. + This is implemented by re-execing /proc/self/exe (typically) + with right parameters. Some selected applets ("NOFORK" applets) + can even be executed without creating new process. + Instead, busybox will call _main() internally. - Note that when using this option, the shell will attempt to directly - run '/bin/busybox'. If you do not have the busybox binary sitting in - that exact location with that exact name, this option will not work at - all. + However, this causes problems in chroot jails without mounted /proc + and with ps/top (command name can be shown as 'exe' for applets + started this way). +# untrue? +# Note that this will *also* cause applets to take precedence +# over shell builtins of the same name. So turning this on will +# eliminate any performance gained by turning on the builtin "echo" +# and "test" commands in ash. +# untrue? +# Note that when using this option, the shell will attempt to directly +# run '/bin/busybox'. If you do not have the busybox binary sitting in +# that exact location with that exact name, this option will not work at +# all. endmenu