Don’t put malformed UTF8 in $AUTOLOAD
authorFather Chrysostomos <sprout@cpan.org>
Fri, 7 Oct 2011 20:44:37 +0000 (13:44 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Fri, 7 Oct 2011 21:38:26 +0000 (14:38 -0700)
gv.c
t/uni/method.t

diff --git a/gv.c b/gv.c
index 24f4912..684f279 100644 (file)
--- a/gv.c
+++ b/gv.c
@@ -1204,7 +1204,10 @@ Perl_gv_autoload_pvn(pTHX_ HV *stash, const char *name, STRLEN len, U32 flags)
     sv_catpvs(varsv, "::");
     /* Ensure SvSETMAGIC() is called if necessary. In particular, to clear
        tainting if $FOO::AUTOLOAD was previously tainted, but is not now.  */
-    sv_catpvn_mg(varsv, name, len);
+    sv_catpvn_flags(
+       varsv, name, len,
+       SV_GMAGIC|SV_SMAGIC|(is_utf8 ? SV_CATUTF8 : SV_CATBYTES)
+    );
     if (is_utf8)
         SvUTF8_on(varsv);
     return gv;
index 8070819..4f9d72d 100644 (file)
@@ -15,7 +15,7 @@ use utf8;
 use open qw( :utf8 :std );
 no warnings 'once';
 
-plan(tests => 61);
+plan(tests => 62);
 
 #Can't use bless yet, as it might not be clean
 
@@ -183,6 +183,15 @@ ok(ฟọ::バッズ->new, 'parent using -norequire, in a UTF-8 package.');
 ok(ฟọ::バッズ->nèw, 'Also works with UTF-8 methods');
 ok(ฟọ::バッズ->ニュー, 'Even methods from an UTF-8 parent');
 
+BEGIN {no strict 'refs'; ++${"\xff::foo"} } # autovivify the package
+package ÿ {                                 # without UTF8
+ sub AUTOLOAD {
+  ::is our $AUTOLOAD,
+      "\xff::\x{100}", '$AUTOLOAD made from Latin1 package + UTF8 sub';
+ }
+}
+ÿ->${\"\x{100}"};
+
 #This test should go somewhere else.
 #DATA was being generated in the wrong package.
 package ʑ;