about summary refs log tree commit diff
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