]> CyberLeo.Net >> Repos - FreeBSD/releng/8.1.git/blob - lib/libc/stdio/mktemp.3
Copy stable/8 to releng/8.1 in preparation for 8.1-RC1.
[FreeBSD/releng/8.1.git] / lib / libc / stdio / mktemp.3
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 .\" 4. 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 February 11, 1998
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 unistd.h
41 .Ft char *
42 .Fn mktemp "char *template"
43 .Ft int
44 .Fn mkstemp "char *template"
45 .Ft int
46 .Fn mkstemps "char *template" "int suffixlen"
47 .Ft char *
48 .Fn mkdtemp "char *template"
49 .Sh DESCRIPTION
50 The
51 .Fn mktemp
52 function
53 takes the given file name template and overwrites a portion of it
54 to create a file name.
55 This file name is guaranteed not to exist at the time of function invocation
56 and is suitable for use
57 by the application.
58 The template may be any file name with some number of
59 .Ql X Ns s
60 appended
61 to it, for example
62 .Pa /tmp/temp.XXXXXX .
63 The trailing
64 .Ql X Ns s
65 are replaced with a
66 unique alphanumeric combination.
67 The number of unique file names
68 .Fn mktemp
69 can return depends on the number of
70 .Ql X Ns s
71 provided; six
72 .Ql X Ns s
73 will
74 result in
75 .Fn mktemp
76 selecting one of 56800235584 (62 ** 6) possible temporary file names.
77 .Pp
78 The
79 .Fn mkstemp
80 function
81 makes the same replacement to the template and creates the template file,
82 mode 0600, returning a file descriptor opened for reading and writing.
83 This avoids the race between testing for a file's existence and opening it
84 for use.
85 .Pp
86 The
87 .Fn mkstemps
88 function acts the same as
89 .Fn mkstemp ,
90 except it permits a suffix to exist in the template.
91 The template should be of the form
92 .Pa /tmp/tmpXXXXXXsuffix .
93 The
94 .Fn mkstemps
95 function
96 is told the length of the suffix string.
97 .Pp
98 The
99 .Fn mkdtemp
100 function makes the same replacement to the template as in
101 .Fn mktemp
102 and creates the template directory, mode 0700.
103 .Sh RETURN VALUES
104 The
105 .Fn mktemp
106 and
107 .Fn mkdtemp
108 functions return a pointer to the template on success and
109 .Dv NULL
110 on failure.
111 The
112 .Fn mkstemp
113 and
114 .Fn mkstemps
115 functions
116 return \-1 if no suitable file could be created.
117 If either call fails an error code is placed in the global variable
118 .Va errno .
119 .Sh ERRORS
120 The
121 .Fn mkstemp ,
122 .Fn mkstemps
123 and
124 .Fn mkdtemp
125 functions
126 may set
127 .Va errno
128 to one of the following values:
129 .Bl -tag -width Er
130 .It Bq Er ENOTDIR
131 The pathname portion of the template is not an existing directory.
132 .El
133 .Pp
134 The
135 .Fn mkstemp ,
136 .Fn mkstemps
137 and
138 .Fn mkdtemp
139 functions
140 may also set
141 .Va errno
142 to any value specified by the
143 .Xr stat 2
144 function.
145 .Pp
146 The
147 .Fn mkstemp
148 and
149 .Fn mkstemps
150 functions
151 may also set
152 .Va errno
153 to any value specified by the
154 .Xr open 2
155 function.
156 .Pp
157 The
158 .Fn mkdtemp
159 function
160 may also set
161 .Va errno
162 to any value specified by the
163 .Xr mkdir 2
164 function.
165 .Sh NOTES
166 A common problem that results in a core dump is that the programmer
167 passes in a read-only string to
168 .Fn mktemp ,
169 .Fn mkstemp ,
170 .Fn mkstemps
171 or
172 .Fn mkdtemp .
173 This is common with programs that were developed before
174 .St -isoC
175 compilers were common.
176 For example, calling
177 .Fn mkstemp
178 with an argument of
179 .Qq /tmp/tempfile.XXXXXX
180 will result in a core dump due to
181 .Fn mkstemp
182 attempting to modify the string constant that was given.
183 If the program in question makes heavy use of that type
184 of function call, you do have the option of compiling the program
185 so that it will store string constants in a writable segment of memory.
186 See
187 .Xr gcc 1
188 for more information.
189 .Sh SEE ALSO
190 .Xr chmod 2 ,
191 .Xr getpid 2 ,
192 .Xr mkdir 2 ,
193 .Xr open 2 ,
194 .Xr stat 2
195 .Sh HISTORY
196 A
197 .Fn mktemp
198 function appeared in
199 .At v7 .
200 The
201 .Fn mkstemp
202 function appeared in
203 .Bx 4.4 .
204 The
205 .Fn mkdtemp
206 function first appeared in
207 .Ox 2.2 ,
208 and later in
209 .Fx 3.2 .
210 The
211 .Fn mkstemps
212 function first appeared in
213 .Ox 2.4 ,
214 and later in
215 .Fx 3.4 .
216 .Sh BUGS
217 This family of functions produces filenames which can be guessed,
218 though the risk is minimized when large numbers of
219 .Ql X Ns s
220 are used to
221 increase the number of possible temporary filenames.
222 This makes the race in
223 .Fn mktemp ,
224 between testing for a file's existence (in the
225 .Fn mktemp
226 function call)
227 and opening it for use
228 (later in the user application)
229 particularly dangerous from a security perspective.
230 Whenever it is possible,
231 .Fn mkstemp
232 should be used instead, since it does not have the race condition.
233 If
234 .Fn mkstemp
235 cannot be used, the filename created by
236 .Fn mktemp
237 should be created using the
238 .Dv O_EXCL
239 flag to
240 .Xr open 2
241 and the return status of the call should be tested for failure.
242 This will ensure that the program does not continue blindly
243 in the event that an attacker has already created the file
244 with the intention of manipulating or reading its contents.
245 .Pp
246 The implementation of these functions calls
247 .Xr arc4random 3 ,
248 which is not reentrant.
249 You must provide your own locking around this and other consumers of the
250 .Xr arc4random 3
251 API.