diff options
Diffstat (limited to 'debug')
-rw-r--r-- | debug/Makefile | 2 | ||||
-rw-r--r-- | debug/Versions | 2 | ||||
-rw-r--r-- | debug/tst-fortify.c | 17 | ||||
-rw-r--r-- | debug/wcslcat_chk.c | 31 | ||||
-rw-r--r-- | debug/wcslcpy_chk.c | 31 |
5 files changed, 83 insertions, 0 deletions
diff --git a/debug/Makefile b/debug/Makefile index 55e2aadec9..9d658e3002 100644 --- a/debug/Makefile +++ b/debug/Makefile @@ -105,6 +105,8 @@ routines = \ wcrtomb_chk \ wcscat_chk \ wcscpy_chk \ + wcslcat_chk \ + wcslcpy_chk \ wcsncat_chk \ wcsncpy_chk \ wcsnrtombs_chk \ diff --git a/debug/Versions b/debug/Versions index 94dfa5f428..9cf2725992 100644 --- a/debug/Versions +++ b/debug/Versions @@ -61,6 +61,8 @@ libc { GLIBC_2.38 { __strlcat_chk; __strlcpy_chk; + __wcslcat_chk; + __wcslcpy_chk; } GLIBC_PRIVATE { __fortify_fail; diff --git a/debug/tst-fortify.c b/debug/tst-fortify.c index 0f823a85d0..3744aadad4 100644 --- a/debug/tst-fortify.c +++ b/debug/tst-fortify.c @@ -783,6 +783,18 @@ do_test (void) CHK_FAIL_END CHK_FAIL_START + wcslcpy (wbuf + 7, L"X", 4); + CHK_FAIL_END + + CHK_FAIL_START + wcslcpy (wbuf + 7, L"X", l0 + 4); + CHK_FAIL_END + + CHK_FAIL_START + wcslcpy (wbuf + 9, L"XABCDEFGH", 8); + CHK_FAIL_END + + CHK_FAIL_START wcpncpy (wbuf + 9, L"XABCDEFGH", 8); CHK_FAIL_END @@ -804,6 +816,11 @@ do_test (void) wcsncat (wbuf, L"ZYXWV", l0 + 3); CHK_FAIL_END + wmemcpy (wbuf, wstr1 + 4, 7); + CHK_FAIL_START + wcslcat (wbuf, L"ZYXWV", l0 + 11); + CHK_FAIL_END + CHK_FAIL_START wmemcpy (wa.buf1 + 1, L"abcdefghij", 10); CHK_FAIL_END diff --git a/debug/wcslcat_chk.c b/debug/wcslcat_chk.c new file mode 100644 index 0000000000..8ddcc012b1 --- /dev/null +++ b/debug/wcslcat_chk.c @@ -0,0 +1,31 @@ +/* Fortified version of wcslcat. + Copyright (C) 2023 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + +#include <wchar.h> + +/* Check that the user-supplied size does not exceed the + compiler-determined size, and then forward to wcslcat. */ +size_t +__wcslcat_chk (wchar_t *__restrict s1, const wchar_t *__restrict s2, + size_t n, size_t s1len) +{ + if (__glibc_unlikely (s1len < n)) + __chk_fail (); + + return __wcslcat (s1, s2, n); +} diff --git a/debug/wcslcpy_chk.c b/debug/wcslcpy_chk.c new file mode 100644 index 0000000000..077fa3715f --- /dev/null +++ b/debug/wcslcpy_chk.c @@ -0,0 +1,31 @@ +/* Fortified version of wcslcpy. + Copyright (C) 2023 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + +#include <wchar.h> + +/* Check that the user-supplied size does not exceed the + compiler-determined size, and then forward to wcslcpy. */ +size_t +__wcslcpy_chk (wchar_t *__restrict s1, const wchar_t *__restrict s2, + size_t n, size_t s1len) +{ + if (__glibc_unlikely (s1len < n)) + __chk_fail (); + + return __wcslcpy (s1, s2, n); +} |