From 111cf856170ccb69de8a3232814cd28e2ba22ffa Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Sun, 23 Jul 2006 12:58:15 +0000 Subject: [PATCH] * tmpfile-safer.c: New file. * stdio-safer.h (fopen_safer): Add prototype. * stdio--.h (tmpfile): Make safer. --- lib/ChangeLog | 6 ++++ lib/stdio--.h | 5 ++- lib/stdio-safer.h | 3 +- lib/tmpfile-safer.c | 76 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 lib/tmpfile-safer.c diff --git a/lib/ChangeLog b/lib/ChangeLog index c44cad7a09..c4dd4e882b 100644 --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,3 +1,9 @@ +2006-07-23 Eric Blake + + * tmpfile-safer.c: New file. + * stdio-safer.h (fopen_safer): Add prototype. + * stdio--.h (tmpfile): Make safer. + 2006-07-22 Paul Eggert * close-stream.c, close-stream.h: New files. diff --git a/lib/stdio--.h b/lib/stdio--.h index b2765fd524..ca3233e181 100644 --- a/lib/stdio--.h +++ b/lib/stdio--.h @@ -1,6 +1,6 @@ /* Like stdio.h, but redefine some names to avoid glitches. - Copyright (C) 2005 Free Software Foundation, Inc. + Copyright (C) 2005, 2006 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -23,3 +23,6 @@ #undef fopen #define fopen fopen_safer + +#undef tmpfile +#define tmpfile tmpfile-safer diff --git a/lib/stdio-safer.h b/lib/stdio-safer.h index 0b9a9ab80c..8329a1a093 100644 --- a/lib/stdio-safer.h +++ b/lib/stdio-safer.h @@ -1,6 +1,6 @@ /* Invoke stdio functions, but avoid some glitches. - Copyright (C) 2001, 2003 Free Software Foundation, Inc. + Copyright (C) 2001, 2003, 2006 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -21,3 +21,4 @@ #include FILE *fopen_safer (char const *, char const *); +FILE *tmpfile_safer (void); diff --git a/lib/tmpfile-safer.c b/lib/tmpfile-safer.c new file mode 100644 index 0000000000..74ab959140 --- /dev/null +++ b/lib/tmpfile-safer.c @@ -0,0 +1,76 @@ +/* Invoke tmpfile, but avoid some glitches. + Copyright (C) 2006 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* Written by Eric Blake, based on ideas from Paul Eggert. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "stdio-safer.h" + +#include +#include +#include "unistd-safer.h" + +#include "binary-io.h" + +#ifndef STDERR_FILENO +# define STDERR_FILENO 2 +#endif + +/* Like tmpfile, but do not return stdin, stdout, or stderr. + + Remember that tmpfile can leave files behind if your program calls _exit, + so this function should not be mixed with the close_stdout module. */ + +FILE * +tmpfile_safer (void) +{ + FILE *fp = tmpfile (); + + if (fp) + { + int fd = fileno (fp); + + if (0 <= fd && fd <= STDERR_FILENO) + { + int f = dup_safer (fd); + + if (f < 0) + { + int e = errno; + fclose (fp); + errno = e; + return NULL; + } + + /* Keep the temporary file in binary mode, on platforms + where that matters. */ + if (fclose (fp) != 0 + || ! (fp = fdopen (f, O_BINARY ? "wb+" : "w+"))) + { + int e = errno; + close (f); + errno = e; + return NULL; + } + } + } + + return fp; +} -- 2.30.2