On Wed, 10 Jan 2024 at 23:59, Marco Pagani <marpagan@xxxxxxxxxx> wrote: > > Commit 2810c1e99867 ("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 2810c1e99867 ("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: 2810c1e99867 ("kunit: Fix wild-memory-access bug in kunit_free_suite_set()") > Reviewed-by: David Gow <davidgow@xxxxxxxxxx> > Tested-by: Rae Moar <rmoar@xxxxxxxxxx> > Tested-by: Richard Fitzgerald <rf@xxxxxxxxxxxxxxxxxxxxx> > Reviewed-by: Javier Martinez Canillas <javierm@xxxxxxxxxx> > Signed-off-by: Marco Pagani <marpagan@xxxxxxxxxx> > --- Thanks very much. Reviewed-by: David Gow <davidgow@xxxxxxxxxx> Cheers, -- David
Attachment:
smime.p7s
Description: S/MIME Cryptographic Signature