1 : /* Checking macros for stdio functions.
2 : Copyright (C) 2004, 2005, 2007, 2008 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, write to the Free
17 : Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18 : 02111-1307 USA. */
19 :
20 : #ifndef _STDIO_H
21 : # error "Never include <bits/stdio2.h> directly; use <stdio.h> instead."
22 : #endif
23 :
24 : extern int __sprintf_chk (char *__restrict __s, int __flag, size_t __slen,
25 : __const char *__restrict __format, ...) __THROW;
26 : extern int __vsprintf_chk (char *__restrict __s, int __flag, size_t __slen,
27 : __const char *__restrict __format,
28 : _G_va_list __ap) __THROW;
29 :
30 : #ifdef __va_arg_pack
31 : __extern_always_inline int
32 : __NTH (sprintf (char *__restrict __s, __const char *__restrict __fmt, ...))
33 : {
34 18340 : return __builtin___sprintf_chk (__s, __USE_FORTIFY_LEVEL - 1,
35 : __bos (__s), __fmt, __va_arg_pack ());
36 : }
37 : #elif !defined __cplusplus
38 : # define sprintf(str, ...) \
39 : __builtin___sprintf_chk (str, __USE_FORTIFY_LEVEL - 1, __bos (str), \
40 : __VA_ARGS__)
41 : #endif
42 :
43 : __extern_always_inline int
44 : __NTH (vsprintf (char *__restrict __s, __const char *__restrict __fmt,
45 : _G_va_list __ap))
46 : {
47 : return __builtin___vsprintf_chk (__s, __USE_FORTIFY_LEVEL - 1,
48 : __bos (__s), __fmt, __ap);
49 : }
50 :
51 : #if defined __USE_BSD || defined __USE_ISOC99 || defined __USE_UNIX98
52 :
53 : extern int __snprintf_chk (char *__restrict __s, size_t __n, int __flag,
54 : size_t __slen, __const char *__restrict __format,
55 : ...) __THROW;
56 : extern int __vsnprintf_chk (char *__restrict __s, size_t __n, int __flag,
57 : size_t __slen, __const char *__restrict __format,
58 : _G_va_list __ap) __THROW;
59 :
60 : # ifdef __va_arg_pack
61 : __extern_always_inline int
62 : __NTH (snprintf (char *__restrict __s, size_t __n,
63 : __const char *__restrict __fmt, ...))
64 : {
65 317824 : return __builtin___snprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1,
66 : __bos (__s), __fmt, __va_arg_pack ());
67 : }
68 : # elif !defined __cplusplus
69 : # define snprintf(str, len, ...) \
70 : __builtin___snprintf_chk (str, len, __USE_FORTIFY_LEVEL - 1, __bos (str), \
71 : __VA_ARGS__)
72 : # endif
73 :
74 : __extern_always_inline int
75 : __NTH (vsnprintf (char *__restrict __s, size_t __n,
76 : __const char *__restrict __fmt, _G_va_list __ap))
77 : {
78 1081194 : return __builtin___vsnprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1,
79 : __bos (__s), __fmt, __ap);
80 : }
81 :
82 : #endif
83 :
84 : #if __USE_FORTIFY_LEVEL > 1
85 :
86 : extern int __fprintf_chk (FILE *__restrict __stream, int __flag,
87 : __const char *__restrict __format, ...);
88 : extern int __printf_chk (int __flag, __const char *__restrict __format, ...);
89 : extern int __vfprintf_chk (FILE *__restrict __stream, int __flag,
90 : __const char *__restrict __format, _G_va_list __ap);
91 : extern int __vprintf_chk (int __flag, __const char *__restrict __format,
92 : _G_va_list __ap);
93 :
94 : # ifdef __va_arg_pack
95 : __extern_always_inline int
96 : fprintf (FILE *__restrict __stream, __const char *__restrict __fmt, ...)
97 : {
98 1184 : return __fprintf_chk (__stream, __USE_FORTIFY_LEVEL - 1, __fmt,
99 : __va_arg_pack ());
100 : }
101 :
102 : __extern_always_inline int
103 : printf (__const char *__restrict __fmt, ...)
104 : {
105 8 : return __printf_chk (__USE_FORTIFY_LEVEL - 1, __fmt, __va_arg_pack ());
106 : }
107 : # elif !defined __cplusplus
108 : # define printf(...) \
109 : __printf_chk (__USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
110 : # define fprintf(stream, ...) \
111 : __fprintf_chk (stream, __USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
112 : # endif
113 :
114 : __extern_always_inline int
115 : vprintf (__const char *__restrict __fmt, _G_va_list __ap)
116 : {
117 : #ifdef __USE_EXTERN_INLINES
118 : return __vfprintf_chk (stdout, __USE_FORTIFY_LEVEL - 1, __fmt, __ap);
119 : #else
120 : return __vprintf_chk (__USE_FORTIFY_LEVEL - 1, __fmt, __ap);
121 : #endif
122 : }
123 :
124 : __extern_always_inline int
125 : vfprintf (FILE *__restrict __stream,
126 : __const char *__restrict __fmt, _G_va_list __ap)
127 : {
128 : return __vfprintf_chk (__stream, __USE_FORTIFY_LEVEL - 1, __fmt, __ap);
129 : }
130 :
131 : # ifdef __USE_GNU
132 :
133 : extern int __asprintf_chk (char **__restrict __ptr, int __flag,
134 : __const char *__restrict __fmt, ...)
135 : __THROW __attribute__ ((__format__ (__printf__, 3, 4))) __wur;
136 : extern int __vasprintf_chk (char **__restrict __ptr, int __flag,
137 : __const char *__restrict __fmt, _G_va_list __arg)
138 : __THROW __attribute__ ((__format__ (__printf__, 3, 0))) __wur;
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, _G_va_list __arg)
143 : __attribute__ ((__format__ (__printf__, 3, 0)));
144 : extern int __obstack_printf_chk (struct obstack *__restrict __obstack,
145 : int __flag, __const char *__restrict __format,
146 : ...)
147 : __THROW __attribute__ ((__format__ (__printf__, 3, 4)));
148 : extern int __obstack_vprintf_chk (struct obstack *__restrict __obstack,
149 : int __flag,
150 : __const char *__restrict __format,
151 : _G_va_list __args)
152 : __THROW __attribute__ ((__format__ (__printf__, 3, 0)));
153 :
154 : # ifdef __va_arg_pack
155 : __extern_always_inline int
156 : __NTH (asprintf (char **__restrict __ptr, __const char *__restrict __fmt, ...))
157 : {
158 : return __asprintf_chk (__ptr, __USE_FORTIFY_LEVEL - 1, __fmt,
159 : __va_arg_pack ());
160 : }
161 :
162 : __extern_always_inline int
163 : __NTH (__asprintf (char **__restrict __ptr, __const char *__restrict __fmt,
164 : ...))
165 : {
166 : return __asprintf_chk (__ptr, __USE_FORTIFY_LEVEL - 1, __fmt,
167 : __va_arg_pack ());
168 : }
169 :
170 : __extern_always_inline int
171 : dprintf (int __fd, __const char *__restrict __fmt, ...)
172 : {
173 : return __dprintf_chk (__fd, __USE_FORTIFY_LEVEL - 1, __fmt,
174 : __va_arg_pack ());
175 : }
176 :
177 : __extern_always_inline int
178 : __NTH (obstack_printf (struct obstack *__restrict __obstack,
179 : __const char *__restrict __fmt, ...))
180 : {
181 : return __obstack_printf_chk (__obstack, __USE_FORTIFY_LEVEL - 1, __fmt,
182 : __va_arg_pack ());
183 : }
184 : # elif !defined __cplusplus
185 : # define asprintf(ptr, ...) \
186 : __asprintf_chk (ptr, __USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
187 : # define __asprintf(ptr, ...) \
188 : __asprintf_chk (ptr, __USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
189 : # define dprintf(fd, ...) \
190 : __dprintf_chk (fd, __USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
191 : # define obstack_printf(obstack, ...) \
192 : __obstack_printf_chk (obstack, __USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
193 : # endif
194 :
195 : __extern_always_inline int
196 : __NTH (vasprintf (char **__restrict __ptr, __const char *__restrict __fmt,
197 : _G_va_list __ap))
198 : {
199 : return __vasprintf_chk (__ptr, __USE_FORTIFY_LEVEL - 1, __fmt, __ap);
200 : }
201 :
202 : __extern_always_inline int
203 : vdprintf (int __fd, __const char *__restrict __fmt, _G_va_list __ap)
204 : {
205 : return __vdprintf_chk (__fd, __USE_FORTIFY_LEVEL - 1, __fmt, __ap);
206 : }
207 :
208 : __extern_always_inline int
209 : __NTH (obstack_vprintf (struct obstack *__restrict __obstack,
210 : __const char *__restrict __fmt, _G_va_list __ap))
211 : {
212 : return __obstack_vprintf_chk (__obstack, __USE_FORTIFY_LEVEL - 1, __fmt,
213 : __ap);
214 : }
215 :
216 : # endif
217 :
218 : #endif
219 :
220 : extern char *__gets_chk (char *__str, size_t) __wur;
221 : extern char *__REDIRECT (__gets_warn, (char *__str), gets)
222 : __wur __warnattr ("please use fgets or getline instead, gets can't "
223 : "specify buffer size");
224 :
225 : __extern_always_inline __wur char *
226 : gets (char *__str)
227 : {
228 : if (__bos (__str) != (size_t) -1)
229 : return __gets_chk (__str, __bos (__str));
230 : return __gets_warn (__str);
231 : }
232 :
233 : extern char *__fgets_chk (char *__restrict __s, size_t __size, int __n,
234 : FILE *__restrict __stream) __wur;
235 : extern char *__REDIRECT (__fgets_alias,
236 : (char *__restrict __s, int __n,
237 : FILE *__restrict __stream), fgets) __wur;
238 : extern char *__REDIRECT (__fgets_chk_warn,
239 : (char *__restrict __s, size_t __size, int __n,
240 : FILE *__restrict __stream), __fgets_chk)
241 : __wur __warnattr ("fgets called with bigger size than length "
242 : "of destination buffer");
243 :
244 : __extern_always_inline __wur char *
245 : fgets (char *__restrict __s, int __n, FILE *__restrict __stream)
246 : {
247 16436 : if (__bos (__s) != (size_t) -1)
248 : {
249 16436 : if (!__builtin_constant_p (__n) || __n <= 0)
250 0 : return __fgets_chk (__s, __bos (__s), __n, __stream);
251 :
252 16436 : if ((size_t) __n > __bos (__s))
253 0 : return __fgets_chk_warn (__s, __bos (__s), __n, __stream);
254 : }
255 16436 : return __fgets_alias (__s, __n, __stream);
256 : }
257 :
258 : extern size_t __fread_chk (void *__restrict __ptr, size_t __ptrlen,
259 : size_t __size, size_t __n,
260 : FILE *__restrict __stream) __wur;
261 : extern size_t __REDIRECT (__fread_alias,
262 : (void *__restrict __ptr, size_t __size,
263 : size_t __n, FILE *__restrict __stream),
264 : fread) __wur;
265 : extern size_t __REDIRECT (__fread_chk_warn,
266 : (void *__restrict __ptr, size_t __ptrlen,
267 : size_t __size, size_t __n,
268 : FILE *__restrict __stream),
269 : __fread_chk)
270 : __wur __warnattr ("fread called with bigger size * nmemb than length "
271 : "of destination buffer");
272 :
273 : __extern_always_inline __wur size_t
274 : fread (void *__restrict __ptr, size_t __size, size_t __n,
275 : FILE *__restrict __stream)
276 : {
277 5095995 : if (__bos0 (__ptr) != (size_t) -1)
278 : {
279 43143 : if (!__builtin_constant_p (__size)
280 14381 : || !__builtin_constant_p (__n)
281 14381 : || (__size | __n) >= (((size_t) 1) << (8 * sizeof (size_t) / 2)))
282 0 : return __fread_chk (__ptr, __bos0 (__ptr), __size, __n, __stream);
283 :
284 14381 : if (__size * __n > __bos0 (__ptr))
285 0 : return __fread_chk_warn (__ptr, __bos0 (__ptr), __size, __n, __stream);
286 : }
287 5095995 : return __fread_alias (__ptr, __size, __n, __stream);
288 : }
289 :
290 : #ifdef __USE_GNU
291 : extern char *__fgets_unlocked_chk (char *__restrict __s, size_t __size,
292 : int __n, FILE *__restrict __stream) __wur;
293 : extern char *__REDIRECT (__fgets_unlocked_alias,
294 : (char *__restrict __s, int __n,
295 : FILE *__restrict __stream), fgets_unlocked) __wur;
296 : extern char *__REDIRECT (__fgets_unlocked_chk_warn,
297 : (char *__restrict __s, size_t __size, int __n,
298 : FILE *__restrict __stream), __fgets_unlocked_chk)
299 : __wur __warnattr ("fgets_unlocked called with bigger size than length "
300 : "of destination buffer");
301 :
302 : __extern_always_inline __wur char *
303 : fgets_unlocked (char *__restrict __s, int __n, FILE *__restrict __stream)
304 : {
305 : if (__bos (__s) != (size_t) -1)
306 : {
307 : if (!__builtin_constant_p (__n) || __n <= 0)
308 : return __fgets_unlocked_chk (__s, __bos (__s), __n, __stream);
309 :
310 : if ((size_t) __n > __bos (__s))
311 : return __fgets_unlocked_chk_warn (__s, __bos (__s), __n, __stream);
312 : }
313 : return __fgets_unlocked_alias (__s, __n, __stream);
314 : }
315 : #endif
316 :
317 : #ifdef __USE_MISC
318 : # undef fread_unlocked
319 : extern size_t __fread_unlocked_chk (void *__restrict __ptr, size_t __ptrlen,
320 : size_t __size, size_t __n,
321 : FILE *__restrict __stream) __wur;
322 : extern size_t __REDIRECT (__fread_unlocked_alias,
323 : (void *__restrict __ptr, size_t __size,
324 : size_t __n, FILE *__restrict __stream),
325 : fread_unlocked) __wur;
326 : extern size_t __REDIRECT (__fread_unlocked_chk_warn,
327 : (void *__restrict __ptr, size_t __ptrlen,
328 : size_t __size, size_t __n,
329 : FILE *__restrict __stream),
330 : __fread_unlocked_chk)
331 : __wur __warnattr ("fread_unlocked called with bigger size * nmemb than "
332 : "length of destination buffer");
333 :
334 : __extern_always_inline __wur size_t
335 : fread_unlocked (void *__restrict __ptr, size_t __size, size_t __n,
336 : FILE *__restrict __stream)
337 : {
338 : if (__bos0 (__ptr) != (size_t) -1)
339 : {
340 : if (!__builtin_constant_p (__size)
341 : || !__builtin_constant_p (__n)
342 : || (__size | __n) >= (((size_t) 1) << (8 * sizeof (size_t) / 2)))
343 : return __fread_unlocked_chk (__ptr, __bos0 (__ptr), __size, __n,
344 : __stream);
345 :
346 : if (__size * __n > __bos0 (__ptr))
347 : return __fread_unlocked_chk_warn (__ptr, __bos0 (__ptr), __size, __n,
348 : __stream);
349 : }
350 :
351 : # ifdef __USE_EXTERN_INLINES
352 : if (__builtin_constant_p (__size)
353 : && __builtin_constant_p (__n)
354 : && (__size | __n) < (((size_t) 1) << (8 * sizeof (size_t) / 2))
355 : && __size * __n <= 8)
356 : {
357 : size_t __cnt = __size * __n;
358 : char *__cptr = (char *) __ptr;
359 : if (__cnt == 0)
360 : return 0;
361 :
362 : for (; __cnt > 0; --__cnt)
363 : {
364 : int __c = _IO_getc_unlocked (__stream);
365 : if (__c == EOF)
366 : break;
367 : *__cptr++ = __c;
368 : }
369 : return (__cptr - (char *) __ptr) / __size;
370 : }
371 : # endif
372 : return __fread_unlocked_alias (__ptr, __size, __n, __stream);
373 : }
374 : #endif
|