From 9696b2257cfc61d3e04045f05cc37580e461d0ef Mon Sep 17 00:00:00 2001 From: Jerry DeLisle Date: Fri, 6 Jan 2006 01:39:34 +0000 Subject: re PR libfortran/25598 (gfortran - Fortran runtime error: Invalid argument) 2006-01-05 Jerry DeLisle PR libgfortran/25598 * io/file_pos.c (unformatted_backspace): Assure the new file position to seek is not less than zero. (st_backspace): Set unit bytes_left to zero. * io/transfer.c (next_record_r): Fix line lengths, no functional change. From-SVN: r109405 --- libgfortran/io/file_pos.c | 5 ++++- libgfortran/io/transfer.c | 7 +++++-- 2 files changed, 9 insertions(+), 3 deletions(-) (limited to 'libgfortran/io') diff --git a/libgfortran/io/file_pos.c b/libgfortran/io/file_pos.c index d9ac1e7..ba8f631 100644 --- a/libgfortran/io/file_pos.c +++ b/libgfortran/io/file_pos.c @@ -120,7 +120,9 @@ unformatted_backspace (st_parameter_filepos *fpp, gfc_unit *u) else reverse_memcpy (&m, p, sizeof (gfc_offset)); - new = file_position (u->s) - m - 2*length; + if ((new = file_position (u->s) - m - 2*length) < 0) + new = 0; + if (sseek (u->s, new) == FAILURE) goto io_error; @@ -179,6 +181,7 @@ st_backspace (st_parameter_filepos *fpp) u->endfile = NO_ENDFILE; u->current_record = 0; + u->bytes_left = 0; } done: diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c index 2c12294..049ebb2 100644 --- a/libgfortran/io/transfer.c +++ b/libgfortran/io/transfer.c @@ -1645,8 +1645,10 @@ next_record_r (st_parameter_dt *dtp) switch (current_mode (dtp)) { case UNFORMATTED_SEQUENTIAL: - dtp->u.p.current_unit->bytes_left += sizeof (gfc_offset); /* Skip over tail */ + /* Skip over tail */ + dtp->u.p.current_unit->bytes_left += sizeof (gfc_offset); + /* Fall through... */ case FORMATTED_DIRECT: @@ -1656,7 +1658,8 @@ next_record_r (st_parameter_dt *dtp) if (is_seekable (dtp->u.p.current_unit->s)) { - new = file_position (dtp->u.p.current_unit->s) + dtp->u.p.current_unit->bytes_left; + new = file_position (dtp->u.p.current_unit->s) + + dtp->u.p.current_unit->bytes_left; /* Direct access files do not generate END conditions, only I/O errors. */ -- cgit v1.1