changeset 14627:780006cfcb42

mkstemp: replace if system version uses wrong permissions * m4/mkstemp.m4 (gl_FUNC_MKSTEMP): Add test for non-owner read/write mode bits set in file created by mkstemp. * doc/posix-functions/mkstemp.texi (mkstemp): Document the fix. Signed-off-by: Eric Blake <eblake@redhat.com>
author Reuben Thomas <rrt@sc3d.org>
date Wed, 27 Apr 2011 14:51:22 +0100
parents 0f3fba4a62b1
children a54d85d62606
files ChangeLog doc/posix-functions/mkstemp.texi m4/mkstemp.m4
diffstat 3 files changed, 23 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Wed Apr 27 09:52:00 2011 -0600
+++ b/ChangeLog	Wed Apr 27 14:51:22 2011 +0100
@@ -1,3 +1,11 @@
+2011-04-27  Reuben Thomas  <rrt@sc3d.org>
+	and Eric Blake  <eblake@redhat.com>
+
+	mkstemp: replace if system version uses wrong permissions
+	* m4/mkstemp.m4 (gl_FUNC_MKSTEMP): Add test for non-owner
+	read/write mode bits set in file created by mkstemp.
+	* doc/posix-functions/mkstemp.texi (mkstemp): Document the fix.
+
 2011-04-27  Eric Blake  <eblake@redhat.com>
 
 	passfd: avoid compiler warning
--- a/doc/posix-functions/mkstemp.texi	Wed Apr 27 09:52:00 2011 -0600
+++ b/doc/posix-functions/mkstemp.texi	Wed Apr 27 14:51:22 2011 +0100
@@ -15,14 +15,14 @@
 On some platforms (HP-UX 10.20, SunOS 4.1.4, Solaris 2.5.1), mkstemp has a silly
 limit that it can create no more than 26 files from a given template.  On
 OSF/1 4.0f, it can create only 32 files per process.
+@item
+On some older platforms, @code{mkstemp} can create a world or group
+writable or readable file, if you haven't set the process umask to
+077.  This is a security risk.
 @end itemize
 
 Portability problems not fixed by Gnulib:
 @itemize
-@item
-On platforms other than glibc 2.0.7 or newer, @code{mkstemp} can create a
-world or group writable or readable file, if you haven't set the process
-umask to 077.  This is a security risk.
 @end itemize
 
 The gnulib module clean-temp can create temporary files that are less
--- a/m4/mkstemp.m4	Wed Apr 27 09:52:00 2011 -0600
+++ b/m4/mkstemp.m4	Wed Apr 27 14:51:22 2011 +0100
@@ -1,4 +1,4 @@
-#serial 19
+#serial 20
 
 # Copyright (C) 2001, 2003-2007, 2009-2011 Free Software Foundation, Inc.
 # This file is free software; the Free Software Foundation
@@ -10,6 +10,8 @@
 # Other systems lack mkstemp altogether.
 # On OSF1/Tru64 V4.0F, the system-provided mkstemp function can create
 # only 32 files per process.
+# On some hosts, mkstemp creates files with mode 0666, which is a security
+# problem and a violation of POSIX 2008.
 # On systems like the above, arrange to use the replacement function.
 AC_DEFUN([gl_FUNC_MKSTEMP],
 [
@@ -30,6 +32,7 @@
               off_t large = (off_t) 4294967295u;
               if (large < 0)
                 large = 2147483647;
+              umask (0);
               for (i = 0; i < 70; i++)
                 {
                   char templ[] = "conftest.mkstemp/coXXXXXX";
@@ -39,9 +42,15 @@
                     result |= 1;
                   else
                     {
+                      struct stat st;
                       if (lseek (fd, large, SEEK_SET) != large)
                         result |= 2;
-                      close (fd);
+                      if (fstat (fd, &st) < 0)
+                        result |= 4;
+                      else if (st.st_mode & 0077)
+                        result |= 8;
+                      if (close (fd))
+                        result |= 16;
                     }
                 }
               return result;]])],