mktemp: fix bug with -q and closed stdout
authorEric Blake <ebb9@byu.net>
Thu, 5 Nov 2009 19:19:45 +0000 (12:19 -0700)
committerEric Blake <ebb9@byu.net>
Sat, 7 Nov 2009 17:10:25 +0000 (10:10 -0700)
If stdin or stdout is closed, then freopen(,stderr) can violate
the premise that STDERR_FILENO==fileno(stderr), which in turn
breaks mktemp -q.

* bootstrap.conf (gnulib_modules): Add freopen-safer.
* src/mktemp.c (includes): Use stdio--.h.
* tests/misc/close-stdout: Enhance test to catch bug.

bootstrap.conf
src/mktemp.c
tests/misc/close-stdout

index 3a26394..d1e80a4 100644 (file)
@@ -92,6 +92,7 @@ gnulib_modules="
   fopen-safer
   fprintftime
   freopen
+  freopen-safer
   fseeko
   fsusage
   fsync
index 6ce40f1..303b9ce 100644 (file)
@@ -17,7 +17,6 @@
 /* Written by Jim Meyering and Eric Blake.  */
 
 #include <config.h>
-#include <stdio.h>
 #include <sys/types.h>
 #include <getopt.h>
 
@@ -27,6 +26,7 @@
 #include "error.h"
 #include "filenamecat.h"
 #include "quote.h"
+#include "stdio--.h"
 #include "tempname.h"
 
 /* The official name of this program (e.g., no `g' prefix).  */
index 852c3c8..ae2350d 100755 (executable)
@@ -52,7 +52,8 @@ if "$p/src/test" -w /dev/stdout >/dev/null &&
   cp --verbose a b >&- 2>/dev/null && fail=1
   rm -Rf tmpfile-?????? || fail=1
   mktemp tmpfile-XXXXXX >&- 2>/dev/null && fail=1
-  test -e tmpfile-?????? && fail=1
+  mktemp tmpfile-XXXXXX -q >&- 2>/dev/null && fail=1
+  case `echo tmpfile-??????` in 'tmpfile-??????') ;; *) fail=1 ;; esac
 fi
 
 # Likewise for /dev/full, if /dev/full works.
@@ -61,7 +62,8 @@ if test -w /dev/full && test -c /dev/full; then
   cp --verbose a b >/dev/full 2>/dev/null && fail=1
   rm -Rf tmpdir-?????? || fail=1
   mktemp -d tmpdir-XXXXXX >/dev/full 2>/dev/null && fail=1
-  test -e tmpdir-?????? && fail=1
+  mktemp -d -q tmpdir-XXXXXX >/dev/full 2>/dev/null && fail=1
+  case `echo tmpfile-??????` in 'tmpfile-??????') ;; *) fail=1 ;; esac
 fi
 
 Exit $fail