diff options
author | Siddhesh Poyarekar <siddhesh@sourceware.org> | 2020-11-12 12:09:56 +0530 |
---|---|---|
committer | Siddhesh Poyarekar <siddhesh@sourceware.org> | 2020-11-12 14:36:43 +0530 |
commit | 7163ace3318d666d40771f5c8e7c4a148827070f (patch) | |
tree | e4069e211ca40c78133ae26d3c1eb57919ef345b /string/bits | |
parent | ee9946ce3c176092fb5fbabc7406a39479565a1b (diff) | |
download | glibc-7163ace3318d666d40771f5c8e7c4a148827070f.zip glibc-7163ace3318d666d40771f5c8e7c4a148827070f.tar.gz glibc-7163ace3318d666d40771f5c8e7c4a148827070f.tar.bz2 |
Use __builtin___stpncpy_chk when available
The builtin has been available in gcc since 4.7.0 and in clang since
2.6. This fixes stpncpy fortification with clang since it does a
better job of plugging in __stpncpy_chk in the right place than the
header hackery.
This has been tested by building and running all tests with gcc 10.2.1
and also with clang tip as of a few days ago (just the tests in debug/
since running all tests don't work with clang at the moment) to make
sure that both compilers pass the stpncpy tests.
Diffstat (limited to 'string/bits')
-rw-r--r-- | string/bits/string_fortified.h | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/string/bits/string_fortified.h b/string/bits/string_fortified.h index c8d3051..4c1aeb4 100644 --- a/string/bits/string_fortified.h +++ b/string/bits/string_fortified.h @@ -91,7 +91,13 @@ __NTH (strncpy (char *__restrict __dest, const char *__restrict __src, return __builtin___strncpy_chk (__dest, __src, __len, __bos (__dest)); } -/* XXX We have no corresponding builtin yet. */ +#if __GNUC_PREREQ (4, 7) || __glibc_clang_prereq (2, 6) +__fortify_function char * +__NTH (stpncpy (char *__dest, const char *__src, size_t __n)) +{ + return __builtin___stpncpy_chk (__dest, __src, __n, __bos (__dest)); +} +#else extern char *__stpncpy_chk (char *__dest, const char *__src, size_t __n, size_t __destlen) __THROW __attr_access ((__write_only__, 1, 3)) __attr_access ((__read_only__, 2)); @@ -106,6 +112,7 @@ __NTH (stpncpy (char *__dest, const char *__src, size_t __n)) return __stpncpy_chk (__dest, __src, __n, __bos (__dest)); return __stpncpy_alias (__dest, __src, __n); } +#endif __fortify_function char * |