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
This commit is contained in:
Jerry DeLisle 2015-08-29 15:38:39 +00:00
parent 4879fba998
commit 7c32549e57
2 changed files with 22 additions and 6 deletions

View File

@ -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> 2015-08-29 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
* acinclude.m4: Remove LIBGFOR_CHECK_ATTRIBUTE_DLLEXPORT. * acinclude.m4: Remove LIBGFOR_CHECK_ATTRIBUTE_DLLEXPORT.

View File

@ -518,16 +518,26 @@ buf_read (unix_stream * s, void * buf, ssize_t nbyte)
if (to_read <= BUFFER_SIZE/2) if (to_read <= BUFFER_SIZE/2)
{ {
did_read = raw_read (s, s->buffer, BUFFER_SIZE); did_read = raw_read (s, s->buffer, BUFFER_SIZE);
s->physical_offset += did_read; if (likely (did_read >= 0))
s->active = did_read; {
did_read = (did_read > to_read) ? to_read : did_read; s->physical_offset += did_read;
memcpy (p, s->buffer, 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 else
{ {
did_read = raw_read (s, p, to_read); did_read = raw_read (s, p, to_read);
s->physical_offset += did_read; if (likely (did_read >= 0))
s->active = 0; {
s->physical_offset += did_read;
s->active = 0;
}
else
return did_read;
} }
nbyte = did_read + nread; nbyte = did_read + nread;
} }