Skip to contentSkip to conversation

of: unittest: Require BUG_ON_DATA_CORRUPTION to be disabled

PATCH In review Danilo Krummrich 2 participants 2 messages Oct 29 – Oct 30 Device tree

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 of: unittest: Require BUG_ON_DATA_CORRUPTION to be disabled

With CONFIG_OF_UNITTEST=y and CONFIG_BUG_ON_DATA_CORRUPTION=y, the machine no longer boots after commit 5b5224220747 ("refcount: Use CONFIG_BUG_ON_DATA_CORRUPTION for UAF-related errors").

of_unittest_lifecycle() deliberately calls of_node_put() after the node's reference count has reached zero. The test expects a warning and continues to check that a subsequent put does not produce another warning. With BUG_ON_DATA_CORRUPTION enabled, refcount underflow now triggers BUG() instead. This panics the kernel during boot:

	kernel BUG at lib/refcount.c:37!
	Oops: invalid opcode: 0000 [#1] SMP NOPTI
	CPU: 1 UID: 0 PID: 1 Comm: swapper/0 Tainted: G                 N  7.3.0+ #14 PREEMPT(full)
	RIP: 0010:refcount_warn_saturate+0x89/0x90
	Call Trace:
	 of_unittest_lifecycle+0x158/0x310
	 of_unittest+0x105/0x130
	 do_one_initcall+0x127/0x350
	 do_initcall_level+0x7c/0xe0
	 do_initcalls+0x59/0xa0
	 kernel_init_freeable+0x118/0x1a0
	 kernel_init+0x1f/0x140
	Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b

Make OF_UNITTEST depend on !BUG_ON_DATA_CORRUPTION and explain the restriction in its help text.

Fixes 5b5224220747 ("refcount: Use CONFIG_BUG_ON_DATA_CORRUPTION for UAF-related errors")

---
Alternatively, we could also just remove the refcount underflow tests. It seems they are not really testing anything OF specific, but rather test the refcount implementation.

---
 drivers/of/Kconfig | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/of/Kconfig +4 -1
index 50697cc3b07e..316e32b35b17 100644
@@ -21,6 +21,7 @@ if OF
 config OF_UNITTEST
 	bool "Device Tree runtime unit tests"
 	depends on OF_EARLY_FLATTREE
+	depends on !BUG_ON_DATA_CORRUPTION
 	select IRQ_DOMAIN
 	select OF_RESOLVE
 	help
@@ -32,7 +33,9 @@ config OF_UNITTEST
 	  will taint the kernel with TAINT_TEST. The tests will cause ERROR and
 	  WARNING messages to print on the console. The tests will cause stack
 	  traces to print on the console.  It is possible that the tests will
-	  leave the devicetree in a corrupted state.
+	  leave the devicetree in a corrupted state.  BUG_ON_DATA_CORRUPTION
+	  must be disabled because the tests deliberately trigger refcount
+	  underflows and expect execution to continue.
 
 	  The unittest output will be verbose.  Copy the output to a file
 	  via capturing the console output or via the dmesg command.  Process

base-commit: a287f97d4256b5f5527f5b5a54f8ada55e1482c7

Signature · 1 line
2.56.0
maintainer
#1 lore raw
Quoted 28 lines · Danilo Krummrich

With CONFIG_OF_UNITTEST=y and CONFIG_BUG_ON_DATA_CORRUPTION=y, the machine no longer boots after commit 5b5224220747 ("refcount: Use CONFIG_BUG_ON_DATA_CORRUPTION for UAF-related errors").

of_unittest_lifecycle() deliberately calls of_node_put() after the node's reference count has reached zero. The test expects a warning and continues to check that a subsequent put does not produce another warning. With BUG_ON_DATA_CORRUPTION enabled, refcount underflow now triggers BUG() instead. This panics the kernel during boot:

        kernel BUG at lib/refcount.c:37!
        Oops: invalid opcode: 0000 [#1] SMP NOPTI
        CPU: 1 UID: 0 PID: 1 Comm: swapper/0 Tainted: G                 N  7.3.0+ #14 PREEMPT(full)
        RIP: 0010:refcount_warn_saturate+0x89/0x90
        Call Trace:
         of_unittest_lifecycle+0x158/0x310
         of_unittest+0x105/0x130
         do_one_initcall+0x127/0x350
         do_initcall_level+0x7c/0xe0
         do_initcalls+0x59/0xa0
         kernel_init_freeable+0x118/0x1a0
         kernel_init+0x1f/0x140
        Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b

Make OF_UNITTEST depend on !BUG_ON_DATA_CORRUPTION and explain the restriction in its help text.

Quoted 6 lines
Fixes 5b5224220747 ("refcount: Use CONFIG_BUG_ON_DATA_CORRUPTION for UAF-related errors")

---
Alternatively, we could also just remove the refcount underflow tests. It seems they are not really testing anything OF specific, but rather test the refcount implementation.

I'm fine with that. I think we should keep just the first part with of_node_release() error check.

Rob