develooper Front page | perl.perl5.porters | Postings from April 2012

[perl #112608] panic: sv_setpvn called with negative strlen -1

Thread Previous | Thread Next
From:
Steve Hay via RT
Date:
April 28, 2012 01:25
Subject:
[perl #112608] panic: sv_setpvn called with negative strlen -1
Message ID:
rt-3.6.HEAD-4610-1335443681-1781.112608-15-0@perl.org
[Reposting my last reply on rt.perl.org since my email of it seems to
have disappeared into the ether...]

On Thu Apr 26 01:20:30 2012, Steve.Hay@verosoftware.com wrote:
> Father Chrysostomos via RT wrote on 2012-04-26:
> > On Wed Apr 25
>    19:58:59 2012, public@khwilliamson.com wrote:
> >> On 04/25/2012
>    05:15 AM, Leon Timmermans wrote:
> >>> 2012/4/25 Steve Hay<perlbug-
>    followup@perl.org>:
> >>>> Running the program below with the
>    attached utf8.txt input file
> >>>> produces the following crash:
>    panic: sv_setpvn called with negative
> >>>> strlen -1 at utf8.pl
>    line 4,<$rh> line 28. Close with partial
> >>>> character at utf8.pl
>    line 4,<$rh>  line 28.
> >>>> 
> >>>> open my $rh, '<:encoding(UTF-
>    8)', 'utf8.txt' or die $!; open my
> >>>> $wh, '>:encoding(ISO-8859-
>    1)', 'iso88591.txt' or die $!;
> >>>> #select((select($wh), $| =
>    1)[0]); print $wh $_ while<$rh>; close
> >>>> $wh; close $rh;
> >>>>
>    >>>> Obviously the (Greek) characters in the input file cannot be
>    >>>> converted to ISO-8859-1, but perl shouldn't crash.
> >>> 
> >>>
>    This crash only seems to happen when combining :crlf with
>    :encoding.
> >>> I suspect we need a smaller test-case to make it
>    obvious what's
> >>> really happening.
> >>> 
> >>>> Uncommenting the
>    select() call strangely makes the crash go away.
> >>>> So does
>    deleting any single line from the input file.
> >>> 
> >>> Another
>    thing that makes it go away: removing the byte order mark in
> >>>
>    your file. This is smelling fishy.
> >>> 
> >>> Leon
> >>> 
> >> 
> >> I
>    could not get this to reproduce on my machine with blead.
> >>
>    Instead, I get messages like:
> >>    \x{feff}" does not map to iso-
>    8859-1 at test.pl line 4, <$rh>
> >> line
> > 28.
> >>   "\x{039f}"
>    does not map to iso-8859-1 at test.pl line 4, <$rh>
> >> line
> > 28.
>    >>   "\x{03af}" does not map to iso-8859-1 at test.pl line 4, <$rh>
>    >> line
> > 28.
> >>   "\x{03a3}" does not map to iso-8859-1 at
>    test.pl line 4, <$rh>
> >> line
> > 28.
> >>   "\x{03c5}" does not map
>    to iso-8859-1 at test.pl line 4, <$rh>
> >> line
> > 28.
> >>
>    "\x{03bd}" does not map to iso-8859-1 at test.pl line 4, <$rh>
> >>
>    line 28. ...
> >>   "\x{03cd}" does not map to iso-8859-1 at test.pl
>    line 5, <$rh>
> >> line
> > 28.
> >>   "\x{03b6}" does not map to iso-
>    8859-1 at test.pl line 5, <$rh>
> >> line
> > 28.
> >>   "\x{03b5}"
>    does not map to iso-8859-1 at test.pl line 5, <$rh>
> >> line
> > 28.
>    >>   "\x{03b9}" does not map to iso-8859-1 at test.pl line 5, <$rh>
>    >> line 28.
> >> 
> > 
> > I get the same result on a Mac, both
>    threaded and unthreaded.
> > 
> > A C backtrace would help.
> >
>    Those messages are, of course, expected given what the program is
>    being asked to do. I get them first too, but then followed by a
>    crash (panic).
> 
> Is it an EOL issue? (I'm running on Windows
>    here.) Leon mentioned it only happening when :crlf was combined
>    with :encoding. I still see the crash with
> 
> open my $rh,
>    '<:encoding(UTF-8):crlf', 'utf8.txt' or die $!;
> open my $wh,
>    '>:encoding(ISO-8859-1):crlf', 'iso88591.txt' or die $!;
> 
> but not
>    with
> 
> open my $rh, '<:raw:encoding(UTF-8)', 'utf8.txt' or die $!;
>    open my $wh, '>:raw:encoding(ISO-8859-1)', 'iso88591.txt' or die
>    $!;
> 
> Also, when I download the utf8.txt attachment I find that it
>    has got mangled somehow from what I uploaded: the line endings are
>    now \r\r\n rather than the \r\n original which I uploaded.
>    Furthermore, the program doesn't crash for me if I leave it like
>    that -- I have to convert it back to \r\n before I see the crash
>    again.
> 
> I will try to get a backtrace.

Backtrace from current bleadperl (906024c7fead4086ed911b8052d784aa07c2f1e2):

(In encode_method, sdone is 4294967295, hence iv is -1 in Perl_sv_setpvn)

perl515.dll!Perl_sv_setpvn(interpreter * my_perl, sv * const sv, const
char * const ptr, const unsigned int len)  Line 4494	C
Encode.dll!encode_method(interpreter * my_perl, const encode_s * enc,
const encpage_s * dir, sv * src, int check, unsigned int * offset, sv *
term, int * retcode, sv * fallback_cb)  Line 266 + 0x19 bytes	C
Encode.dll!XS_Encode__XS_encode(interpreter * my_perl, cv * cv)  Line
658 + 0x26 bytes	C
perl515.dll!Perl_pp_entersub(interpreter * my_perl)  Line 2778 + 0x12
bytes	C
perl515.dll!Perl_runops_debug(interpreter * my_perl)  Line 2119 + 0xf
bytes	C
perl515.dll!Perl_call_sv(interpreter * my_perl, sv * sv, volatile long
flags)  Line 2690 + 0x38 bytes	C
perl515.dll!Perl_call_method(interpreter * my_perl, const char *
methname, long flags)  Line 2616 + 0x2d bytes	C
encoding.dll!PerlIOEncode_flush(interpreter * my_perl, _PerlIO * * f) 
Line 424 + 0x11 bytes	C
perl515.dll!Perl_PerlIO_flush(interpreter * my_perl, _PerlIO * * f) 
Line 1727 + 0x10 bytes	C
perl515.dll!PerlIOBuf_write(interpreter * my_perl, _PerlIO * * f, const
void * vbuf, unsigned int count)  Line 4166 + 0xd bytes	C
encoding.dll!PerlIOEncode_write(interpreter * my_perl, _PerlIO * * f,
const void * vbuf, unsigned int count)  Line 593 + 0x15 bytes	C
perl515.dll!Perl_PerlIO_write(interpreter * my_perl, _PerlIO * * f,
const void * vbuf, unsigned int count)  Line 1703 + 0x40 bytes	C
perl515.dll!Perl_do_print(interpreter * my_perl, sv * sv, _PerlIO * *
fp)  Line 1258 + 0x1b bytes	C
perl515.dll!Perl_pp_print(interpreter * my_perl)  Line 730 + 0x13 bytes	C
perl515.dll!Perl_runops_debug(interpreter * my_perl)  Line 2119 + 0xf
bytes	C
perl515.dll!S_run_body(interpreter * my_perl, long oldscope)  Line 2402
+ 0xf bytes	C
perl515.dll!perl_run(interpreter * my_perl)  Line 2320 + 0xd bytes	C
perl515.dll!RunPerl(int argc, char * * argv, char * * env)  Line 270 +
0x9 bytes	C++
perl.exe!main(int argc, char * * argv, char * * env)  Line 23 + 0x12 bytes	C
perl.exe!__tmainCRTStartup()  Line 555 + 0x17 bytes	C


---
via perlbug:  queue: perl5 status: open
https://rt.perl.org:443/rt3/Ticket/Display.html?id=112608

Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About