This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
PATCH: [perl #127262] assertion fail on malformed UTF8
authorKarl Williamson <khw@cpan.org>
Sat, 5 Mar 2016 00:05:09 +0000 (17:05 -0700)
committerKarl Williamson <khw@cpan.org>
Sat, 5 Mar 2016 00:10:09 +0000 (17:10 -0700)
Add a guard against malformed UTF-8.

t/lib/warnings/utf8
toke.c

index e8c8527..a430507 100644 (file)
@@ -757,3 +757,8 @@ Use of code point 0x80+ is deprecated; the permissible max is 0x7F+ at - line \d
 Operation "uc" returns its argument for non-Unicode code point 0x80+ at - line \d+.
 Code point 0x7F+ is not Unicode, may not be portable in print at - line \d+.
 Use of code point 0x80+ is deprecated; the permissible max is 0x7F+ in print at - line \d+.
 Operation "uc" returns its argument for non-Unicode code point 0x80+ at - line \d+.
 Code point 0x7F+ is not Unicode, may not be portable in print at - line \d+.
 Use of code point 0x80+ is deprecated; the permissible max is 0x7F+ in print at - line \d+.
+########
+# NAME  [perl #127262]
+BEGIN{{};$^H=2**400}Â
+EXPECT
+Malformed UTF-8 character (unexpected non-continuation byte 0x0a, immediately after start byte 0xc2) at - line 1.
diff --git a/toke.c b/toke.c
index e5ef340..fd359ed 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -4818,9 +4818,22 @@ Perl_yylex(pTHX)
   retry:
     switch (*s) {
     default:
   retry:
     switch (*s) {
     default:
-       if (UTF ? isIDFIRST_utf8((U8*)s) : isALNUMC(*s))
+       if (UTF) {
+            if (! isUTF8_CHAR((U8 *) s, (U8 *) PL_bufend)) {
+                ENTER;
+                SAVESPTR(PL_warnhook);
+                PL_warnhook = PERL_WARNHOOK_FATAL;
+                utf8n_to_uvchr((U8*)s, PL_bufend-s, NULL, 0);
+                LEAVE;
+            }
+            if (isIDFIRST_utf8((U8*)s)) {
+                goto keylookup;
+            }
+        }
+        else if (isALNUMC(*s)) {
            goto keylookup;
            goto keylookup;
-       {
+       }
+    {
         SV *dsv = newSVpvs_flags("", SVs_TEMP);
         const char *c = UTF ? sv_uni_display(dsv, newSVpvn_flags(s,
                                                     UTF8SKIP(s),
         SV *dsv = newSVpvs_flags("", SVs_TEMP);
         const char *c = UTF ? sv_uni_display(dsv, newSVpvn_flags(s,
                                                     UTF8SKIP(s),