diff options
author | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2006-01-18 06:21:28 +0000 |
---|---|---|
committer | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2006-01-18 06:21:28 +0000 |
commit | 7b7034ea9a1670ccc3fd5808cd0219e0645ffae7 (patch) | |
tree | 18ea553828ecf780f4551052d6ab0fa5acedf71b | |
parent | 3dd0df7f136e41d9b05a1804ba1d01166a3a0a0e (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | libgfortran/io/transfer.c | 10 |
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)) { |