mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-03 06:59:21 +00:00
Merge pull request #1886 from donaldsharp/strlcpy
lib: Fixup strlcat and strlcpy to be a bit more descriptive
This commit is contained in:
commit
2b9a295256
@ -28,23 +28,25 @@
|
||||
#ifndef HAVE_STRLCAT
|
||||
#undef strlcat
|
||||
|
||||
size_t strlcat(char *__restrict dest, const char *__restrict src, size_t size);
|
||||
size_t strlcat(char *__restrict dest,
|
||||
const char *__restrict src, size_t destsize);
|
||||
|
||||
size_t strlcat(char *__restrict dest, const char *__restrict src, size_t size)
|
||||
size_t strlcat(char *__restrict dest,
|
||||
const char *__restrict src, size_t destsize)
|
||||
{
|
||||
size_t src_length = strlen(src);
|
||||
|
||||
/* Our implementation strlcat supports dest == NULL if size == 0
|
||||
(for consistency with snprintf and strlcpy), but strnlen does
|
||||
not, so we have to cover this case explicitly. */
|
||||
if (size == 0)
|
||||
if (destsize == 0)
|
||||
return src_length;
|
||||
|
||||
size_t dest_length = strnlen(dest, size);
|
||||
if (dest_length != size) {
|
||||
size_t dest_length = strnlen(dest, destsize);
|
||||
if (dest_length != destsize) {
|
||||
/* Copy at most the remaining number of characters in the
|
||||
destination buffer. Leave for the NUL terminator. */
|
||||
size_t to_copy = size - dest_length - 1;
|
||||
size_t to_copy = destsize - dest_length - 1;
|
||||
/* But not more than what is available in the source string. */
|
||||
if (to_copy > src_length)
|
||||
to_copy = src_length;
|
||||
|
@ -27,23 +27,26 @@
|
||||
#ifndef HAVE_STRLCPY
|
||||
#undef strlcpy
|
||||
|
||||
size_t strlcpy(char *__restrict dest, const char *__restrict src, size_t size);
|
||||
size_t strlcpy(char *__restrict dest,
|
||||
const char *__restrict src, size_t destsize);
|
||||
|
||||
size_t strlcpy(char *__restrict dest, const char *__restrict src, size_t size)
|
||||
size_t strlcpy(char *__restrict dest,
|
||||
const char *__restrict src, size_t destsize)
|
||||
{
|
||||
size_t src_length = strlen(src);
|
||||
|
||||
if (__builtin_expect(src_length >= size, 0)) {
|
||||
if (size > 0) {
|
||||
/* Copy the leading portion of the string. The last
|
||||
character is subsequently overwritten with the NUL
|
||||
terminator, but the destination size is usually a
|
||||
multiple of a small power of two, so writing it twice
|
||||
should be more efficient than copying an odd number
|
||||
of
|
||||
bytes. */
|
||||
memcpy(dest, src, size);
|
||||
dest[size - 1] = '\0';
|
||||
if (__builtin_expect(src_length >= destsize, 0)) {
|
||||
if (destsize > 0) {
|
||||
/*
|
||||
* Copy the leading portion of the string. The last
|
||||
* character is subsequently overwritten with the NUL
|
||||
* terminator, but the destination destsize is usually
|
||||
* a multiple of a small power of two, so writing it
|
||||
* twice should be more efficient than copying an odd
|
||||
* number of bytes.
|
||||
*/
|
||||
memcpy(dest, src, destsize);
|
||||
dest[destsize - 1] = '\0';
|
||||
}
|
||||
} else
|
||||
/* Copy the string and its terminating NUL character. */
|
||||
|
@ -232,10 +232,12 @@ typedef unsigned char u_int8_t;
|
||||
#include "zassert.h"
|
||||
|
||||
#ifndef HAVE_STRLCAT
|
||||
size_t strlcat(char *__restrict dest, const char *__restrict src, size_t size);
|
||||
size_t strlcat(char *__restrict dest,
|
||||
const char *__restrict src, size_t destsize);
|
||||
#endif
|
||||
#ifndef HAVE_STRLCPY
|
||||
size_t strlcpy(char *__restrict dest, const char *__restrict src, size_t size);
|
||||
size_t strlcpy(char *__restrict dest,
|
||||
const char *__restrict src, size_t destsize);
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_BROKEN_CMSG_FIRSTHDR
|
||||
|
Loading…
Reference in New Issue
Block a user