re PR libfortran/24489 (read_block wrong execution order)

2005-10-23  Jerry DeLisle  <jvdelisle@verizon.net>

        PR libgfortran/24489
        * io/transfer.c (read_block): Change the order of execution to not read
        past end-of-record.
        (read_block_direct): Same change.

From-SVN: r105840
This commit is contained in:
Jerry DeLisle 2005-10-24 03:51:24 +00:00 committed by Jerry DeLisle
parent 9da7372540
commit 835681c8a2
2 changed files with 20 additions and 13 deletions

View File

@ -1,3 +1,10 @@
2005-10-23 Jerry DeLisle <jvdelisle@verizon.net>
PR libgfortran/24489
* io/transfer.c (read_block): Change the order of execution to not read
past end-of-record.
(read_block_direct): Same change.
2005-10-23 Francois-Xavier Coudert <coudert@clipper.ens.fr>
PR libfortran/23272

View File

@ -248,10 +248,6 @@ read_block (int *length)
char *source;
int nread;
if (current_unit->flags.form == FORM_FORMATTED &&
current_unit->flags.access == ACCESS_SEQUENTIAL)
return read_sf (length); /* Special case. */
if (current_unit->bytes_left < *length)
{
if (current_unit->flags.pad == PAD_NO)
@ -262,6 +258,10 @@ read_block (int *length)
*length = current_unit->bytes_left;
}
if (current_unit->flags.form == FORM_FORMATTED &&
current_unit->flags.access == ACCESS_SEQUENTIAL)
return read_sf (length); /* Special case. */
current_unit->bytes_left -= *length;
@ -295,15 +295,6 @@ read_block_direct (void * buf, size_t * nbytes)
void *data;
size_t nread;
if (current_unit->flags.form == FORM_FORMATTED &&
current_unit->flags.access == ACCESS_SEQUENTIAL)
{
length = (int*) nbytes;
data = read_sf (length); /* Special case. */
memcpy (buf, data, (size_t) *length);
return;
}
if (current_unit->bytes_left < *nbytes)
{
if (current_unit->flags.pad == PAD_NO)
@ -315,6 +306,15 @@ read_block_direct (void * buf, size_t * nbytes)
*nbytes = current_unit->bytes_left;
}
if (current_unit->flags.form == FORM_FORMATTED &&
current_unit->flags.access == ACCESS_SEQUENTIAL)
{
length = (int*) nbytes;
data = read_sf (length); /* Special case. */
memcpy (buf, data, (size_t) *length);
return;
}
current_unit->bytes_left -= *nbytes;
nread = *nbytes;