This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Re: [PATCH] eof() coredumps when ARGV is aliased to another filehandle
authorRafael Garcia-Suarez <rgarciasuarez@gmail.com>
Fri, 8 Feb 2002 00:21:07 +0000 (01:21 +0100)
committerJarkko Hietaniemi <jhi@iki.fi>
Fri, 8 Feb 2002 14:14:16 +0000 (14:14 +0000)
Message-ID: <20020208002107.E763@rafael>

p4raw-id: //depot/perl@14601

doio.c
pp_sys.c
t/io/argv.t

diff --git a/doio.c b/doio.c
index 68853c2..0520992 100644 (file)
--- 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
index 4b1a1e7..e7e4121 100644 (file)
--- 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) {
index a602a02..f2f3245 100755 (executable)
@@ -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';
+}