Control: severity -1 normal Hi, thanks Ian for the report and Damyan for looking into the issues.
On Sun, Jul 31, 2022 at 11:37:09AM +0300, Damyan Ivanov wrote: > -=| Ian Jackson, 30.07.2022 13:42:05 +0100 |=- > > Package: perl > > Version: 5.34.0-4 > > Severity: grave > > > > To reproduce > > > > perl -MIO::Handle -e 'open X, "<", "." or die $!; $_ = <X>; printf "%s > > %s %s\n", X->error(), $!;' > > perl -MIO::Handle -e 'open X, ">", "/dev/full" or die $!; print X 1; > > flush X; printf "%s %s %s\n", X->error(), $!; close X' > > > > Expected output > > > > -1 Bad file descriptor > > -1 No space left on device > > > > Actual output > > > > 0 Bad file descriptor > > 0 No space left on device FWIW I get 0 Is a directory 1 No space left on device on sid (perl_5.34.0-5). I'm not sure why you'd expect -1. The documentation for IO::Handle::error() only mentions it reporting a true value. The first issue (reading a directory as a plain file) seems to be about the error flag getting cleared when reading past EOF or something like that. According to my meager debugger skills, the clearing happens around https://sources.debian.org/src/perl/5.34.0-5/pp_hot.c/#L3278 As Damyan notes, you can detect this by checking for EOF before reading, although perl -MIO::Handle -e 'open X, "<", "." or die $!; $_ = <X> if !X->eof(); printf "%s %s\n", X->error(), $!;' 1 Inappropriate ioctl for device is not quite what I'd expect either. Anyway, the data loss argument seems misplaced given we've read all the data there is when we are at EOF? I can see there is probably a bug around here, but it would be good to have an example test case that doesn't involve treating a directory as a plain file (which can have very varying results between different platforms) before taking this upstream. Particularly so if you want to argue it's as serious as claimed here. See also https://github.com/Perl/perl5/issues/12782 which has not received attention in almost ten years. The second issue (writing to /dev/full) is indeed fixed in sid / Perl 5.34. It was https://github.com/Perl/perl5/issues/6799 and reportedly only affects things like character devices (including /dev/full) and sockets. I've verified that trying to write to a normal file on a full filesystem does set the error() flag on stable / Perl 5.32. I think that makes the issue less severe, and I'm not very inclined to fix it in stable. But in case we end up doing that anyway, these would be the commits needed: https://github.com/Perl/perl5/commit/89341f87f9fc65c4d7133e497bb04586e86b8052 https://github.com/Perl/perl5/commit/8a2562bec7cd9f8eff6812f340f99dddd028bb33 Downgrading the severity, but let me know what you think based on the above. -- Niko