From 6683d1cbb44859f549f87f882545b84b9369585c Mon Sep 17 00:00:00 2001 From: Youfu Zhang Date: Fri, 26 May 2017 15:31:29 +0800 Subject: 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 Signed-off-by: Denys Vlasenko --- shell/ash.c | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/shell/ash.c b/shell/ash.c index 60c8ffe..eb51d47 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); } -- cgit v1.1