[klibc] [klibc:update-dash] [BUILTIN] Correctly handle test ! ! = !

klibc-bot for Herbert Xu herbert at gondor.apana.org.au
Thu Jan 24 19:15:13 PST 2019


Commit-ID:  4061dd0658545bd7ea6a677663e31be9ee7f57cb
Gitweb:     http://git.kernel.org/?p=libs/klibc/klibc.git;a=commit;h=4061dd0658545bd7ea6a677663e31be9ee7f57cb
Author:     Herbert Xu <herbert at gondor.apana.org.au>
AuthorDate: Sun, 28 Sep 2014 18:40:18 +0800
Committer:  Ben Hutchings <ben at decadent.org.uk>
CommitDate: Fri, 25 Jan 2019 02:57:21 +0000

[klibc] [BUILTIN] Correctly handle test ! ! = !

This patch adds a special case in testcmd for the 4-argument
expression beginning with a !.  Without this ! ! = ! is deemed
a syntax error, which breaks POSIX.

Note that this special case does not extend down into subexpressions
so if ! ! = ! is used inside parentheses then a syntax error will
still occur as before.

Signed-off-by: Herbert Xu <herbert at gondor.apana.org.au>
Signed-off-by: Ben Hutchings <ben at decadent.org.uk>

---
 usr/dash/bltin/test.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/usr/dash/bltin/test.c b/usr/dash/bltin/test.c
index baa91a57..458e9f55 100644
--- a/usr/dash/bltin/test.c
+++ b/usr/dash/bltin/test.c
@@ -177,7 +177,7 @@ testcmd(int argc, char **argv)
 {
 	const struct t_op *op;
 	enum token n;
-	int res;
+	int res = 1;
 
 	if (*argv[0] == '[') {
 		if (*argv[--argc] != ']')
@@ -185,11 +185,12 @@ testcmd(int argc, char **argv)
 		argv[argc] = NULL;
 	}
 
+recheck:
 	argv++;
 	argc--;
 
 	if (argc < 1)
-		return 1;
+		return res;
 
 	/*
 	 * POSIX prescriptions: he who wrote this deserves the Nobel
@@ -209,6 +210,9 @@ testcmd(int argc, char **argv)
 			argv[--argc] = NULL;
 			argv++;
 			argc--;
+		} else if (!strcmp(argv[0], "!")) {
+			res = 0;
+			goto recheck;
 		}
 	}
 
@@ -216,7 +220,7 @@ testcmd(int argc, char **argv)
 
 eval:
 	t_wp = argv;
-	res = !oexpr(n);
+	res ^= oexpr(n);
 	argv = t_wp;
 
 	if (argv[0] != NULL && argv[1] != NULL)


More information about the klibc mailing list