OSDN Git Service

2005-10-23 Jerry DeLisle <jvdelisle@verizon.net>
authorjvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 24 Oct 2005 03:51:24 +0000 (03:51 +0000)
committerjvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 24 Oct 2005 03:51:24 +0000 (03:51 +0000)
        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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@105840 138bc75d-0d04-0410-961f-82ee72b054a4

libgfortran/ChangeLog
libgfortran/io/transfer.c

index 12bf51a..6dd2359 100644 (file)
@@ -1,3 +1,10 @@
+2005-10-23  Jerry DeLisle  <jvdelisle@verizon.net>
+
+        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  <coudert@clipper.ens.fr>
 
        PR libfortran/23272
index 1d1b78b..efd8e9d 100644 (file)
@@ -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;