diff options
author | Matthias Schiffer <matthias.schiffer@ew.tq-group.com> | 2023-07-14 13:24:50 +0200 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2023-08-08 17:05:43 -0400 |
commit | 615828721abfe8c73b5103d4436402ecbf9b9897 (patch) | |
tree | bdd4cb11ef01155c17dfa51115eeff976bba05e7 /lib | |
parent | a169438411f9277cc689c14078151aa1d1caae3c (diff) | |
download | u-boot-615828721abfe8c73b5103d4436402ecbf9b9897.tar.gz u-boot-615828721abfe8c73b5103d4436402ecbf9b9897.tar.bz2 u-boot-615828721abfe8c73b5103d4436402ecbf9b9897.zip |
Revert "lib: string: Fix strlcpy return value", fix callers
Both the Linux kernel and libbsd agree that strlcpy() should always
return strlen(src) and not include the NUL termination. The incorrect
U-Boot implementation makes it impossible to check the return value for
truncation, and breaks code written with the usual implementation in
mind (for example, fdtdec_add_reserved_memory() was subtly broken).
I reviewed all callers of strlcpy() and strlcat() and fixed them
according to my understanding of the intended function.
This reverts commit d3358ecc54be0bc3b4dd11f7a63eab0a2842f772 and adds
related fixes.
Fixes: d3358ecc54be ("lib: string: Fix strlcpy return value")
Signed-off-by: Matthias Schiffer <matthias.schiffer@ew.tq-group.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Sean Anderson <sean.anderson@seco.com>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/string.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/lib/string.c b/lib/string.c index ecea755f40..f2c6147128 100644 --- a/lib/string.c +++ b/lib/string.c @@ -116,20 +116,18 @@ char * strncpy(char * dest,const char *src,size_t count) * of course, the buffer size is zero). It does not pad * out the result like strncpy() does. * - * Return: the number of bytes copied + * Return: strlen(src) */ size_t strlcpy(char *dest, const char *src, size_t size) { - if (size) { - size_t srclen = strlen(src); - size_t len = (srclen >= size) ? size - 1 : srclen; + size_t ret = strlen(src); + if (size) { + size_t len = (ret >= size) ? size - 1 : ret; memcpy(dest, src, len); dest[len] = '\0'; - return len + 1; } - - return 0; + return ret; } #endif @@ -191,6 +189,8 @@ char * strncat(char *dest, const char *src, size_t count) * Compatible with *BSD: the result is always a valid NUL-terminated string that * fits in the buffer (unless, of course, the buffer size is zero). It does not * write past @size like strncat() does. + * + * Return: min(strlen(dest), size) + strlen(src) */ size_t strlcat(char *dest, const char *src, size_t size) { |