diff options
author | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2015-08-29 15:38:39 +0000 |
---|---|---|
committer | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2015-08-29 15:38:39 +0000 |
commit | 7c32549e5729741383aa482b29f45cf69bcf6740 (patch) | |
tree | 777f6d57a9e500963bbf8338c8f9872e171551ec /libgfortran | |
parent | 4879fba9985f5781c9c9b5bfdd60680519e6c1e1 (diff) | |
download | gcc-7c32549e5729741383aa482b29f45cf69bcf6740.zip gcc-7c32549e5729741383aa482b29f45cf69bcf6740.tar.gz gcc-7c32549e5729741383aa482b29f45cf69bcf6740.tar.bz2 |
re PR fortran/67367 (Program crashes on READ(IOSTAT=IOS, ...) on directory OPEN()ed without error)
2015-08-29 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.
From-SVN: r227320
Diffstat (limited to 'libgfortran')
-rw-r--r-- | libgfortran/ChangeLog | 6 | ||||
-rw-r--r-- | libgfortran/io/unix.c | 22 |
2 files changed, 22 insertions, 6 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 62db347..d08f050 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,9 @@ +2015-08-29 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. + 2015-08-29 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> * acinclude.m4: Remove LIBGFOR_CHECK_ATTRIBUTE_DLLEXPORT. diff --git a/libgfortran/io/unix.c b/libgfortran/io/unix.c index aa2feab..fd5f277 100644 --- a/libgfortran/io/unix.c +++ b/libgfortran/io/unix.c @@ -518,16 +518,26 @@ buf_read (unix_stream * s, void * buf, ssize_t nbyte) 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; } |