From 835681c8a218a2625d97f84c08a3789b373a2336 Mon Sep 17 00:00:00 2001 From: Jerry DeLisle Date: Mon, 24 Oct 2005 03:51:24 +0000 Subject: [PATCH] re PR libfortran/24489 (read_block wrong execution order) 2005-10-23 Jerry DeLisle 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 --- libgfortran/ChangeLog | 7 +++++++ libgfortran/io/transfer.c | 26 +++++++++++++------------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 12bf51a5027..6dd23590d52 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,10 @@ +2005-10-23 Jerry DeLisle + + 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 PR libfortran/23272 diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c index 1d1b78b3740..efd8e9dde4f 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; -- 2.30.2