strlcpy removal for v6.8-rc1
- Remove of the final (very recent) user of strlcpy() (in bcachefs). - Remove the strlcpy() API. Long live strscpy(). -----BEGIN PGP SIGNATURE----- iQJKBAABCgA0FiEEpcP2jyKd1g9yPm4TiXL039xtwCYFAmWq5VgWHGtlZXNjb29r QGNocm9taXVtLm9yZwAKCRCJcvTf3G3AJhsHD/9xfEA1YFC4WzTuX1RcsSwZQTGL L8ej9NuRiQ57vJA37PEV3wyTIVHLOJDjNr+8cmL1Pu0GR9K4R2s4YzdQtaK6pFeE BYuXUOUK9rkQsVLL0DrTv/YryjMah0DDb/M7kKZDRfTgii0yWZ1WqEmO2+9wbdKS n7O9oYZreiNkFg3/6yHPYlBve9QXt+VHN/NIxSQqps3BVXRPKcIwCCJq7IiazBpR xo7FkhTftmL1ZqGOGRcoY7YKWt7WFg9HPBB30WXkqCIqmaFWm4sBancArVgTgQ+r vES/QF4SsFXkprf4fPWuQZlcChc2hibREI9o3t3Qck4FG7W+alXSpj3IxFiZqNFu BvNZwKW5/MB2r+CugM12JUszxAVlcwqskoilGOVD65AJ26xUYh2oAr3kpU5L6Nur c3zcLSlpec9sYQMdXSGQWOF2juhEp2ikceP5dw5ONcj4P7UXadPnB4hsW8ulG844 Rh552sR0je5UCxzXNozec9X1JFZf7Z8lOjdRv1Xs549+F2rmzaZAt2eOnageCCO7 XKoqZ/auIwzj/3WqDxivjs3xT+1PpxJd3bALDXb/iIu10DMbNq7CRwHO+1OZo1e1 4OLE1gbM3Ldv2WgUe2o1dDURnmKq1aiYN8ThoOIVy9VTC0FOxujVXKsd//f6qpMu EGOypgqRBFpVd53DvQ== =DuKT -----END PGP SIGNATURE----- Merge tag 'strlcpy-removal-v6.8-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux Pull strlcpy removal from Kees Cook: "As promised, this is 'part 2' of the hardening tree, late in -rc1 now that all the other trees with strlcpy() removals have landed. One new user appeared (in bcachefs) but was a trivial refactor. The kernel is now free of the strlcpy() API! - Remove of the final (very recent) user of strlcpy() (in bcachefs) - Remove the strlcpy() API. Long live strscpy()" * tag 'strlcpy-removal-v6.8-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux: string: Remove strlcpy() bcachefs: Replace strlcpy() with strscpy()
This commit is contained in:
commit
57f22c8dab
@ -1386,8 +1386,8 @@ static int bch2_dev_attach_bdev(struct bch_fs *c, struct bch_sb_handle *sb)
|
||||
prt_bdevname(&name, ca->disk_sb.bdev);
|
||||
|
||||
if (c->sb.nr_devices == 1)
|
||||
strlcpy(c->name, name.buf, sizeof(c->name));
|
||||
strlcpy(ca->name, name.buf, sizeof(ca->name));
|
||||
strscpy(c->name, name.buf, sizeof(c->name));
|
||||
strscpy(ca->name, name.buf, sizeof(ca->name));
|
||||
|
||||
printbuf_exit(&name);
|
||||
|
||||
|
@ -214,51 +214,6 @@ __kernel_size_t __fortify_strlen(const char * const POS p)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Defined after fortified strlen() to reuse it. */
|
||||
extern size_t __real_strlcpy(char *, const char *, size_t) __RENAME(strlcpy);
|
||||
/**
|
||||
* strlcpy - Copy a string into another string buffer
|
||||
*
|
||||
* @p: pointer to destination of copy
|
||||
* @q: pointer to NUL-terminated source string to copy
|
||||
* @size: maximum number of bytes to write at @p
|
||||
*
|
||||
* If strlen(@q) >= @size, the copy of @q will be truncated at
|
||||
* @size - 1 bytes. @p will always be NUL-terminated.
|
||||
*
|
||||
* Do not use this function. While FORTIFY_SOURCE tries to avoid
|
||||
* over-reads when calculating strlen(@q), it is still possible.
|
||||
* Prefer strscpy(), though note its different return values for
|
||||
* detecting truncation.
|
||||
*
|
||||
* Returns total number of bytes written to @p, including terminating NUL.
|
||||
*
|
||||
*/
|
||||
__FORTIFY_INLINE size_t strlcpy(char * const POS p, const char * const POS q, size_t size)
|
||||
{
|
||||
const size_t p_size = __member_size(p);
|
||||
const size_t q_size = __member_size(q);
|
||||
size_t q_len; /* Full count of source string length. */
|
||||
size_t len; /* Count of characters going into destination. */
|
||||
|
||||
if (p_size == SIZE_MAX && q_size == SIZE_MAX)
|
||||
return __real_strlcpy(p, q, size);
|
||||
q_len = strlen(q);
|
||||
len = (q_len >= size) ? size - 1 : q_len;
|
||||
if (__builtin_constant_p(size) && __builtin_constant_p(q_len) && size) {
|
||||
/* Write size is always larger than destination. */
|
||||
if (len >= p_size)
|
||||
__write_overflow();
|
||||
}
|
||||
if (size) {
|
||||
if (len >= p_size)
|
||||
fortify_panic(__func__);
|
||||
__underlying_memcpy(p, q, len);
|
||||
p[len] = '\0';
|
||||
}
|
||||
return q_len;
|
||||
}
|
||||
|
||||
/* Defined after fortified strnlen() to reuse it. */
|
||||
extern ssize_t __real_strscpy(char *, const char *, size_t) __RENAME(strscpy);
|
||||
/**
|
||||
@ -272,12 +227,6 @@ extern ssize_t __real_strscpy(char *, const char *, size_t) __RENAME(strscpy);
|
||||
* @p buffer. The behavior is undefined if the string buffers overlap. The
|
||||
* destination @p buffer is always NUL terminated, unless it's zero-sized.
|
||||
*
|
||||
* Preferred to strlcpy() since the API doesn't require reading memory
|
||||
* from the source @q string beyond the specified @size bytes, and since
|
||||
* the return value is easier to error-check than strlcpy()'s.
|
||||
* In addition, the implementation is robust to the string changing out
|
||||
* from underneath it, unlike the current strlcpy() implementation.
|
||||
*
|
||||
* Preferred to strncpy() since it always returns a valid string, and
|
||||
* doesn't unnecessarily force the tail of the destination buffer to be
|
||||
* zero padded. If padding is desired please use strscpy_pad().
|
||||
|
@ -66,9 +66,6 @@ extern char * strcpy(char *,const char *);
|
||||
#ifndef __HAVE_ARCH_STRNCPY
|
||||
extern char * strncpy(char *,const char *, __kernel_size_t);
|
||||
#endif
|
||||
#ifndef __HAVE_ARCH_STRLCPY
|
||||
size_t strlcpy(char *, const char *, size_t);
|
||||
#endif
|
||||
#ifndef __HAVE_ARCH_STRSCPY
|
||||
ssize_t strscpy(char *, const char *, size_t);
|
||||
#endif
|
||||
|
@ -758,7 +758,7 @@ EXPORT_SYMBOL(nla_find);
|
||||
* @dstsize: Size of destination buffer.
|
||||
*
|
||||
* Copies at most dstsize - 1 bytes into the destination buffer.
|
||||
* Unlike strlcpy the destination buffer is always padded out.
|
||||
* Unlike strscpy() the destination buffer is always padded out.
|
||||
*
|
||||
* Return:
|
||||
* * srclen - Returns @nla length (not including the trailing %NUL).
|
||||
|
15
lib/string.c
15
lib/string.c
@ -103,21 +103,6 @@ char *strncpy(char *dest, const char *src, size_t count)
|
||||
EXPORT_SYMBOL(strncpy);
|
||||
#endif
|
||||
|
||||
#ifndef __HAVE_ARCH_STRLCPY
|
||||
size_t strlcpy(char *dest, const char *src, size_t size)
|
||||
{
|
||||
size_t ret = strlen(src);
|
||||
|
||||
if (size) {
|
||||
size_t len = (ret >= size) ? size - 1 : ret;
|
||||
__builtin_memcpy(dest, src, len);
|
||||
dest[len] = '\0';
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(strlcpy);
|
||||
#endif
|
||||
|
||||
#ifndef __HAVE_ARCH_STRSCPY
|
||||
ssize_t strscpy(char *dest, const char *src, size_t count)
|
||||
{
|
||||
|
@ -1,5 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
#define TEST \
|
||||
strlcpy(small, large_src, sizeof(small) + 1)
|
||||
|
||||
#include "test_fortify.h"
|
@ -1,5 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
#define TEST \
|
||||
strlcpy(instance.buf, large_src, sizeof(instance.buf) + 1)
|
||||
|
||||
#include "test_fortify.h"
|
Loading…
Reference in New Issue
Block a user