From: Danilo Krummrich <dakr@kernel.org>
To: robh@kernel.org, saravanak@kernel.org
Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
Danilo Krummrich <dakr@kernel.org>
Subject: [PATCH] of: unittest: Remove refcount underflow tests
Date: Sun, 1 Nov 2026 13:19:29 +0100 [thread overview]
Message-ID: <20261101122128.2124348-1-dakr@kernel.org> (raw)
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
Remove the refcount underflow tests, which exercise the refcount
implementation rather than OF-specific behavior.
Fixes: 5b5224220747 ("refcount: Use CONFIG_BUG_ON_DATA_CORRUPTION for UAF-related errors")
Signed-off-by: Danilo Krummrich <dakr@kernel.org>
---
drivers/of/unittest.c | 43 -------------------------------------------
1 file changed, 43 deletions(-)
diff --git a/drivers/of/unittest.c b/drivers/of/unittest.c
index e255f54f4d76..03fc941c0995 100644
--- a/drivers/of/unittest.c
+++ b/drivers/of/unittest.c
@@ -3678,9 +3678,6 @@ static void __init of_unittest_lifecycle(void)
* - Decrementing refcount to zero via of_node_put() should cause the
* attempt to free the node memory by of_node_release() to fail
* because the node is not a dynamic node.
- *
- * - Decrementing refcount past zero should result in additional
- * errors reported.
*/
np = of_find_node_by_path(refcount_path);
@@ -3714,46 +3711,6 @@ static void __init of_unittest_lifecycle(void)
EXPECT_END(KERN_INFO, "OF: ERROR: of_node_release() detected bad of_node_put() on /testcase-data/refcount-node");
-
- /*
- * expect stack trace for subsequent of_node_put():
- * __refcount_sub_and_test() calls:
- * refcount_warn_saturate(r, REFCOUNT_SUB_UAF)
- *
- * Not capturing entire WARN_ONCE() trace with EXPECT_*(), just
- * the first three lines, and the last line.
- */
- EXPECT_BEGIN(KERN_INFO, "------------[ cut here ]------------");
- EXPECT_BEGIN(KERN_INFO, "WARNING: <<all>>");
- EXPECT_BEGIN(KERN_INFO, "refcount_t: underflow; use-after-free.");
- EXPECT_BEGIN(KERN_INFO, "---[ end trace <<int>> ]---");
-
- /* refcount is now zero, this should fail */
- unittest(1, "/testcase-data/refcount-node is zero");
- of_node_put(np);
-
- EXPECT_END(KERN_INFO, "---[ end trace <<int>> ]---");
- EXPECT_END(KERN_INFO, "refcount_t: underflow; use-after-free.");
- EXPECT_END(KERN_INFO, "WARNING: <<all>>");
- EXPECT_END(KERN_INFO, "------------[ cut here ]------------");
-
- /*
- * Q. do we expect to get yet another warning?
- * A. no, the WARNING is from WARN_ONCE()
- */
- EXPECT_NOT_BEGIN(KERN_INFO, "------------[ cut here ]------------");
- EXPECT_NOT_BEGIN(KERN_INFO, "WARNING: <<all>>");
- EXPECT_NOT_BEGIN(KERN_INFO, "refcount_t: underflow; use-after-free.");
- EXPECT_NOT_BEGIN(KERN_INFO, "---[ end trace <<int>> ]---");
-
- unittest(1, "/testcase-data/refcount-node is zero, second time");
- of_node_put(np);
-
- EXPECT_NOT_END(KERN_INFO, "---[ end trace <<int>> ]---");
- EXPECT_NOT_END(KERN_INFO, "refcount_t: underflow; use-after-free.");
- EXPECT_NOT_END(KERN_INFO, "WARNING: <<all>>");
- EXPECT_NOT_END(KERN_INFO, "------------[ cut here ]------------");
-
/*
* refcount of zero will trigger stack traces from any further
* attempt to of_node_get() node "refcount-node". One example of
base-commit: a287f97d4256b5f5527f5b5a54f8ada55e1482c7
--
2.56.0
next reply other threads:[~2026-11-01 12:21 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-01 12:19 Danilo Krummrich [this message]
2026-11-02 18:19 ` [PATCH] of: unittest: Remove refcount underflow tests Rob Herring
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261101122128.2124348-1-dakr@kernel.org \
--to=dakr@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=robh@kernel.org \
--cc=saravanak@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.