summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2016-09-03 21:58:50 +0800
committerHerbert Xu <herbert@gondor.apana.org.au>2016-09-23 22:50:16 +0800
commitad092191a3f281c2d14089c86757305403a9de64 (patch)
treec8677f1b8dd700ebe39c476dbb455622b2ccb0bc /src
parentbuiltin: Fix echo -n early termination (diff)
downloaddash-ad092191a3f281c2d14089c86757305403a9de64.tar.gz
dash-ad092191a3f281c2d14089c86757305403a9de64.zip
expand - Fix dangling left square brackets in patterns
When there is an unmatched left square bracket in patterns, pmatch
will behave strangely and exhibit undefined behaviour.  This patch
(based on Harld van Dijk's original) fixes this by treating it as
a literal left square bracket.

Reported-by: Olof Johansson <olof@ethup.se>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'src')
-rw-r--r--src/expand.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/src/expand.c b/src/expand.c
index 36bea76..2a50830 100644
--- a/src/expand.c
+++ b/src/expand.c
@@ -1584,14 +1584,14 @@ pmatch(const char *pattern, const char *string)
 				p++;
 			}
 			found = 0;
-			chr = *q++;
+			chr = *q;
 			if (chr == '\0')
 				return 0;
 			c = *p++;
 			do {
 				if (!c) {
 					p = startp;
-					c = *p;
+					c = '[';
 					goto dft;
 				}
 				if (c == '[') {
@@ -1618,6 +1618,7 @@ pmatch(const char *pattern, const char *string)
 			} while ((c = *p++) != ']');
 			if (found == invert)
 				return 0;
+			q++;
 			break;
 		}
 dft:	        default: