[klibc] [klibc:update-dash] builtin: describe_command - fix incorrect path

klibc-bot for Harald van Dijk
2019-01-25T03:15:46Z

Commit-ID:  4d9e71d139782c7bbd47285e7c38874965502e19
Gitweb:
http://git.kernel.org/?p=libs/klibc/klibc.git;a=commit;h=4d9e71d139782c7bbd47285e7c38874965502e19
Author:     Harald van Dijk <harald at gigawatt.nl>
AuthorDate: Fri, 26 May 2017 09:59:44 +0200
Committer:  Ben Hutchings <ben at decadent.org.uk>
CommitDate: Fri, 25 Jan 2019 02:57:21 +0000

[klibc] 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 at gigawatt.nl>
Signed-off-by: Herbert Xu <herbert at gondor.apana.org.au>
Signed-off-by: Ben Hutchings <ben at decadent.org.uk>

---
 usr/dash/exec.c | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/usr/dash/exec.c b/usr/dash/exec.c
index ec0eadd8..e9e29b7e 100644
--- a/usr/dash/exec.c
+++ b/usr/dash/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 {