mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2024-12-28 16:53:49 +00:00
hardening updates for v6.13-rc1
- Disable __counted_by in Clang < 19.1.3 (Jan Hendrik Farr) - string_helpers: Silence output truncation warning (Bartosz Golaszewski) - compiler.h: Avoid needing BUILD_BUG_ON_ZERO() (Philipp Reisner) - MAINTAINERS: Add kernel hardening keywords __counted_by{_le|_be} (Thorsten Blum) -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQRSPkdeREjth1dHnSE2KwveOeQkuwUCZz9GaQAKCRA2KwveOeQk uwIhAP0dbxSOT3T7Xz7ZKqNKWvuyy8nkY5SqizXeThFXKQZGMgEApHJ2DVENHA+R mvFTq1t8JcFMUlBgBO1a6ow8/CCRmAI= =l0lE -----END PGP SIGNATURE----- Merge tag 'hardening-v6.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux Pull hardening updates from Kees Cook: - Disable __counted_by in Clang < 19.1.3 (Jan Hendrik Farr) - string_helpers: Silence output truncation warning (Bartosz Golaszewski) - compiler.h: Avoid needing BUILD_BUG_ON_ZERO() (Philipp Reisner) - MAINTAINERS: Add kernel hardening keywords __counted_by{_le|_be} (Thorsten Blum) * tag 'hardening-v6.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux: Compiler Attributes: disable __counted_by for clang < 19.1.3 compiler.h: Fix undefined BUILD_BUG_ON_ZERO() lib: string_helpers: silence snprintf() output truncation warning MAINTAINERS: Add kernel hardening keywords __counted_by{_le|_be}
This commit is contained in:
commit
36843bfbf7
@ -12403,7 +12403,7 @@ F: mm/usercopy.c
|
||||
F: security/Kconfig.hardening
|
||||
K: \b(add|choose)_random_kstack_offset\b
|
||||
K: \b__check_(object_size|heap_object)\b
|
||||
K: \b__counted_by\b
|
||||
K: \b__counted_by(_le|_be)?\b
|
||||
|
||||
KERNEL JANITORS
|
||||
L: kernel-janitors@vger.kernel.org
|
||||
|
@ -445,7 +445,7 @@ static void lkdtm_FAM_BOUNDS(void)
|
||||
|
||||
pr_err("FAIL: survived access of invalid flexible array member index!\n");
|
||||
|
||||
if (!__has_attribute(__counted_by__))
|
||||
if (!IS_ENABLED(CONFIG_CC_HAS_COUNTED_BY))
|
||||
pr_warn("This is expected since this %s was built with a compiler that does not support __counted_by\n",
|
||||
lkdtm_kernel_info);
|
||||
else if (IS_ENABLED(CONFIG_UBSAN_BOUNDS))
|
||||
|
@ -239,11 +239,18 @@ static inline void *offset_to_ptr(const int *off)
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#ifdef __CHECKER__
|
||||
#define __BUILD_BUG_ON_ZERO_MSG(e, msg) (0)
|
||||
#else /* __CHECKER__ */
|
||||
#define __BUILD_BUG_ON_ZERO_MSG(e, msg) ((int)sizeof(struct {_Static_assert(!(e), msg);}))
|
||||
#endif /* __CHECKER__ */
|
||||
|
||||
/* &a[0] degrades to a pointer: a different type from an array */
|
||||
#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
|
||||
#define __must_be_array(a) __BUILD_BUG_ON_ZERO_MSG(__same_type((a), &(a)[0]), "must be array")
|
||||
|
||||
/* Require C Strings (i.e. NUL-terminated) lack the "nonstring" attribute. */
|
||||
#define __must_be_cstr(p) BUILD_BUG_ON_ZERO(__annotated(p, nonstring))
|
||||
#define __must_be_cstr(p) \
|
||||
__BUILD_BUG_ON_ZERO_MSG(__annotated(p, nonstring), "must be cstr (NUL-terminated)")
|
||||
|
||||
/*
|
||||
* This returns a constant expression while determining if an argument is
|
||||
|
@ -94,19 +94,6 @@
|
||||
# define __copy(symbol)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Optional: only supported since gcc >= 15
|
||||
* Optional: only supported since clang >= 18
|
||||
*
|
||||
* gcc: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108896
|
||||
* clang: https://github.com/llvm/llvm-project/pull/76348
|
||||
*/
|
||||
#if __has_attribute(__counted_by__)
|
||||
# define __counted_by(member) __attribute__((__counted_by__(member)))
|
||||
#else
|
||||
# define __counted_by(member)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Optional: not supported by gcc
|
||||
* Optional: only supported since clang >= 14.0
|
||||
|
@ -329,6 +329,25 @@ struct ftrace_likely_data {
|
||||
#define __no_sanitize_or_inline __always_inline
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Optional: only supported since gcc >= 15
|
||||
* Optional: only supported since clang >= 18
|
||||
*
|
||||
* gcc: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108896
|
||||
* clang: https://github.com/llvm/llvm-project/pull/76348
|
||||
*
|
||||
* __bdos on clang < 19.1.2 can erroneously return 0:
|
||||
* https://github.com/llvm/llvm-project/pull/110497
|
||||
*
|
||||
* __bdos on clang < 19.1.3 can be off by 4:
|
||||
* https://github.com/llvm/llvm-project/pull/112636
|
||||
*/
|
||||
#ifdef CONFIG_CC_HAS_COUNTED_BY
|
||||
# define __counted_by(member) __attribute__((__counted_by__(member)))
|
||||
#else
|
||||
# define __counted_by(member)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Apply __counted_by() when the Endianness matches to increase test coverage.
|
||||
*/
|
||||
|
@ -120,6 +120,15 @@ config CC_HAS_ASM_INLINE
|
||||
config CC_HAS_NO_PROFILE_FN_ATTR
|
||||
def_bool $(success,echo '__attribute__((no_profile_instrument_function)) int x();' | $(CC) -x c - -c -o /dev/null -Werror)
|
||||
|
||||
config CC_HAS_COUNTED_BY
|
||||
# TODO: when gcc 15 is released remove the build test and add
|
||||
# a gcc version check
|
||||
def_bool $(success,echo 'struct flex { int count; int array[] __attribute__((__counted_by__(count))); };' | $(CC) $(CLANG_FLAGS) -x c - -c -o /dev/null -Werror)
|
||||
# clang needs to be at least 19.1.3 to avoid __bdos miscalculations
|
||||
# https://github.com/llvm/llvm-project/pull/110497
|
||||
# https://github.com/llvm/llvm-project/pull/112636
|
||||
depends on !(CC_IS_CLANG && CLANG_VERSION < 190103)
|
||||
|
||||
config PAHOLE_VERSION
|
||||
int
|
||||
default $(shell,$(srctree)/scripts/pahole-version.sh $(PAHOLE))
|
||||
|
@ -1187,7 +1187,7 @@ static void DEFINE_FLEX_test(struct kunit *test)
|
||||
{
|
||||
/* Using _RAW_ on a __counted_by struct will initialize "counter" to zero */
|
||||
DEFINE_RAW_FLEX(struct foo, two_but_zero, array, 2);
|
||||
#if __has_attribute(__counted_by__)
|
||||
#ifdef CONFIG_CC_HAS_COUNTED_BY
|
||||
int expected_raw_size = sizeof(struct foo);
|
||||
#else
|
||||
int expected_raw_size = sizeof(struct foo) + 2 * sizeof(s16);
|
||||
|
@ -57,7 +57,7 @@ int string_get_size(u64 size, u64 blk_size, const enum string_size_units units,
|
||||
static const unsigned int rounding[] = { 500, 50, 5 };
|
||||
int i = 0, j;
|
||||
u32 remainder = 0, sf_cap;
|
||||
char tmp[8];
|
||||
char tmp[12];
|
||||
const char *unit;
|
||||
|
||||
tmp[0] = '\0';
|
||||
|
Loading…
Reference in New Issue
Block a user