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>
This commit is contained in:
Youfu Zhang 2017-05-26 15:31:29 +08:00 committed by Denys Vlasenko
parent 2599937c4e
commit 6683d1cbb4

View File

@ -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);
}