tail: fix SEGV on "tail -N" config system: clarify PREFER_APPLETS/SH_STANDALONE effects in help text
No binary (build failed)
—
(log yok)
| @@ -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" | |
| @@ -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 | |
| @@ -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 | |