Home | History | Annotate | Download | only in bits
      1 /* Checking macros for unistd functions.
      2    Copyright (C) 2005, 2006, 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 _UNISTD_H
     21 # error "Never include <bits/unistd.h> directly; use <unistd.h> instead."
     22 #endif
     23 
     24 extern ssize_t __read_chk (int __fd, void *__buf, size_t __nbytes,
     25 			   size_t __buflen) __wur;
     26 extern ssize_t __REDIRECT (__read_alias, (int __fd, void *__buf,
     27 					  size_t __nbytes), read) __wur;
     28 extern ssize_t __REDIRECT (__read_chk_warn,
     29 			   (int __fd, void *__buf, size_t __nbytes,
     30 			    size_t __buflen), __read_chk)
     31      __wur __warnattr ("read called with bigger length than size of "
     32 		       "the destination buffer");
     33 
     34 __extern_always_inline __wur ssize_t
     35 read (int __fd, void *__buf, size_t __nbytes)
     36 {
     37   if (__bos0 (__buf) != (size_t) -1)
     38     {
     39       if (!__builtin_constant_p (__nbytes))
     40 	return __read_chk (__fd, __buf, __nbytes, __bos0 (__buf));
     41 
     42       if (__nbytes > __bos0 (__buf))
     43 	return __read_chk_warn (__fd, __buf, __nbytes, __bos0 (__buf));
     44     }
     45   return __read_alias (__fd, __buf, __nbytes);
     46 }
     47 
     48 #ifdef __USE_UNIX98
     49 extern ssize_t __pread_chk (int __fd, void *__buf, size_t __nbytes,
     50 			    __off_t __offset, size_t __bufsize) __wur;
     51 extern ssize_t __pread64_chk (int __fd, void *__buf, size_t __nbytes,
     52 			      __off64_t __offset, size_t __bufsize) __wur;
     53 extern ssize_t __REDIRECT (__pread_alias,
     54 			   (int __fd, void *__buf, size_t __nbytes,
     55 			    __off_t __offset), pread) __wur;
     56 extern ssize_t __REDIRECT (__pread64_alias,
     57 			   (int __fd, void *__buf, size_t __nbytes,
     58 			    __off64_t __offset), pread64) __wur;
     59 extern ssize_t __REDIRECT (__pread_chk_warn,
     60 			   (int __fd, void *__buf, size_t __nbytes,
     61 			    __off_t __offset, size_t __bufsize), __pread_chk)
     62      __wur __warnattr ("pread called with bigger length than size of "
     63 		       "the destination buffer");
     64 extern ssize_t __REDIRECT (__pread64_chk_warn,
     65 			   (int __fd, void *__buf, size_t __nbytes,
     66 			    __off64_t __offset, size_t __bufsize),
     67 			    __pread64_chk)
     68      __wur __warnattr ("pread64 called with bigger length than size of "
     69 		       "the destination buffer");
     70 
     71 # ifndef __USE_FILE_OFFSET64
     72 __extern_always_inline __wur ssize_t
     73 pread (int __fd, void *__buf, size_t __nbytes, __off_t __offset)
     74 {
     75   if (__bos0 (__buf) != (size_t) -1)
     76     {
     77       if (!__builtin_constant_p (__nbytes))
     78 	return __pread_chk (__fd, __buf, __nbytes, __offset, __bos0 (__buf));
     79 
     80       if ( __nbytes > __bos0 (__buf))
     81 	return __pread_chk_warn (__fd, __buf, __nbytes, __offset,
     82 				 __bos0 (__buf));
     83     }
     84   return __pread_alias (__fd, __buf, __nbytes, __offset);
     85 }
     86 # else
     87 __extern_always_inline __wur ssize_t
     88 pread (int __fd, void *__buf, size_t __nbytes, __off64_t __offset)
     89 {
     90   if (__bos0 (__buf) != (size_t) -1)
     91     {
     92       if (!__builtin_constant_p (__nbytes))
     93 	return __pread64_chk (__fd, __buf, __nbytes, __offset, __bos0 (__buf));
     94 
     95       if ( __nbytes > __bos0 (__buf))
     96 	return __pread64_chk_warn (__fd, __buf, __nbytes, __offset,
     97 				   __bos0 (__buf));
     98     }
     99 
    100   return __pread64_alias (__fd, __buf, __nbytes, __offset);
    101 }
    102 # endif
    103 
    104 # ifdef __USE_LARGEFILE64
    105 __extern_always_inline __wur ssize_t
    106 pread64 (int __fd, void *__buf, size_t __nbytes, __off64_t __offset)
    107 {
    108   if (__bos0 (__buf) != (size_t) -1)
    109     {
    110       if (!__builtin_constant_p (__nbytes))
    111 	return __pread64_chk (__fd, __buf, __nbytes, __offset, __bos0 (__buf));
    112 
    113       if ( __nbytes > __bos0 (__buf))
    114 	return __pread64_chk_warn (__fd, __buf, __nbytes, __offset,
    115 				   __bos0 (__buf));
    116     }
    117 
    118   return __pread64_alias (__fd, __buf, __nbytes, __offset);
    119 }
    120 # endif
    121 #endif
    122 
    123 #if defined __USE_BSD || defined __USE_XOPEN_EXTENDED || defined __USE_XOPEN2K
    124 extern ssize_t __readlink_chk (__const char *__restrict __path,
    125 			       char *__restrict __buf, size_t __len,
    126 			       size_t __buflen)
    127      __THROW __nonnull ((1, 2)) __wur;
    128 extern ssize_t __REDIRECT_NTH (__readlink_alias,
    129 			       (__const char *__restrict __path,
    130 				char *__restrict __buf, size_t __len), readlink)
    131      __nonnull ((1, 2)) __wur;
    132 extern ssize_t __REDIRECT_NTH (__readlink_chk_warn,
    133 			       (__const char *__restrict __path,
    134 				char *__restrict __buf, size_t __len,
    135 				size_t __buflen), __readlink_chk)
    136      __nonnull ((1, 2)) __wur __warnattr ("readlink called with bigger length "
    137 					  "than size of destination buffer");
    138 
    139 __extern_always_inline __nonnull ((1, 2)) __wur ssize_t
    140 __NTH (readlink (__const char *__restrict __path, char *__restrict __buf,
    141 		 size_t __len))
    142 {
    143   if (__bos (__buf) != (size_t) -1)
    144     {
    145       if (!__builtin_constant_p (__len))
    146 	return __readlink_chk (__path, __buf, __len, __bos (__buf));
    147 
    148       if ( __len > __bos (__buf))
    149 	return __readlink_chk_warn (__path, __buf, __len, __bos (__buf));
    150     }
    151   return __readlink_alias (__path, __buf, __len);
    152 }
    153 #endif
    154 
    155 #ifdef __USE_ATFILE
    156 extern ssize_t __readlinkat_chk (int __fd, __const char *__restrict __path,
    157 				 char *__restrict __buf, size_t __len,
    158 				 size_t __buflen)
    159      __THROW __nonnull ((2, 3)) __wur;
    160 extern ssize_t __REDIRECT_NTH (__readlinkat_alias,
    161 			       (int __fd, __const char *__restrict __path,
    162 				char *__restrict __buf, size_t __len),
    163 			       readlinkat)
    164      __nonnull ((2, 3)) __wur;
    165 extern ssize_t __REDIRECT_NTH (__readlinkat_chk_warn,
    166 			       (int __fd, __const char *__restrict __path,
    167 				char *__restrict __buf, size_t __len,
    168 				size_t __buflen), __readlinkat_chk)
    169      __nonnull ((2, 3)) __wur __warnattr ("readlinkat called with bigger "
    170 					  "length than size of destination "
    171 					  "buffer");
    172 
    173 __extern_always_inline __nonnull ((2, 3)) __wur ssize_t
    174 __NTH (readlinkat (int __fd, __const char *__restrict __path,
    175 		   char *__restrict __buf, size_t __len))
    176 {
    177   if (__bos (__buf) != (size_t) -1)
    178     {
    179       if (!__builtin_constant_p (__len))
    180 	return __readlinkat_chk (__fd, __path, __buf, __len, __bos (__buf));
    181 
    182       if (__len > __bos (__buf))
    183 	return __readlinkat_chk_warn (__fd, __path, __buf, __len,
    184 				      __bos (__buf));
    185     }
    186   return __readlinkat_alias (__fd, __path, __buf, __len);
    187 }
    188 #endif
    189 
    190 extern char *__getcwd_chk (char *__buf, size_t __size, size_t __buflen)
    191      __THROW __wur;
    192 extern char *__REDIRECT_NTH (__getcwd_alias,
    193 			     (char *__buf, size_t __size), getcwd) __wur;
    194 extern char *__REDIRECT_NTH (__getcwd_chk_warn,
    195 			     (char *__buf, size_t __size, size_t __buflen),
    196 			     __getcwd_chk)
    197      __wur __warnattr ("getcwd caller with bigger length than size of "
    198 		       "destination buffer");
    199 
    200 __extern_always_inline __wur char *
    201 __NTH (getcwd (char *__buf, size_t __size))
    202 {
    203   if (__bos (__buf) != (size_t) -1)
    204     {
    205       if (!__builtin_constant_p (__size))
    206 	return __getcwd_chk (__buf, __size, __bos (__buf));
    207 
    208       if (__size > __bos (__buf))
    209 	return __getcwd_chk_warn (__buf, __size, __bos (__buf));
    210     }
    211   return __getcwd_alias (__buf, __size);
    212 }
    213 
    214 #if defined __USE_BSD || defined __USE_XOPEN_EXTENDED
    215 extern char *__getwd_chk (char *__buf, size_t buflen)
    216      __THROW __nonnull ((1)) __wur;
    217 extern char *__REDIRECT_NTH (__getwd_warn, (char *__buf), getwd)
    218      __nonnull ((1)) __wur __warnattr ("please use getcwd instead, as getwd "
    219 				       "doesn't specify buffer size");
    220 
    221 __extern_always_inline __nonnull ((1)) __attribute_deprecated__ __wur char *
    222 __NTH (getwd (char *__buf))
    223 {
    224   if (__bos (__buf) != (size_t) -1)
    225     return __getwd_chk (__buf, __bos (__buf));
    226   return __getwd_warn (__buf);
    227 }
    228 #endif
    229 
    230 extern size_t __confstr_chk (int __name, char *__buf, size_t __len,
    231 			     size_t __buflen) __THROW;
    232 extern size_t __REDIRECT_NTH (__confstr_alias, (int __name, char *__buf,
    233 						size_t __len), confstr);
    234 extern size_t __REDIRECT_NTH (__confstr_chk_warn,
    235 			      (int __name, char *__buf, size_t __len,
    236 			       size_t __buflen), __confstr_chk)
    237      __warnattr ("confstr called with bigger length than size of destination "
    238 		 "buffer");
    239 
    240 __extern_always_inline size_t
    241 __NTH (confstr (int __name, char *__buf, size_t __len))
    242 {
    243   if (__bos (__buf) != (size_t) -1)
    244     {
    245       if (!__builtin_constant_p (__len))
    246 	return __confstr_chk (__name, __buf, __len, __bos (__buf));
    247 
    248       if (__bos (__buf) < __len)
    249 	return __confstr_chk_warn (__name, __buf, __len, __bos (__buf));
    250     }
    251   return __confstr_alias (__name, __buf, __len);
    252 }
    253 
    254 
    255 extern int __getgroups_chk (int __size, __gid_t __list[], size_t __listlen)
    256      __THROW __wur;
    257 extern int __REDIRECT_NTH (__getgroups_alias, (int __size, __gid_t __list[]),
    258 			   getgroups) __wur;
    259 extern int __REDIRECT_NTH (__getgroups_chk_warn,
    260 			   (int __size, __gid_t __list[], size_t __listlen),
    261 			   __getgroups_chk)
    262      __wur __warnattr ("getgroups called with bigger group count than what "
    263 		       "can fit into destination buffer");
    264 
    265 __extern_always_inline int
    266 __NTH (getgroups (int __size, __gid_t __list[]))
    267 {
    268   if (__bos (__list) != (size_t) -1)
    269     {
    270       if (!__builtin_constant_p (__size) || __size < 0)
    271 	return __getgroups_chk (__size, __list, __bos (__list));
    272 
    273       if (__size * sizeof (__gid_t) > __bos (__list))
    274 	return __getgroups_chk_warn (__size, __list, __bos (__list));
    275     }
    276   return __getgroups_alias (__size, __list);
    277 }
    278 
    279 
    280 extern int __ttyname_r_chk (int __fd, char *__buf, size_t __buflen,
    281 			    size_t __nreal) __THROW __nonnull ((2));
    282 extern int __REDIRECT_NTH (__ttyname_r_alias, (int __fd, char *__buf,
    283 					       size_t __buflen), ttyname_r)
    284      __nonnull ((2));
    285 extern int __REDIRECT_NTH (__ttyname_r_chk_warn,
    286 			   (int __fd, char *__buf, size_t __buflen,
    287 			    size_t __nreal), __ttyname_r_chk)
    288      __nonnull ((2)) __warnattr ("ttyname_r called with bigger buflen than "
    289 				 "size of destination buffer");
    290 
    291 __extern_always_inline int
    292 __NTH (ttyname_r (int __fd, char *__buf, size_t __buflen))
    293 {
    294   if (__bos (__buf) != (size_t) -1)
    295     {
    296       if (!__builtin_constant_p (__buflen))
    297 	return __ttyname_r_chk (__fd, __buf, __buflen, __bos (__buf));
    298 
    299       if (__buflen > __bos (__buf))
    300 	return __ttyname_r_chk_warn (__fd, __buf, __buflen, __bos (__buf));
    301     }
    302   return __ttyname_r_alias (__fd, __buf, __buflen);
    303 }
    304 
    305 
    306 #if defined __USE_REENTRANT || defined __USE_POSIX199506
    307 extern int __getlogin_r_chk (char *__buf, size_t __buflen, size_t __nreal)
    308      __nonnull ((1));
    309 extern int __REDIRECT (__getlogin_r_alias, (char *__buf, size_t __buflen),
    310 		       getlogin_r) __nonnull ((1));
    311 extern int __REDIRECT (__getlogin_r_chk_warn,
    312 		       (char *__buf, size_t __buflen, size_t __nreal),
    313 		       __getlogin_r_chk)
    314      __nonnull ((1)) __warnattr ("getlogin_r called with bigger buflen than "
    315 				 "size of destination buffer");
    316 
    317 __extern_always_inline int
    318 getlogin_r (char *__buf, size_t __buflen)
    319 {
    320   if (__bos (__buf) != (size_t) -1)
    321     {
    322       if (!__builtin_constant_p (__buflen))
    323 	return __getlogin_r_chk (__buf, __buflen, __bos (__buf));
    324 
    325       if (__buflen > __bos (__buf))
    326 	return __getlogin_r_chk_warn (__buf, __buflen, __bos (__buf));
    327     }
    328   return __getlogin_r_alias (__buf, __buflen);
    329 }
    330 #endif
    331 
    332 
    333 #if defined __USE_BSD || defined __USE_UNIX98
    334 extern int __gethostname_chk (char *__buf, size_t __buflen, size_t __nreal)
    335      __THROW __nonnull ((1));
    336 extern int __REDIRECT_NTH (__gethostname_alias, (char *__buf, size_t __buflen),
    337 			   gethostname) __nonnull ((1));
    338 extern int __REDIRECT_NTH (__gethostname_chk_warn,
    339 			   (char *__buf, size_t __buflen, size_t __nreal),
    340 			   __gethostname_chk)
    341      __nonnull ((1)) __warnattr ("gethostname called with bigger buflen than "
    342 				 "size of destination buffer");
    343 
    344 __extern_always_inline int
    345 __NTH (gethostname (char *__buf, size_t __buflen))
    346 {
    347   if (__bos (__buf) != (size_t) -1)
    348     {
    349       if (!__builtin_constant_p (__buflen))
    350 	return __gethostname_chk (__buf, __buflen, __bos (__buf));
    351 
    352       if (__buflen > __bos (__buf))
    353 	return __gethostname_chk_warn (__buf, __buflen, __bos (__buf));
    354     }
    355   return __gethostname_alias (__buf, __buflen);
    356 }
    357 #endif
    358 
    359 
    360 #if defined __USE_BSD || (defined __USE_XOPEN && !defined __USE_UNIX98)
    361 extern int __getdomainname_chk (char *__buf, size_t __buflen, size_t __nreal)
    362      __THROW __nonnull ((1)) __wur;
    363 extern int __REDIRECT_NTH (__getdomainname_alias, (char *__buf,
    364 						   size_t __buflen),
    365 			   getdomainname) __nonnull ((1)) __wur;
    366 extern int __REDIRECT_NTH (__getdomainname_chk_warn,
    367 			   (char *__buf, size_t __buflen, size_t __nreal),
    368 			   __getdomainname_chk)
    369      __nonnull ((1)) __wur __warnattr ("getdomainname called with bigger "
    370 				       "buflen than size of destination "
    371 				       "buffer");
    372 
    373 __extern_always_inline int
    374 __NTH (getdomainname (char *__buf, size_t __buflen))
    375 {
    376   if (__bos (__buf) != (size_t) -1)
    377     {
    378       if (!__builtin_constant_p (__buflen))
    379 	return __getdomainname_chk (__buf, __buflen, __bos (__buf));
    380 
    381       if (__buflen > __bos (__buf))
    382 	return __getdomainname_chk_warn (__buf, __buflen, __bos (__buf));
    383     }
    384   return __getdomainname_alias (__buf, __buflen);
    385 }
    386 #endif
    387