Mercurial > hg > octave-kai > gnulib-hg
changeset 7036:a57aa913b52c
* tmpfile-safer.c: New file.
* stdio-safer.h (fopen_safer): Add prototype.
* stdio--.h (tmpfile): Make safer.
author | Eric Blake <ebb9@byu.net> |
---|---|
date | Sun, 23 Jul 2006 12:58:15 +0000 |
parents | 264f42792bc8 |
children | cca9b74499c4 |
files | lib/ChangeLog lib/stdio--.h lib/stdio-safer.h lib/tmpfile-safer.c |
diffstat | 4 files changed, 88 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,3 +1,9 @@ +2006-07-23 Eric Blake <ebb9@byu.net> + + * tmpfile-safer.c: New file. + * stdio-safer.h (fopen_safer): Add prototype. + * stdio--.h (tmpfile): Make safer. + 2006-07-22 Paul Eggert <eggert@cs.ucla.edu> * close-stream.c, close-stream.h: New files.
--- 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
--- 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 <stdio.h> FILE *fopen_safer (char const *, char const *); +FILE *tmpfile_safer (void);
new file mode 100644 --- /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 <config.h> +#endif + +#include "stdio-safer.h" + +#include <errno.h> +#include <unistd.h> +#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; +}