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