diff options
author | Harald van Dijk <harald@gigawatt.nl> | 2017-05-26 09:59:44 +0200 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2018-03-10 16:01:42 +0800 |
commit | f19f3b398a2e947148a646096de94b77c73bb55d (patch) | |
tree | bf4db378c7dc2ab18b3490e59d33def954933e05 | |
parent | trap: Globally rename pendingsigs to pending_sig (diff) | |
download | dash-f19f3b398a2e947148a646096de94b77c73bb55d.tar.gz dash-f19f3b398a2e947148a646096de94b77c73bb55d.zip |
builtin: describe_command - fix incorrect path
Hi, On 26/05/17 09:04, Youfu Zhang wrote: > $ PATH=/extra/path:/usr/sbin:/usr/bin:/sbin:/bin \ >> 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 (core dumped) > > 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. True, but only when a path is passed in. If the default path is used, looking up in the hash table is correct, and printing tracked aliases is intentional. If it's desirable to drop that feature, then it should be dropped completely, code shouldn't be left in that can no longer be used. But it's possible to keep it working: how about this instead? Signed-off-by: Harald van Dijk <harald@gigawatt.nl> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r-- | src/exec.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/src/exec.c b/src/exec.c index ec0eadd..e9e29b7 100644 --- a/src/exec.c +++ b/src/exec.c @@ -743,8 +743,6 @@ describe_command(out, command, path, verbose) struct tblentry *cmdp; const struct alias *ap; - path = path ?: pathval(); - if (verbose) { outstr(command, out); } @@ -767,8 +765,17 @@ describe_command(out, command, path, verbose) goto out; } - /* Then check if it is a tracked alias */ - if ((cmdp = cmdlookup(command, 0)) != NULL) { + /* Then if the standard search path is used, check if it is + * a tracked alias. + */ + if (path == NULL) { + path = pathval(); + cmdp = cmdlookup(command, 0); + } else { + cmdp = NULL; + } + + if (cmdp != NULL) { entry.cmdtype = cmdp->cmdtype; entry.u = cmdp->param; } else { |