diff options
author | Youfu Zhang <zhangyoufu@gmail.com> | 2017-05-26 15:31:29 +0800 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2017-05-26 17:37:35 +0200 |
commit | 6683d1cbb44859f549f87f882545b84b9369585c (patch) | |
tree | a151695f4874f5bb8e2c23ef9b6f2fd4c744b62d /shell | |
parent | 2599937c4e5012d8e410d58574d22dec92e6eaa5 (diff) |
ash: fix incorrect path in describe_command
$ PATH=/extra/path:/usr/sbin:/usr/bin:/sbin:/bin \
> busybox sh -xc 'command -V ls; command -V ls; command -Vp ls; command -vp ls'
+ command -V ls
ls is /bin/ls
+ command -V ls
ls is a tracked alias for /bin/ls
+ command -Vp ls
ls is a tracked alias for (null)
+ command -vp ls
Segmentation fault
describe_command should respect `path' argument. Looking up in the hash table
may gives incorrect index in entry.u.index and finally causes incorrect output
or SIGSEGV.
function old new delta
describe_command 386 313 -73
Signed-off-by: Youfu Zhang <zhangyoufu@gmail.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'shell')
-rw-r--r-- | shell/ash.c | 16 |
1 files changed, 3 insertions, 13 deletions
diff --git a/shell/ash.c b/shell/ash.c index 60c8ffeb7..eb51d47cc 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -8163,7 +8163,6 @@ static int describe_command(char *command, const char *path, int describe_command_verbose) { struct cmdentry entry; - struct tblentry *cmdp; #if ENABLE_ASH_ALIAS const struct alias *ap; #endif @@ -8193,15 +8192,8 @@ describe_command(char *command, const char *path, int describe_command_verbose) goto out; } #endif - /* Then check if it is a tracked alias */ - cmdp = cmdlookup(command, 0); - if (cmdp != NULL) { - entry.cmdtype = cmdp->cmdtype; - entry.u = cmdp->param; - } else { - /* Finally use brute force */ - find_command(command, &entry, DO_ABS, path); - } + /* Brute force */ + find_command(command, &entry, DO_ABS, path); switch (entry.cmdtype) { case CMDNORMAL: { @@ -8216,9 +8208,7 @@ describe_command(char *command, const char *path, int describe_command_verbose) } while (--j >= 0); } if (describe_command_verbose) { - out1fmt(" is%s %s", - (cmdp ? " a tracked alias for" : nullstr), p - ); + out1fmt(" is %s", p); } else { out1str(p); } |