From: Bill Wendling <morbo@google.com>
To: linux-kernel@vger.kernel.org
Cc: Bill Wendling <morbo@google.com>, Kees Cook <kees@kernel.org>,
"Gustavo A. R. Silva" <gustavoars@kernel.org>,
Andrew Morton <akpm@linux-foundation.org>,
Brendan Higgins <brendan.higgins@linux.dev>,
David Gow <david@davidgow.net>, Rae Moar <raemoar63@gmail.com>,
Ryota Sakamoto <sakamo.ryota@gmail.com>,
Kuan-Wei Chiu <visitorckw@gmail.com>,
Pasha Tatashin <pasha.tatashin@soleen.com>,
Dmitry Antipov <dmantipov@yandex.ru>,
Petr Mladek <pmladek@suse.com>, Kir Chou <note351@hotmail.com>,
codemender-patching+linux@google.com,
linux-hardening@vger.kernel.org,
linux-kselftest@vger.kernel.org, kunit-dev@googlegroups.com
Subject: [PATCH 2/2] lib/tests: Add KUnit test for struct stack_trace __counted_by_ptr attribute
Date: Sun, 23 Aug 2026 12:35:33 +0000 [thread overview]
Message-ID: <20260823123549.1120133-3-morbo@google.com> (raw)
In-Reply-To: <20260823123549.1120133-1-morbo@google.com>
Add a custom KUnit test suite 'stacktrace_counted_by' to verify that the
__counted_by_ptr annotation on the 'entries' field of 'struct stack_trace'
behaves correctly.
The test verifies that 'max_entries' correctly limits and validates access
to 'entries' when CONFIG_ARCH_STACKWALK is not defined. If it is defined,
the test is cleanly skipped at runtime to prevent compile-time or runtime
failures due to 'struct stack_trace' being undefined on modern
architectures.
Assisted-by: Gemini Next
Signed-off-by: Bill Wendling <morbo@google.com>
---
Cc: Kees Cook <kees@kernel.org>
Cc: "Gustavo A. R. Silva" <gustavoars@kernel.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Brendan Higgins <brendan.higgins@linux.dev>
Cc: David Gow <david@davidgow.net>
Cc: Rae Moar <raemoar63@gmail.com>
Cc: Ryota Sakamoto <sakamo.ryota@gmail.com>
Cc: Kuan-Wei Chiu <visitorckw@gmail.com>
Cc: Pasha Tatashin <pasha.tatashin@soleen.com>
Cc: Dmitry Antipov <dmantipov@yandex.ru>
Cc: Petr Mladek <pmladek@suse.com>
Cc: Kir Chou <note351@hotmail.com>
Cc: codemender-patching+linux@google.com
Cc: linux-kernel@vger.kernel.org
Cc: linux-hardening@vger.kernel.org
Cc: linux-kselftest@vger.kernel.org
Cc: kunit-dev@googlegroups.com
Cc: linux-hardening@vger.kernel.org
---
lib/Kconfig.debug | 10 +++++++
lib/kunit/.kunitconfig | 1 +
lib/tests/Makefile | 1 +
lib/tests/stacktrace_kunit.c | 51 ++++++++++++++++++++++++++++++++++++
4 files changed, 63 insertions(+)
create mode 100644 lib/tests/stacktrace_kunit.c
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
index e97bdf3a42a8..51a6ac1a2461 100644
--- a/lib/Kconfig.debug
+++ b/lib/Kconfig.debug
@@ -2716,6 +2716,16 @@ config BITOPS_KUNIT
If unsure, say N.
+config STACKTRACE_KUNIT_TEST
+ tristate "KUnit test for stacktrace counted_by attribute" if !KUNIT_ALL_TESTS
+ depends on KUNIT
+ default KUNIT_ALL_TESTS
+ help
+ This option enables the KUnit test for verifying the __counted_by_ptr
+ attribute on struct stack_trace.
+
+ If unsure, say N.
+
config BITFIELD_KUNIT
tristate "KUnit test bitfield functions at runtime" if !KUNIT_ALL_TESTS
depends on KUNIT
diff --git a/lib/kunit/.kunitconfig b/lib/kunit/.kunitconfig
index 9235b7d42d38..b3761b41459e 100644
--- a/lib/kunit/.kunitconfig
+++ b/lib/kunit/.kunitconfig
@@ -1,3 +1,4 @@
CONFIG_KUNIT=y
CONFIG_KUNIT_TEST=y
CONFIG_KUNIT_EXAMPLE_TEST=y
+CONFIG_STACKTRACE_KUNIT_TEST=y
diff --git a/lib/tests/Makefile b/lib/tests/Makefile
index 4ead57602eac..40875e729fc8 100644
--- a/lib/tests/Makefile
+++ b/lib/tests/Makefile
@@ -6,6 +6,7 @@
CFLAGS_bitfield_kunit.o := $(DISABLE_STRUCTLEAK_PLUGIN)
obj-$(CONFIG_BASE64_KUNIT) += base64_kunit.o
obj-$(CONFIG_BITOPS_KUNIT) += bitops_kunit.o
+obj-$(CONFIG_STACKTRACE_KUNIT_TEST) += stacktrace_kunit.o
obj-$(CONFIG_BITFIELD_KUNIT) += bitfield_kunit.o
obj-$(CONFIG_BITS_TEST) += test_bits.o
obj-$(CONFIG_SHDI3_KUNIT_TEST) += shdi3_kunit.o
diff --git a/lib/tests/stacktrace_kunit.c b/lib/tests/stacktrace_kunit.c
new file mode 100644
index 000000000000..7ec48edf84fe
--- /dev/null
+++ b/lib/tests/stacktrace_kunit.c
@@ -0,0 +1,51 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * KUnit test for struct stack_trace counted_by attribute.
+ */
+
+#include <kunit/test.h>
+#include <linux/stacktrace.h>
+
+#ifndef CONFIG_ARCH_STACKWALK
+static void test_stack_trace_counted_by(struct kunit *test)
+{
+ unsigned long entries_buf[4];
+ struct stack_trace trace = {
+ .entries = entries_buf,
+ .max_entries = 4,
+ };
+
+ KUNIT_EXPECT_EQ(test, trace.max_entries, 4U);
+ KUNIT_EXPECT_PTR_EQ(test, trace.entries, (unsigned long *)entries_buf);
+
+ /* Write to the allocated elements to verify access */
+ trace.entries[0] = 0xdeadbeef;
+ trace.entries[1] = 0xbeefcafe;
+ trace.entries[2] = 0xcafebabe;
+ trace.entries[3] = 0x12345678;
+
+ KUNIT_EXPECT_EQ(test, trace.entries[0], 0xdeadbeefUL);
+ KUNIT_EXPECT_EQ(test, trace.entries[1], 0xbeefcafeUL);
+ KUNIT_EXPECT_EQ(test, trace.entries[2], 0xcafebabeUL);
+ KUNIT_EXPECT_EQ(test, trace.entries[3], 0x12345678UL);
+}
+#else
+static void test_stack_trace_counted_by(struct kunit *test)
+{
+ kunit_skip(test, "CONFIG_ARCH_STACKWALK is enabled, struct stack_trace is not defined");
+}
+#endif
+
+static struct kunit_case stacktrace_test_cases[] = {
+ KUNIT_CASE(test_stack_trace_counted_by),
+ {}
+};
+
+static struct kunit_suite stacktrace_test_suite = {
+ .name = "stacktrace_counted_by",
+ .test_cases = stacktrace_test_cases,
+};
+
+kunit_test_suite(stacktrace_test_suite);
+
+MODULE_LICENSE("GPL");
--
2.55.0.860.g4b6b3295ed-goog
next prev parent reply other threads:[~2026-08-23 12:35 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-23 12:35 [PATCH 0/2] Add __counted_by_ptr attribute to struct stack_trace Bill Wendling
2026-08-23 12:35 ` [PATCH 1/2] stacktrace: " Bill Wendling
2026-08-24 19:12 ` Gustavo A. R. Silva
2026-08-23 12:35 ` Bill Wendling [this message]
2026-08-23 15:11 ` [PATCH 2/2] lib/tests: Add KUnit test for struct stack_trace __counted_by_ptr attribute Kuan-Wei Chiu
2026-09-10 19:30 ` Bill Wendling
2026-08-24 6:41 ` Thomas Weißschuh
2026-09-10 19:48 ` Bill Wendling
2026-08-25 5:07 ` David Gow
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=20260823123549.1120133-3-morbo@google.com \
--to=morbo@google.com \
--cc=akpm@linux-foundation.org \
--cc=brendan.higgins@linux.dev \
--cc=codemender-patching+linux@google.com \
--cc=david@davidgow.net \
--cc=dmantipov@yandex.ru \
--cc=gustavoars@kernel.org \
--cc=kees@kernel.org \
--cc=kunit-dev@googlegroups.com \
--cc=linux-hardening@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=note351@hotmail.com \
--cc=pasha.tatashin@soleen.com \
--cc=pmladek@suse.com \
--cc=raemoar63@gmail.com \
--cc=sakamo.ryota@gmail.com \
--cc=visitorckw@gmail.com \
/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.