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:
parent
2599937c4e
commit
6683d1cbb4
16
shell/ash.c
16
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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user