wchar2.h 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611
  1. /* Checking macros for wchar functions.
  2. Copyright (C) 2005-2021 Free Software Foundation, Inc.
  3. This file is part of the GNU C Library.
  4. The GNU C Library is free software; you can redistribute it and/or
  5. modify it under the terms of the GNU Lesser General Public
  6. License as published by the Free Software Foundation; either
  7. version 2.1 of the License, or (at your option) any later version.
  8. The GNU C Library is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  11. Lesser General Public License for more details.
  12. You should have received a copy of the GNU Lesser General Public
  13. License along with the GNU C Library; if not, see
  14. <https://www.gnu.org/licenses/>. */
  15. #ifndef _WCHAR_H
  16. # error "Never include <bits/wchar2.h> directly; use <wchar.h> instead."
  17. #endif
  18. extern wchar_t *__wmemcpy_chk (wchar_t *__restrict __s1,
  19. const wchar_t *__restrict __s2, size_t __n,
  20. size_t __ns1) __THROW;
  21. extern wchar_t *__REDIRECT_NTH (__wmemcpy_alias,
  22. (wchar_t *__restrict __s1,
  23. const wchar_t *__restrict __s2, size_t __n),
  24. wmemcpy);
  25. extern wchar_t *__REDIRECT_NTH (__wmemcpy_chk_warn,
  26. (wchar_t *__restrict __s1,
  27. const wchar_t *__restrict __s2, size_t __n,
  28. size_t __ns1), __wmemcpy_chk)
  29. __warnattr ("wmemcpy called with length bigger than size of destination "
  30. "buffer");
  31. __fortify_function wchar_t *
  32. __NTH (wmemcpy (wchar_t *__restrict __s1, const wchar_t *__restrict __s2,
  33. size_t __n))
  34. {
  35. if (__glibc_objsize0 (__s1) != (size_t) -1)
  36. {
  37. if (!__builtin_constant_p (__n))
  38. return __wmemcpy_chk (__s1, __s2, __n,
  39. __glibc_objsize0 (__s1) / sizeof (wchar_t));
  40. if (__n > __glibc_objsize0 (__s1) / sizeof (wchar_t))
  41. return __wmemcpy_chk_warn (__s1, __s2, __n,
  42. __glibc_objsize0 (__s1) / sizeof (wchar_t));
  43. }
  44. return __wmemcpy_alias (__s1, __s2, __n);
  45. }
  46. extern wchar_t *__wmemmove_chk (wchar_t *__s1, const wchar_t *__s2,
  47. size_t __n, size_t __ns1) __THROW;
  48. extern wchar_t *__REDIRECT_NTH (__wmemmove_alias, (wchar_t *__s1,
  49. const wchar_t *__s2,
  50. size_t __n), wmemmove);
  51. extern wchar_t *__REDIRECT_NTH (__wmemmove_chk_warn,
  52. (wchar_t *__s1, const wchar_t *__s2,
  53. size_t __n, size_t __ns1), __wmemmove_chk)
  54. __warnattr ("wmemmove called with length bigger than size of destination "
  55. "buffer");
  56. __fortify_function wchar_t *
  57. __NTH (wmemmove (wchar_t *__s1, const wchar_t *__s2, size_t __n))
  58. {
  59. if (__glibc_objsize0 (__s1) != (size_t) -1)
  60. {
  61. if (!__builtin_constant_p (__n))
  62. return __wmemmove_chk (__s1, __s2, __n,
  63. __glibc_objsize0 (__s1) / sizeof (wchar_t));
  64. if (__n > __glibc_objsize0 (__s1) / sizeof (wchar_t))
  65. return __wmemmove_chk_warn (__s1, __s2, __n,
  66. (__glibc_objsize0 (__s1)
  67. / sizeof (wchar_t)));
  68. }
  69. return __wmemmove_alias (__s1, __s2, __n);
  70. }
  71. #ifdef __USE_GNU
  72. extern wchar_t *__wmempcpy_chk (wchar_t *__restrict __s1,
  73. const wchar_t *__restrict __s2, size_t __n,
  74. size_t __ns1) __THROW;
  75. extern wchar_t *__REDIRECT_NTH (__wmempcpy_alias,
  76. (wchar_t *__restrict __s1,
  77. const wchar_t *__restrict __s2,
  78. size_t __n), wmempcpy);
  79. extern wchar_t *__REDIRECT_NTH (__wmempcpy_chk_warn,
  80. (wchar_t *__restrict __s1,
  81. const wchar_t *__restrict __s2, size_t __n,
  82. size_t __ns1), __wmempcpy_chk)
  83. __warnattr ("wmempcpy called with length bigger than size of destination "
  84. "buffer");
  85. __fortify_function wchar_t *
  86. __NTH (wmempcpy (wchar_t *__restrict __s1, const wchar_t *__restrict __s2,
  87. size_t __n))
  88. {
  89. if (__glibc_objsize0 (__s1) != (size_t) -1)
  90. {
  91. if (!__builtin_constant_p (__n))
  92. return __wmempcpy_chk (__s1, __s2, __n,
  93. __glibc_objsize0 (__s1) / sizeof (wchar_t));
  94. if (__n > __glibc_objsize0 (__s1) / sizeof (wchar_t))
  95. return __wmempcpy_chk_warn (__s1, __s2, __n,
  96. (__glibc_objsize0 (__s1)
  97. / sizeof (wchar_t)));
  98. }
  99. return __wmempcpy_alias (__s1, __s2, __n);
  100. }
  101. #endif
  102. extern wchar_t *__wmemset_chk (wchar_t *__s, wchar_t __c, size_t __n,
  103. size_t __ns) __THROW;
  104. extern wchar_t *__REDIRECT_NTH (__wmemset_alias, (wchar_t *__s, wchar_t __c,
  105. size_t __n), wmemset);
  106. extern wchar_t *__REDIRECT_NTH (__wmemset_chk_warn,
  107. (wchar_t *__s, wchar_t __c, size_t __n,
  108. size_t __ns), __wmemset_chk)
  109. __warnattr ("wmemset called with length bigger than size of destination "
  110. "buffer");
  111. __fortify_function wchar_t *
  112. __NTH (wmemset (wchar_t *__s, wchar_t __c, size_t __n))
  113. {
  114. if (__glibc_objsize0 (__s) != (size_t) -1)
  115. {
  116. if (!__builtin_constant_p (__n))
  117. return __wmemset_chk (__s, __c, __n,
  118. __glibc_objsize0 (__s) / sizeof (wchar_t));
  119. if (__n > __glibc_objsize0 (__s) / sizeof (wchar_t))
  120. return __wmemset_chk_warn (__s, __c, __n,
  121. __glibc_objsize0 (__s) / sizeof (wchar_t));
  122. }
  123. return __wmemset_alias (__s, __c, __n);
  124. }
  125. extern wchar_t *__wcscpy_chk (wchar_t *__restrict __dest,
  126. const wchar_t *__restrict __src,
  127. size_t __n) __THROW;
  128. extern wchar_t *__REDIRECT_NTH (__wcscpy_alias,
  129. (wchar_t *__restrict __dest,
  130. const wchar_t *__restrict __src), wcscpy);
  131. __fortify_function wchar_t *
  132. __NTH (wcscpy (wchar_t *__restrict __dest, const wchar_t *__restrict __src))
  133. {
  134. if (__glibc_objsize (__dest) != (size_t) -1)
  135. return __wcscpy_chk (__dest, __src,
  136. __glibc_objsize (__dest) / sizeof (wchar_t));
  137. return __wcscpy_alias (__dest, __src);
  138. }
  139. extern wchar_t *__wcpcpy_chk (wchar_t *__restrict __dest,
  140. const wchar_t *__restrict __src,
  141. size_t __destlen) __THROW;
  142. extern wchar_t *__REDIRECT_NTH (__wcpcpy_alias,
  143. (wchar_t *__restrict __dest,
  144. const wchar_t *__restrict __src), wcpcpy);
  145. __fortify_function wchar_t *
  146. __NTH (wcpcpy (wchar_t *__restrict __dest, const wchar_t *__restrict __src))
  147. {
  148. if (__glibc_objsize (__dest) != (size_t) -1)
  149. return __wcpcpy_chk (__dest, __src,
  150. __glibc_objsize (__dest) / sizeof (wchar_t));
  151. return __wcpcpy_alias (__dest, __src);
  152. }
  153. extern wchar_t *__wcsncpy_chk (wchar_t *__restrict __dest,
  154. const wchar_t *__restrict __src, size_t __n,
  155. size_t __destlen) __THROW;
  156. extern wchar_t *__REDIRECT_NTH (__wcsncpy_alias,
  157. (wchar_t *__restrict __dest,
  158. const wchar_t *__restrict __src,
  159. size_t __n), wcsncpy);
  160. extern wchar_t *__REDIRECT_NTH (__wcsncpy_chk_warn,
  161. (wchar_t *__restrict __dest,
  162. const wchar_t *__restrict __src,
  163. size_t __n, size_t __destlen), __wcsncpy_chk)
  164. __warnattr ("wcsncpy called with length bigger than size of destination "
  165. "buffer");
  166. __fortify_function wchar_t *
  167. __NTH (wcsncpy (wchar_t *__restrict __dest, const wchar_t *__restrict __src,
  168. size_t __n))
  169. {
  170. if (__glibc_objsize (__dest) != (size_t) -1)
  171. {
  172. if (!__builtin_constant_p (__n))
  173. return __wcsncpy_chk (__dest, __src, __n,
  174. __glibc_objsize (__dest) / sizeof (wchar_t));
  175. if (__n > __glibc_objsize (__dest) / sizeof (wchar_t))
  176. return __wcsncpy_chk_warn (__dest, __src, __n,
  177. (__glibc_objsize (__dest)
  178. / sizeof (wchar_t)));
  179. }
  180. return __wcsncpy_alias (__dest, __src, __n);
  181. }
  182. extern wchar_t *__wcpncpy_chk (wchar_t *__restrict __dest,
  183. const wchar_t *__restrict __src, size_t __n,
  184. size_t __destlen) __THROW;
  185. extern wchar_t *__REDIRECT_NTH (__wcpncpy_alias,
  186. (wchar_t *__restrict __dest,
  187. const wchar_t *__restrict __src,
  188. size_t __n), wcpncpy);
  189. extern wchar_t *__REDIRECT_NTH (__wcpncpy_chk_warn,
  190. (wchar_t *__restrict __dest,
  191. const wchar_t *__restrict __src,
  192. size_t __n, size_t __destlen), __wcpncpy_chk)
  193. __warnattr ("wcpncpy called with length bigger than size of destination "
  194. "buffer");
  195. __fortify_function wchar_t *
  196. __NTH (wcpncpy (wchar_t *__restrict __dest, const wchar_t *__restrict __src,
  197. size_t __n))
  198. {
  199. if (__glibc_objsize (__dest) != (size_t) -1)
  200. {
  201. if (!__builtin_constant_p (__n))
  202. return __wcpncpy_chk (__dest, __src, __n,
  203. __glibc_objsize (__dest) / sizeof (wchar_t));
  204. if (__n > __glibc_objsize (__dest) / sizeof (wchar_t))
  205. return __wcpncpy_chk_warn (__dest, __src, __n,
  206. (__glibc_objsize (__dest)
  207. / sizeof (wchar_t)));
  208. }
  209. return __wcpncpy_alias (__dest, __src, __n);
  210. }
  211. extern wchar_t *__wcscat_chk (wchar_t *__restrict __dest,
  212. const wchar_t *__restrict __src,
  213. size_t __destlen) __THROW;
  214. extern wchar_t *__REDIRECT_NTH (__wcscat_alias,
  215. (wchar_t *__restrict __dest,
  216. const wchar_t *__restrict __src), wcscat);
  217. __fortify_function wchar_t *
  218. __NTH (wcscat (wchar_t *__restrict __dest, const wchar_t *__restrict __src))
  219. {
  220. if (__glibc_objsize (__dest) != (size_t) -1)
  221. return __wcscat_chk (__dest, __src,
  222. __glibc_objsize (__dest) / sizeof (wchar_t));
  223. return __wcscat_alias (__dest, __src);
  224. }
  225. extern wchar_t *__wcsncat_chk (wchar_t *__restrict __dest,
  226. const wchar_t *__restrict __src,
  227. size_t __n, size_t __destlen) __THROW;
  228. extern wchar_t *__REDIRECT_NTH (__wcsncat_alias,
  229. (wchar_t *__restrict __dest,
  230. const wchar_t *__restrict __src,
  231. size_t __n), wcsncat);
  232. __fortify_function wchar_t *
  233. __NTH (wcsncat (wchar_t *__restrict __dest, const wchar_t *__restrict __src,
  234. size_t __n))
  235. {
  236. if (__glibc_objsize (__dest) != (size_t) -1)
  237. return __wcsncat_chk (__dest, __src, __n,
  238. __glibc_objsize (__dest) / sizeof (wchar_t));
  239. return __wcsncat_alias (__dest, __src, __n);
  240. }
  241. extern int __swprintf_chk (wchar_t *__restrict __s, size_t __n,
  242. int __flag, size_t __s_len,
  243. const wchar_t *__restrict __format, ...)
  244. __THROW /* __attribute__ ((__format__ (__wprintf__, 5, 6))) */;
  245. extern int __REDIRECT_NTH_LDBL (__swprintf_alias,
  246. (wchar_t *__restrict __s, size_t __n,
  247. const wchar_t *__restrict __fmt, ...),
  248. swprintf);
  249. #ifdef __va_arg_pack
  250. __fortify_function int
  251. __NTH (swprintf (wchar_t *__restrict __s, size_t __n,
  252. const wchar_t *__restrict __fmt, ...))
  253. {
  254. if (__glibc_objsize (__s) != (size_t) -1 || __USE_FORTIFY_LEVEL > 1)
  255. return __swprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1,
  256. __glibc_objsize (__s) / sizeof (wchar_t),
  257. __fmt, __va_arg_pack ());
  258. return __swprintf_alias (__s, __n, __fmt, __va_arg_pack ());
  259. }
  260. #elif !defined __cplusplus
  261. /* XXX We might want to have support in gcc for swprintf. */
  262. # define swprintf(s, n, ...) \
  263. (__glibc_objsize (s) != (size_t) -1 || __USE_FORTIFY_LEVEL > 1 \
  264. ? __swprintf_chk (s, n, __USE_FORTIFY_LEVEL - 1, \
  265. __glibc_objsize (s) / sizeof (wchar_t), __VA_ARGS__) \
  266. : swprintf (s, n, __VA_ARGS__))
  267. #endif
  268. extern int __vswprintf_chk (wchar_t *__restrict __s, size_t __n,
  269. int __flag, size_t __s_len,
  270. const wchar_t *__restrict __format,
  271. __gnuc_va_list __arg)
  272. __THROW /* __attribute__ ((__format__ (__wprintf__, 5, 0))) */;
  273. extern int __REDIRECT_NTH_LDBL (__vswprintf_alias,
  274. (wchar_t *__restrict __s, size_t __n,
  275. const wchar_t *__restrict __fmt,
  276. __gnuc_va_list __ap), vswprintf);
  277. __fortify_function int
  278. __NTH (vswprintf (wchar_t *__restrict __s, size_t __n,
  279. const wchar_t *__restrict __fmt, __gnuc_va_list __ap))
  280. {
  281. if (__glibc_objsize (__s) != (size_t) -1 || __USE_FORTIFY_LEVEL > 1)
  282. return __vswprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1,
  283. __glibc_objsize (__s) / sizeof (wchar_t), __fmt,
  284. __ap);
  285. return __vswprintf_alias (__s, __n, __fmt, __ap);
  286. }
  287. #if __USE_FORTIFY_LEVEL > 1
  288. extern int __fwprintf_chk (__FILE *__restrict __stream, int __flag,
  289. const wchar_t *__restrict __format, ...);
  290. extern int __wprintf_chk (int __flag, const wchar_t *__restrict __format,
  291. ...);
  292. extern int __vfwprintf_chk (__FILE *__restrict __stream, int __flag,
  293. const wchar_t *__restrict __format,
  294. __gnuc_va_list __ap);
  295. extern int __vwprintf_chk (int __flag, const wchar_t *__restrict __format,
  296. __gnuc_va_list __ap);
  297. # ifdef __va_arg_pack
  298. __fortify_function int
  299. wprintf (const wchar_t *__restrict __fmt, ...)
  300. {
  301. return __wprintf_chk (__USE_FORTIFY_LEVEL - 1, __fmt, __va_arg_pack ());
  302. }
  303. __fortify_function int
  304. fwprintf (__FILE *__restrict __stream, const wchar_t *__restrict __fmt, ...)
  305. {
  306. return __fwprintf_chk (__stream, __USE_FORTIFY_LEVEL - 1, __fmt,
  307. __va_arg_pack ());
  308. }
  309. # elif !defined __cplusplus
  310. # define wprintf(...) \
  311. __wprintf_chk (__USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
  312. # define fwprintf(stream, ...) \
  313. __fwprintf_chk (stream, __USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
  314. # endif
  315. __fortify_function int
  316. vwprintf (const wchar_t *__restrict __fmt, __gnuc_va_list __ap)
  317. {
  318. return __vwprintf_chk (__USE_FORTIFY_LEVEL - 1, __fmt, __ap);
  319. }
  320. __fortify_function int
  321. vfwprintf (__FILE *__restrict __stream,
  322. const wchar_t *__restrict __fmt, __gnuc_va_list __ap)
  323. {
  324. return __vfwprintf_chk (__stream, __USE_FORTIFY_LEVEL - 1, __fmt, __ap);
  325. }
  326. #endif
  327. extern wchar_t *__fgetws_chk (wchar_t *__restrict __s, size_t __size, int __n,
  328. __FILE *__restrict __stream) __wur;
  329. extern wchar_t *__REDIRECT (__fgetws_alias,
  330. (wchar_t *__restrict __s, int __n,
  331. __FILE *__restrict __stream), fgetws) __wur;
  332. extern wchar_t *__REDIRECT (__fgetws_chk_warn,
  333. (wchar_t *__restrict __s, size_t __size, int __n,
  334. __FILE *__restrict __stream), __fgetws_chk)
  335. __wur __warnattr ("fgetws called with bigger size than length "
  336. "of destination buffer");
  337. __fortify_function __wur wchar_t *
  338. fgetws (wchar_t *__restrict __s, int __n, __FILE *__restrict __stream)
  339. {
  340. if (__glibc_objsize (__s) != (size_t) -1)
  341. {
  342. if (!__builtin_constant_p (__n) || __n <= 0)
  343. return __fgetws_chk (__s, __glibc_objsize (__s) / sizeof (wchar_t),
  344. __n, __stream);
  345. if ((size_t) __n > __glibc_objsize (__s) / sizeof (wchar_t))
  346. return __fgetws_chk_warn (__s,
  347. __glibc_objsize (__s) / sizeof (wchar_t),
  348. __n, __stream);
  349. }
  350. return __fgetws_alias (__s, __n, __stream);
  351. }
  352. #ifdef __USE_GNU
  353. extern wchar_t *__fgetws_unlocked_chk (wchar_t *__restrict __s, size_t __size,
  354. int __n, __FILE *__restrict __stream)
  355. __wur;
  356. extern wchar_t *__REDIRECT (__fgetws_unlocked_alias,
  357. (wchar_t *__restrict __s, int __n,
  358. __FILE *__restrict __stream), fgetws_unlocked)
  359. __wur;
  360. extern wchar_t *__REDIRECT (__fgetws_unlocked_chk_warn,
  361. (wchar_t *__restrict __s, size_t __size, int __n,
  362. __FILE *__restrict __stream),
  363. __fgetws_unlocked_chk)
  364. __wur __warnattr ("fgetws_unlocked called with bigger size than length "
  365. "of destination buffer");
  366. __fortify_function __wur wchar_t *
  367. fgetws_unlocked (wchar_t *__restrict __s, int __n, __FILE *__restrict __stream)
  368. {
  369. if (__glibc_objsize (__s) != (size_t) -1)
  370. {
  371. if (!__builtin_constant_p (__n) || __n <= 0)
  372. return __fgetws_unlocked_chk (__s,
  373. __glibc_objsize (__s) / sizeof (wchar_t),
  374. __n, __stream);
  375. if ((size_t) __n > __glibc_objsize (__s) / sizeof (wchar_t))
  376. return __fgetws_unlocked_chk_warn (__s,
  377. (__glibc_objsize (__s)
  378. / sizeof (wchar_t)),
  379. __n, __stream);
  380. }
  381. return __fgetws_unlocked_alias (__s, __n, __stream);
  382. }
  383. #endif
  384. extern size_t __wcrtomb_chk (char *__restrict __s, wchar_t __wchar,
  385. mbstate_t *__restrict __p,
  386. size_t __buflen) __THROW __wur;
  387. extern size_t __REDIRECT_NTH (__wcrtomb_alias,
  388. (char *__restrict __s, wchar_t __wchar,
  389. mbstate_t *__restrict __ps), wcrtomb) __wur;
  390. __fortify_function __wur size_t
  391. __NTH (wcrtomb (char *__restrict __s, wchar_t __wchar,
  392. mbstate_t *__restrict __ps))
  393. {
  394. /* We would have to include <limits.h> to get a definition of MB_LEN_MAX.
  395. But this would only disturb the namespace. So we define our own
  396. version here. */
  397. #define __WCHAR_MB_LEN_MAX 16
  398. #if defined MB_LEN_MAX && MB_LEN_MAX != __WCHAR_MB_LEN_MAX
  399. # error "Assumed value of MB_LEN_MAX wrong"
  400. #endif
  401. if (__glibc_objsize (__s) != (size_t) -1
  402. && __WCHAR_MB_LEN_MAX > __glibc_objsize (__s))
  403. return __wcrtomb_chk (__s, __wchar, __ps, __glibc_objsize (__s));
  404. return __wcrtomb_alias (__s, __wchar, __ps);
  405. }
  406. extern size_t __mbsrtowcs_chk (wchar_t *__restrict __dst,
  407. const char **__restrict __src,
  408. size_t __len, mbstate_t *__restrict __ps,
  409. size_t __dstlen) __THROW;
  410. extern size_t __REDIRECT_NTH (__mbsrtowcs_alias,
  411. (wchar_t *__restrict __dst,
  412. const char **__restrict __src,
  413. size_t __len, mbstate_t *__restrict __ps),
  414. mbsrtowcs);
  415. extern size_t __REDIRECT_NTH (__mbsrtowcs_chk_warn,
  416. (wchar_t *__restrict __dst,
  417. const char **__restrict __src,
  418. size_t __len, mbstate_t *__restrict __ps,
  419. size_t __dstlen), __mbsrtowcs_chk)
  420. __warnattr ("mbsrtowcs called with dst buffer smaller than len "
  421. "* sizeof (wchar_t)");
  422. __fortify_function size_t
  423. __NTH (mbsrtowcs (wchar_t *__restrict __dst, const char **__restrict __src,
  424. size_t __len, mbstate_t *__restrict __ps))
  425. {
  426. if (__glibc_objsize (__dst) != (size_t) -1)
  427. {
  428. if (!__builtin_constant_p (__len))
  429. return __mbsrtowcs_chk (__dst, __src, __len, __ps,
  430. __glibc_objsize (__dst) / sizeof (wchar_t));
  431. if (__len > __glibc_objsize (__dst) / sizeof (wchar_t))
  432. return __mbsrtowcs_chk_warn (__dst, __src, __len, __ps,
  433. (__glibc_objsize (__dst)
  434. / sizeof (wchar_t)));
  435. }
  436. return __mbsrtowcs_alias (__dst, __src, __len, __ps);
  437. }
  438. extern size_t __wcsrtombs_chk (char *__restrict __dst,
  439. const wchar_t **__restrict __src,
  440. size_t __len, mbstate_t *__restrict __ps,
  441. size_t __dstlen) __THROW;
  442. extern size_t __REDIRECT_NTH (__wcsrtombs_alias,
  443. (char *__restrict __dst,
  444. const wchar_t **__restrict __src,
  445. size_t __len, mbstate_t *__restrict __ps),
  446. wcsrtombs);
  447. extern size_t __REDIRECT_NTH (__wcsrtombs_chk_warn,
  448. (char *__restrict __dst,
  449. const wchar_t **__restrict __src,
  450. size_t __len, mbstate_t *__restrict __ps,
  451. size_t __dstlen), __wcsrtombs_chk)
  452. __warnattr ("wcsrtombs called with dst buffer smaller than len");
  453. __fortify_function size_t
  454. __NTH (wcsrtombs (char *__restrict __dst, const wchar_t **__restrict __src,
  455. size_t __len, mbstate_t *__restrict __ps))
  456. {
  457. if (__glibc_objsize (__dst) != (size_t) -1)
  458. {
  459. if (!__builtin_constant_p (__len))
  460. return __wcsrtombs_chk (__dst, __src, __len, __ps,
  461. __glibc_objsize (__dst));
  462. if (__len > __glibc_objsize (__dst))
  463. return __wcsrtombs_chk_warn (__dst, __src, __len, __ps,
  464. __glibc_objsize (__dst));
  465. }
  466. return __wcsrtombs_alias (__dst, __src, __len, __ps);
  467. }
  468. #ifdef __USE_GNU
  469. extern size_t __mbsnrtowcs_chk (wchar_t *__restrict __dst,
  470. const char **__restrict __src, size_t __nmc,
  471. size_t __len, mbstate_t *__restrict __ps,
  472. size_t __dstlen) __THROW;
  473. extern size_t __REDIRECT_NTH (__mbsnrtowcs_alias,
  474. (wchar_t *__restrict __dst,
  475. const char **__restrict __src, size_t __nmc,
  476. size_t __len, mbstate_t *__restrict __ps),
  477. mbsnrtowcs);
  478. extern size_t __REDIRECT_NTH (__mbsnrtowcs_chk_warn,
  479. (wchar_t *__restrict __dst,
  480. const char **__restrict __src, size_t __nmc,
  481. size_t __len, mbstate_t *__restrict __ps,
  482. size_t __dstlen), __mbsnrtowcs_chk)
  483. __warnattr ("mbsnrtowcs called with dst buffer smaller than len "
  484. "* sizeof (wchar_t)");
  485. __fortify_function size_t
  486. __NTH (mbsnrtowcs (wchar_t *__restrict __dst, const char **__restrict __src,
  487. size_t __nmc, size_t __len, mbstate_t *__restrict __ps))
  488. {
  489. if (__glibc_objsize (__dst) != (size_t) -1)
  490. {
  491. if (!__builtin_constant_p (__len))
  492. return __mbsnrtowcs_chk (__dst, __src, __nmc, __len, __ps,
  493. __glibc_objsize (__dst) / sizeof (wchar_t));
  494. if (__len > __glibc_objsize (__dst) / sizeof (wchar_t))
  495. return __mbsnrtowcs_chk_warn (__dst, __src, __nmc, __len, __ps,
  496. (__glibc_objsize (__dst)
  497. / sizeof (wchar_t)));
  498. }
  499. return __mbsnrtowcs_alias (__dst, __src, __nmc, __len, __ps);
  500. }
  501. extern size_t __wcsnrtombs_chk (char *__restrict __dst,
  502. const wchar_t **__restrict __src,
  503. size_t __nwc, size_t __len,
  504. mbstate_t *__restrict __ps, size_t __dstlen)
  505. __THROW;
  506. extern size_t __REDIRECT_NTH (__wcsnrtombs_alias,
  507. (char *__restrict __dst,
  508. const wchar_t **__restrict __src,
  509. size_t __nwc, size_t __len,
  510. mbstate_t *__restrict __ps), wcsnrtombs);
  511. extern size_t __REDIRECT_NTH (__wcsnrtombs_chk_warn,
  512. (char *__restrict __dst,
  513. const wchar_t **__restrict __src,
  514. size_t __nwc, size_t __len,
  515. mbstate_t *__restrict __ps,
  516. size_t __dstlen), __wcsnrtombs_chk)
  517. __warnattr ("wcsnrtombs called with dst buffer smaller than len");
  518. __fortify_function size_t
  519. __NTH (wcsnrtombs (char *__restrict __dst, const wchar_t **__restrict __src,
  520. size_t __nwc, size_t __len, mbstate_t *__restrict __ps))
  521. {
  522. if (__glibc_objsize (__dst) != (size_t) -1)
  523. {
  524. if (!__builtin_constant_p (__len))
  525. return __wcsnrtombs_chk (__dst, __src, __nwc, __len, __ps,
  526. __glibc_objsize (__dst));
  527. if (__len > __glibc_objsize (__dst))
  528. return __wcsnrtombs_chk_warn (__dst, __src, __nwc, __len, __ps,
  529. __glibc_objsize (__dst));
  530. }
  531. return __wcsnrtombs_alias (__dst, __src, __nwc, __len, __ps);
  532. }
  533. #endif