• Kees Cook's avatar
    kunit/fortify: Fix replaced failure path to unbreak __alloc_size · 74df2245
    Kees Cook authored
    The __alloc_size annotation for kmemdup() was getting disabled under
    KUnit testing because the replaced fortify_panic macro implementation
    was using "return NULL" as a way to survive the sanity checking. But
    having the chance to return NULL invalidated __alloc_size, so kmemdup
    was not passing the __builtin_dynamic_object_size() tests any more:
    
    [23:26:18] [PASSED] fortify_test_alloc_size_kmalloc_const
    [23:26:19]     # fortify_test_alloc_size_kmalloc_dynamic: EXPECTATION FAILED at lib/fortify_kunit.c:265
    [23:26:19]     Expected __builtin_dynamic_object_size(p, 1) == expected, but
    [23:26:19]         __builtin_dynamic_object_size(p, 1) == -1 (0xffffffffffffffff)
    [23:26:19]         expected == 11 (0xb)
    [23:26:19] __alloc_size() not working with __bdos on kmemdup("hello there", len, gfp)
    [23:26:19] [FAILED] fortify_test_alloc_size_kmalloc_dynamic
    
    Normal builds were not affected: __alloc_size continued to work there.
    
    Use a zero-sized allocation instead, which allows __alloc_size to
    behave.
    
    Fixes: 4ce615e7 ("fortify: Provide KUnit counters for failure testing")
    Fixes: fa4a3f86 ("fortify: Add KUnit tests for runtime overflows")
    Link: https://lore.kernel.org/r/20240501232937.work.532-kees@kernel.orgSigned-off-by: default avatarKees Cook <keescook@chromium.org>
    74df2245
fortify_kunit.c 38.7 KB