xref: /freebsd/lib/libc/stdio/mktemp.3 (revision 6966ac055c3b7a39266fb982493330df7a097997)
1.\" Copyright (c) 1989, 1991, 1993
2.\"	The Regents of the University of California.  All rights reserved.
3.\"
4.\" Redistribution and use in source and binary forms, with or without
5.\" modification, are permitted provided that the following conditions
6.\" are met:
7.\" 1. Redistributions of source code must retain the above copyright
8.\"    notice, this list of conditions and the following disclaimer.
9.\" 2. Redistributions in binary form must reproduce the above copyright
10.\"    notice, this list of conditions and the following disclaimer in the
11.\"    documentation and/or other materials provided with the distribution.
12.\" 3. Neither the name of the University nor the names of its contributors
13.\"    may be used to endorse or promote products derived from this software
14.\"    without specific prior written permission.
15.\"
16.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
17.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
20.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26.\" SUCH DAMAGE.
27.\"
28.\"     @(#)mktemp.3	8.1 (Berkeley) 6/4/93
29.\" $FreeBSD$
30.\"
31.Dd July 29, 2019
32.Dt MKTEMP 3
33.Os
34.Sh NAME
35.Nm mktemp
36.Nd make temporary file name (unique)
37.Sh LIBRARY
38.Lb libc
39.Sh SYNOPSIS
40.In stdlib.h
41.Ft char *
42.Fn mktemp "char *template"
43.Ft int
44.Fn mkstemp "char *template"
45.Ft int
46.Fn mkostemp "char *template" "int oflags"
47.Ft int
48.Fn mkostemps "char *template" "int suffixlen" "int oflags"
49.Ft int
50.Fn mkostempsat "int dfd" "char *template" "int suffixlen" "int oflags"
51.Ft char *
52.Fn mkdtemp "char *template"
53.In unistd.h
54.Ft int
55.Fn mkstemps "char *template" "int suffixlen"
56.Sh DESCRIPTION
57The
58.Fn mktemp
59function
60takes the given file name template and overwrites a portion of it
61to create a file name.
62This file name is guaranteed not to exist at the time of function invocation
63and is suitable for use
64by the application.
65The template may be any file name with some number of
66.Ql X Ns s
67appended
68to it, for example
69.Pa /tmp/temp.XXXXXX .
70The trailing
71.Ql X Ns s
72are replaced with a
73unique alphanumeric combination.
74The number of unique file names
75.Fn mktemp
76can return depends on the number of
77.Ql X Ns s
78provided; six
79.Ql X Ns s
80will
81result in
82.Fn mktemp
83selecting one of 56800235584 (62 ** 6) possible temporary file names.
84.Pp
85The
86.Fn mkstemp
87function
88makes the same replacement to the template and creates the template file,
89mode 0600, returning a file descriptor opened for reading and writing.
90This avoids the race between testing for a file's existence and opening it
91for use.
92.Pp
93The
94.Fn mkostemp
95function
96is like
97.Fn mkstemp
98but allows specifying additional
99.Xr open 2
100flags (defined in
101.In fcntl.h ) .
102The permitted flags are
103.Dv O_APPEND ,
104.Dv O_DIRECT ,
105.Dv O_SHLOCK ,
106.Dv O_EXLOCK ,
107.Dv O_SYNC
108and
109.Dv O_CLOEXEC .
110.Pp
111The
112.Fn mkstemps
113and
114.Fn mkostemps
115functions act the same as
116.Fn mkstemp
117and
118.Fn mkostemp
119respectively,
120except they permit a suffix to exist in the template.
121The template should be of the form
122.Pa /tmp/tmpXXXXXXsuffix .
123The
124.Fn mkstemps
125and
126.Fn mkostemps
127function
128are told the length of the suffix string.
129.Pp
130The
131.Fn mkostempsat
132function acts the same as
133.Fn mkostemps
134but takes an additional directory descriptor as a parameter.
135The temporary file is created relative to the corresponding
136directory, or to the current working directory if the special
137value
138.Dv AT_FDCWD
139is specified.
140If the template path is an absolute path, the
141.Fa dfd
142parameter is ignored and the behavior is identical to
143.Fn mkostemps .
144.Pp
145The
146.Fn mkdtemp
147function makes the same replacement to the template as in
148.Fn mktemp
149and creates the template directory, mode 0700.
150.Sh RETURN VALUES
151The
152.Fn mktemp
153and
154.Fn mkdtemp
155functions return a pointer to the template on success and
156.Dv NULL
157on failure.
158The
159.Fn mkstemp ,
160.Fn mkostemp
161.Fn mkstemps
162and
163.Fn mkostemps
164functions
165return \-1 if no suitable file could be created.
166If either call fails an error code is placed in the global variable
167.Va errno .
168.Sh ERRORS
169The
170.Fn mkstemp ,
171.Fn mkostemp ,
172.Fn mkstemps ,
173.Fn mkostemps
174and
175.Fn mkdtemp
176functions
177may set
178.Va errno
179to one of the following values:
180.Bl -tag -width Er
181.It Bq Er ENOTDIR
182The pathname portion of the template is not an existing directory.
183.El
184.Pp
185The
186.Fn mkostemp
187and
188.Fn mkostemps
189functions
190may also set
191.Va errno
192to the following value:
193.Bl -tag -width Er
194.It Bq Er EINVAL
195The
196.Fa oflags
197argument is invalid.
198.El
199.Pp
200The
201.Fn mkstemp ,
202.Fn mkostemp ,
203.Fn mkstemps ,
204.Fn mkostemps
205and
206.Fn mkdtemp
207functions
208may also set
209.Va errno
210to any value specified by the
211.Xr stat 2
212function.
213.Pp
214The
215.Fn mkstemp ,
216.Fn mkostemp ,
217.Fn mkstemps
218and
219.Fn mkostemps
220functions
221may also set
222.Va errno
223to any value specified by the
224.Xr open 2
225function.
226.Pp
227The
228.Fn mkdtemp
229function
230may also set
231.Va errno
232to any value specified by the
233.Xr mkdir 2
234function.
235.Sh NOTES
236A common problem that results in a core dump is that the programmer
237passes in a read-only string to
238.Fn mktemp ,
239.Fn mkstemp ,
240.Fn mkstemps
241or
242.Fn mkdtemp .
243This is common with programs that were developed before
244.St -isoC
245compilers were common.
246For example, calling
247.Fn mkstemp
248with an argument of
249.Qq /tmp/tempfile.XXXXXX
250will result in a core dump due to
251.Fn mkstemp
252attempting to modify the string constant that was given.
253.Pp
254The
255.Fn mkdtemp ,
256.Fn mkstemp
257and
258.Fn mktemp
259function prototypes are also available from
260.In unistd.h .
261.Sh SEE ALSO
262.Xr chmod 2 ,
263.Xr getpid 2 ,
264.Xr mkdir 2 ,
265.Xr open 2 ,
266.Xr stat 2
267.Sh STANDARDS
268The
269.Fn mkstemp
270and
271.Fn mkdtemp
272functions are expected to conform to
273.St -p1003.1-2008 .
274The
275.Fn mktemp
276function is expected to conform to
277.St -p1003.1-2001
278and is not specified by
279.St -p1003.1-2008 .
280The
281.Fn mkostemp ,
282.Fn mkstemps ,
283.Fn mkostemps
284and
285.Fn mkostempsat
286functions do not conform to any standard.
287.Sh HISTORY
288A
289.Fn mktemp
290function appeared in
291.At v7 .
292The
293.Fn mkstemp
294function appeared in
295.Bx 4.4 .
296The
297.Fn mkdtemp
298function first appeared in
299.Ox 2.2 ,
300and later in
301.Fx 3.2 .
302The
303.Fn mkstemps
304function first appeared in
305.Ox 2.4 ,
306and later in
307.Fx 3.4 .
308The
309.Fn mkostemp
310and
311.Fn mkostemps
312functions appeared in
313.Fx 10.0 .
314The
315.Fn mkostempsat
316function appeared in
317.Fx 13.0 .
318.Sh BUGS
319This family of functions produces filenames which can be guessed,
320though the risk is minimized when large numbers of
321.Ql X Ns s
322are used to
323increase the number of possible temporary filenames.
324This makes the race in
325.Fn mktemp ,
326between testing for a file's existence (in the
327.Fn mktemp
328function call)
329and opening it for use
330(later in the user application)
331particularly dangerous from a security perspective.
332Whenever it is possible,
333.Fn mkstemp ,
334.Fn mkostemp
335or
336.Fn mkostempsat
337should be used instead, since they do not have the race condition.
338If
339.Fn mkstemp
340cannot be used, the filename created by
341.Fn mktemp
342should be created using the
343.Dv O_EXCL
344flag to
345.Xr open 2
346and the return status of the call should be tested for failure.
347This will ensure that the program does not continue blindly
348in the event that an attacker has already created the file
349with the intention of manipulating or reading its contents.
350