summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--Src/glob.c8
-rw-r--r--Test/D04parameter.ztst10
3 files changed, 21 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 8cba5b571..ce95e6ed8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2017-03-23 Peter Stephenson <p.stephenson@samsung.com>
+
+ * 22601: Src/glob.c, Test/D04parameter.ztst: problem matching
+ pattern against zero-length string in parameter substitutions.
+
2017-03-21 Peter Stephenson <p.stephenson@samsung.com>
* 40875 (Martin Krafft): change description of REC_EXACT option.
diff --git a/Src/glob.c b/Src/glob.c
index 0fcb4e122..9ac0ae66c 100644
--- a/Src/glob.c
+++ b/Src/glob.c
@@ -2969,7 +2969,7 @@ igetmatch(char **sp, Patprog p, int fl, int n, char *replstr,
do {
/* loop over all matches for global substitution */
matched = 0;
- for (; t < send; ioff++) {
+ for (; t <= send; ioff++) {
/* Find the longest match from this position. */
set_pat_start(p, t-s);
if (pattrylen(p, t, umlen, 0, &patstralloc, ioff)) {
@@ -3018,15 +3018,19 @@ igetmatch(char **sp, Patprog p, int fl, int n, char *replstr,
* which is already marked for replacement.
*/
matched = 1;
+ if (t == send)
+ break;
while (t < mpos) {
ioff++;
umlen -= iincchar(&t, send - t);
}
break;
}
+ if (t == send)
+ break;
umlen -= iincchar(&t, send - t);
}
- } while (matched);
+ } while (matched && t < send);
/*
* check if we can match a blank string, if so do it
* at the start. Goodness knows if this is a good idea
diff --git a/Test/D04parameter.ztst b/Test/D04parameter.ztst
index cb9d50dc8..99f7dd91a 100644
--- a/Test/D04parameter.ztst
+++ b/Test/D04parameter.ztst
@@ -2148,3 +2148,13 @@ F:behavior, see http://austingroupbugs.net/view.php?id=888
[[ ${-} = [[:alnum:]]## ]] || print Failed 2
}
0:$- expansion correctly handles Dash token
+
+ a=(1 "" 3)
+ print -rl -- "${(@)a//*/x}"
+ a=""
+ print -rl -- "${(@)a//*/y}"
+0:Zero-length string match in parameter substitution
+>x
+>x
+>x
+>y