From 086656241c3ccca377474bfea1cb269ac9a67d60 Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Thu, 23 Mar 2017 09:35:20 +0000 Subject: 22601: Fix for parameter substitution pattern matches. It was not possible to math against a zero-length string in some cases. --- ChangeLog | 5 +++++ Src/glob.c | 8 ++++++-- Test/D04parameter.ztst | 10 ++++++++++ 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 + + * 22601: Src/glob.c, Test/D04parameter.ztst: problem matching + pattern against zero-length string in parameter substitutions. + 2017-03-21 Peter Stephenson * 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 -- cgit 1.4.1