• Daniel Latypov's avatar
    kunit: make kunit_kfree() not segfault on invalid inputs · e562e309
    Daniel Latypov authored
    kunit_kfree() can only work on data ("resources") allocated by KUnit.
    
    Currently for code like this,
    > void *ptr = kmalloc(4, GFP_KERNEL);
    > kunit_kfree(test, ptr);
    kunit_kfree() will segfault.
    
    It'll try and look up the kunit_resource associated with `ptr` and get a
    NULL back, but it won't check for this. This means we also segfault if
    you double-free.
    
    Change kunit_kfree() so it'll notice these invalid pointers and respond
    by failing the test.
    
    Implementation: kunit_destroy_resource() does what kunit_kfree() does,
    but is more generic and returns -ENOENT when it can't find the resource.
    Sadly, unlike just letting it crash, this means we don't get a stack
    trace. But kunit_kfree() is so infrequently used it shouldn't be hard to
    track down the bad callsite anyways.
    
    After this change, the above code gives:
    > # example_simple_test: EXPECTATION FAILED at lib/kunit/test.c:702
    > kunit_kfree: 00000000626ec200 already freed or not allocated by kunit
    Signed-off-by: default avatarDaniel Latypov <dlatypov@google.com>
    Reviewed-by: default avatarDavid Gow <davidgow@google.com>
    Reviewed-by: default avatarBrendan Higgins <brendanhiggins@google.com>
    Signed-off-by: default avatarShuah Khan <skhan@linuxfoundation.org>
    e562e309
test.c 18.7 KB