From e5ad478df2e6e119fac0dc7357f30cb4ebdaebc4 Mon Sep 17 00:00:00 2001 From: Janne Blomqvist Date: Sun, 25 May 2014 22:29:00 +0300 Subject: [PATCH] PR 61187 Avoid reading uninitialized memory. 2014-05-25 Janne Blomqvist Backport from trunk. 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: r210914 --- libgfortran/ChangeLog | 7 +++++++ libgfortran/io/unix.c | 14 ++++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 1aaf6845cd79..6f70effe77be 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,10 @@ +2014-05-25 Janne Blomqvist + + Backport from trunk. + 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-22 Release Manager * GCC 4.8.3 released. diff --git a/libgfortran/io/unix.c b/libgfortran/io/unix.c index 8b9d7a773425..185d0dca157b 100644 --- a/libgfortran/io/unix.c +++ b/libgfortran/io/unix.c @@ -407,7 +407,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); @@ -983,7 +985,15 @@ fd_to_stream (int fd) /* 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; -- 2.47.2