aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Denis Vlasenko <vda.linux@googlemail.com>2007-05-08 17:27:17 +0000
committerGravatar Denis Vlasenko <vda.linux@googlemail.com>2007-05-08 17:27:17 +0000
commit92c0b8222eb50dd35c06e2f1265706b388762234 (patch)
treec94def6f5c4cfbbcc1a7a70d96e721eb433ed01f
parent0cacc80952a7a34f9cb8b384d6dd0b1522c37bae (diff)
downloadbusybox-92c0b8222eb50dd35c06e2f1265706b388762234.tar.gz
busybox-92c0b8222eb50dd35c06e2f1265706b388762234.tar.bz2
tail: fix SEGV on "tail -N"
config system: clarify PREFER_APPLETS/SH_STANDALONE effects in help text
-rw-r--r--Config.in9
-rw-r--r--coreutils/tail.c16
-rw-r--r--shell/Config.in29
3 files changed, 37 insertions, 17 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/<applet> -> 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.
-
- 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.
+ 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 <applet>_main() internally.
+
+ 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