aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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;
}