aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJerry DeLisle <jvdelisle@gcc.gnu.org>2007-03-09 21:51:39 +0000
committerJerry DeLisle <jvdelisle@gcc.gnu.org>2007-03-09 21:51:39 +0000
commitf4072316a3ef6466ff3b554ca19b14ce4e64eda0 (patch)
treef373d27e1481d619ffecd03c0e976bc2f878ccbe
parent7cd4f641a0bbc98177446251888dbd96e3fd12f5 (diff)
downloadgcc-f4072316a3ef6466ff3b554ca19b14ce4e64eda0.zip
gcc-f4072316a3ef6466ff3b554ca19b14ce4e64eda0.tar.gz
gcc-f4072316a3ef6466ff3b554ca19b14ce4e64eda0.tar.bz2
re PR libfortran/31099 (Runtime error on legal code using RECL)
2007-03-09 Jerry DeLisle <jvdelisle@gcc.gnu.org> PR libgfortran/31099 * io/open.c (new_unit): Initialize bytes_left and recl_subrecord. * io/transfer.c (next_record_w): Set bytes left to record length for sequential unformatted I/O. (next_record_r): Ditto. (read_block_direct): Fix test for exceeding bytes_left. From-SVN: r122763
-rw-r--r--libgfortran/ChangeLog9
-rw-r--r--libgfortran/io/open.c2
-rw-r--r--libgfortran/io/transfer.c9
3 files changed, 16 insertions, 4 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 889a70d..7f90658 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,12 @@
+2007-03-09 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+
+ PR libgfortran/31099
+ * io/open.c (new_unit): Initialize bytes_left and recl_subrecord.
+ * io/transfer.c (next_record_w): Set bytes left to record length for
+ sequential unformatted I/O.
+ (next_record_r): Ditto.
+ (read_block_direct): Fix test for exceeding bytes_left.
+
2007-03-08 Daniel Franke <franke.daniel@gmail.com>
PR fortran/30947
diff --git a/libgfortran/io/open.c b/libgfortran/io/open.c
index ef1ce1e..783c5e8 100644
--- a/libgfortran/io/open.c
+++ b/libgfortran/io/open.c
@@ -437,6 +437,8 @@ new_unit (st_parameter_open *opp, gfc_unit *u, unit_flags * flags)
{
u->flags.has_recl = 1;
u->recl = opp->recl_in;
+ u->recl_subrecord = u->recl;
+ u->bytes_left = u->recl;
}
else
{
diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c
index a7632da..42f8249 100644
--- a/libgfortran/io/transfer.c
+++ b/libgfortran/io/transfer.c
@@ -434,11 +434,10 @@ read_block_direct (st_parameter_dt *dtp, void *buf, size_t *nbytes)
/* Check whether we exceed the total record length. */
- if (dtp->u.p.current_unit->flags.has_recl)
+ if (dtp->u.p.current_unit->flags.has_recl
+ && (*nbytes > (size_t) dtp->u.p.current_unit->bytes_left))
{
- to_read_record =
- *nbytes > (size_t) dtp->u.p.current_unit->bytes_left ?
- *nbytes : (size_t) dtp->u.p.current_unit->bytes_left;
+ to_read_record = (size_t) dtp->u.p.current_unit->bytes_left;
short_record = 1;
}
else
@@ -2152,6 +2151,7 @@ next_record_r (st_parameter_dt *dtp)
case UNFORMATTED_SEQUENTIAL:
next_record_r_unf (dtp, 1);
+ dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
break;
case FORMATTED_DIRECT:
@@ -2377,6 +2377,7 @@ next_record_w (st_parameter_dt *dtp, int done)
case UNFORMATTED_SEQUENTIAL:
next_record_w_unf (dtp, 0);
+ dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
break;
case FORMATTED_STREAM: