Skip to content

Commit

Permalink
Merge tag 'linux_kselftest-kunit-fixes-6.11-rc7' of git://git.kernel.…
Browse files Browse the repository at this point in the history
…org/pub/scm/linux/kernel/git/shuah/linux-kselftest

Pull kunit fix fromShuah Khan:
 "One single fix to a use-after-free bug resulting from
  kunit_driver_create() failing to copy the driver name leaving it on
  the stack or freeing it"

* tag 'linux_kselftest-kunit-fixes-6.11-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest:
  kunit: Device wrappers should also manage driver name
  • Loading branch information
Linus Torvalds committed Sep 5, 2024
2 parents c763c43 + f2c6dbd commit 120434e
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 2 deletions.
48 changes: 48 additions & 0 deletions include/kunit/test.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
#include <linux/types.h>

#include <asm/rwonce.h>
#include <asm/sections.h>

/* Static key: true if any KUnit tests are currently running */
DECLARE_STATIC_KEY_FALSE(kunit_running);
Expand Down Expand Up @@ -480,6 +481,53 @@ static inline void *kunit_kcalloc(struct kunit *test, size_t n, size_t size, gfp
return kunit_kmalloc_array(test, n, size, gfp | __GFP_ZERO);
}


/**
* kunit_kfree_const() - conditionally free test managed memory
* @x: pointer to the memory
*
* Calls kunit_kfree() only if @x is not in .rodata section.
* See kunit_kstrdup_const() for more information.
*/
void kunit_kfree_const(struct kunit *test, const void *x);

/**
* kunit_kstrdup() - Duplicates a string into a test managed allocation.
*
* @test: The test context object.
* @str: The NULL-terminated string to duplicate.
* @gfp: flags passed to underlying kmalloc().
*
* See kstrdup() and kunit_kmalloc_array() for more information.
*/
static inline char *kunit_kstrdup(struct kunit *test, const char *str, gfp_t gfp)
{
size_t len;
char *buf;

if (!str)
return NULL;

len = strlen(str) + 1;
buf = kunit_kmalloc(test, len, gfp);
if (buf)
memcpy(buf, str, len);
return buf;
}

/**
* kunit_kstrdup_const() - Conditionally duplicates a string into a test managed allocation.
*
* @test: The test context object.
* @str: The NULL-terminated string to duplicate.
* @gfp: flags passed to underlying kmalloc().
*
* Calls kunit_kstrdup() only if @str is not in the rodata section. Must be freed with
* kunit_kfree_const() -- not kunit_kfree().
* See kstrdup_const() and kunit_kmalloc_array() for more information.
*/
const char *kunit_kstrdup_const(struct kunit *test, const char *str, gfp_t gfp);

/**
* kunit_vm_mmap() - Allocate KUnit-tracked vm_mmap() area
* @test: The test context object.
Expand Down
7 changes: 5 additions & 2 deletions lib/kunit/device.c
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ struct device_driver *kunit_driver_create(struct kunit *test, const char *name)
if (!driver)
return ERR_PTR(err);

driver->name = name;
driver->name = kunit_kstrdup_const(test, name, GFP_KERNEL);
driver->bus = &kunit_bus_type;
driver->owner = THIS_MODULE;

Expand Down Expand Up @@ -192,8 +192,11 @@ void kunit_device_unregister(struct kunit *test, struct device *dev)
const struct device_driver *driver = to_kunit_device(dev)->driver;

kunit_release_action(test, device_unregister_wrapper, dev);
if (driver)
if (driver) {
const char *driver_name = driver->name;
kunit_release_action(test, driver_unregister_wrapper, (void *)driver);
kunit_kfree_const(test, driver_name);
}
}
EXPORT_SYMBOL_GPL(kunit_device_unregister);

19 changes: 19 additions & 0 deletions lib/kunit/test.c
Original file line number Diff line number Diff line change
Expand Up @@ -874,6 +874,25 @@ void kunit_kfree(struct kunit *test, const void *ptr)
}
EXPORT_SYMBOL_GPL(kunit_kfree);

void kunit_kfree_const(struct kunit *test, const void *x)
{
#if !IS_MODULE(CONFIG_KUNIT)
if (!is_kernel_rodata((unsigned long)x))
#endif
kunit_kfree(test, x);
}
EXPORT_SYMBOL_GPL(kunit_kfree_const);

const char *kunit_kstrdup_const(struct kunit *test, const char *str, gfp_t gfp)
{
#if !IS_MODULE(CONFIG_KUNIT)
if (is_kernel_rodata((unsigned long)str))
return str;
#endif
return kunit_kstrdup(test, str, gfp);
}
EXPORT_SYMBOL_GPL(kunit_kstrdup_const);

void kunit_cleanup(struct kunit *test)
{
struct kunit_resource *res;
Expand Down

0 comments on commit 120434e

Please sign in to comment.