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 <o...@ethup.se>
Signed-off-by: Herbert Xu <herb...@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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to