• Marco Pagani's avatar
    kunit: run test suites only after module initialization completes · a1af6a2b
    Marco Pagani authored
    Commit 2810c1e9 ("kunit: Fix wild-memory-access bug in
    kunit_free_suite_set()") fixed a wild-memory-access bug that could have
    happened during the loading phase of test suites built and executed as
    loadable modules. However, it also introduced a problematic side effect
    that causes test suites modules to crash when they attempt to register
    fake devices.
    
    When a module is loaded, it traverses the MODULE_STATE_UNFORMED and
    MODULE_STATE_COMING states before reaching the normal operating state
    MODULE_STATE_LIVE. Finally, when the module is removed, it moves to
    MODULE_STATE_GOING before being released. However, if the loading
    function load_module() fails between complete_formation() and
    do_init_module(), the module goes directly from MODULE_STATE_COMING to
    MODULE_STATE_GOING without passing through MODULE_STATE_LIVE.
    
    This behavior was causing kunit_module_exit() to be called without
    having first executed kunit_module_init(). Since kunit_module_exit() is
    responsible for freeing the memory allocated by kunit_module_init()
    through kunit_filter_suites(), this behavior was resulting in a
    wild-memory-access bug.
    
    Commit 2810c1e9 ("kunit: Fix wild-memory-access bug in
    kunit_free_suite_set()") fixed this issue by running the tests when the
    module is still in MODULE_STATE_COMING. However, modules in that state
    are not fully initialized, lacking sysfs kobjects. Therefore, if a test
    module attempts to register a fake device, it will inevitably crash.
    
    This patch proposes a different approach to fix the original
    wild-memory-access bug while restoring the normal module execution flow
    by making kunit_module_exit() able to detect if kunit_module_init() has
    previously initialized the tests suite set. In this way, test modules
    can once again register fake devices without crashing.
    
    This behavior is achieved by checking whether mod->kunit_suites is a
    virtual or direct mapping address. If it is a virtual address, then
    kunit_module_init() has allocated the suite_set in kunit_filter_suites()
    using kmalloc_array(). On the contrary, if mod->kunit_suites is still
    pointing to the original address that was set when looking up the
    .kunit_test_suites section of the module, then the loading phase has
    failed and there's no memory to be freed.
    
    v4:
    - rebased on 6.8
    - noted that kunit_filter_suites() must return a virtual address
    v3:
    - add a comment to clarify why the start address is checked
    v2:
    - add include <linux/mm.h>
    
    Fixes: 2810c1e9 ("kunit: Fix wild-memory-access bug in kunit_free_suite_set()")
    Reviewed-by: default avatarDavid Gow <davidgow@google.com>
    Tested-by: default avatarRae Moar <rmoar@google.com>
    Tested-by: default avatarRichard Fitzgerald <rf@opensource.cirrus.com>
    Reviewed-by: default avatarJavier Martinez Canillas <javierm@redhat.com>
    Signed-off-by: default avatarMarco Pagani <marpagan@redhat.com>
    Signed-off-by: default avatarShuah Khan <skhan@linuxfoundation.org>
    a1af6a2b
executor.c 11 KB