mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 18:40:43 +03:00
Move strlcat, strlcpy, and strnlen
Move strlcat() and strlcpy() from .c source files in to the libspl
string.h header. By changing these compatibility functions to static
inline functions they can included as needed without requiring linking
with the libspl.so library.
Remove strnlen() which is barely used in the source, and has been
provided by glibc since v2.10.
Finally, convert four instances of strncpy() to strlcpy() in
libzfs_input_check.c which were causing build warnings when compiling
with gcc 8.2.1. For example:
libzfs_input_check.c: In function ‘zfs_destroy’:
libzfs_input_check.c:651:9: error: ‘strncpy’ specified bound \
4096 equals destination size [-Werror=stringop-truncation]
(void) strncpy(zc.zc_name, dataset, sizeof (zc.zc_name));
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Reviewed-by: Olaf Faaland <faaland1@llnl.gov>
Reviewed-by: Richard Laager <rlaager@wiktel.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #8116
This commit is contained in:
@@ -28,9 +28,56 @@
|
||||
#define _LIBSPL_STRING_H
|
||||
|
||||
#include_next <string.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
extern size_t strlcat(char *dst, const char *src, size_t dstsize);
|
||||
extern size_t strlcpy(char *dst, const char *src, size_t len);
|
||||
extern size_t strnlen(const char *str, size_t maxlen);
|
||||
/*
|
||||
* Appends src to the dstsize buffer at dst. The append will never
|
||||
* overflow the destination buffer and the buffer will always be null
|
||||
* terminated. Never reference beyond &dst[dstsize-1] when computing
|
||||
* the length of the pre-existing string.
|
||||
*/
|
||||
static inline size_t
|
||||
strlcat(char *dst, const char *src, size_t dstsize)
|
||||
{
|
||||
char *df = dst;
|
||||
size_t left = dstsize;
|
||||
size_t l1;
|
||||
size_t l2 = strlen(src);
|
||||
size_t copied;
|
||||
|
||||
while (left-- != 0 && *df != '\0')
|
||||
df++;
|
||||
|
||||
l1 = df - dst;
|
||||
|
||||
if (dstsize == l1)
|
||||
return (l1 + l2);
|
||||
|
||||
copied = l1 + l2 >= dstsize ? dstsize - l1 - 1 : l2;
|
||||
(void) memcpy(dst + l1, src, copied);
|
||||
dst[l1+copied] = '\0';
|
||||
|
||||
return (l1 + l2);
|
||||
}
|
||||
|
||||
/*
|
||||
* Copies src to the dstsize buffer at dst. The copy will never
|
||||
* overflow the destination buffer and the buffer will always be null
|
||||
* terminated.
|
||||
*/
|
||||
static inline size_t
|
||||
strlcpy(char *dst, const char *src, size_t len)
|
||||
{
|
||||
size_t slen = strlen(src);
|
||||
|
||||
if (len == 0)
|
||||
return (slen);
|
||||
|
||||
size_t copied = (slen >= len) ? len - 1 : slen;
|
||||
(void) memcpy(dst, src, copied);
|
||||
dst[copied] = '\0';
|
||||
|
||||
return (slen);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user