kernel-hacking-2024-linux-s.../lib/kunit
David Gow f2c6dbd220 kunit: Device wrappers should also manage driver name
kunit_driver_create() accepts a name for the driver, but does not copy
it, so if that name is either on the stack, or otherwise freed, we end
up with a use-after-free when the driver is cleaned up.

Instead, strdup() the name, and manage it as another KUnit allocation.
As there was no existing kunit_kstrdup(), we add one. Further, add a
kunit_ variant of strdup_const() and kfree_const(), so we don't need to
allocate and manage the string in the majority of cases where it's a
constant.

However, these are inline functions, and is_kernel_rodata() only works
for built-in code. This causes problems in two cases:
- If kunit is built as a module, __{start,end}_rodata is not defined.
- If a kunit test using these functions is built as a module, it will
  suffer the same fate.

This fixes a KASAN splat with overflow.overflow_allocation_test, when
built as a module.

Restrict the is_kernel_rodata() case to when KUnit is built as a module,
which fixes the first case, at the cost of losing the optimisation.

Also, make kunit_{kstrdup,kfree}_const non-inline, so that other modules
using them will not accidentally depend on is_kernel_rodata(). If KUnit
is built-in, they'll benefit from the optimisation, if KUnit is not,
they won't, but the string will be properly duplicated.

Fixes: d03c720e03 ("kunit: Add APIs for managing devices")
Reported-by: Nico Pache <npache@redhat.com>
Closes: https://groups.google.com/g/kunit-dev/c/81V9b9QYON0
Reviewed-by: Kees Cook <kees@kernel.org>
Reviewed-by: Maxime Ripard <mripard@kernel.org>
Reviewed-by: Rae Moar <rmoar@google.com>
Signed-off-by: David Gow <davidgow@google.com>
Tested-by: Rae Moar <rmoar@google.com>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
2024-08-26 07:03:46 -06:00
..
.kunitconfig
assert.c kunit: Cover 'assert.c' with tests 2024-05-30 12:53:47 -06:00
assert_test.c kunit: Cover 'assert.c' with tests 2024-05-30 12:53:47 -06:00
attributes.c
debugfs.c
debugfs.h
device-impl.h
device.c kunit: Device wrappers should also manage driver name 2024-08-26 07:03:46 -06:00
executor.c kunit: executor: Simplify string allocation handling 2024-07-12 10:11:48 -06:00
executor_test.c kunit: executor: Simplify string allocation handling 2024-07-12 10:11:48 -06:00
hooks-impl.h
hooks.c
Kconfig
kunit-example-test.c kunit: add missing MODULE_DESCRIPTION() macros to core modules 2024-06-07 15:59:05 -06:00
kunit-test.c kunit: add missing MODULE_DESCRIPTION() macros to core modules 2024-06-07 15:59:05 -06:00
Makefile kunit: test: Add vm_mmap() allocation resource manager 2024-06-14 19:31:33 -06:00
resource.c
static_stub.c
string-stream-test.c kunit: string-stream-test: use KUNIT_DEFINE_ACTION_WRAPPER 2024-05-06 14:22:02 -06:00
string-stream.c
string-stream.h
test.c kunit: Device wrappers should also manage driver name 2024-08-26 07:03:46 -06:00
try-catch-impl.h
try-catch.c
user_alloc.c kunit/usercopy: Disable testing on !CONFIG_MMU 2024-07-02 10:11:40 -06:00