Thought I'd check if this was still in 5.10, and it is.  I can see
where it is, but fixing it looks quite complex, and this is only a
normal-priority bug.

PerlIOUnix_read has a loop which makes a blocking read, and calls
PERL_ASYNC_CHECK() if the read is interrupted by a signal.

Once PERL_ASYNC_CHECK() has returned, the pointers "f" and "buf"
in PerlIOUnix_read are pointing to freed space, which looks fairly
simple to detect and handle.  Similar bugs also need fixing
elsewhere in perlio.c.

However, working out what needs to be done in PerlIOBuf_fill will
take a bit of study.  I'm not volunteering.


Here's the problem callstack (calls from bottom to top).  Line
numbers are from perl_5.10.0-13.

free (vg_replace_malloc.c:323)
Perl_safesysfree (util.c:260)
PerlIOBuf_close (perlio.c:4038) 
PerlIO__close (perlio.c:1417)
Perl_PerlIO_close (perlio.c:1430)
Perl_io_close (doio.c:976)
Perl_do_close (doio.c:939)
Perl_pp_close (pp_sys.c:591)
Perl_runops_standard (run.c:38)
Perl_call_sv (perl.c:2653)
Perl_sighandler (mg.c:2885)
Perl_despatch_signals (mg.c:1388)   <== interrupt handling for PERL_ASYNC_CHECK
PerlIOUnix_read (perlio.c:2689)     <== easy to fix use of invalidated pointers
Perl_PerlIO_read (perlio.c:1625)
PerlIOBuf_fill (perlio.c:3843)      <== crash occurs at line 3849
Perl_PerlIO_fill (perlio.c:1717)
PerlIOBase_read (perlio.c:2135)
PerlIOBuf_read (perlio.c:3864)
Perl_PerlIO_read (perlio.c:1625)
PerlIO_getc (perlio.c:5015)
Perl_sv_gets (sv.c:6501)
Perl_do_readline (pp_hot.c:1638)
Perl_pp_readline (pp_hot.c:335)
Perl_runops_standard (run.c:38)
S_run_body (perl.c:2391)
perl_run (perl.c:2309)
main (perlmain.c:113)

Steve



-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to