xref: /aosp_15_r20/bionic/libc/include/bits/fortify/unistd.h (revision 8d67ca893c1523eb926b9080dbe4e2ffd2a27ba1)
1*8d67ca89SAndroid Build Coastguard Worker /*
2*8d67ca89SAndroid Build Coastguard Worker  * Copyright (C) 2017 The Android Open Source Project
3*8d67ca89SAndroid Build Coastguard Worker  * All rights reserved.
4*8d67ca89SAndroid Build Coastguard Worker  *
5*8d67ca89SAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
6*8d67ca89SAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
7*8d67ca89SAndroid Build Coastguard Worker  * are met:
8*8d67ca89SAndroid Build Coastguard Worker  *  * Redistributions of source code must retain the above copyright
9*8d67ca89SAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer.
10*8d67ca89SAndroid Build Coastguard Worker  *  * Redistributions in binary form must reproduce the above copyright
11*8d67ca89SAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer in
12*8d67ca89SAndroid Build Coastguard Worker  *    the documentation and/or other materials provided with the
13*8d67ca89SAndroid Build Coastguard Worker  *    distribution.
14*8d67ca89SAndroid Build Coastguard Worker  *
15*8d67ca89SAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16*8d67ca89SAndroid Build Coastguard Worker  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17*8d67ca89SAndroid Build Coastguard Worker  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18*8d67ca89SAndroid Build Coastguard Worker  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19*8d67ca89SAndroid Build Coastguard Worker  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20*8d67ca89SAndroid Build Coastguard Worker  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21*8d67ca89SAndroid Build Coastguard Worker  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22*8d67ca89SAndroid Build Coastguard Worker  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23*8d67ca89SAndroid Build Coastguard Worker  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24*8d67ca89SAndroid Build Coastguard Worker  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25*8d67ca89SAndroid Build Coastguard Worker  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26*8d67ca89SAndroid Build Coastguard Worker  * SUCH DAMAGE.
27*8d67ca89SAndroid Build Coastguard Worker  */
28*8d67ca89SAndroid Build Coastguard Worker #ifndef _UNISTD_H_
29*8d67ca89SAndroid Build Coastguard Worker #error "Never include this file directly; instead, include <unistd.h>"
30*8d67ca89SAndroid Build Coastguard Worker #endif
31*8d67ca89SAndroid Build Coastguard Worker 
32*8d67ca89SAndroid Build Coastguard Worker 
33*8d67ca89SAndroid Build Coastguard Worker #if __BIONIC_AVAILABILITY_GUARD(24)
34*8d67ca89SAndroid Build Coastguard Worker char* _Nullable __getcwd_chk(char* _Nullable, size_t, size_t) __INTRODUCED_IN(24);
35*8d67ca89SAndroid Build Coastguard Worker #endif /* __BIONIC_AVAILABILITY_GUARD(24) */
36*8d67ca89SAndroid Build Coastguard Worker 
37*8d67ca89SAndroid Build Coastguard Worker 
38*8d67ca89SAndroid Build Coastguard Worker 
39*8d67ca89SAndroid Build Coastguard Worker #if __BIONIC_AVAILABILITY_GUARD(23)
40*8d67ca89SAndroid Build Coastguard Worker ssize_t __pread_chk(int, void* _Nonnull, size_t, off_t, size_t) __INTRODUCED_IN(23);
41*8d67ca89SAndroid Build Coastguard Worker #endif /* __BIONIC_AVAILABILITY_GUARD(23) */
42*8d67ca89SAndroid Build Coastguard Worker 
43*8d67ca89SAndroid Build Coastguard Worker ssize_t __pread_real(int, void* _Nonnull, size_t, off_t) __RENAME(pread);
44*8d67ca89SAndroid Build Coastguard Worker 
45*8d67ca89SAndroid Build Coastguard Worker 
46*8d67ca89SAndroid Build Coastguard Worker #if __BIONIC_AVAILABILITY_GUARD(23)
47*8d67ca89SAndroid Build Coastguard Worker ssize_t __pread64_chk(int, void* _Nonnull, size_t, off64_t, size_t) __INTRODUCED_IN(23);
48*8d67ca89SAndroid Build Coastguard Worker #endif /* __BIONIC_AVAILABILITY_GUARD(23) */
49*8d67ca89SAndroid Build Coastguard Worker 
50*8d67ca89SAndroid Build Coastguard Worker ssize_t __pread64_real(int, void* _Nonnull, size_t, off64_t) __RENAME(pread64);
51*8d67ca89SAndroid Build Coastguard Worker 
52*8d67ca89SAndroid Build Coastguard Worker 
53*8d67ca89SAndroid Build Coastguard Worker #if __BIONIC_AVAILABILITY_GUARD(24)
54*8d67ca89SAndroid Build Coastguard Worker ssize_t __pwrite_chk(int, const void* _Nonnull, size_t, off_t, size_t) __INTRODUCED_IN(24);
55*8d67ca89SAndroid Build Coastguard Worker #endif /* __BIONIC_AVAILABILITY_GUARD(24) */
56*8d67ca89SAndroid Build Coastguard Worker 
57*8d67ca89SAndroid Build Coastguard Worker ssize_t __pwrite_real(int, const void* _Nonnull, size_t, off_t) __RENAME(pwrite);
58*8d67ca89SAndroid Build Coastguard Worker 
59*8d67ca89SAndroid Build Coastguard Worker 
60*8d67ca89SAndroid Build Coastguard Worker #if __BIONIC_AVAILABILITY_GUARD(24)
61*8d67ca89SAndroid Build Coastguard Worker ssize_t __pwrite64_chk(int, const void* _Nonnull, size_t, off64_t, size_t) __INTRODUCED_IN(24);
62*8d67ca89SAndroid Build Coastguard Worker #endif /* __BIONIC_AVAILABILITY_GUARD(24) */
63*8d67ca89SAndroid Build Coastguard Worker 
64*8d67ca89SAndroid Build Coastguard Worker ssize_t __pwrite64_real(int, const void* _Nonnull, size_t, off64_t) __RENAME(pwrite64);
65*8d67ca89SAndroid Build Coastguard Worker 
66*8d67ca89SAndroid Build Coastguard Worker ssize_t __read_chk(int, void* __BIONIC_COMPLICATED_NULLNESS, size_t, size_t);
67*8d67ca89SAndroid Build Coastguard Worker 
68*8d67ca89SAndroid Build Coastguard Worker #if __BIONIC_AVAILABILITY_GUARD(24)
69*8d67ca89SAndroid Build Coastguard Worker ssize_t __write_chk(int, const void* __BIONIC_COMPLICATED_NULLNESS, size_t, size_t) __INTRODUCED_IN(24);
70*8d67ca89SAndroid Build Coastguard Worker #endif /* __BIONIC_AVAILABILITY_GUARD(24) */
71*8d67ca89SAndroid Build Coastguard Worker 
72*8d67ca89SAndroid Build Coastguard Worker 
73*8d67ca89SAndroid Build Coastguard Worker #if __BIONIC_AVAILABILITY_GUARD(23)
74*8d67ca89SAndroid Build Coastguard Worker ssize_t __readlink_chk(const char* _Nonnull, char* _Nonnull, size_t, size_t) __INTRODUCED_IN(23);
75*8d67ca89SAndroid Build Coastguard Worker ssize_t __readlinkat_chk(int dirfd, const char* _Nonnull, char* _Nonnull, size_t, size_t) __INTRODUCED_IN(23);
76*8d67ca89SAndroid Build Coastguard Worker #endif /* __BIONIC_AVAILABILITY_GUARD(23) */
77*8d67ca89SAndroid Build Coastguard Worker 
78*8d67ca89SAndroid Build Coastguard Worker 
79*8d67ca89SAndroid Build Coastguard Worker #if defined(__BIONIC_FORTIFY)
80*8d67ca89SAndroid Build Coastguard Worker 
81*8d67ca89SAndroid Build Coastguard Worker #if defined(__USE_FILE_OFFSET64)
82*8d67ca89SAndroid Build Coastguard Worker #define __PREAD_PREFIX(x) __pread64_ ## x
83*8d67ca89SAndroid Build Coastguard Worker #define __PWRITE_PREFIX(x) __pwrite64_ ## x
84*8d67ca89SAndroid Build Coastguard Worker #else
85*8d67ca89SAndroid Build Coastguard Worker #define __PREAD_PREFIX(x) __pread_ ## x
86*8d67ca89SAndroid Build Coastguard Worker #define __PWRITE_PREFIX(x) __pwrite_ ## x
87*8d67ca89SAndroid Build Coastguard Worker #endif
88*8d67ca89SAndroid Build Coastguard Worker 
89*8d67ca89SAndroid Build Coastguard Worker #define __error_if_overflows_ssizet(what, fn) \
90*8d67ca89SAndroid Build Coastguard Worker     __clang_error_if((what) > SSIZE_MAX, "in call to '" #fn "', '" #what "' must be <= SSIZE_MAX")
91*8d67ca89SAndroid Build Coastguard Worker 
92*8d67ca89SAndroid Build Coastguard Worker #define __error_if_overflows_objectsize(what, objsize, fn) \
93*8d67ca89SAndroid Build Coastguard Worker     __clang_error_if(__bos_unevaluated_lt((objsize), (what)), \
94*8d67ca89SAndroid Build Coastguard Worker                      "in call to '" #fn "', '" #what "' bytes overflows the given object")
95*8d67ca89SAndroid Build Coastguard Worker 
96*8d67ca89SAndroid Build Coastguard Worker #define __bos_trivially_ge_no_overflow(bos_val, index)  \
97*8d67ca89SAndroid Build Coastguard Worker       ((__bos_dynamic_check_impl_and((bos_val), >=, (index), (bos_val) <= SSIZE_MAX) && \
98*8d67ca89SAndroid Build Coastguard Worker         __builtin_constant_p(index) && (index) <= SSIZE_MAX))
99*8d67ca89SAndroid Build Coastguard Worker 
100*8d67ca89SAndroid Build Coastguard Worker __BIONIC_FORTIFY_INLINE
getcwd(char * const _Nullable __pass_object_size buf,size_t size)101*8d67ca89SAndroid Build Coastguard Worker char* _Nullable getcwd(char* const _Nullable __pass_object_size buf, size_t size)
102*8d67ca89SAndroid Build Coastguard Worker         __overloadable
103*8d67ca89SAndroid Build Coastguard Worker         __error_if_overflows_objectsize(size, __bos(buf), getcwd) {
104*8d67ca89SAndroid Build Coastguard Worker #if __ANDROID_API__ >= 24 && __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
105*8d67ca89SAndroid Build Coastguard Worker     size_t bos = __bos(buf);
106*8d67ca89SAndroid Build Coastguard Worker 
107*8d67ca89SAndroid Build Coastguard Worker     if (!__bos_trivially_ge(bos, size)) {
108*8d67ca89SAndroid Build Coastguard Worker         return __getcwd_chk(buf, size, bos);
109*8d67ca89SAndroid Build Coastguard Worker     }
110*8d67ca89SAndroid Build Coastguard Worker #endif
111*8d67ca89SAndroid Build Coastguard Worker     return __call_bypassing_fortify(getcwd)(buf, size);
112*8d67ca89SAndroid Build Coastguard Worker }
113*8d67ca89SAndroid Build Coastguard Worker 
114*8d67ca89SAndroid Build Coastguard Worker #if !defined(__USE_FILE_OFFSET64)
115*8d67ca89SAndroid Build Coastguard Worker __BIONIC_FORTIFY_INLINE
pread(int fd,void * const _Nonnull __pass_object_size0 buf,size_t count,off_t offset)116*8d67ca89SAndroid Build Coastguard Worker ssize_t pread(int fd, void* const _Nonnull __pass_object_size0 buf, size_t count, off_t offset)
117*8d67ca89SAndroid Build Coastguard Worker         __overloadable
118*8d67ca89SAndroid Build Coastguard Worker         __error_if_overflows_ssizet(count, pread)
119*8d67ca89SAndroid Build Coastguard Worker         __error_if_overflows_objectsize(count, __bos0(buf), pread) {
120*8d67ca89SAndroid Build Coastguard Worker #if __ANDROID_API__ >= 23 && __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
121*8d67ca89SAndroid Build Coastguard Worker     size_t bos = __bos0(buf);
122*8d67ca89SAndroid Build Coastguard Worker 
123*8d67ca89SAndroid Build Coastguard Worker     if (!__bos_trivially_ge_no_overflow(bos, count)) {
124*8d67ca89SAndroid Build Coastguard Worker         return __PREAD_PREFIX(chk)(fd, buf, count, offset, bos);
125*8d67ca89SAndroid Build Coastguard Worker     }
126*8d67ca89SAndroid Build Coastguard Worker #endif
127*8d67ca89SAndroid Build Coastguard Worker     return __PREAD_PREFIX(real)(fd, buf, count, offset);
128*8d67ca89SAndroid Build Coastguard Worker }
129*8d67ca89SAndroid Build Coastguard Worker #endif /* !defined(__USE_FILE_OFFSET64) */
130*8d67ca89SAndroid Build Coastguard Worker 
131*8d67ca89SAndroid Build Coastguard Worker __BIONIC_FORTIFY_INLINE
pread64(int fd,void * const _Nonnull __pass_object_size0 buf,size_t count,off64_t offset)132*8d67ca89SAndroid Build Coastguard Worker ssize_t pread64(int fd, void* const _Nonnull __pass_object_size0 buf, size_t count, off64_t offset)
133*8d67ca89SAndroid Build Coastguard Worker         __overloadable
134*8d67ca89SAndroid Build Coastguard Worker         __error_if_overflows_ssizet(count, pread64)
135*8d67ca89SAndroid Build Coastguard Worker         __error_if_overflows_objectsize(count, __bos0(buf), pread64) {
136*8d67ca89SAndroid Build Coastguard Worker #if __ANDROID_API__ >= 23 && __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
137*8d67ca89SAndroid Build Coastguard Worker     size_t bos = __bos0(buf);
138*8d67ca89SAndroid Build Coastguard Worker 
139*8d67ca89SAndroid Build Coastguard Worker     if (!__bos_trivially_ge_no_overflow(bos, count)) {
140*8d67ca89SAndroid Build Coastguard Worker         return __pread64_chk(fd, buf, count, offset, bos);
141*8d67ca89SAndroid Build Coastguard Worker     }
142*8d67ca89SAndroid Build Coastguard Worker #endif
143*8d67ca89SAndroid Build Coastguard Worker     return __pread64_real(fd, buf, count, offset);
144*8d67ca89SAndroid Build Coastguard Worker }
145*8d67ca89SAndroid Build Coastguard Worker 
146*8d67ca89SAndroid Build Coastguard Worker #if !defined(__USE_FILE_OFFSET64)
147*8d67ca89SAndroid Build Coastguard Worker __BIONIC_FORTIFY_INLINE
pwrite(int fd,const void * const _Nonnull __pass_object_size0 buf,size_t count,off_t offset)148*8d67ca89SAndroid Build Coastguard Worker ssize_t pwrite(int fd, const void* const _Nonnull __pass_object_size0 buf, size_t count, off_t offset)
149*8d67ca89SAndroid Build Coastguard Worker         __overloadable
150*8d67ca89SAndroid Build Coastguard Worker         __error_if_overflows_ssizet(count, pwrite)
151*8d67ca89SAndroid Build Coastguard Worker         __error_if_overflows_objectsize(count, __bos0(buf), pwrite) {
152*8d67ca89SAndroid Build Coastguard Worker #if __ANDROID_API__ >= 24 && __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
153*8d67ca89SAndroid Build Coastguard Worker     size_t bos = __bos0(buf);
154*8d67ca89SAndroid Build Coastguard Worker 
155*8d67ca89SAndroid Build Coastguard Worker     if (!__bos_trivially_ge_no_overflow(bos, count)) {
156*8d67ca89SAndroid Build Coastguard Worker         return __PWRITE_PREFIX(chk)(fd, buf, count, offset, bos);
157*8d67ca89SAndroid Build Coastguard Worker     }
158*8d67ca89SAndroid Build Coastguard Worker #endif
159*8d67ca89SAndroid Build Coastguard Worker     return __PWRITE_PREFIX(real)(fd, buf, count, offset);
160*8d67ca89SAndroid Build Coastguard Worker }
161*8d67ca89SAndroid Build Coastguard Worker #endif /* !defined(__USE_FILE_OFFSET64) */
162*8d67ca89SAndroid Build Coastguard Worker 
163*8d67ca89SAndroid Build Coastguard Worker __BIONIC_FORTIFY_INLINE
pwrite64(int fd,const void * const _Nonnull __pass_object_size0 buf,size_t count,off64_t offset)164*8d67ca89SAndroid Build Coastguard Worker ssize_t pwrite64(int fd, const void* const _Nonnull __pass_object_size0 buf, size_t count, off64_t offset)
165*8d67ca89SAndroid Build Coastguard Worker         __overloadable
166*8d67ca89SAndroid Build Coastguard Worker         __error_if_overflows_ssizet(count, pwrite64)
167*8d67ca89SAndroid Build Coastguard Worker         __error_if_overflows_objectsize(count, __bos0(buf), pwrite64) {
168*8d67ca89SAndroid Build Coastguard Worker #if __ANDROID_API__ >= 24 && __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
169*8d67ca89SAndroid Build Coastguard Worker     size_t bos = __bos0(buf);
170*8d67ca89SAndroid Build Coastguard Worker 
171*8d67ca89SAndroid Build Coastguard Worker     if (!__bos_trivially_ge_no_overflow(bos, count)) {
172*8d67ca89SAndroid Build Coastguard Worker         return __pwrite64_chk(fd, buf, count, offset, bos);
173*8d67ca89SAndroid Build Coastguard Worker     }
174*8d67ca89SAndroid Build Coastguard Worker #endif
175*8d67ca89SAndroid Build Coastguard Worker     return __pwrite64_real(fd, buf, count, offset);
176*8d67ca89SAndroid Build Coastguard Worker }
177*8d67ca89SAndroid Build Coastguard Worker 
178*8d67ca89SAndroid Build Coastguard Worker __BIONIC_FORTIFY_INLINE
read(int fd,void * const __BIONIC_COMPLICATED_NULLNESS __pass_object_size0 buf,size_t count)179*8d67ca89SAndroid Build Coastguard Worker ssize_t read(int fd, void* const __BIONIC_COMPLICATED_NULLNESS __pass_object_size0 buf, size_t count)
180*8d67ca89SAndroid Build Coastguard Worker         __overloadable
181*8d67ca89SAndroid Build Coastguard Worker         __error_if_overflows_ssizet(count, read)
182*8d67ca89SAndroid Build Coastguard Worker         __error_if_overflows_objectsize(count, __bos0(buf), read) {
183*8d67ca89SAndroid Build Coastguard Worker #if __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
184*8d67ca89SAndroid Build Coastguard Worker     size_t bos = __bos0(buf);
185*8d67ca89SAndroid Build Coastguard Worker 
186*8d67ca89SAndroid Build Coastguard Worker     if (!__bos_trivially_ge_no_overflow(bos, count)) {
187*8d67ca89SAndroid Build Coastguard Worker         return __read_chk(fd, buf, count, bos);
188*8d67ca89SAndroid Build Coastguard Worker     }
189*8d67ca89SAndroid Build Coastguard Worker #endif
190*8d67ca89SAndroid Build Coastguard Worker     return __call_bypassing_fortify(read)(fd, buf, count);
191*8d67ca89SAndroid Build Coastguard Worker }
192*8d67ca89SAndroid Build Coastguard Worker 
193*8d67ca89SAndroid Build Coastguard Worker __BIONIC_FORTIFY_INLINE
write(int fd,const void * const __BIONIC_COMPLICATED_NULLNESS __pass_object_size0 buf,size_t count)194*8d67ca89SAndroid Build Coastguard Worker ssize_t write(int fd, const void* const __BIONIC_COMPLICATED_NULLNESS __pass_object_size0 buf, size_t count)
195*8d67ca89SAndroid Build Coastguard Worker         __overloadable
196*8d67ca89SAndroid Build Coastguard Worker         __error_if_overflows_ssizet(count, write)
197*8d67ca89SAndroid Build Coastguard Worker         __error_if_overflows_objectsize(count, __bos0(buf), write) {
198*8d67ca89SAndroid Build Coastguard Worker #if __ANDROID_API__ >= 24 && __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
199*8d67ca89SAndroid Build Coastguard Worker     size_t bos = __bos0(buf);
200*8d67ca89SAndroid Build Coastguard Worker 
201*8d67ca89SAndroid Build Coastguard Worker     if (!__bos_trivially_ge_no_overflow(bos, count)) {
202*8d67ca89SAndroid Build Coastguard Worker         return __write_chk(fd, buf, count, bos);
203*8d67ca89SAndroid Build Coastguard Worker     }
204*8d67ca89SAndroid Build Coastguard Worker #endif
205*8d67ca89SAndroid Build Coastguard Worker     return __call_bypassing_fortify(write)(fd, buf, count);
206*8d67ca89SAndroid Build Coastguard Worker }
207*8d67ca89SAndroid Build Coastguard Worker 
208*8d67ca89SAndroid Build Coastguard Worker __BIONIC_FORTIFY_INLINE
readlink(const char * _Nonnull path,char * _Nonnull const __pass_object_size buf,size_t size)209*8d67ca89SAndroid Build Coastguard Worker ssize_t readlink(const char* _Nonnull path, char* _Nonnull const __pass_object_size buf, size_t size)
210*8d67ca89SAndroid Build Coastguard Worker         __overloadable
211*8d67ca89SAndroid Build Coastguard Worker         __error_if_overflows_ssizet(size, readlink)
212*8d67ca89SAndroid Build Coastguard Worker         __error_if_overflows_objectsize(size, __bos(buf), readlink) {
213*8d67ca89SAndroid Build Coastguard Worker #if __ANDROID_API__ >= 23 && __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
214*8d67ca89SAndroid Build Coastguard Worker     size_t bos = __bos(buf);
215*8d67ca89SAndroid Build Coastguard Worker 
216*8d67ca89SAndroid Build Coastguard Worker     if (!__bos_trivially_ge_no_overflow(bos, size)) {
217*8d67ca89SAndroid Build Coastguard Worker         return __readlink_chk(path, buf, size, bos);
218*8d67ca89SAndroid Build Coastguard Worker     }
219*8d67ca89SAndroid Build Coastguard Worker #endif
220*8d67ca89SAndroid Build Coastguard Worker     return __call_bypassing_fortify(readlink)(path, buf, size);
221*8d67ca89SAndroid Build Coastguard Worker }
222*8d67ca89SAndroid Build Coastguard Worker 
223*8d67ca89SAndroid Build Coastguard Worker __BIONIC_FORTIFY_INLINE
readlinkat(int dirfd,const char * _Nonnull path,char * const _Nonnull __pass_object_size buf,size_t size)224*8d67ca89SAndroid Build Coastguard Worker ssize_t readlinkat(int dirfd, const char* _Nonnull path, char* const _Nonnull __pass_object_size buf, size_t size)
225*8d67ca89SAndroid Build Coastguard Worker         __overloadable
226*8d67ca89SAndroid Build Coastguard Worker         __error_if_overflows_ssizet(size, readlinkat)
227*8d67ca89SAndroid Build Coastguard Worker         __error_if_overflows_objectsize(size, __bos(buf), readlinkat) {
228*8d67ca89SAndroid Build Coastguard Worker #if __ANDROID_API__ >= 23 && __BIONIC_FORTIFY_RUNTIME_CHECKS_ENABLED
229*8d67ca89SAndroid Build Coastguard Worker     size_t bos = __bos(buf);
230*8d67ca89SAndroid Build Coastguard Worker 
231*8d67ca89SAndroid Build Coastguard Worker     if (!__bos_trivially_ge_no_overflow(bos, size)) {
232*8d67ca89SAndroid Build Coastguard Worker         return __readlinkat_chk(dirfd, path, buf, size, bos);
233*8d67ca89SAndroid Build Coastguard Worker     }
234*8d67ca89SAndroid Build Coastguard Worker #endif
235*8d67ca89SAndroid Build Coastguard Worker     return __call_bypassing_fortify(readlinkat)(dirfd, path, buf, size);
236*8d67ca89SAndroid Build Coastguard Worker }
237*8d67ca89SAndroid Build Coastguard Worker 
238*8d67ca89SAndroid Build Coastguard Worker #undef __bos_trivially_ge_no_overflow
239*8d67ca89SAndroid Build Coastguard Worker #undef __enable_if_no_overflow_ssizet
240*8d67ca89SAndroid Build Coastguard Worker #undef __error_if_overflows_objectsize
241*8d67ca89SAndroid Build Coastguard Worker #undef __error_if_overflows_ssizet
242*8d67ca89SAndroid Build Coastguard Worker #undef __PREAD_PREFIX
243*8d67ca89SAndroid Build Coastguard Worker #undef __PWRITE_PREFIX
244*8d67ca89SAndroid Build Coastguard Worker #endif /* defined(__BIONIC_FORTIFY) */
245