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; }