diff options
| -rw-r--r-- | libgfortran/ChangeLog | 7 | ||||
| -rw-r--r-- | libgfortran/io/transfer.c | 26 |
2 files changed, 20 insertions, 13 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 12bf51a..6dd2359 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -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 diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c index 1d1b78b..efd8e9d 100644 --- a/libgfortran/io/transfer.c +++ b/libgfortran/io/transfer.c @@ -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; |
