[perl #90160] U* gives ‘U0 mode on an empty string’
authorFather Chrysostomos <sprout@cpan.org>
Wed, 18 May 2011 21:35:47 +0000 (14:35 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Fri, 9 Sep 2011 01:10:52 +0000 (18:10 -0700)
This is a regression in 5.10 caused by change 23966/08ca2aa38a29,
which added a bit of faulty logic. It was treating U* in the middle of
a pack template as equivalent to U0, if the input string was empty.
(cherry picked from commit c5333953a555847ef4f1457905bf0f111a79eb72)

pp_pack.c
t/op/pack.t

index 0ae8afd..65adb51 100644 (file)
--- a/pp_pack.c
+++ b/pp_pack.c
@@ -1660,7 +1660,7 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const c
            break;
        case 'U':
            if (len == 0) {
-                if (explicit_length) {
+                if (explicit_length && howlen != e_star) {
                    /* Switch to "bytes in UTF-8" mode */
                    if (symptr->flags & FLAG_DO_UTF8) utf8 = 0;
                    else
index 5775caf..7b9912a 100644 (file)
@@ -12,7 +12,7 @@ my $no_endianness = $] > 5.009 ? '' :
 my $no_signedness = $] > 5.009 ? '' :
   "Signed/unsigned pack modifiers not available on this perl";
 
-plan tests => 14699;
+plan tests => 14700;
 
 use strict;
 use warnings qw(FATAL all);
@@ -1993,3 +1993,7 @@ is(unpack('c'), 65, "one-arg unpack (change #18751)"); # defaulting to $_
     my $y = runperl( prog => 'print split( /,/, unpack(q(%32u*), q(#,3,Q)), qq(\n)), qq(\n)' );
     is($y, "0\n", "split /a/, unpack('%32u*'...) didn't crash");
 }
+
+#90160
+is(eval { () = unpack "C0 U*", ""; "ok" }, "ok",
+  'medial U* on empty string');