From: Rafael Garcia-Suarez Date: Fri, 8 Feb 2002 00:21:07 +0000 (+0100) Subject: Re: [PATCH] eof() coredumps when ARGV is aliased to another filehandle X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=ed2c6b9b45ca155543a6a8e651e2d3e0d446406e;p=p5sagit%2Fp5-mst-13.2.git Re: [PATCH] eof() coredumps when ARGV is aliased to another filehandle Message-ID: <20020208002107.E763@rafael> p4raw-id: //depot/perl@14601 --- diff --git a/doio.c b/doio.c index 68853c2..0520992 100644 --- a/doio.c +++ b/doio.c @@ -997,7 +997,7 @@ Perl_do_eof(pTHX_ GV *gv) PerlIO_set_cnt(IoIFP(io),-1); } if (PL_op->op_flags & OPf_SPECIAL) { /* not necessarily a real EOF yet? */ - if (!nextargv(PL_argvgv)) /* get another fp handy */ + if (gv != PL_argvgv || !nextargv(gv)) /* get another fp handy */ return TRUE; } else diff --git a/pp_sys.c b/pp_sys.c index 4b1a1e7..e7e4121 100644 --- a/pp_sys.c +++ b/pp_sys.c @@ -1894,7 +1894,7 @@ PP(pp_eof) if (MAXARG == 0) { if (PL_op->op_flags & OPf_SPECIAL) { /* eof() */ IO *io; - gv = PL_last_in_gv = PL_argvgv; + gv = PL_last_in_gv = GvEGV(PL_argvgv); io = GvIO(gv); if (io && !IoIFP(io)) { if ((IoFLAGS(io) & IOf_START) && av_len(GvAVn(gv)) < 0) { diff --git a/t/io/argv.t b/t/io/argv.t index a602a02..f2f3245 100755 --- a/t/io/argv.t +++ b/t/io/argv.t @@ -7,7 +7,7 @@ BEGIN { require "./test.pl"; -plan(tests => 21); +plan(tests => 22); use File::Spec; @@ -111,4 +111,22 @@ ok( eof(), 'eof() true after closing ARGV' ); close F or die "Could not close: $!"; } -END { unlink 'Io_argv1.tmp', 'Io_argv1.tmp_bak', 'Io_argv2.tmp', 'Io_argv2.tmp_bak' } +# This used to dump core +fresh_perl_is( <<'**PROG**', "foobar", {}, "ARGV aliasing and eof()" ); +open OUT, ">Io_argv3.tmp" or die "Can't open temp file: $!"; +print OUT "foo"; +close OUT; +open IN, "Io_argv3.tmp" or die "Can't open temp file: $!"; +*ARGV = *IN; +while (<>) { + print; + print "bar" if eof(); +} +close IN; +unlink "Io_argv3.tmp"; +**PROG** + +END { + unlink 'Io_argv1.tmp', 'Io_argv1.tmp_bak', + 'Io_argv2.tmp', 'Io_argv2.tmp_bak', 'Io_argv3.tmp'; +}