string: Check for "nonstring" attribute on strscpy() arguments
GCC already checks for arguments that are marked with the "nonstring"[1] attribute when used on standard C String API functions (e.g. strcpy). Gain this compile-time checking also for the kernel's primary string copying function, strscpy(). Note that Clang has neither "nonstring" nor __builtin_has_attribute(). Link: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-nonstring-variable-attribute [1] Reviewed-by: Miguel Ojeda <ojeda@kernel.org> Tested-by: Miguel Ojeda <ojeda@kernel.org> Link: https://lore.kernel.org/r/20240805214340.work.339-kees@kernel.org Signed-off-by: Kees Cook <kees@kernel.org>
This commit is contained in:
@@ -76,12 +76,16 @@ ssize_t sized_strscpy(char *, const char *, size_t);
|
||||
* known size.
|
||||
*/
|
||||
#define __strscpy0(dst, src, ...) \
|
||||
sized_strscpy(dst, src, sizeof(dst) + __must_be_array(dst))
|
||||
#define __strscpy1(dst, src, size) sized_strscpy(dst, src, size)
|
||||
sized_strscpy(dst, src, sizeof(dst) + __must_be_array(dst) + \
|
||||
__must_be_cstr(dst) + __must_be_cstr(src))
|
||||
#define __strscpy1(dst, src, size) \
|
||||
sized_strscpy(dst, src, size + __must_be_cstr(dst) + __must_be_cstr(src))
|
||||
|
||||
#define __strscpy_pad0(dst, src, ...) \
|
||||
sized_strscpy_pad(dst, src, sizeof(dst) + __must_be_array(dst))
|
||||
#define __strscpy_pad1(dst, src, size) sized_strscpy_pad(dst, src, size)
|
||||
sized_strscpy_pad(dst, src, sizeof(dst) + __must_be_array(dst) + \
|
||||
__must_be_cstr(dst) + __must_be_cstr(src))
|
||||
#define __strscpy_pad1(dst, src, size) \
|
||||
sized_strscpy_pad(dst, src, size + __must_be_cstr(dst) + __must_be_cstr(src))
|
||||
|
||||
/**
|
||||
* strscpy - Copy a C-string into a sized buffer
|
||||
|
||||
Reference in New Issue
Block a user