Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 21 Oct 1998 19:25:05 +1000
From:      Bruce Evans <bde@zeta.org.au>
To:        bde@zeta.org.au, peter@netplex.com.au
Cc:        cvs-all@FreeBSD.ORG, cvs-committers@FreeBSD.ORG
Subject:   Re: cvs commit: src/lib/libc/stdio mktemp.c
Message-ID:  <199810210925.TAA31167@godzilla.zeta.org.au>

next in thread | raw e-mail | index | archive | help
>> >man mkstemp:
>> >     The mkstemp() function makes the same replacement to the template and
>> >     creates the template file, mode 0600, returning a file descriptor opene
>    d
>> >                                     ^^^^
>> >     for reading and writing.  This avoids the race between testing for a
>> >     file's existence and opening it for use.
>> 
>> man creat.  It's not clear that creation has its English meaning or the
>> technical one of creat.  I trust the code more than the man page.
>
>What does this have to do with creat()?  The documentation is the 

creat() "with" mode m gives a final mode of (m & ~umask).

>definition for the interface in this case and here's specific: the file 
>will be created mode 0600.  There is no ambiguity.

It's hard to tell, since the clause describing the mode is hard to parse.

>> >A specfic mode is specified, your example is broken, especially on NFS.  
>> >The way to implement what you want is:
>> >
>> >     fd = mkstemp(foo);
>> >     unlink(foo);
>> 
>> This has a race between the mkstemp() and the unlink().
>
>So?  It's no different to another process doing a chmod on the mode 000 
>file to get access to it.  If you want to stop signals from making you 

So you just added a race where there was no race before (if the caller
called umask(0777).  The other process still has to do a chmod to change
the mode from 000.  Perhaps it has agreed not to do that.

>> Hmm.  POSIX specifies that tmpfile() shall allocate the fd as fopen()
>> does (and that fopen() shall allocate it as open() does).  This seems
>> to require honouring the umask.
>
>It's irrelevant, the filesystem permissions do not "exist" because there 
>is no file present at the return of tmpfile().

They exist internally in tmpfile().

>> Who owns it?  The Linux (Redhat version mumble) man page says that
>> mkstemp() conforms to BSD 4.3 and creates the file with permissions
>> 0666.  glibc-2.0.5c uses the same O_EXCL open as us except for using
>> this insecure mode.
        ^^^^^^^^

>This falls squarely into the '1 million flies can't be wrong' department.  
>Doing it that way just makes it an already dangerous operation more 
>dangerous.

I know.

Bruce

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe cvs-all" in the body of the message



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199810210925.TAA31167>