On Sun Feb 25 18:08:34 2007, sprout@cpan.org wrote:
> If the following hold true--
>
> - die is called outside an eval
> - its argument is an object with overloaded stringification
> - while the stringification subroutine is on the call stack a
> substitution is performed
> - the substitution's regexp contains [\x{d800}-\x{dbff}]
>
> --then the substitution operator will automagically call the
> stringification routine again with the same arguments, thereby
> causing infinite recursion.
>
> Here is a test script:
>
> #!/usr/bin/perl -lw
>
> no warnings 'once';
>
> use Carp 'longmess';
> use overload '""' => sub {
> warn longmess if ++$count == 10;
>
> my $x = 'thing'; # any string will trigger the bug
> $x =~ s/([\x{d800}-\x{dbff}])([\x{dc00}-\x{dfff}])/
> chr 0x10000 + (ord($1) - 0xD800) * 0x400 +
> (ord($2) - 0xDC00)
> /ge;
> $x
> };
>
> $thing = bless [];
> die $thing;
> # die "$thing"; # this one works, because 'die' is not doing the
> stringification
>
> __END__
>
> If I use s/[a-e]/b/g for the substitution, the bug is not triggered.
> It's the [\x{d800}-\x{dbff}] that does it.
>
> This bug exists in 5.9.4 as well as 5.8.8.
>
> This is a really obscure bug--it took me a while to reproduce it. :-)
>
> ---
This is still a problem on blead...
#!/usr/bin/perl -lw
no warnings 'once';
use Carp 'longmess';
use overload '""' => sub {
my @z = @_;
# warn longmess if ++$count == 10;
my $x = "thing\n"; # any string will trigger the bug
$x =~
s/([\x{d800}-\x{dbff}])([\x{dc00}-\x{dfff}])/
chr 0x10000 + (ord($1) - 0xD800) * 0x400 + (ord($2) - 0xDC00)
/ge;
$x;
};
$thing = bless [];
die $thing;
__END__
Doesn't segfault
#!/usr/bin/perl -lw
no warnings 'once';
use Carp 'longmess';
use overload '""' => sub {
my @z = @_;
# warn longmess if ++$count == 10;
my $x = "thing\n"; # any string will trigger the bug
$x =~
s/([\x{d800}-\x{dbff}])([\x{dc00}-\x{dfff}])/
chr 0x10000 + (ord($1) - 0xD800) * 0x400 + (ord($2) - 0xDC00)
/ge;
$x;
};
my $x = "thing\n"; # any string will trigger the bug
$x =~ s/([\x{d800}-\x{dbff}])([\x{dc00}-\x{dfff}])/
chr 0x10000 + (ord($1) - 0xD800) * 0x400 + (ord($2) - 0xDC00)
/ge;
print $x;
$thing = bless [];
die $thing;
__END__
Does segfault
But:
#!/usr/bin/perl -lw
my $x = "thing\n"; # any string will trigger the bug
$x =~ s/([\x{d800}-\x{dbff}])([\x{dc00}-\x{dfff}])/
chr 0x10000 + (ord($1) - 0xD800) * 0x400 + (ord($2) - 0xDC00)
/ge;
print $x;
__END__
Does not segfault.
Kind regards,
Bram