Line data Source code
1 : /* Checking macros for stdio functions.
2 : Copyright (C) 2004-2022 Free Software Foundation, Inc.
3 : This file is part of the GNU C Library.
4 :
5 : The GNU C Library is free software; you can redistribute it and/or
6 : modify it under the terms of the GNU Lesser General Public
7 : License as published by the Free Software Foundation; either
8 : version 2.1 of the License, or (at your option) any later version.
9 :
10 : The GNU C Library is distributed in the hope that it will be useful,
11 : but WITHOUT ANY WARRANTY; without even the implied warranty of
12 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 : Lesser General Public License for more details.
14 :
15 : You should have received a copy of the GNU Lesser General Public
16 : License along with the GNU C Library; if not, see
17 : <https://www.gnu.org/licenses/>. */
18 :
19 : #ifndef _BITS_STDIO2_H
20 : #define _BITS_STDIO2_H 1
21 :
22 : #ifndef _STDIO_H
23 : # error "Never include <bits/stdio2.h> directly; use <stdio.h> instead."
24 : #endif
25 :
26 : extern int __sprintf_chk (char *__restrict __s, int __flag, size_t __slen,
27 : const char *__restrict __format, ...) __THROW
28 : __attr_access ((__write_only__, 1, 3));
29 : extern int __vsprintf_chk (char *__restrict __s, int __flag, size_t __slen,
30 : const char *__restrict __format,
31 : __gnuc_va_list __ap) __THROW
32 : __attr_access ((__write_only__, 1, 3));
33 :
34 : #ifdef __va_arg_pack
35 : __fortify_function int
36 : __NTH (sprintf (char *__restrict __s, const char *__restrict __fmt, ...))
37 : {
38 : return __builtin___sprintf_chk (__s, __USE_FORTIFY_LEVEL - 1,
39 : __glibc_objsize (__s), __fmt,
40 : __va_arg_pack ());
41 : }
42 : #elif !defined __cplusplus
43 : # define sprintf(str, ...) \
44 : __builtin___sprintf_chk (str, __USE_FORTIFY_LEVEL - 1, \
45 : __glibc_objsize (str), __VA_ARGS__)
46 : #endif
47 :
48 : __fortify_function int
49 : __NTH (vsprintf (char *__restrict __s, const char *__restrict __fmt,
50 : __gnuc_va_list __ap))
51 : {
52 : return __builtin___vsprintf_chk (__s, __USE_FORTIFY_LEVEL - 1,
53 : __glibc_objsize (__s), __fmt, __ap);
54 : }
55 :
56 : #if defined __USE_ISOC99 || defined __USE_UNIX98
57 :
58 : extern int __snprintf_chk (char *__restrict __s, size_t __n, int __flag,
59 : size_t __slen, const char *__restrict __format,
60 : ...) __THROW
61 : __attr_access ((__write_only__, 1, 2));
62 : extern int __vsnprintf_chk (char *__restrict __s, size_t __n, int __flag,
63 : size_t __slen, const char *__restrict __format,
64 : __gnuc_va_list __ap) __THROW;
65 :
66 : # ifdef __va_arg_pack
67 : __fortify_function int
68 18367850 : __NTH (snprintf (char *__restrict __s, size_t __n,
69 : const char *__restrict __fmt, ...))
70 : {
71 18345414 : return __builtin___snprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1,
72 : __glibc_objsize (__s), __fmt,
73 : __va_arg_pack ());
74 : }
75 : # elif !defined __cplusplus
76 : # define snprintf(str, len, ...) \
77 : __builtin___snprintf_chk (str, len, __USE_FORTIFY_LEVEL - 1, \
78 : __glibc_objsize (str), __VA_ARGS__)
79 : # endif
80 :
81 : __fortify_function int
82 35037438 : __NTH (vsnprintf (char *__restrict __s, size_t __n,
83 : const char *__restrict __fmt, __gnuc_va_list __ap))
84 : {
85 35037438 : return __builtin___vsnprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1,
86 : __glibc_objsize (__s), __fmt, __ap);
87 : }
88 :
89 : #endif
90 :
91 : #if __USE_FORTIFY_LEVEL > 1
92 :
93 : extern int __fprintf_chk (FILE *__restrict __stream, int __flag,
94 : const char *__restrict __format, ...);
95 : extern int __printf_chk (int __flag, const char *__restrict __format, ...);
96 : extern int __vfprintf_chk (FILE *__restrict __stream, int __flag,
97 : const char *__restrict __format, __gnuc_va_list __ap);
98 : extern int __vprintf_chk (int __flag, const char *__restrict __format,
99 : __gnuc_va_list __ap);
100 :
101 : # ifdef __va_arg_pack
102 : __fortify_function int
103 94550 : fprintf (FILE *__restrict __stream, const char *__restrict __fmt, ...)
104 : {
105 78471 : return __fprintf_chk (__stream, __USE_FORTIFY_LEVEL - 1, __fmt,
106 : __va_arg_pack ());
107 : }
108 :
109 : __fortify_function int
110 402327 : printf (const char *__restrict __fmt, ...)
111 : {
112 402223 : return __printf_chk (__USE_FORTIFY_LEVEL - 1, __fmt, __va_arg_pack ());
113 : }
114 : # elif !defined __cplusplus
115 : # define printf(...) \
116 : __printf_chk (__USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
117 : # define fprintf(stream, ...) \
118 : __fprintf_chk (stream, __USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
119 : # endif
120 :
121 : __fortify_function int
122 47836 : vprintf (const char *__restrict __fmt, __gnuc_va_list __ap)
123 : {
124 : #ifdef __USE_EXTERN_INLINES
125 47836 : return __vfprintf_chk (stdout, __USE_FORTIFY_LEVEL - 1, __fmt, __ap);
126 : #else
127 : return __vprintf_chk (__USE_FORTIFY_LEVEL - 1, __fmt, __ap);
128 : #endif
129 : }
130 :
131 : __fortify_function int
132 39966521 : vfprintf (FILE *__restrict __stream,
133 : const char *__restrict __fmt, __gnuc_va_list __ap)
134 : {
135 39966521 : return __vfprintf_chk (__stream, __USE_FORTIFY_LEVEL - 1, __fmt, __ap);
136 : }
137 :
138 : # ifdef __USE_XOPEN2K8
139 : extern int __dprintf_chk (int __fd, int __flag, const char *__restrict __fmt,
140 : ...) __attribute__ ((__format__ (__printf__, 3, 4)));
141 : extern int __vdprintf_chk (int __fd, int __flag,
142 : const char *__restrict __fmt, __gnuc_va_list __arg)
143 : __attribute__ ((__format__ (__printf__, 3, 0)));
144 :
145 : # ifdef __va_arg_pack
146 : __fortify_function int
147 0 : dprintf (int __fd, const char *__restrict __fmt, ...)
148 : {
149 0 : return __dprintf_chk (__fd, __USE_FORTIFY_LEVEL - 1, __fmt,
150 : __va_arg_pack ());
151 : }
152 : # elif !defined __cplusplus
153 : # define dprintf(fd, ...) \
154 : __dprintf_chk (fd, __USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
155 : # endif
156 :
157 : __fortify_function int
158 : vdprintf (int __fd, const char *__restrict __fmt, __gnuc_va_list __ap)
159 : {
160 : return __vdprintf_chk (__fd, __USE_FORTIFY_LEVEL - 1, __fmt, __ap);
161 : }
162 : # endif
163 :
164 : # ifdef __USE_GNU
165 :
166 : extern int __asprintf_chk (char **__restrict __ptr, int __flag,
167 : const char *__restrict __fmt, ...)
168 : __THROW __attribute__ ((__format__ (__printf__, 3, 4))) __wur;
169 : extern int __vasprintf_chk (char **__restrict __ptr, int __flag,
170 : const char *__restrict __fmt, __gnuc_va_list __arg)
171 : __THROW __attribute__ ((__format__ (__printf__, 3, 0))) __wur;
172 : extern int __obstack_printf_chk (struct obstack *__restrict __obstack,
173 : int __flag, const char *__restrict __format,
174 : ...)
175 : __THROW __attribute__ ((__format__ (__printf__, 3, 4)));
176 : extern int __obstack_vprintf_chk (struct obstack *__restrict __obstack,
177 : int __flag,
178 : const char *__restrict __format,
179 : __gnuc_va_list __args)
180 : __THROW __attribute__ ((__format__ (__printf__, 3, 0)));
181 :
182 : # ifdef __va_arg_pack
183 : __fortify_function int
184 88874 : __NTH (asprintf (char **__restrict __ptr, const char *__restrict __fmt, ...))
185 : {
186 88874 : return __asprintf_chk (__ptr, __USE_FORTIFY_LEVEL - 1, __fmt,
187 : __va_arg_pack ());
188 : }
189 :
190 : __fortify_function int
191 : __NTH (__asprintf (char **__restrict __ptr, const char *__restrict __fmt,
192 : ...))
193 : {
194 : return __asprintf_chk (__ptr, __USE_FORTIFY_LEVEL - 1, __fmt,
195 : __va_arg_pack ());
196 : }
197 :
198 : __fortify_function int
199 : __NTH (obstack_printf (struct obstack *__restrict __obstack,
200 : const char *__restrict __fmt, ...))
201 : {
202 : return __obstack_printf_chk (__obstack, __USE_FORTIFY_LEVEL - 1, __fmt,
203 : __va_arg_pack ());
204 : }
205 : # elif !defined __cplusplus
206 : # define asprintf(ptr, ...) \
207 : __asprintf_chk (ptr, __USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
208 : # define __asprintf(ptr, ...) \
209 : __asprintf_chk (ptr, __USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
210 : # define obstack_printf(obstack, ...) \
211 : __obstack_printf_chk (obstack, __USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
212 : # endif
213 :
214 : __fortify_function int
215 410232 : __NTH (vasprintf (char **__restrict __ptr, const char *__restrict __fmt,
216 : __gnuc_va_list __ap))
217 : {
218 410232 : return __vasprintf_chk (__ptr, __USE_FORTIFY_LEVEL - 1, __fmt, __ap);
219 : }
220 :
221 : __fortify_function int
222 : __NTH (obstack_vprintf (struct obstack *__restrict __obstack,
223 : const char *__restrict __fmt, __gnuc_va_list __ap))
224 : {
225 : return __obstack_vprintf_chk (__obstack, __USE_FORTIFY_LEVEL - 1, __fmt,
226 : __ap);
227 : }
228 :
229 : # endif
230 :
231 : #endif
232 :
233 : #if __GLIBC_USE (DEPRECATED_GETS)
234 : extern char *__gets_chk (char *__str, size_t) __wur;
235 : extern char *__REDIRECT (__gets_warn, (char *__str), gets)
236 : __wur __warnattr ("please use fgets or getline instead, gets can't "
237 : "specify buffer size");
238 :
239 : __fortify_function __wur char *
240 : gets (char *__str)
241 : {
242 : if (__glibc_objsize (__str) != (size_t) -1)
243 : return __gets_chk (__str, __glibc_objsize (__str));
244 : return __gets_warn (__str);
245 : }
246 : #endif
247 :
248 : extern char *__fgets_chk (char *__restrict __s, size_t __size, int __n,
249 : FILE *__restrict __stream)
250 : __wur __attr_access ((__write_only__, 1, 3));
251 : extern char *__REDIRECT (__fgets_alias,
252 : (char *__restrict __s, int __n,
253 : FILE *__restrict __stream), fgets)
254 : __wur __attr_access ((__write_only__, 1, 2));
255 : extern char *__REDIRECT (__fgets_chk_warn,
256 : (char *__restrict __s, size_t __size, int __n,
257 : FILE *__restrict __stream), __fgets_chk)
258 : __wur __warnattr ("fgets called with bigger size than length "
259 : "of destination buffer");
260 :
261 : __fortify_function __wur __fortified_attr_access (__write_only__, 1, 2) char *
262 2966291 : fgets (char *__restrict __s, int __n, FILE *__restrict __stream)
263 : {
264 2966291 : size_t sz = __glibc_objsize (__s);
265 2966291 : if (__glibc_safe_or_unknown_len (__n, sizeof (char), sz))
266 2966291 : return __fgets_alias (__s, __n, __stream);
267 0 : if (__glibc_unsafe_len (__n, sizeof (char), sz))
268 0 : return __fgets_chk_warn (__s, sz, __n, __stream);
269 0 : return __fgets_chk (__s, sz, __n, __stream);
270 : }
271 :
272 : extern size_t __fread_chk (void *__restrict __ptr, size_t __ptrlen,
273 : size_t __size, size_t __n,
274 : FILE *__restrict __stream) __wur;
275 : extern size_t __REDIRECT (__fread_alias,
276 : (void *__restrict __ptr, size_t __size,
277 : size_t __n, FILE *__restrict __stream),
278 : fread) __wur;
279 : extern size_t __REDIRECT (__fread_chk_warn,
280 : (void *__restrict __ptr, size_t __ptrlen,
281 : size_t __size, size_t __n,
282 : FILE *__restrict __stream),
283 : __fread_chk)
284 : __wur __warnattr ("fread called with bigger size * nmemb than length "
285 : "of destination buffer");
286 :
287 : __fortify_function __wur size_t
288 65771137 : fread (void *__restrict __ptr, size_t __size, size_t __n,
289 : FILE *__restrict __stream)
290 : {
291 65771137 : size_t sz = __glibc_objsize0 (__ptr);
292 65771137 : if (__glibc_safe_or_unknown_len (__n, __size, sz))
293 65771137 : return __fread_alias (__ptr, __size, __n, __stream);
294 0 : if (__glibc_unsafe_len (__n, __size, sz))
295 0 : return __fread_chk_warn (__ptr, sz, __size, __n, __stream);
296 0 : return __fread_chk (__ptr, sz, __size, __n, __stream);
297 : }
298 :
299 : #ifdef __USE_GNU
300 : extern char *__fgets_unlocked_chk (char *__restrict __s, size_t __size,
301 : int __n, FILE *__restrict __stream)
302 : __wur __attr_access ((__write_only__, 1, 3));
303 : extern char *__REDIRECT (__fgets_unlocked_alias,
304 : (char *__restrict __s, int __n,
305 : FILE *__restrict __stream), fgets_unlocked)
306 : __wur __attr_access ((__write_only__, 1, 2));
307 : extern char *__REDIRECT (__fgets_unlocked_chk_warn,
308 : (char *__restrict __s, size_t __size, int __n,
309 : FILE *__restrict __stream), __fgets_unlocked_chk)
310 : __wur __warnattr ("fgets_unlocked called with bigger size than length "
311 : "of destination buffer");
312 :
313 : __fortify_function __wur __fortified_attr_access (__write_only__, 1, 2) char *
314 : fgets_unlocked (char *__restrict __s, int __n, FILE *__restrict __stream)
315 : {
316 : size_t sz = __glibc_objsize (__s);
317 : if (__glibc_safe_or_unknown_len (__n, sizeof (char), sz))
318 : return __fgets_unlocked_alias (__s, __n, __stream);
319 : if (__glibc_unsafe_len (__n, sizeof (char), sz))
320 : return __fgets_unlocked_chk_warn (__s, sz, __n, __stream);
321 : return __fgets_unlocked_chk (__s, sz, __n, __stream);
322 : }
323 : #endif
324 :
325 : #ifdef __USE_MISC
326 : # undef fread_unlocked
327 : extern size_t __fread_unlocked_chk (void *__restrict __ptr, size_t __ptrlen,
328 : size_t __size, size_t __n,
329 : FILE *__restrict __stream) __wur;
330 : extern size_t __REDIRECT (__fread_unlocked_alias,
331 : (void *__restrict __ptr, size_t __size,
332 : size_t __n, FILE *__restrict __stream),
333 : fread_unlocked) __wur;
334 : extern size_t __REDIRECT (__fread_unlocked_chk_warn,
335 : (void *__restrict __ptr, size_t __ptrlen,
336 : size_t __size, size_t __n,
337 : FILE *__restrict __stream),
338 : __fread_unlocked_chk)
339 : __wur __warnattr ("fread_unlocked called with bigger size * nmemb than "
340 : "length of destination buffer");
341 :
342 : __fortify_function __wur size_t
343 : fread_unlocked (void *__restrict __ptr, size_t __size, size_t __n,
344 : FILE *__restrict __stream)
345 : {
346 : size_t sz = __glibc_objsize0 (__ptr);
347 : if (__glibc_safe_or_unknown_len (__n, __size, sz))
348 : {
349 : # ifdef __USE_EXTERN_INLINES
350 : if (__builtin_constant_p (__size)
351 : && __builtin_constant_p (__n)
352 : && (__size | __n) < (((size_t) 1) << (8 * sizeof (size_t) / 2))
353 : && __size * __n <= 8)
354 : {
355 : size_t __cnt = __size * __n;
356 : char *__cptr = (char *) __ptr;
357 : if (__cnt == 0)
358 : return 0;
359 :
360 : for (; __cnt > 0; --__cnt)
361 : {
362 : int __c = getc_unlocked (__stream);
363 : if (__c == EOF)
364 : break;
365 : *__cptr++ = __c;
366 : }
367 : return (__cptr - (char *) __ptr) / __size;
368 : }
369 : # endif
370 : return __fread_unlocked_alias (__ptr, __size, __n, __stream);
371 : }
372 : if (__glibc_unsafe_len (__n, __size, sz))
373 : return __fread_unlocked_chk_warn (__ptr, sz, __size, __n, __stream);
374 : return __fread_unlocked_chk (__ptr, sz, __size, __n, __stream);
375 :
376 : }
377 : #endif
378 :
379 : #endif /* bits/stdio2.h. */
|