diff options
| author | Jacob McDonnell <jacob@jacobmcdonnell.com> | 2026-04-25 19:55:15 -0400 |
|---|---|---|
| committer | Jacob McDonnell <jacob@jacobmcdonnell.com> | 2026-04-25 19:55:15 -0400 |
| commit | 253e67c8b3a72b3a4757fdbc5845297628db0a4a (patch) | |
| tree | adf53b66087aa30dfbf8bf391a1dadb044c3bf4d /static/netbsd/man3/mktemp.3 | |
| parent | a9157ce950dfe2fc30795d43b9d79b9d1bffc48b (diff) | |
docs: Added All NetBSD Manuals
Diffstat (limited to 'static/netbsd/man3/mktemp.3')
| -rw-r--r-- | static/netbsd/man3/mktemp.3 | 390 |
1 files changed, 390 insertions, 0 deletions
diff --git a/static/netbsd/man3/mktemp.3 b/static/netbsd/man3/mktemp.3 new file mode 100644 index 00000000..496ff865 --- /dev/null +++ b/static/netbsd/man3/mktemp.3 @@ -0,0 +1,390 @@ +.\" $NetBSD: mktemp.3,v 1.36 2025/08/06 23:52:06 kre Exp $ +.\" +.\" Copyright (c) 1989, 1991, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)mktemp.3 8.1 (Berkeley) 6/4/93 +.\" +.Dd November 2, 2024 +.Dt MKTEMP 3 +.Os +.Sh NAME +.Nm mktemp , +.Nm mkstemp , +.Nm mkstemps , +.Nm mkostemp , +.Nm mkostemps , +.Nm mkdtemp +.Nd make unique temporary file or directory name +.Sh LIBRARY +.Lb libc +.Sh SYNOPSIS +.In stdlib.h +.Ft char * +.Fn mktemp "char *template" +.Ft int +.Fn mkstemp "char *template" +.Ft int +.Fn mkostemp "char *template" "int oflags" +.Ft int +.Fn mkostemps "char *template" "int suffixlen" "int oflags" +.Ft char * +.Fn mkdtemp "char *template" +.In unistd.h +.Ft int +.Fn mkstemps "char *template" "int suffixlen" +.Sh DESCRIPTION +The +.Fn mktemp +function +takes the given file name template and overwrites a portion of it +to create a file name. +This file name is unique and suitable for use +by the application. +The template may be any file name with some number of +.Sq Li X +characters appended to it, for example +.Pa /tmp/temp.XXXXXX . +The trailing +.Sq Li X +characters in the template are replaced with a unique letter and number +combination. +.Fn mktemp +can return depends on the number of +.Sq Li X +characters provided. +Although the +.Nx +implementation of the functions will accept any number of trailing +.Sq Li X +characters, for portability reasons one should use only six. +Using six +.Sq Li X +characters will result in +.Fn mktemp +testing roughly 62 ** 6 (56800235584) combinations. +.Pp +The +.Fn mkstemp +function +makes the same replacement to the template and creates the template file, +mode 0600, returning a file descriptor opened for reading and writing. +This avoids the race between testing for a file's existence and opening it +for use. +The +.Fn mkostemp +function +is like +.Fn mkstemp +but allows specifying additional +.Xr open 2 +flags (defined in +.In fcntl.h ) . +The permitted flags are +.Dv O_APPEND , +.Dv O_DIRECT , +.Dv O_SHLOCK , +.Dv O_EXLOCK , +.Dv O_SYNC , +.Dv O_CLOEXEC +and +.Dv O_CLOFORK . +.Pp +The +.Fn mkstemps +and +.Fn mkostemps +functions act the same as +.Fn mkstemp +and +.Fn mkostemp +respectively, +except they permit a suffix to exist in the template. +The template should be of the form +.Pa /tmp/tmpXXXXXXsuffix . +The +.Fn mkstemps +and +.Fn mkostemps +function +are told the length of the suffix string. +.Pp +The +.Fn mkdtemp +function +is similar to +.Fn mkstemp , +but it creates a mode 0700 directory instead and returns the path. +.Pp +Please note that the permissions of the file or directory being created are +subject to the restrictions imposed by the +.Xr umask 2 +system call. +It may thus happen that the created file is unreadable and/or unwritable. +.Sh RETURN VALUES +The +.Fn mktemp +and +.Fn mkdtemp +functions +return a pointer to the template on success and +.Dv NULL +on failure. +The +.Fn mkstemp , +.Fn mkostemp , +.Fn mkstemps +and +.Fn mkostemps +functions +returns \-1 if no suitable file could be created. +If either call fails an error code is placed in the global variable +.Va errno . +.Sh EXAMPLES +Quite often a programmer will want to replace a use of +.Fn mktemp +with +.Fn mkstemp , +usually to avoid the problems described above. +Doing this correctly requires a good understanding of the code in question. +.Pp +For instance, code of this form: +.Bd -literal -offset indent +char sfn[15] = ""; +FILE *sfp; + +strlcpy(sfn, "/tmp/ed.XXXXXX", sizeof sfn); +if (mktemp(sfn) == NULL || (sfp = fopen(sfn, "w+")) == NULL) { + fprintf(stderr, "%s: %s\en", sfn, strerror(errno)); + return (NULL); +} +return (sfp); +.Ed +.Pp +should be rewritten like this: +.Bd -literal -offset indent +char sfn[15] = ""; +FILE *sfp; +int fd = -1; + +strlcpy(sfn, "/tmp/ed.XXXXXX", sizeof sfn); +if ((fd = mkstemp(sfn)) == -1 || + (sfp = fdopen(fd, "w+")) == NULL) { + if (fd != -1) { + unlink(sfn); + close(fd); + } + fprintf(stderr, "%s: %s\en", sfn, strerror(errno)); + return (NULL); +} +return (sfp); +.Ed +.Pp +Often one will find code which uses +.Fn mktemp +very early on, perhaps to globally initialize the template nicely, but the +code which calls +.Xr open 2 +or +.Xr fopen 3 +on that filename will occur much later. +(In almost all cases, the use of +.Xr fopen 3 +will mean that the flags +.Dv O_CREAT +| +.Dv O_EXCL +are not given to +.Xr open 2 , +and thus a symbolic link race becomes possible, hence making +necessary the use of +.Xr fdopen 3 +as seen above). +Furthermore, one must be careful about code which opens, closes, and then +re-opens the file in question. +Finally, one must ensure that upon error the temporary file is +removed correctly. +.Pp +There are also cases where modifying the code to use +.Fn mktemp , +in concert with +.Xr open 2 +using the flags +.Dv O_CREAT +| +.Dv O_EXCL , +is better, as long as the code retries a new template if +.Xr open 2 +fails with an +.Va errno +of +.Er EEXIST . +.Sh ERRORS +The +.Fn mkstemp , +.Fn mkostemp , +.Fn mkstemps , +.Fn mkostemps +and +.Fn mkdtemp +functions +may set +.Va errno +to one of the following values: +.Bl -tag -width Er +.It Bq Er ENOTDIR +The pathname portion of the template is not an existing directory. +.El +.Pp +The +.Fn mktemp , +.Fn mkstemp +and +.Fn mkdtemp +functions +may also set +.Va errno +to any value specified by the +.Xr stat 2 +function. +.Pp +The +.Fn mkstemp +function +may also set +.Va errno +to any value specified by the +.Xr open 2 +function. +.Pp +The +.Fn mkdtemp +function +may also set +.Va errno +to any value specified by the +.Xr mkdir 2 +function. +.Sh SEE ALSO +.Xr chmod 2 , +.Xr getpid 2 , +.Xr open 2 , +.Xr stat 2 , +.Xr umask 2 +.Sh STANDARDS +The +.Fn mktemp +conforms to +.St -p1003.1-2001 . +It was however removed from the specification in the +.St -p1003.1-2008 +revision. +The +.Fn mkstemp +function conforms to +.St -p1003.1-2004 . +The +.Fn mkdtemp +function conforms to +.St -p1003.1-2008 . +The +.Fn mkostemp +function conforms to +.St -p1003.1-2024 . +.Sh HISTORY +A +.Fn mktemp +function appeared in +.At v7 . +.Pp +The +.Fn mkstemp +function appeared in +.Bx 4.4 . +.Pp +The +.Fn mkdtemp +function appeared in +.Nx 1.4 . +The +.Fn mkstemps +function first appeared in +.Ox 2.4 , +and later in +.Fx 3.4 +and +.Nx 7.0 . +The +.Fn mkostemp +and +.Fn mkostemps +functions appeared in +.Fx 10.0 +and +.Nx 7.0 . +.Sh BUGS +For +.Fn mktemp +there is an obvious race between file name selection and file +creation and deletion: the program is typically written to call +.Xr tmpnam 3 , +.Xr tempnam 3 , +or +.Fn mktemp . +Subsequently, the program calls +.Xr open 2 +or +.Xr fopen 3 +and erroneously opens a file (or symbolic link, fifo or other +device) that the attacker has created in the expected file location. +Hence +.Fn mkstemp +is recommended, since it atomically creates the file. +An attacker can guess the filenames produced by +.Fn mktemp . +Whenever it is possible, +.Fn mkstemp +or +.Fn mkdtemp +should be used instead. +.Pp +For this reason, +.Xr ld 1 +will output a warning message whenever it links code that uses +.Fn mktemp . +.Sh SECURITY CONSIDERATIONS +The use of +.Fn mktemp +should generally be avoided, as a hostile process can exploit a race +condition in the time between the generation of a temporary filename by +.Fn mktemp +and the invoker's use of the temporary name. +A link-time warning will be issued advising the use of +.Fn mkstemp +or +.Fn mkdtemp +instead. |
