mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-29 11:41:21 +03:00
Implement strlcpy and strlcat [BZ #178]
These functions are about to be added to POSIX, under Austin Group issue 986. The fortified strlcat implementation does not raise SIGABRT if the destination buffer does not contain a null terminator, it just inherits the non-failing regular strlcat behavior. Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
This commit is contained in:
@ -139,4 +139,40 @@ __NTH (strncat (char *__restrict __dest, const char *__restrict __src,
|
||||
__glibc_objsize (__dest));
|
||||
}
|
||||
|
||||
#ifdef __USE_MISC
|
||||
extern size_t __strlcpy_chk (char *__dest, const char *__src, size_t __n,
|
||||
size_t __destlen) __THROW;
|
||||
extern size_t __REDIRECT_NTH (__strlcpy_alias,
|
||||
(char *__dest, const char *__src, size_t __n),
|
||||
strlcpy);
|
||||
|
||||
__fortify_function size_t
|
||||
__NTH (strlcpy (char *__restrict __dest, const char *__restrict __src,
|
||||
size_t __n))
|
||||
{
|
||||
if (__glibc_objsize (__dest) != (size_t) -1
|
||||
&& (!__builtin_constant_p (__n > __glibc_objsize (__dest))
|
||||
|| __n > __glibc_objsize (__dest)))
|
||||
return __strlcpy_chk (__dest, __src, __n, __glibc_objsize (__dest));
|
||||
return __strlcpy_alias (__dest, __src, __n);
|
||||
}
|
||||
|
||||
extern size_t __strlcat_chk (char *__dest, const char *__src, size_t __n,
|
||||
size_t __destlen) __THROW;
|
||||
extern size_t __REDIRECT_NTH (__strlcat_alias,
|
||||
(char *__dest, const char *__src, size_t __n),
|
||||
strlcat);
|
||||
|
||||
__fortify_function size_t
|
||||
__NTH (strlcat (char *__restrict __dest, const char *__restrict __src,
|
||||
size_t __n))
|
||||
{
|
||||
if (__glibc_objsize (__dest) != (size_t) -1
|
||||
&& (!__builtin_constant_p (__n > __glibc_objsize (__dest))
|
||||
|| __n > __glibc_objsize (__dest)))
|
||||
return __strlcat_chk (__dest, __src, __n, __glibc_objsize (__dest));
|
||||
return __strlcat_alias (__dest, __src, __n);
|
||||
}
|
||||
#endif /* __USE_MISC */
|
||||
|
||||
#endif /* bits/string_fortified.h */
|
||||
|
Reference in New Issue
Block a user