sysctl: move u8 register test to lib/test_sysctl.c
authorJoel Granados <joel.granados@kernel.org>
Thu, 13 Mar 2025 21:35:25 +0000 (22:35 +0100)
committerJoel Granados <joel.granados@kernel.org>
Mon, 14 Apr 2025 12:13:41 +0000 (14:13 +0200)
commit138303ec6ccbe38611931eeb955a722c6f78ec25
tree478c53bd05ccbd294b28f1d2c271aac7b71abfa5
parentbc4f328ff516f6ea53c3c0d385a84ea7ae423c20
sysctl: move u8 register test to lib/test_sysctl.c

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

To reproduce
    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

Move the test to lib/test_sysctl.c where the registration reference is
handled on module exit

Fixes: b5ffbd139688 ("sysctl: move the extra1/2 boundary check of u8 to sysctl_check_table_array")

Reviewed-by: Kees Cook <kees@kernel.org>
Signed-off-by: Joel Granados <joel.granados@kernel.org>
kernel/sysctl-test.c
lib/test_sysctl.c