All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] sysctl: unregister sysctl table after testing
@ 2024-12-24 17:11 John Sperbeck
  2024-12-26 11:58 ` Wen Yang
  2025-01-06 14:15 ` Joel Granados
  0 siblings, 2 replies; 12+ messages in thread
From: John Sperbeck @ 2024-12-24 17:11 UTC (permalink / raw)
  To: Joel Granados, Kees Cook
  Cc: Wen Yang, linux-kernel, linux-fsdevel, John Sperbeck

In commit b5ffbd139688 ("sysctl: move the extra1/2 boundary check
of u8 to sysctl_check_table_array"), a kunit test was added that
registers a sysctl table.  If the test is run as a module, then a
lingering reference to the module is left behind, and a 'sysctl -a'
leads to a panic.

This can be reproduced with these kernel config settings:

    CONFIG_KUNIT=y
    CONFIG_SYSCTL_KUNIT_TEST=m

Then run these commands:

    modprobe sysctl-test
    rmmod sysctl-test
    sysctl -a

The panic varies but generally looks something like this:

    BUG: unable to handle page fault for address: ffffa4571c0c7db4
    #PF: supervisor read access in kernel mode
    #PF: error_code(0x0000) - not-present page
    PGD 100000067 P4D 100000067 PUD 100351067 PMD 114f5e067 PTE 0
    Oops: Oops: 0000 [#1] SMP NOPTI
    ... ... ...
    RIP: 0010:proc_sys_readdir+0x166/0x2c0
    ... ... ...
    Call Trace:
     <TASK>
     iterate_dir+0x6e/0x140
     __se_sys_getdents+0x6e/0x100
     do_syscall_64+0x70/0x150
     entry_SYSCALL_64_after_hwframe+0x76/0x7e

If we unregister the test sysctl table, then the failure is gone.

Fixes: b5ffbd139688 ("sysctl: move the extra1/2 boundary check of u8 to sysctl_check_table_array")
Signed-off-by: John Sperbeck <jsperbeck@google.com>
---
 kernel/sysctl-test.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/kernel/sysctl-test.c b/kernel/sysctl-test.c
index 3ac98bb7fb82..2184c1813b1d 100644
--- a/kernel/sysctl-test.c
+++ b/kernel/sysctl-test.c
@@ -373,6 +373,7 @@ static void sysctl_test_api_dointvec_write_single_greater_int_max(
 static void sysctl_test_register_sysctl_sz_invalid_extra_value(
 		struct kunit *test)
 {
+	struct ctl_table_header *hdr;
 	unsigned char data = 0;
 	struct ctl_table table_foo[] = {
 		{
@@ -412,7 +413,9 @@ static void sysctl_test_register_sysctl_sz_invalid_extra_value(
 
 	KUNIT_EXPECT_NULL(test, register_sysctl("foo", table_foo));
 	KUNIT_EXPECT_NULL(test, register_sysctl("foo", table_bar));
-	KUNIT_EXPECT_NOT_NULL(test, register_sysctl("foo", table_qux));
+	hdr = register_sysctl("foo", table_qux);
+	KUNIT_EXPECT_NOT_NULL(test, hdr);
+	unregister_sysctl_table(hdr);
 }
 
 static struct kunit_case sysctl_test_cases[] = {
-- 
2.47.1.613.gc27f4b7a9f-goog


^ permalink raw reply related	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2025-03-12 21:23 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-12-24 17:11 [PATCH] sysctl: unregister sysctl table after testing John Sperbeck
2024-12-26 11:58 ` Wen Yang
2025-01-06 14:15 ` Joel Granados
2025-01-12 21:50   ` [PATCH v2] sysctl: expose sysctl_check_table for unit testing and use it John Sperbeck
2025-01-13  6:01     ` kernel test robot
2025-01-13  7:00     ` [PATCH v3] " John Sperbeck
2025-01-13 10:01       ` Joel Granados
2025-01-16 10:01       ` Joel Granados
2025-01-18 12:28       ` kernel test robot
2025-01-21 21:33         ` [PATCH v4] " John Sperbeck
2025-03-12 21:23           ` Joel Granados
2025-03-12 21:15   ` [PATCH] sysctl: unregister sysctl table after testing Joel Granados

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.