From 7c32549e5729741383aa482b29f45cf69bcf6740 Mon Sep 17 00:00:00 2001 From: Jerry DeLisle Date: Sat, 29 Aug 2015 15:38:39 +0000 Subject: [PATCH] re PR fortran/67367 (Program crashes on READ(IOSTAT=IOS, ...) on directory OPEN()ed without error) 2015-08-29 Jerry DeLisle PR libgfortran/67367 * io/unix.c (buf_read): Check for error condition and if found return the error code. From-SVN: r227320 --- libgfortran/ChangeLog | 6 ++++++ libgfortran/io/unix.c | 22 ++++++++++++++++------ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 62db347978f..d08f050eb31 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,9 @@ +2015-08-29 Jerry DeLisle + + 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 * acinclude.m4: Remove LIBGFOR_CHECK_ATTRIBUTE_DLLEXPORT. diff --git a/libgfortran/io/unix.c b/libgfortran/io/unix.c index aa2feabebf0..fd5f2779021 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; } -- 2.30.2