1*4882a593SmuzhiyunCreate better temporary files. 2*4882a593Smuzhiyun 3*4882a593SmuzhiyunProbably-Signed-off-by: Dave Bender <bender@benegon.com> 4*4882a593Smuzhiyun[yann.morin.1998@free.fr: patch was made by Dave, but he 5*4882a593Smuzhiyun forgot his SoB line, so I added it; split the patch in two 6*4882a593Smuzhiyun independent fixes] 7*4882a593SmuzhiyunSigned-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr> 8*4882a593Smuzhiyun 9*4882a593Smuzhiyundiff -rupN cgic206/cgic.c cgic206_tempfile/cgic.c 10*4882a593Smuzhiyun--- cgic206/cgic.c 2014-03-16 18:17:11.000000000 -0400 11*4882a593Smuzhiyun+++ cgic206_tempfile/cgic.c 2015-01-21 11:58:45.436384908 -0500 12*4882a593Smuzhiyun@@ -22,6 +22,8 @@ 13*4882a593Smuzhiyun #define CGICDEBUGEND 14*4882a593Smuzhiyun #endif /* CGICDEBUG */ 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun+#define _GNU_SOURCE 17*4882a593Smuzhiyun+ 18*4882a593Smuzhiyun #include <stdio.h> 19*4882a593Smuzhiyun #include <string.h> 20*4882a593Smuzhiyun #include <ctype.h> 21*4882a593Smuzhiyun@@ -34,11 +36,11 @@ 22*4882a593Smuzhiyun #include <io.h> 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun /* cgic 2.01 */ 25*4882a593Smuzhiyun-#include <fcntl.h> 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun #else 28*4882a593Smuzhiyun #include <unistd.h> 29*4882a593Smuzhiyun #endif /* WIN32 */ 30*4882a593Smuzhiyun+#include <fcntl.h> 31*4882a593Smuzhiyun #include "cgic.h" 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun #define cgiStrEq(a, b) (!strcmp((a), (b))) 34*4882a593Smuzhiyun@@ -636,16 +638,17 @@ static cgiParseResultType getTempFileNam 35*4882a593Smuzhiyun window between the file's creation and the 36*4882a593Smuzhiyun chmod call (glibc 2.0.6 and lower might 37*4882a593Smuzhiyun otherwise have allowed this). */ 38*4882a593Smuzhiyun+ mode_t umode; 39*4882a593Smuzhiyun int outfd; 40*4882a593Smuzhiyun+ umode = umask(0600); 41*4882a593Smuzhiyun strcpy(tfileName, cgicTempDir "/cgicXXXXXX"); 42*4882a593Smuzhiyun- outfd = mkstemp(tfileName); 43*4882a593Smuzhiyun+ outfd = mkostemp(tfileName, O_CLOEXEC | O_NOATIME); 44*4882a593Smuzhiyun+ umask(umode); 45*4882a593Smuzhiyun if (outfd == -1) { 46*4882a593Smuzhiyun return cgiParseIO; 47*4882a593Smuzhiyun } 48*4882a593Smuzhiyun- close(outfd); 49*4882a593Smuzhiyun- /* Fix the permissions */ 50*4882a593Smuzhiyun- if (chmod(tfileName, 0600) != 0) { 51*4882a593Smuzhiyun- unlink(tfileName); 52*4882a593Smuzhiyun+ 53*4882a593Smuzhiyun+ if (close(outfd)) { 54*4882a593Smuzhiyun return cgiParseIO; 55*4882a593Smuzhiyun } 56*4882a593Smuzhiyun #else 57