Skip to content

Commit

Permalink
Merge pull request #1886 from donaldsharp/strlcpy
Browse files Browse the repository at this point in the history
lib: Fixup strlcat and strlcpy to be a bit more descriptive
  • Loading branch information
rzalamena authored Mar 14, 2018
2 parents 51cee26 + c9a164d commit 2b9a295
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 21 deletions.
14 changes: 8 additions & 6 deletions lib/strlcat.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
29 changes: 16 additions & 13 deletions lib/strlcpy.c
Original file line number Diff line number Diff line change
Expand Up @@ -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. */
Expand Down
6 changes: 4 additions & 2 deletions lib/zebra.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 2b9a295

Please sign in to comment.