ash: fix incorrect path in describe_command
authorYoufu Zhang <zhangyoufu@gmail.com>
Fri, 26 May 2017 07:31:29 +0000 (15:31 +0800)
committerDenys Vlasenko <vda.linux@googlemail.com>
Fri, 26 May 2017 15:37:35 +0000 (17:37 +0200)
$ 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>
shell/ash.c

index 60c8ffeb7d45c1a1da641c900e8fac3dce8ae0d4..eb51d47cc9fde958c794df579f7b7e13d343039e 100644 (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);
                }