Message ID | 20160903135850.GA20234@gondor.apana.org.au (mailing list archive) |
---|---|
State | Accepted |
Delegated to: | Herbert Xu |
Headers | show |
On 03/09/16 15:58, Herbert Xu wrote: > On Sat, Sep 03, 2016 at 03:19:57PM +0200, Harald van Dijk wrote: >> >> But yeah, sure, if the bug has been there for over 10 years, and I'm >> unable to find older versions of dash to check, I would have guessed >> that dash indeed has never worked this way. > > OK it looks like this actually wasn't the original behaviour. > It was introduced along with the character class support. So > with that in mind, I feel a lot happier in changing the behaviour > of the case statement. > > I've changed your patch slightly and will commit it if there are > no other issues. None that I can see. Agreed that avoiding increment-decrement-increment to just do a single increment instead is an improvement, and I don't spot any issues in it. > ---8<--- > Subject: 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> > > 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: > -- To unsubscribe from this list: send the line "unsubscribe dash" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
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: