aboutsummaryrefslogtreecommitdiff
path: root/libgfortran
diff options
context:
space:
mode:
authorJerry DeLisle <jvdelisle@gcc.gnu.org>2015-08-29 15:38:39 +0000
committerJerry DeLisle <jvdelisle@gcc.gnu.org>2015-08-29 15:38:39 +0000
commit7c32549e5729741383aa482b29f45cf69bcf6740 (patch)
tree777f6d57a9e500963bbf8338c8f9872e171551ec /libgfortran
parent4879fba9985f5781c9c9b5bfdd60680519e6c1e1 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--libgfortran/io/unix.c22
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;
}