about summary refs log tree commit diff
path: root/Src
diff options
context:
space:
mode:
authorPeter Stephenson <pws@zsh.org>2017-03-23 09:35:20 +0000
committerPeter Stephenson <pws@zsh.org>2017-03-23 09:35:20 +0000
commit086656241c3ccca377474bfea1cb269ac9a67d60 (patch)
tree14df959ce75426ebd08c44f028b8950a2bffc2b9 /Src
parent20d464944b8599e28044664a9adc8f349e3da5d4 (diff)
downloadzsh-086656241c3ccca377474bfea1cb269ac9a67d60.tar.gz
zsh-086656241c3ccca377474bfea1cb269ac9a67d60.tar.xz
zsh-086656241c3ccca377474bfea1cb269ac9a67d60.zip
22601: Fix for parameter substitution pattern matches.
It was not possible to math against a zero-length string in
some cases.
Diffstat (limited to 'Src')
-rw-r--r--Src/glob.c8
1 files changed, 6 insertions, 2 deletions
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