aboutsummaryrefslogtreecommitdiff
path: root/libgfortran/io
diff options
context:
space:
mode:
authorJanne Blomqvist <jb@gcc.gnu.org>2018-01-08 14:12:05 +0200
committerJanne Blomqvist <jb@gcc.gnu.org>2018-01-08 14:12:05 +0200
commit4135a21f4dc1b490446722a40ce113a0f7a28305 (patch)
tree076c38c37b3cc831ebb83bdb854df64797ba6b08 /libgfortran/io
parent4c035a2394ef0cebb22128e6cf14428c47ec20fe (diff)
downloadgcc-4135a21f4dc1b490446722a40ce113a0f7a28305.zip
gcc-4135a21f4dc1b490446722a40ce113a0f7a28305.tar.gz
gcc-4135a21f4dc1b490446722a40ce113a0f7a28305.tar.bz2
PR 78534 Regression on 32-bit targets
By switching from int to size_t in order to handle larger values, r256322 introduced a bug that manifested itself on 32-bit targets. Fixed by using the correct type to store the result of a next_array_record call. Regtested on x86_64-pc-linux-gnu and i686-pc-linux-gnu, committed to trunk as obvious. libgfortran/ChangeLog: 2018-01-08 Janne Blomqvist <jb@gcc.gnu.org> PR 78534, bugfix for r256322 * io/transfer.c (next_record_w): Use correct type for return value of next_array_record. From-SVN: r256337
Diffstat (limited to 'libgfortran/io')
-rw-r--r--libgfortran/io/transfer.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c
index f9c8696..7e076de 100644
--- a/libgfortran/io/transfer.c
+++ b/libgfortran/io/transfer.c
@@ -3691,7 +3691,7 @@ next_record_w (st_parameter_dt *dtp, int done)
{
char *p;
/* Internal unit, so must fit in memory. */
- size_t length, m, record;
+ size_t length, m;
size_t max_pos = max_pos_off;
if (is_array_io (dtp))
{
@@ -3730,14 +3730,16 @@ next_record_w (st_parameter_dt *dtp, int done)
memset (p, ' ', length);
/* Now that the current record has been padded out,
- determine where the next record in the array is. */
- record = next_array_record (dtp, dtp->u.p.current_unit->ls,
- &finished);
+ determine where the next record in the array is.
+ Note that this can return a negative value, so it
+ needs to be assigned to a signed value. */
+ gfc_offset record = next_array_record
+ (dtp, dtp->u.p.current_unit->ls, &finished);
if (finished)
dtp->u.p.current_unit->endfile = AT_ENDFILE;
/* Now seek to this record */
- record = record * ((size_t) dtp->u.p.current_unit->recl);
+ record = record * dtp->u.p.current_unit->recl;
if (sseek (dtp->u.p.current_unit->s, record, SEEK_SET) < 0)
{