Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

slab.h: disable completely broken overflow handling in flex allocations

Commit 69050f8d6d07 ("treewide: Replace kmalloc with kmalloc_obj for
non-scalar types") started using the new allocation helpers, and in the
process showed that they were completely non-working.

The overflow logic in overflows_flex_counter_type() is completely the
wrong way around, and that broke __alloc_flex() completely. By chance,
the resulting code was then such a mess that clang generated
sufficiently garbage code that objtool warned about it all. Which made
it somewhat quicker to narrow things down.

While fixing overflows_flex_counter_type() would presumably fix this
all, I'm excising the whole broken overflow logic from __alloc_flex(),
because we don't want that kind of code in basic allocation functions
anyway.

That (no longer) broken overflows_flex_counter_type() thing needs to be
inserted into the actual __set_flex_counter() logic in the unlikely case
that we ever want this at all. And made conditional.

Fixes: 81cee9166a90 ("compiler_types: Introduce __flex_counter() and family")
Fixes: 69050f8d6d07 ("treewide: Replace kmalloc with kmalloc_obj for non-scalar types")
Cc: Kees Cook <kees@kernel.org>
Link: https://lore.kernel.org/all/CAHk-=whEd020BYzGTzYrENjD9Z5_82xx6h8HsQvH5xDSnv0=Hw@mail.gmail.com/
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

+2 -6
+1 -1
include/linux/overflow.h
··· 570 570 * @FAM is not annotated with __counted_by(), always returns true. 571 571 */ 572 572 #define overflows_flex_counter_type(TYPE, FAM, COUNT) \ 573 - (!overflows_type(COUNT, typeof_flex_counter(((TYPE *)NULL)->FAM))) 573 + (overflows_type(COUNT, typeof_flex_counter(((TYPE *)NULL)->FAM))) 574 574 575 575 /** 576 576 * __set_flex_counter() - Set the counter associated with the given flexible
+1 -5
include/linux/slab.h
··· 1003 1003 ({ \ 1004 1004 const size_t __count = (COUNT); \ 1005 1005 const size_t __obj_size = struct_size_t(TYPE, FAM, __count); \ 1006 - TYPE *__obj_ptr; \ 1007 - if (WARN_ON_ONCE(overflows_flex_counter_type(TYPE, FAM, __count))) \ 1008 - __obj_ptr = NULL; \ 1009 - else \ 1010 - __obj_ptr = KMALLOC(__obj_size, GFP); \ 1006 + TYPE *__obj_ptr = KMALLOC(__obj_size, GFP); \ 1011 1007 if (__obj_ptr) \ 1012 1008 __set_flex_counter(__obj_ptr->FAM, __count); \ 1013 1009 __obj_ptr; \