re PR libfortran/24489 (read_block wrong execution order)
authorJerry DeLisle <jvdelisle@verizon.net>
Mon, 24 Oct 2005 03:51:24 +0000 (03:51 +0000)
committerJerry DeLisle <jvdelisle@gcc.gnu.org>
Mon, 24 Oct 2005 03:51:24 +0000 (03:51 +0000)
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.

From-SVN: r105840

libgfortran/ChangeLog
libgfortran/io/transfer.c

index 12bf51a5027bc262b1e63f7dfca3fbaba8f44776..6dd23590d523e443f1bfd9e0927715ad0160ebde 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 1d1b78b374064f7f1be64315a687271cf2cfd276..efd8e9dde4f8519a32ceadf6450611e7bf81a630 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;