On Sat, Apr 2, 2022 at 12:35 AM 'David Gow' via KUnit Development <kunit-dev@xxxxxxxxxxxxxxxx> wrote: > > KUnit's test-managed resources can be created in two ways: > - Using the kunit_add_resource() family of functions, which accept a > struct kunit_resource pointer, typically allocated statically or on > the stack during the test. > - Using the kunit_alloc_resource() family of functions, which allocate a > struct kunit_resource using kzalloc() behind the scenes. > > Both of these families of functions accept a 'free' function to be > called when the resource is finally disposed of. > > At present, KUnit will kfree() the resource if this 'free' function is > specified, and will not if it is NULL. However, this can lead > kunit_alloc_resource() to leak memory (if no 'free' function is passed > in), or kunit_add_resource() to incorrectly kfree() memory which was > allocated by some other means (on the stack, as part of a larger > allocation, etc), if a 'free' function is provided. > > Instead, always kfree() if the resource was allocated with > kunit_alloc_resource(), and never kfree() if it was passed into > kunit_add_resource() by the user. (If the user of kunit_add_resource() > wishes the resource be kfree()ed, they can call kfree() on the resource > from within the 'free' function. > > This is implemented by adding a 'should_free' member to > struct kunit_resource and setting it appropriately. To facilitate this, > the various resource add/alloc functions have been refactored somewhat, > making them all call a __kunit_add_resource() helper after setting the > 'should_free' member appropriately. In the process, all other functions > have been made static inline functions. > > Signed-off-by: David Gow <davidgow@xxxxxxxxxx> > Tested-by: Daniel Latypov <dlatypov@xxxxxxxxxx> Reviewed-by: Brendan Higgins <brendanhiggins@xxxxxxxxxx>