Skip to content

Commit 6270f4d

Browse files
committed
string.h: Use ARRAY_SIZE() for memtostr*()/strtomem*()
The destination argument of memtostr*() and strtomem*() must be a fixed-size char array at compile time, so there is no need to use __builtin_object_size() (which is useful for when an argument is either a pointer or unknown). Instead use ARRAY_SIZE(), which has the benefit of working around a bug in Clang (fixed[1] in 15+) that got __builtin_object_size() wrong sometimes. Reported-by: kernel test robot <[email protected]> Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/ Suggested-by: Kent Overstreet <[email protected]> Link: llvm/llvm-project@d8e0a6d [1] Tested-by: Suren Baghdasaryan <[email protected]> Signed-off-by: Kees Cook <[email protected]>
1 parent 20e5cc2 commit 6270f4d

File tree

1 file changed

+8
-4
lines changed

1 file changed

+8
-4
lines changed

include/linux/string.h

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -411,7 +411,8 @@ void memcpy_and_pad(void *dest, size_t dest_len, const void *src, size_t count,
411411
* must be discoverable by the compiler.
412412
*/
413413
#define strtomem_pad(dest, src, pad) do { \
414-
const size_t _dest_len = __builtin_object_size(dest, 1); \
414+
const size_t _dest_len = __must_be_byte_array(dest) + \
415+
ARRAY_SIZE(dest); \
415416
const size_t _src_len = __builtin_object_size(src, 1); \
416417
\
417418
BUILD_BUG_ON(!__builtin_constant_p(_dest_len) || \
@@ -434,7 +435,8 @@ void memcpy_and_pad(void *dest, size_t dest_len, const void *src, size_t count,
434435
* must be discoverable by the compiler.
435436
*/
436437
#define strtomem(dest, src) do { \
437-
const size_t _dest_len = __builtin_object_size(dest, 1); \
438+
const size_t _dest_len = __must_be_byte_array(dest) + \
439+
ARRAY_SIZE(dest); \
438440
const size_t _src_len = __builtin_object_size(src, 1); \
439441
\
440442
BUILD_BUG_ON(!__builtin_constant_p(_dest_len) || \
@@ -453,7 +455,8 @@ void memcpy_and_pad(void *dest, size_t dest_len, const void *src, size_t count,
453455
* Note that sizes of @dest and @src must be known at compile-time.
454456
*/
455457
#define memtostr(dest, src) do { \
456-
const size_t _dest_len = __builtin_object_size(dest, 1); \
458+
const size_t _dest_len = __must_be_byte_array(dest) + \
459+
ARRAY_SIZE(dest); \
457460
const size_t _src_len = __builtin_object_size(src, 1); \
458461
const size_t _src_chars = strnlen(src, _src_len); \
459462
const size_t _copy_len = min(_dest_len - 1, _src_chars); \
@@ -478,7 +481,8 @@ void memcpy_and_pad(void *dest, size_t dest_len, const void *src, size_t count,
478481
* Note that sizes of @dest and @src must be known at compile-time.
479482
*/
480483
#define memtostr_pad(dest, src) do { \
481-
const size_t _dest_len = __builtin_object_size(dest, 1); \
484+
const size_t _dest_len = __must_be_byte_array(dest) + \
485+
ARRAY_SIZE(dest); \
482486
const size_t _src_len = __builtin_object_size(src, 1); \
483487
const size_t _src_chars = strnlen(src, _src_len); \
484488
const size_t _copy_len = min(_dest_len - 1, _src_chars); \

0 commit comments

Comments
 (0)