[PATCH v2 17/18] tools/kstackwatch: add interactive test script for KStackWatch

Jinchao Wang
2025-09-04T00:24:26Z

Introduce kstackwatch_test.sh, a shell script to facilitate running various
test scenarios interactively or via command-line arguments.

Signed-off-by: Jinchao Wang <wangjinchao600@gmail.com>
---
tools/kstackwatch/kstackwatch_test.sh | 118 ++++++++++++++++++++++++++
1 file changed, 118 insertions(+)
create mode 100755 tools/kstackwatch/kstackwatch_test.sh

diff --git a/tools/kstackwatch/kstackwatch_test.sh b/tools/kstackwatch/kstackwatch_test.sh
new file mode 100755
index 000000000000..fcdb5ac9b607
--- /dev/null
+++ b/tools/kstackwatch/kstackwatch_test.sh
@@ -0,0 +1,118 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0
+
+# --- Usage function ---
+usage() {
+ echo "======================================"
+ echo " KStackWatch Test Script Usage"
+ echo "======================================"
+ echo ""
+ echo "IMPORTANT: Before running, make sure you have updated the offset values!"
+ echo ""
+ echo "To find your offsets, use objdump:"
+ echo " objdump -S --disassemble=canary_test_write vmlinux"
+ echo ""
+ echo "Then search for your function names to find the instruction addresses."
+ echo "- Instruction offset: address relative to function's start"
+ echo "- Stack var offset: distance from stack base (%rbp) to the variable"
+ echo ""
+ echo "Usage: $0 [test_case_number]"
+ echo ""
+ echo "Available test cases:"
+ echo " 0 - Canary Write Test"
+ echo " 1 - Canary Overflow Test"
+ echo " 2 - Silent Corruption Test"
+ echo " 3 - Recursive Corruption Test"
+ echo ""
+ echo "======================================"
+ echo ""
+}
+
+# --- Interactive menu ---
+show_menu() {
+ echo "Select a test case to run:"
+ echo " 0) Canary Write Test"
+ echo " 1) Canary Overflow Test"
+ echo " 2) Silent Corruption Test"
+ echo " 3) Recursive Corruption Test"
+ echo " q) Quit"
+ echo ""
+ echo "WARNING: Each test may cause system crash/hang!"
+ echo ""
+ read -p "Enter your choice [0-3/q]: " choice
+ echo ""
+
+ case "$choice" in
+ 0) test0 ;;
+ 1) test1 ;;
+ 2) test2 ;;
+ 3) test3 ;;
+ q | Q)
+ echo "Exiting..."
+ exit 0
+ ;;
+ *)
+ echo "Invalid choice. Please try again."
+ echo ""
+ show_menu
+ ;;
+ esac
+}
+
+# --- Test Case 0: Canary Write ---
+test0() {
+ echo "=== Running Test Case 0: Canary Write ==="
+ # function+instruction_off[+depth] [local_var_offset:local_var_len]
+ echo "canary_test_write+0x12" >/proc/kstackwatch
+ echo "test0" >/proc/kstackwatch_test
+ echo >/proc/kstackwatch
+}
+
+# --- Test Case 1: Canary Overflow ---
+test1() {
+ echo "=== Running Test Case 1: Canary Overflow ==="
+ # function+instruction_off[+depth] [local_var_offset:local_var_len]
+ echo "canary_test_overflow+0x12" >/proc/kstackwatch
+ echo "test1" >/proc/kstackwatch_test
+ echo >/proc/kstackwatch
+
+}
+
+# --- Test Case 2: Silent Corruption ---
+test2() {
+ echo "=== Running Test Case 2: Silent Corruption ==="
+ # function+instruction_off[+depth] [local_var_offset:local_var_len]
+ echo "silent_corruption_hapless+0x7f 0:8" >/proc/kstackwatch
+ echo "test2" >/proc/kstackwatch_test
+ echo >/proc/kstackwatch
+}
+
+# --- Test Case 3: Recursive Corruption ---
+test3() {
+ echo "=== Running Test Case 3: Recursive Corruption ==="
+ # function+instruction_off[+depth] [local_var_offset:local_var_len]
+ echo "recursive_corruption_test+0x1b+3 0:8" >/proc/kstackwatch
+ echo "test3" >/proc/kstackwatch_test
+ echo >/proc/kstackwatch
+}
+
+# --- Main ---
+if [ -z "$1" ]; then
+ usage
+ echo ""
+ show_menu
+else
+ case "$1" in
+ 0) test0 ;;
+ 1) test1 ;;
+ 2) test2 ;;
+ 3) test3 ;;
+ help | --help | -h) usage ;;
+ *)
+ echo "Error: Invalid argument '$1'"
+ echo ""
+ usage
+ exit 1
+ ;;
+ esac
+fi
--
2.43.0