[alexandria-devel] Proposed addition of temporary file creation utilities

Pascal J. Bourguignon pjb at informatimago.com
Sun Apr 22 19:26:12 UTC 2012


Hans Hübner <hans.huebner at gmail.com> writes:

> Faré,
>
> neither iolib nor osicat are the right place for temporary file
> handling operators like the one I proposed.  Both these libraries are
> specifically targeted towards POSIX systems, so there is no chance
> that they will cooperate, say, with ABCL.

A lot of systems implement the POSIX API.  
http://en.wikipedia.org/wiki/POSIX

Does the JVM run on a non-POSIX plateform?  Does it not provide the
mkstemp(3) POSIX function?  


> Setting the process umask is something that is completely unrelated to
> portably creating temporary files.

You mean to say that (CL) portably creating temporary files cannot be
done controling the umask, because there's no such notion in CL.

That's all right, and for a lot of uses, this may be OK, but that
doesn't fulfill the need for a mkstemp() when the security consideration
need to be taken into account, ie. as soon as you're writing a real
program.


Ie. there's no point in providing a conforming temporary file creation,
for real stuff you need a portability temporary file creation library
that allows the setting of umask.



> If this is not going into Alexandria, there are two likely other
> outcomes:  Either the code goes into Postmodern, giving the next
> person the same problem (and I've not had this problem once, but many
> times), or it will end up in a trivial-temporary-file library that may
> include some conditional code for setting up the default temporary
> directory in a meaningful way.  With Quicklisp, this would not hurt
> much, but it certainly feels a little silly to additional
> trivial-whatever libraries for basic functionality.

You're discovering that creation of temporary files is not so trivial
after all.  On unix, this has a long history of tries and failures.  To
wit:



mktemp(3)

    BUGS 

        Never use mktemp().  Some implementations follow 4.3BSD and
        replace XXXXXX by the current process ID and a single letter, so
        that at most 26 different names can be returned.  Since on the
        one hand the names are easy to guess, and on the other hand
        there is a race between testing whether the name exists and
        opening the file, every use of mktemp() is a security risk.  The
        race is avoided by mkstemp(3).


tempnam(3)

    NOTES

         Although tempnam() generates names that are difficult to guess,
         it  is  nevertheless possible  that  between the time that
         tempnam() returns a pathname, and the time that the program
         opens it, another program might create that pathname using
         open(2),  or create it as a symbolic link.  This can lead to
         security holes.  To avoid such possi‐ bilities, use the open(2)
         O_EXCL flag to open  the  pathname.   Or  better yet,  use
         mkstemp(3) or tmpfile(3).

         SUSv2  does not mention the use of TMPDIR; glibc will use it
         only when the program is not set-user-ID.  On SVr4, the
         directory used under d) is  /tmp  (and  this  is  what glibc
         does).

         Because  it  dynamically  allocates  memory used to return the
         pathname, tempnam() is reentrant, and thus thread safe, unlike
         tmpnam(3).

         The tempnam() function generates a different string each time
         it  is  called,  up  to TMP_MAX  (defined  in <stdio.h>) times.
         If it is called more than TMP_MAX times, the behavior is
         implementation defined.

         tempnam() uses at most the first five bytes from pfx.

         The glibc implementation of tempnam() will fail with the error
         EEXIST upon failure to find a unique name.

    BUGS

        The  precise meaning of "appropriate" is undefined; it is
        unspecified how accessibil‐ ity of a directory is determined.

        Never use this function.  Use mkstemp(3) or tmpfile(3) instead.


mkstemp(3)

    NOTES
 
         The  old  behavior of creating a file with mode 0666 may be a
         security risk, especially since other UNIX flavors use 0600,
         and somebody might overlook this detail when porting pro‐
         grams.

         More generally, the POSIX specification of mkstemp() does not
         say anything about file modes, so the application should make
         sure its file mode creation mask (see umask(2))  is  set
         appropriately before calling mkstemp() (and mkostemp()).



So it's not the first time that such difficulties are identified in an
apparently simple API.



Again, for a toy, just creating a randomly named file is ok.  But in
production code you will need more than that.


> Your remarks regarding how this request represents a "poor way to
> promote Lisp as a serious language" are unwelcome, unconstructive and
> wrong.  Thank you for not continuing on that path.

That's a little strong.

-- 
__Pascal Bourguignon__                     http://www.informatimago.com/
A bad day in () is better than a good day in {}.




More information about the alexandria-devel mailing list