[PATCH] ash: make bash_source command search current directory after PATH
Denys Vlasenko
vda.linux at googlemail.com
Sat Jan 27 17:15:23 UTC 2018
I already committed a similar patch to git.
On Fri, Jan 26, 2018 at 5:46 PM, Paul Otto <paul at ottoops.com> wrote:
> I have modified this patch per your review comments. For what it's worth, I
> went through hush, and found that it still exhibits the BASH non-POSIXy
> behavior. Take a look:
>
> static char *find_in_path(const char *arg)
> {
> ...
> if (sz != 0) {
> ret = xasprintf("%.*s/%s", sz, PATH, arg);
> } else {
> /* We have xxx::yyyy in $PATH,
> * it means "use current dir" */
> ret = xstrdup(arg);
> }
> if (access(ret, F_OK) == 0)
> break;
> ...
>
> ----
>
> static int FAST_FUNC builtin_source(char **argv)
> {
> ...
> if (!strchr(filename, '/')) {
> arg_path = find_in_path(filename);
> if (arg_path)
> filename = arg_path;
> }
> ...
>
> ----
>
> shell/ash.c | 26 ++++++++++++++++++++++++--
> 1 file changed, 24 insertions(+), 2 deletions(-)
>
> diff --git i/shell/ash.c w/shell/ash.c
> index 865159d20..c9edce16c 100644
> --- i/shell/ash.c
> +++ w/shell/ash.c
> @@ -60,6 +60,20 @@
> //config: from GNU bash, which allows for alternative command not
> found
> //config: handling.
> //config:
> +//config:config ASH_BASH_NON_POSIX_DOTCMD
> +//config: bool "non-POSIXy dotcmd behavior (ie: . <file> or source
> <file>)"
> +//config: default n
> +//config: depends ASH_BASH_COMPAT
> +//config: help
> +//config: Activates the expected, non-POSIXy behavior BASH follows
> when
> +//config: dotcmd is invoked with either ". <file>" or "source <file>".
> In
> +//config: BASH, when the dotcmd is combined with a filename without an
> +//config: absolute or relative path specified, the shell first scans
> the
> +//config: environment's PATH, followed by the present working
> directory
> +//config: (PWD). The POSIX-compliant command does NOT scan the present
> +//config: working directory. This option is disabled by default for
> improved
> +//config: speed and security.
> +//config:
> //config:config ASH_JOB_CONTROL
> //config: bool "Job control"
> //config: default y
> @@ -12967,7 +12981,10 @@ find_dot_file(char *name)
> if (strchr(name, '/'))
> return name;
>
> - while ((fullname = path_advance(&path, name)) != NULL) {
> + while ((fullname = path_advance(&path, name)) != NULL) {
> +#if ASH_BASH_NON_POSIX_DOTCMD
> + try_cur_dir:
> +#endif
> if ((stat(fullname, &statb) == 0) && S_ISREG(statb.st_mode))
> {
> /*
> * Don't bother freeing here, since it will
> @@ -12980,7 +12997,12 @@ find_dot_file(char *name)
> }
>
> /* not found in the PATH */
> - ash_msg_and_raise_error("%s: not found", name);
> +#if ASH_BASH_NON_POSIX_DOTCMD
> + fullname = name;
> + goto try_cur_dir;
you can simply "return name" here.
> +#endif
> + /* not found at all */
> + ash_msg_and_raise_error("%s: not found", name);
> /* NOTREACHED */
> }
More information about the busybox
mailing list