Skip to content
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 setting $! on success contrary to perlfunc #9876

Closed
p5pRT opened this issue Sep 17, 2009 · 8 comments
Closed

readline setting $! on success contrary to perlfunc #9876

p5pRT opened this issue Sep 17, 2009 · 8 comments

Comments

@p5pRT
Copy link

p5pRT commented Sep 17, 2009

Migrated from rt.perl.org#69208 (status was 'resolved')

Searchable as RT69208$

@p5pRT
Copy link
Author

p5pRT commented Sep 17, 2009

From user42@zip.com.au

Created by user42@zip.com.au

The readline() function sometimes sets $! to EBADF when it succeeds,
which means the error checking method recommended in perlfunc readline()
doesn't work.

For example the program foo.pl below prints

  first​: Bad file descriptor

where I expected that it would print an empty string, or perhaps
"Success" from $! having been left unchanged from undef.

foo.pl gets it at the start of a file, I struck it when a readline
crossed a 1024 byte boundary later in a file.

gdb claims errno is changed by PerlIO_fast_gets() under buffer filling
of PerlIOBuf_fill. I suppose if fast_gets fails and the fill must fall
back on PerlIO_read then errno should be restored, to let that
readline() error approach work, and perserve the principle that system
calls or pseudo-system-calls don't change errno if they succeed.

Perl Info

Flags:
    category=core
    severity=medium

Site configuration information for perl 5.10.1:

Configured by Debian Project at Sun Sep  6 13:25:58 UTC 2009.

Summary of my perl5 (revision 5 version 10 subversion 1) configuration:
   
  Platform:
    osname=linux, osvers=2.6.18.3xenu, archname=i486-linux-gnu-thread-multi
    uname='linux demosthenes.ayous.org 2.6.18.3xenu #2 smp fri nov 24 22:26:50 utc 2006 i686 gnulinux '
    config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN -Dcccdlflags=-fPIC -Darchname=i486-linux-gnu -Dprefix=/usr -Dprivlib=/usr/share/perl/5.10 -Darchlib=/usr/lib/perl/5.10 -Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5 -Dvendorarch=/usr/lib/perl5 -Dsiteprefix=/usr/local -Dsitelib=/usr/local/share/perl/5.10.1 -Dsitearch=/usr/local/lib/perl/5.10.1 -Dman1dir=/usr/share/man/man1 -Dman3dir=/usr/share/man/man3 -Dsiteman1dir=/usr/local/man/man1 -Dsiteman3dir=/usr/local/man/man3 -Dman1ext=1 -Dman3ext=3perl -Dpager=/usr/bin/sensible-pager -Uafs -Ud_csh -Ud_ualarm -Uusesfio -Uusenm -DDEBUGGING=-g -Doptimize=-O2 -Duseshrplib -Dlibperl=libperl.so.5.10.1 -Dd_dosuid -des'
    hint=recommended, useposix=true, d_sigaction=define
    useithreads=define, usemultiplicity=define
    useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
    use64bitint=undef, use64bitall=undef, uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
  Compiler:
    cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
    optimize='-O2 -g',
    cppflags='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include'
    ccversion='', gccversion='4.3.4', gccosandvers=''
    intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
    d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12
    ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
    alignbytes=4, prototype=define
  Linker and Libraries:
    ld='cc', ldflags =' -fstack-protector -L/usr/local/lib'
    libpth=/usr/local/lib /lib /usr/lib /usr/lib64
    libs=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt
    perllibs=-ldl -lm -lpthread -lc -lcrypt
    libc=/lib/libc-2.9.so, so=so, useshrplib=true, libperl=libperl.so.5.10.1
    gnulibc_version='2.9'
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
    cccdlflags='-fPIC', lddlflags='-shared -O2 -g -L/usr/local/lib -fstack-protector'

Locally applied patches:
    



@p5pRT
Copy link
Author

p5pRT commented Sep 17, 2009

From user42@zip.com.au

foo.pl

@p5pRT
Copy link
Author

p5pRT commented Sep 18, 2009

From @ikegami

On Thu, Sep 17, 2009 at 7​:53 PM, Kevin Ryde <perlbug-followup@​perl.org>wrote​:

# New Ticket Created by Kevin Ryde
# Please include the string​: [perl #69208]
# in the subject line of all future correspondence about this issue.
# <URL​: http​://rt.perl.org/rt3/Ticket/Display.html?id=69208 >

This is a bug report for perl from user42@​zip.com.au,
generated with the help of perlbug 1.39 running under perl 5.10.1.

-----------------------------------------------------------------
[Please describe your issue here]

The readline() function sometimes sets $! to EBADF when it succeeds,
which means the error checking method recommended in perlfunc readline()
doesn't work.

It's on my todo list to create a documentation patch for this. Basically,
the solution is​:

while (!eof($fh)) {
  defined( $_ = <$fh> )
  or die("readline​: $!\n");
  ...
}

More details here​:
http​://markmail.org/message/bu2vnbgabfakzicc

@p5pRT
Copy link
Author

p5pRT commented Sep 18, 2009

The RT System itself - Status changed from 'new' to 'open'

@p5pRT
Copy link
Author

p5pRT commented Sep 21, 2009

From user42@zip.com.au

"Eric Brine via RT" <perlbug-followup@​perl.org> writes​:

while (!eof($fh)) {

Is eof the best there? For myself I ended up checking the result string
does end with $/ (using a chomp).

If readline has never done anything particular with $! then I suppose it
may be a bit late to bother trying to make it so.

@p5pRT
Copy link
Author

p5pRT commented Sep 25, 2009

From @briandfoy

I've fixed the documentation portion of this in 0f03d33.

@p5pRT
Copy link
Author

p5pRT commented Jul 21, 2016

From @dcollinsn

On Fri Sep 25 13​:19​:21 2009, comdog wrote​:

I've fixed the documentation portion of this in
0f03d33.

There are a number of older bugs like this, where someone is checking $! after a call that didn't fail, and is surprised when there's something silly in there. The docs now say that $! is only meaningful immediately after a failure, and in the case of readline, that means it is only meaningful after readline has returned undef.

Closing resolved.

--
Respectfully,
Dan Collins

@p5pRT
Copy link
Author

p5pRT commented Jul 21, 2016

@dcollinsn - Status changed from 'open' to 'resolved'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant