From 0b4d979f55a573d7b145b6925d3601baa3be50e8 Mon Sep 17 00:00:00 2001
From: Jerry DeLisle <jvdelisle@gcc.gnu.org>
Date: Thu, 19 Nov 2009 04:50:04 +0000
Subject: [PATCH] re PR fortran/42090 (I/O: Problems when reading partial
 records in formatted direct access files)

2009-11-18  Jerry DeLisle  <jvdelisle@gcc.gnu.org>

	PR libgfortran/42090
	* io/transfer.c (skip_record): Set bytes_left_subrecord to zero after
	skipping the remaining bytes in the record.
	(next_record_r): Call skip_record with the number of bytes_left to be
	skipped.

From-SVN: r154316
---
 libgfortran/ChangeLog     | 8 ++++++++
 libgfortran/io/transfer.c | 4 +++-
 2 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 3ee00936037e..8a816fc9e5ad 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,11 @@
+2009-11-18  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+
+	PR libgfortran/42090
+	* io/transfer.c (skip_record): Set bytes_left_subrecord to zero after
+	skipping the remaining bytes in the record.
+	(next_record_r): Call skip_record with the number of bytes_left to be
+	skipped.
+
 2009-11-02  Janne Blomqvist  <jb@gcc.gnu.org>
 
 	* Makefile.am (gfor_io_headers): Add fbuf.h, format.h, unix.h.
diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c
index b5f52b1ccf38..a110c6529ffe 100644
--- a/libgfortran/io/transfer.c
+++ b/libgfortran/io/transfer.c
@@ -2661,6 +2661,8 @@ skip_record (st_parameter_dt *dtp, ssize_t bytes)
       if (sseek (dtp->u.p.current_unit->s, 
 		 dtp->u.p.current_unit->bytes_left_subrecord, SEEK_CUR) < 0)
 	generate_error (&dtp->common, LIBERROR_OS, NULL);
+
+      dtp->u.p.current_unit->bytes_left_subrecord = 0;
     }
   else
     {			/* Seek by reading data.  */
@@ -2741,7 +2743,7 @@ next_record_r (st_parameter_dt *dtp)
 
     case FORMATTED_DIRECT:
     case UNFORMATTED_DIRECT:
-      skip_record (dtp, 0);
+      skip_record (dtp, dtp->u.p.current_unit->bytes_left);
       break;
 
     case FORMATTED_STREAM:
-- 
GitLab