aboutsummaryrefslogtreecommitdiff
path: root/libgfortran/io/unix.c
diff options
context:
space:
mode:
Diffstat (limited to 'libgfortran/io/unix.c')
-rw-r--r--libgfortran/io/unix.c22
1 files changed, 16 insertions, 6 deletions
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;
}