Line data Source code
1 : /*
2 : * Copyright (C) 2015-2016 Dimitris Papastamos <sin@2f30.org>
3 : * Copyright (C) 2022 q66 <q66@chimera-linux.org>
4 : *
5 : * Permission to use, copy, modify, and/or distribute this software for any
6 : * purpose with or without fee is hereby granted.
7 : *
8 : * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 : * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 : * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 : * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 : * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 : * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 : * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 : */
16 :
17 : #ifndef _FORTIFY_UNISTD_H
18 : #define _FORTIFY_UNISTD_H
19 :
20 : #if !defined(__cplusplus) && !defined(__clang__)
21 : __extension__
22 : #endif
23 : #include_next <unistd.h>
24 :
25 : #if defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE > 0 && defined(__OPTIMIZE__) && __OPTIMIZE__ > 0
26 : #include "fortify-headers.h"
27 :
28 : #ifdef __cplusplus
29 : extern "C" {
30 : #endif
31 :
32 : #undef confstr
33 : #undef getcwd
34 : #undef getgroups
35 : #undef gethostname
36 : #undef getlogin_r
37 : #undef pread
38 : #undef read
39 : #undef readlink
40 : #undef readlinkat
41 : #undef ttyname_r
42 : #undef write
43 :
44 : __fh_access(write_only, 2, 3)
45 : #if __has_builtin(__builtin_confstr)
46 : __diagnose_as_builtin(__builtin_confstr, 1, 2, 3)
47 : #endif
48 : _FORTIFY_FN(confstr) size_t confstr(int __n, char * _FORTIFY_POS0 __s, size_t __l)
49 : {
50 : __fh_size_t __b = __fh_bos(__s, 0);
51 4 : __fh_size_t __r = __orig_confstr(__n, __s, __b > __l ? __l : __b);
52 :
53 2 : if (__l > __b && __r > __b)
54 2 : __builtin_trap();
55 : return __r;
56 : }
57 :
58 : __fh_access(write_only, 1, 2)
59 : #if __has_builtin(__builtin_getcwd)
60 : __diagnose_as_builtin(__builtin_getcwd, 1, 2)
61 : #endif
62 : _FORTIFY_FN(getcwd) char *getcwd(char * _FORTIFY_POS0 __s, size_t __l)
63 : {
64 : __fh_size_t __b = __fh_bos(__s, 0);
65 :
66 1 : if (__l > __b)
67 2 : __builtin_trap();
68 2 : return __orig_getcwd(__s, __l);
69 : }
70 :
71 : #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
72 : #undef getdomainname
73 : __fh_access(write_only, 1, 2)
74 : #if __has_builtin(__builtin_getdomainname)
75 : __diagnose_as_builtin(__builtin_getdomainname, 1, 2)
76 : #endif
77 : _FORTIFY_FN(getdomainname) int getdomainname(char * _FORTIFY_POS0 __s, size_t __l)
78 : {
79 : __fh_size_t __b = __fh_bos(__s, 0);
80 :
81 1 : if (__l > __b)
82 2 : __builtin_trap();
83 2 : return __orig_getdomainname(__s, __l);
84 : }
85 : #endif
86 :
87 : #if __has_builtin(__builtin_getgroups)
88 : __diagnose_as_builtin(__builtin_getgroups, 1, 2)
89 : #endif
90 : _FORTIFY_FN(getgroups) int getgroups(int __l, gid_t * _FORTIFY_POS0 __s)
91 : {
92 : __fh_size_t __b = __fh_bos(__s, 0);
93 :
94 1 : if (__l > 0 && (unsigned)__l > __b / sizeof(gid_t))
95 2 : __builtin_trap();
96 2 : return __orig_getgroups(__l, __s);
97 : }
98 :
99 : __fh_access(write_only, 1, 2)
100 : #if __has_builtin(__builtin_gethostname)
101 : __diagnose_as_builtin(__builtin_gethostname, 1, 2)
102 : #endif
103 : _FORTIFY_FN(gethostname) int gethostname(char * _FORTIFY_POS0 __s, size_t __l)
104 : {
105 : __fh_size_t __b = __fh_bos(__s, 0);
106 :
107 1 : if (__l > __b)
108 2 : __builtin_trap();
109 2 : return __orig_gethostname(__s, __l);
110 : }
111 :
112 : __fh_access(write_only, 1, 2)
113 : #if __has_builtin(__builtin_getlogin_r)
114 : __diagnose_as_builtin(__builtin_getlogin_r, 1, 2)
115 : #endif
116 : _FORTIFY_FN(getlogin_r) int getlogin_r(char * _FORTIFY_POS0 __s, size_t __l)
117 : {
118 : __fh_size_t __b = __fh_bos(__s, 0);
119 :
120 1 : if (__l > __b)
121 2 : __builtin_trap();
122 2 : return __orig_getlogin_r(__s, __l);
123 : }
124 :
125 : #if __has_builtin(__builtin_pread)
126 : __diagnose_as_builtin(__builtin_pread, 1, 2, 3, 4)
127 : #endif
128 : _FORTIFY_FN(pread) ssize_t pread(int __f, void * _FORTIFY_POS0 __s,
129 : size_t __n, off_t __o)
130 : {
131 : __fh_size_t __b = __fh_bos(__s, 0);
132 :
133 1 : if (__n > __b)
134 2 : __builtin_trap();
135 0 : return __orig_pread(__f, __s, __n, __o);
136 : }
137 :
138 : __fh_access(write_only, 2, 3)
139 : #if __has_builtin(__builtin_read)
140 : __diagnose_as_builtin(__builtin_read, 1, 2, 3)
141 : #endif
142 : _FORTIFY_FN(read) ssize_t read(int __f, void * _FORTIFY_POS0 __s, size_t __n)
143 : {
144 : __fh_size_t __b = __fh_bos(__s, 0);
145 :
146 1 : if (__n > __b)
147 2 : __builtin_trap();
148 0 : return __orig_read(__f, __s, __n);
149 : }
150 :
151 : __fh_access(write_only, 2, 3)
152 : #if __has_builtin(__builtin_readlink)
153 : __diagnose_as_builtin(__builtin_readlink, 1, 2, 3)
154 : #endif
155 : _FORTIFY_FN(readlink) ssize_t readlink(const char *__p,
156 : char * _FORTIFY_POS0 __s, size_t __n)
157 : {
158 : __fh_size_t __b = __fh_bos(__s, 0);
159 :
160 1 : if (__n > __b)
161 2 : __builtin_trap();
162 2 : return __orig_readlink(__p, __s, __n);
163 : }
164 :
165 : __fh_access(write_only, 3, 4)
166 : #if __has_builtin(__builtin_readlinkat)
167 : __diagnose_as_builtin(__builtin_readlinkat, 1, 2, 3, 4)
168 : #endif
169 : _FORTIFY_FN(readlinkat) ssize_t readlinkat(int __f, const char *__p,
170 : char * _FORTIFY_POS0 __s, size_t __n)
171 : {
172 : __fh_size_t __b = __fh_bos(__s, 0);
173 :
174 : if (__n > __b)
175 : __builtin_trap();
176 : return __orig_readlinkat(__f, __p, __s, __n);
177 : }
178 :
179 : __fh_access(write_only, 2, 3)
180 : #if __has_builtin(__builtin_ttyname_r)
181 : __diagnose_as_builtin(__builtin_ttyname_r, 1, 2, 3)
182 : #endif
183 : _FORTIFY_FN(ttyname_r) int ttyname_r(int __f, char * _FORTIFY_POS0 __s,
184 : size_t __n)
185 : {
186 : __fh_size_t __b = __fh_bos(__s, 0);
187 :
188 1 : if (__n > __b)
189 2 : __builtin_trap();
190 0 : return __orig_ttyname_r(__f, __s, __n);
191 : }
192 :
193 : __fh_access(read_only, 2, 3)
194 : #if __has_builtin(__builtin_write)
195 : __diagnose_as_builtin(__builtin_write, 1, 2, 3)
196 : #endif
197 : _FORTIFY_FN(write) ssize_t write(int __f, const void * _FORTIFY_POS0 __s,
198 : size_t __n)
199 : {
200 : __fh_size_t __b = __fh_bos(__s, 0);
201 :
202 1 : if (__n > __b)
203 2 : __builtin_trap();
204 0 : return __orig_write(__f, __s, __n);
205 : }
206 :
207 : #if __has_builtin(__builtin_pwrite)
208 : __diagnose_as_builtin(__builtin_pwrite, 1, 2, 3, 4)
209 : #endif
210 : _FORTIFY_FN(pwrite) ssize_t pwrite(int __f, const void * _FORTIFY_POS0 __s,
211 : size_t __n, off_t __o)
212 : {
213 : __fh_size_t __b = __fh_bos(__s, 0);
214 :
215 1 : if (__n > __b)
216 2 : __builtin_trap();
217 0 : return __orig_pwrite(__f, __s, __n, __o);
218 : }
219 :
220 : #ifdef __cplusplus
221 : }
222 : #endif
223 :
224 : #endif
225 :
226 : #endif
|