This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[patch, libgfortran] PR67367 Program crashes on READ
- From: Jerry DeLisle <jvdelisle at charter dot net>
- To: gfortran <fortran at gcc dot gnu dot org>
- Cc: gcc patches <gcc-patches at gcc dot gnu dot org>
- Date: Fri, 28 Aug 2015 22:18:11 -0700
- Subject: [patch, libgfortran] PR67367 Program crashes on READ
- Authentication-results: sourceware.org; auth=none
I found that in read_buf where raw_read is called, no checks for errors were
being made, raw_read returns the number of bytes read or an error code. In the
test case, an error occurs and we proceeded to use the resulting error code as
if it were the number of bytes read.
The attached patch fixes this. Regression tested on x86_64. New test case
provided.
OK for trunk?
Regards,
Jerry
2015-08-28 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR libgfortran/67367
* io/unix.c (buf_read): Check for error condition and if found
return the error code.
Index: unix.c
===================================================================
--- unix.c (revision 227314)
+++ unix.c (working copy)
@@ -529,16 +529,26 @@ buf_read (unix_stream * s, void * buf, ssize_t nby
if (to_read <= BUFFER_SIZE/2)
{
did_read = raw_read (s, s->buffer, BUFFER_SIZE);
- s->physical_offset += did_read;
- s->active = did_read;
- did_read = (did_read > to_read) ? to_read : did_read;
- memcpy (p, s->buffer, did_read);
+ if (likely (did_read >= 0))
+ {
+ s->physical_offset += did_read;
+ s->active = did_read;
+ did_read = (did_read > to_read) ? to_read : did_read;
+ memcpy (p, s->buffer, did_read);
+ }
+ else
+ return did_read;
}
else
{
did_read = raw_read (s, p, to_read);
- s->physical_offset += did_read;
- s->active = 0;
+ if (likely (did_read >= 0))
+ {
+ s->physical_offset += did_read;
+ s->active = 0;
+ }
+ else
+ return did_read;
}
nbyte = did_read + nread;
}
! { dg-do run }
! PR67367
program bug
implicit none
character(len=1) :: c
character(len=256) :: message
integer ios
call system('[ -d junko.dir ] || mkdir junko.dir')
open(unit=10, file='junko.dir',iostat=ios,action='read',access='stream')
if (ios.ne.0) call abort
read(10, iostat=ios) c
if (ios.ne.21) call abort
call system('rmdir junko.dir')
end program bug