aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJanne Blomqvist <jb@gcc.gnu.org>2014-05-16 23:37:13 +0300
committerJanne Blomqvist <jb@gcc.gnu.org>2014-05-16 23:37:13 +0300
commit870c7fa03a0d97a77092fab5ab397b25ef1f6d6b (patch)
treee2b9590673b3978f49350f9440fe3aa32bc1ddff
parent2236746bbb9b2f2e71db8200f363b7649748e981 (diff)
downloadgcc-870c7fa03a0d97a77092fab5ab397b25ef1f6d6b.zip
gcc-870c7fa03a0d97a77092fab5ab397b25ef1f6d6b.tar.gz
gcc-870c7fa03a0d97a77092fab5ab397b25ef1f6d6b.tar.bz2
PR 61187 Fix use of uninitialized memory.
2014-05-16 Janne Blomqvist <jb@gcc.gnu.org> PR libfortran/61187 * io/unix.c (raw_close): Check if s->fd is -1. (fd_to_stream): Check return value of fstat(), handle error. From-SVN: r210527
-rw-r--r--libgfortran/ChangeLog6
-rw-r--r--libgfortran/io/unix.c14
2 files changed, 18 insertions, 2 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index ed26a4d..f9287bd 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,9 @@
+2014-05-16 Janne Blomqvist <jb@gcc.gnu.org>
+
+ PR libfortran/61187
+ * io/unix.c (raw_close): Check if s->fd is -1.
+ (fd_to_stream): Check return value of fstat(), handle error.
+
2014-05-12 Janne Blomqvist <jb@gcc.gnu.org>
PR libfortran/61035
diff --git a/libgfortran/io/unix.c b/libgfortran/io/unix.c
index 34c2d0c..76ed84e 100644
--- a/libgfortran/io/unix.c
+++ b/libgfortran/io/unix.c
@@ -412,7 +412,9 @@ raw_close (unix_stream * s)
{
int retval;
- if (s->fd != STDOUT_FILENO
+ if (s->fd == -1)
+ retval = -1;
+ else if (s->fd != STDOUT_FILENO
&& s->fd != STDERR_FILENO
&& s->fd != STDIN_FILENO)
retval = close (s->fd);
@@ -1003,7 +1005,15 @@ fd_to_stream (int fd, bool unformatted)
/* Get the current length of the file. */
- fstat (fd, &statbuf);
+ if (fstat (fd, &statbuf) == -1)
+ {
+ s->st_dev = s->st_ino = -1;
+ s->file_length = 0;
+ if (errno == EBADF)
+ s->fd = -1;
+ raw_init (s);
+ return (stream *) s;
+ }
s->st_dev = statbuf.st_dev;
s->st_ino = statbuf.st_ino;