-
Notifications
You must be signed in to change notification settings - Fork 567
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
readline of a not NL-terminated last line results in Bad file descriptor #8431
Comments
From Mark.Martinec@ijs.siCreated by Mark.Martinec@ijs.siThis is a bug report for perl from Mark.Martinec@ijs.si, ----------------------------------------------------------------- Using the <>. readline or IO::File::getline behave the same, To reproduce: echo -n "test" | \ Interestingly the problem occurs only on Linux, but not on From the documentation: So testing for $! after a readline returing an undef is valid and is Perl Info
|
From @andk
blame analysis shows: ----Program---- ----Output of .../pBlBYbJ/perl-5.8.0@19461/bin/perl---- ----EOF ($?='0')---- ----EOF ($?='5632')---- Change 19462 by jhi@kosh on 2003/05/09 18:53:27 Try to comprehensively have a plan B if a PerlIO -- |
The RT System itself - Status changed from 'new' to 'open' |
From Mark.Martinec@ijs.siIt gets more interesting, thanks to recent troubleshooting by Bradley M New test cases (distilled from more complex real application): $ echo "test" | perl -e ' $ echo "test" | PERLIO="perlio" perl -e ' $ echo "test" | PERLIO="stdio" perl -e ' Unfortunately some Linux distributions seem to set PERLIO="stdio" Mark |
p5p@spam.wizbit.be - Status changed from 'open' to 'stalled' |
From Mark.Martinec@ijs.si
The bug is still present in 5.10.0! Its presence forces people to intentionally skip status checks It would be very much desirable to get it finally fixed, |
The RT System itself - Status changed from 'stalled' to 'open' |
From skasal@redhat.comThe probelm has also been reported to Fedora: |
From skasal@redhat.comI traced the problem to PerlIO_fast_gets: if PERLIO_F_FASTGETS bit is |
From skasal@redhat.com0001-fix-RT-39060-errno-incorrectly-set-in-perlio.patchFrom e57cc2468d765872b20810478b94ead3906f1912 Mon Sep 17 00:00:00 2001
From: Stepan Kasal <skasal@redhat.com>
Date: Wed, 3 Jun 2009 12:03:55 +0200
Subject: [PATCH] fix RT 39060, errno incorrectly set in perlio
---
MANIFEST | 1 +
perlio.c | 12 +++++++-----
t/io/errno.t | 26 ++++++++++++++++++++++++++
3 files changed, 34 insertions(+), 5 deletions(-)
create mode 100644 t/io/errno.t
diff --git a/MANIFEST b/MANIFEST
index b7c9341..be3be43 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -3899,6 +3899,7 @@ t/io/binmode.t See if binmode() works
t/io/crlf.t See if :crlf works
t/io/crlf_through.t See if pipe passes data intact with :crlf
t/io/dup.t See if >& works right
+t/io/errno.t See if $! is correctly set
t/io/fflush.t See if auto-flush on fork/exec/system/qx works
t/io/fs.t See if directory manipulations work
t/io/inplace.t See if inplace editing works
diff --git a/perlio.c b/perlio.c
index 0a086a8..e92a32a 100644
--- a/perlio.c
+++ b/perlio.c
@@ -1784,12 +1784,14 @@ PerlIO_has_base(PerlIO *f)
int
PerlIO_fast_gets(PerlIO *f)
{
- if (PerlIOValid(f) && (PerlIOBase(f)->flags & PERLIO_F_FASTGETS)) {
- const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
+ if (PerlIOValid(f)) {
+ if (PerlIOBase(f)->flags & PERLIO_F_FASTGETS) {
+ const PerlIO_funcs * const tab = PerlIOBase(f)->tab;
- if (tab)
- return (tab->Set_ptrcnt != NULL);
- SETERRNO(EINVAL, LIB_INVARG);
+ if (tab)
+ return (tab->Set_ptrcnt != NULL);
+ SETERRNO(EINVAL, LIB_INVARG);
+ }
}
else
SETERRNO(EBADF, SS_IVCHAN);
diff --git a/t/io/errno.t b/t/io/errno.t
new file mode 100644
index 0000000..b55e3db
--- /dev/null
+++ b/t/io/errno.t
@@ -0,0 +1,26 @@
+#!./perl
+# vim: ts=4 sts=4 sw=4:
+
+# $! may not be set if EOF was reached without any error.
+# http://rt.perl.org/rt3/Ticket/Display.html?id=39060
+
+use strict;
+require './test.pl';
+
+plan( tests => 16 );
+
+my $test_prog = 'while(<>){print}; print $!';
+
+for my $perlio ('perlio', 'stdio') {
+ $ENV{PERLIO} = $perlio;
+ for my $test_in ("test\n", "test") {
+ my $test_in_esc = $test_in;
+ $test_in_esc =~ s/\n/\\n/g;
+ for my $rs_code ('', '$/=undef', '$/=\2', '$/=\1024') {
+ is( runperl( prog => "$rs_code; $test_prog",
+ stdin => $test_in, stderr => 1),
+ $test_in,
+ "Wrong errno, PERLIO=$ENV{PERLIO} stdin='$test_in_esc'");
+ }
+ }
+}
--
1.6.2
|
From skasal@redhat.comOn Wed Jun 03 07:26:55 2009, kasal wrote:
I forgot to mention that I verified that the patch does not break the |
From skasal@redhat.comGiving due credit: all the test combinations are inspired by test |
@rgs - Status changed from 'open' to 'resolved' |
Migrated from rt.perl.org#39060 (status was 'resolved')
Searchable as RT39060$
The text was updated successfully, but these errors were encountered: