Branch data Line data Source code
1 : : /* Checking macros for stdlib functions.
2 : : Copyright (C) 2005, 2007 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 _STDLIB_H
21 : : # error "Never include <bits/stdlib.h> directly; use <stdlib.h> instead."
22 : : #endif
23 : :
24 : : extern char *__realpath_chk (__const char *__restrict __name,
25 : : char *__restrict __resolved,
26 : : size_t __resolvedlen) __THROW __wur;
27 : : extern char *__REDIRECT_NTH (__realpath_alias,
28 : : (__const char *__restrict __name,
29 : : char *__restrict __resolved), realpath) __wur;
30 : : extern char *__REDIRECT_NTH (__realpath_chk_warn,
31 : : (__const char *__restrict __name,
32 : : char *__restrict __resolved,
33 : : size_t __resolvedlen), __realpath_chk) __wur
34 : : __warnattr ("second argument of realpath must be either NULL or at "
35 : : "least PATH_MAX bytes long buffer");
36 : :
37 : : __extern_always_inline __wur char *
38 : : __NTH (realpath (__const char *__restrict __name, char *__restrict __resolved))
39 : : {
40 [ - + ]: 2 : if (__bos (__resolved) != (size_t) -1)
41 : : {
42 : : #if defined _LIBC_LIMITS_H_ && defined PATH_MAX
43 : : if (__bos (__resolved) < PATH_MAX)
44 : : return __realpath_chk_warn (__name, __resolved, __bos (__resolved));
45 : : #endif
46 : 0 : return __realpath_chk (__name, __resolved, __bos (__resolved));
47 : : }
48 : :
49 : 2 : return __realpath_alias (__name, __resolved);
50 : : }
51 : :
52 : :
53 : : extern int __ptsname_r_chk (int __fd, char *__buf, size_t __buflen,
54 : : size_t __nreal) __THROW __nonnull ((2));
55 : : extern int __REDIRECT_NTH (__ptsname_r_alias, (int __fd, char *__buf,
56 : : size_t __buflen), ptsname_r)
57 : : __nonnull ((2));
58 : : extern int __REDIRECT_NTH (__ptsname_r_chk_warn,
59 : : (int __fd, char *__buf, size_t __buflen,
60 : : size_t __nreal), __ptsname_r_chk)
61 : : __nonnull ((2)) __warnattr ("ptsname_r called with buflen bigger than "
62 : : "size of buf");
63 : :
64 : : __extern_always_inline int
65 : : __NTH (ptsname_r (int __fd, char *__buf, size_t __buflen))
66 : : {
67 : : if (__bos (__buf) != (size_t) -1)
68 : : {
69 : : if (!__builtin_constant_p (__buflen))
70 : : return __ptsname_r_chk (__fd, __buf, __buflen, __bos (__buf));
71 : : if (__buflen > __bos (__buf))
72 : : return __ptsname_r_chk_warn (__fd, __buf, __buflen, __bos (__buf));
73 : : }
74 : : return __ptsname_r_alias (__fd, __buf, __buflen);
75 : : }
76 : :
77 : :
78 : : extern int __wctomb_chk (char *__s, wchar_t __wchar, size_t __buflen)
79 : : __THROW __wur;
80 : : extern int __REDIRECT_NTH (__wctomb_alias, (char *__s, wchar_t __wchar),
81 : : wctomb) __wur;
82 : :
83 : : __extern_always_inline __wur int
84 : : __NTH (wctomb (char *__s, wchar_t __wchar))
85 : : {
86 : : /* We would have to include <limits.h> to get a definition of MB_LEN_MAX.
87 : : But this would only disturb the namespace. So we define our own
88 : : version here. */
89 : : #define __STDLIB_MB_LEN_MAX 16
90 : : #if defined MB_LEN_MAX && MB_LEN_MAX != __STDLIB_MB_LEN_MAX
91 : : # error "Assumed value of MB_LEN_MAX wrong"
92 : : #endif
93 : : if (__bos (__s) != (size_t) -1 && __STDLIB_MB_LEN_MAX > __bos (__s))
94 : : return __wctomb_chk (__s, __wchar, __bos (__s));
95 : : return __wctomb_alias (__s, __wchar);
96 : : }
97 : :
98 : :
99 : : extern size_t __mbstowcs_chk (wchar_t *__restrict __dst,
100 : : __const char *__restrict __src,
101 : : size_t __len, size_t __dstlen) __THROW;
102 : : extern size_t __REDIRECT_NTH (__mbstowcs_alias,
103 : : (wchar_t *__restrict __dst,
104 : : __const char *__restrict __src,
105 : : size_t __len), mbstowcs);
106 : : extern size_t __REDIRECT_NTH (__mbstowcs_chk_warn,
107 : : (wchar_t *__restrict __dst,
108 : : __const char *__restrict __src,
109 : : size_t __len, size_t __dstlen), __mbstowcs_chk)
110 : : __warnattr ("mbstowcs called with dst buffer smaller than len "
111 : : "* sizeof (wchar_t)");
112 : :
113 : : __extern_always_inline size_t
114 : : __NTH (mbstowcs (wchar_t *__restrict __dst, __const char *__restrict __src,
115 : : size_t __len))
116 : : {
117 : : if (__bos (__dst) != (size_t) -1)
118 : : {
119 : : if (!__builtin_constant_p (__len))
120 : : return __mbstowcs_chk (__dst, __src, __len,
121 : : __bos (__dst) / sizeof (wchar_t));
122 : :
123 : : if (__len > __bos (__dst) / sizeof (wchar_t))
124 : : return __mbstowcs_chk_warn (__dst, __src, __len,
125 : : __bos (__dst) / sizeof (wchar_t));
126 : : }
127 : : return __mbstowcs_alias (__dst, __src, __len);
128 : : }
129 : :
130 : :
131 : : extern size_t __wcstombs_chk (char *__restrict __dst,
132 : : __const wchar_t *__restrict __src,
133 : : size_t __len, size_t __dstlen) __THROW;
134 : : extern size_t __REDIRECT_NTH (__wcstombs_alias,
135 : : (char *__restrict __dst,
136 : : __const wchar_t *__restrict __src,
137 : : size_t __len), wcstombs);
138 : : extern size_t __REDIRECT_NTH (__wcstombs_chk_warn,
139 : : (char *__restrict __dst,
140 : : __const wchar_t *__restrict __src,
141 : : size_t __len, size_t __dstlen), __wcstombs_chk)
142 : : __warnattr ("wcstombs called with dst buffer smaller than len");
143 : :
144 : : __extern_always_inline size_t
145 : : __NTH (wcstombs (char *__restrict __dst, __const wchar_t *__restrict __src,
146 : : size_t __len))
147 : : {
148 : : if (__bos (__dst) != (size_t) -1)
149 : : {
150 : : if (!__builtin_constant_p (__len))
151 : : return __wcstombs_chk (__dst, __src, __len, __bos (__dst));
152 : : if (__len > __bos (__dst))
153 : : return __wcstombs_chk_warn (__dst, __src, __len, __bos (__dst));
154 : : }
155 : : return __wcstombs_alias (__dst, __src, __len);
156 : : }
|