ZERO_OR_NULL_PTR() returns true for every value less than or equal to ZERO_SIZE_PTR. With the sentinel raised to ARCH_KMALLOC_MINALIGN, up to 128 on some architectures, the helper matches additional values that are neither NULL nor the sentinel.
Compare explicitly against NULL and ZERO_SIZE_PTR. Store the argument in an unsigned long temporary to support both pointer and integer address arguments while evaluating it only once. This also changes check_bogus_address() in hardened usercopy: nonzero addresses below ZERO_SIZE_PTR no longer cause its null-address abort. Apart from hardened usercopy, direct in-tree users apply the helper to allocation results or explicit sentinel values. Assisted-by: Claude:claude-fable-5 Signed-off-by: Karl Mehltretter <[email protected]> --- include/linux/slab.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/include/linux/slab.h b/include/linux/slab.h index 3e012cc4f001e..023e10ab77f8d 100644 --- a/include/linux/slab.h +++ b/include/linux/slab.h @@ -270,8 +270,12 @@ enum _slab_flag_bits { #define ZERO_SIZE_PTR ((void *)(ARCH_KMALLOC_MINALIGN > 16 ? \ ARCH_KMALLOC_MINALIGN : 16)) -#define ZERO_OR_NULL_PTR(x) ((unsigned long)(x) <= \ - (unsigned long)ZERO_SIZE_PTR) +#define ZERO_OR_NULL_PTR(x) \ +({ \ + unsigned long __zon_ptr = (unsigned long)(x); \ + __zon_ptr == 0 || \ + __zon_ptr == (unsigned long)ZERO_SIZE_PTR; \ +}) #include <linux/kasan.h> -- 2.53.0

