Skip to content

Commit fa5c82f

Browse files
committed
slab.h: disable completely broken overflow handling in flex allocations
Commit 69050f8 ("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: 81cee91 ("compiler_types: Introduce __flex_counter() and family") Fixes: 69050f8 ("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>
1 parent 8934827 commit fa5c82f

2 files changed

Lines changed: 2 additions & 6 deletions

File tree

include/linux/overflow.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -570,7 +570,7 @@ static inline size_t __must_check size_sub(size_t minuend, size_t subtrahend)
570570
* @FAM is not annotated with __counted_by(), always returns true.
571571
*/
572572
#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)))
574574

575575
/**
576576
* __set_flex_counter() - Set the counter associated with the given flexible

include/linux/slab.h

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1003,11 +1003,7 @@ void *kmalloc_nolock_noprof(size_t size, gfp_t gfp_flags, int node);
10031003
({ \
10041004
const size_t __count = (COUNT); \
10051005
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); \
10111007
if (__obj_ptr) \
10121008
__set_flex_counter(__obj_ptr->FAM, __count); \
10131009
__obj_ptr; \

0 commit comments

Comments
 (0)