This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
PATCH: [perl #126181] regex: handle \cX inside (?[])
authorVictor Adam <victor@drawall.cc>
Sun, 27 Sep 2015 08:22:08 +0000 (10:22 +0200)
committerKarl Williamson <khw@cpan.org>
Tue, 20 Oct 2015 17:31:30 +0000 (11:31 -0600)
The \cX notation for control characters used to cause panics and unexpected
behavior when used insed an extended character class. See bug #126181.

The solution is to ignore the byte following \c during the first parsing
pass of a (?[]) construct.

regcomp.c
t/re/regex_sets.t

index 540f71c..beec98d 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -13444,6 +13444,10 @@ S_handle_regex_sets(pTHX_ RExC_state_t *pRExC_state, SV** return_invlist,
                      * default: case next time and keep on incrementing until
                      * we find one of the invariants we do handle. */
                     RExC_parse++;
+                    if (*RExC_parse == 'c') {
+                            /* Skip the \cX notation for control characters */
+                            RExC_parse++;
+                    }
                     break;
                 case '[':
                 {
index 5c683ba..a5941ba 100644 (file)
@@ -139,6 +139,25 @@ if (! is_miniperl() && locales_enabled('LC_CTYPE')) {
     }
 }
 
+# RT #126181: \cX behaves strangely inside (?[])
+{
+       no warnings qw(syntax regexp);
+
+       eval { $_ = '/(?[(\c]) /'; qr/$_/ };
+       like($@, qr/^Syntax error/, '/(?[(\c]) / should not panic');
+       eval { $_ = '(?[\c#]' . "\n])"; qr/$_/ };
+       like($@, qr/^Syntax error/, '/(?[(\c]) / should not panic');
+       eval { $_ = '(?[(\c])'; qr/$_/ };
+       like($@, qr/^Syntax error/, '/(?[(\c])/ should be a syntax error');
+       eval { $_ = '(?[(\c]) ]\b'; qr/$_/ };
+       like($@, qr/^Syntax error/, '/(?[(\c]) ]\b/ should be a syntax error');
+       eval { $_ = '(?[\c[]](])'; qr/$_/ };
+       like($@, qr/^Syntax error/, '/(?[\c[]](])/ should be a syntax error');
+       like("\c#", qr/(?[\c#])/, '\c# should match itself');
+       like("\c[", qr/(?[\c[])/, '\c[ should match itself');
+       like("\c\ ", qr/(?[\c\])/, '\c\ should match itself');
+       like("\c]", qr/(?[\c]])/, '\c] should match itself');
+}
 
 done_testing();