aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJerry DeLisle <jvdelisle@gcc.gnu.org>2006-01-18 06:21:28 +0000
committerJerry DeLisle <jvdelisle@gcc.gnu.org>2006-01-18 06:21:28 +0000
commit7b7034ea9a1670ccc3fd5808cd0219e0645ffae7 (patch)
tree18ea553828ecf780f4551052d6ab0fa5acedf71b
parent3dd0df7f136e41d9b05a1804ba1d01166a3a0a0e (diff)
downloadgcc-7b7034ea9a1670ccc3fd5808cd0219e0645ffae7.zip
gcc-7b7034ea9a1670ccc3fd5808cd0219e0645ffae7.tar.gz
gcc-7b7034ea9a1670ccc3fd5808cd0219e0645ffae7.tar.bz2
re PR libfortran/25697 (libfortran - Segmentation fault/ Bad Address on unformatted read)
2006-01-17 Jerry DeLisle <jvdelisle@gcc.gnu.org> PR libgfortran/25697 * io/transfer.c (us_read): Detect end of file condition from previous operations and bail out (no need to pre-position). From-SVN: r109870
-rw-r--r--libgfortran/ChangeLog6
-rw-r--r--libgfortran/io/transfer.c10
2 files changed, 14 insertions, 2 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index d5e178e..009b044 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,5 +1,11 @@
2006-01-17 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+ PR libgfortran/25697
+ * io/transfer.c (us_read): Detect end of file condition from previous
+ operations and bail out (no need to pre-position).
+
+2006-01-17 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+
PR libgfortran/25631
* io/transfer.c (formatted_transfer_scalar): Adjust pending_spaces and
skips so that TL works correctly when no bytes_used yet.
diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c
index 7298835..b5b8df4 100644
--- a/libgfortran/io/transfer.c
+++ b/libgfortran/io/transfer.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
Contributed by Andy Vaught
Namelist transfer functions contributed by Paul Thomas
@@ -1219,11 +1219,17 @@ us_read (st_parameter_dt *dtp)
int n;
gfc_offset i;
+ if (dtp->u.p.current_unit->endfile == AT_ENDFILE)
+ return;
+
n = sizeof (gfc_offset);
p = salloc_r (dtp->u.p.current_unit->s, &n);
if (n == 0)
- return; /* end of file */
+ {
+ dtp->u.p.current_unit->endfile = AT_ENDFILE;
+ return; /* end of file */
+ }
if (p == NULL || n != sizeof (gfc_offset))
{