Allow U+0FFFF in regex
Karl Williamson [Fri, 18 Dec 2009 03:07:32 +0000 (20:07 -0700)]
regexec.c
t/re/pat_advanced.t

index 11c408f..17a0dc6 100644 (file)
--- a/regexec.c
+++ b/regexec.c
@@ -5948,8 +5948,10 @@ S_reginclass(pTHX_ const regexp *prog, register const regnode *n, register const
 
     if (do_utf8 && !UTF8_IS_INVARIANT(c)) {
        c = utf8n_to_uvchr(p, UTF8_MAXBYTES, &len,
-               (UTF8_ALLOW_DEFAULT & UTF8_ALLOW_ANYUV) | UTF8_CHECK_ONLY);
-               /* see [perl #37836] for UTF8_ALLOW_ANYUV */
+               (UTF8_ALLOW_DEFAULT & UTF8_ALLOW_ANYUV)
+               | UTF8_ALLOW_FFFF | UTF8_CHECK_ONLY);
+               /* see [perl #37836] for UTF8_ALLOW_ANYUV; [perl #38293] for
+                * UTF8_ALLOW_FFFF */
        if (len == (STRLEN)-1) 
            Perl_croak(aTHX_ "Malformed UTF-8 character (fatal)");
     }
index a0eec58..3a66a0c 100644 (file)
@@ -21,7 +21,7 @@ BEGIN {
 }
 
 
-plan tests => 1142;  # Update this when adding/deleting tests.
+plan tests => 1143;  # Update this when adding/deleting tests.
 
 run_tests() unless caller;
 
@@ -1770,6 +1770,17 @@ sub run_tests {
         iseq $_, "!Bang!1!Bang!2!Bang!3!Bang!";
     }
 
+    { 
+        # Earlier versions of Perl said this was fatal.
+        local $Message = "U+0FFFF shouldn't crash the regex engine";
+        no warnings 'utf8';
+        my $a = eval "chr(65535)";
+        use warnings;
+        my $warning_message;
+        local $SIG{__WARN__} = sub { $warning_message = $_[0] };
+        eval $a =~ /[a-z]/;
+        ok(1);  # If it didn't crash, it worked.
+    }
 } # End of sub run_tests
 
 1;