tail: fix SEGV on "tail -N"

config system: clarify PREFER_APPLETS/SH_STANDALONE effects in help text
This commit is contained in:
Denis Vlasenko 2007-05-08 17:27:17 +00:00
parent 0cacc80952
commit 92c0b8222e
3 changed files with 36 additions and 16 deletions

View File

@ -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"

View File

@ -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

View File

@ -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 <applet>_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