All of lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Jim Cromie" <jim.cromie@gmail.com>
Cc: linux-modules@vger.kernel.org, dri-devel@lists.freedesktop.org
Subject: Re: [PATCH v7 02/29] selftests/dyndbg: Add kselftest script to verify dynamic-debug
Date: Tue, 21 Jul 2026 21:06:25 +0000	[thread overview]
Message-ID: <20260721210625.CC4EF1F00A3D@smtp.kernel.org> (raw)
In-Reply-To: <20260721-dd-maint-2-v7-2-010fbe73b311@gmail.com>

Thank you for your contribution! Sashiko AI review found 5 potential issue(s) to consider:
- [High] The script uses predictable temporary file names in `/tmp` based on the process ID, introducing a Time-of-Check to Time-of-Use (TOCTOU) symlink vulnerability.
- [Medium] The golden record MD5 hashing of dynamic debug control diffs includes source code line numbers, strictly coupling the test to file topology and causing spurious failures on unrelated code changes.
- [Medium] The framework uses exact MD5 hashes of dmesg slices, leading to severe flakiness when concurrent kernel activity occurs.
- [Medium] The script unconditionally skips all tests on monolithic kernels due to an overly broad initial `lsmod` check.
- [Medium] The dmesg log parsing does not account for `CONFIG_PRINTK_CALLER=y`, causing MD5 hashes to change on every test run due to PID inclusion.
--

--- Patch [2]: [PATCH v7 02/29] selftests/dyndbg: Add kselftest script to verify dynamic-debug ---
commit acdd3977962a0d4f508ca6d6378e26344aaef61d
Author: Jim Cromie <jim.cromie@gmail.com>

selftests/dyndbg: Add kselftest script to verify dynamic-debug

Add a kselftest script to attempt full validation of dynamic-debug
behavior. The script tests query grammar as documented, responses to
bad input, and proper/expected effects on both the control-file
display of current state, and on pr_debug logging behavior.

diff --git a/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh b/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh
index 0000000000000..1dafeaabc9768
--- /dev/null
+++ b/tools/testing/selftests/dynamic_debug/dyndbg_selftest.sh
@@ -0,0 +1,799 @@
[ ... ]
> [ -e /proc/dynamic_debug/control ] || {
>     echo -e "${RED}: this test requires CONFIG_DYNAMIC_DEBUG=y ${NC}"
>     exit $ksft_skip # nothing to test here, no good reason to fail.
> }
> 
> lsmod >/dev/null 2>&1 || {
>     echo -e "${RED}: lsmod requires /proc/modules ${NC}"
>     exit $ksft_skip # maybe later we can do more
> }

[Severity: Medium]
Does this early exit prevent the script from running the builtin tests
on a monolithic kernel?

Since the builtin_tests are explicitly designed to validate dynamic_debug
behavior on built-in code without requiring module support, it seems like
skipping the entire script here disables valid testing on kernels compiled
without CONFIG_MODULES=y.

[ ... ]
diff --git a/tools/testing/selftests/dynamic_debug/syslog_hash_validation.sh b/tools/testing/selftests/dynamic_debug/syslog_hash_validation.sh
index 0000000000000..c6d60495d7baa
--- /dev/null
+++ b/tools/testing/selftests/dynamic_debug/syslog_hash_validation.sh
@@ -0,0 +1,384 @@
[ ... ]
> # Default APP to DYNDBG if not already set
> APP="${APP:-DYNDBG}"
> APP_LOWER=$(echo "$APP" | tr '[:upper:]' '[:lower:]')
> 
> # Global files for tracking seen, unregistered, and drifted hashes
> SEEN_HASHES_FILE="/tmp/${APP_LOWER}_seen_hashes_$$"
> UNREG_HASHES_FILE="/tmp/${APP_LOWER}_unreg_hashes_$$"
> DRIFT_HASHES_FILE="/tmp/${APP_LOWER}_drift_hashes_$$"

[Severity: High]
Are these predictable file paths in the world-writable /tmp directory
vulnerable to a symlink attack?

If a malicious local user creates a symlink matching this PID pattern
right before the script writes to it, could it allow the script to
overwrite sensitive files, since it blindly appends to these paths later
on?

Using mktemp might be a safer approach here to prevent Time-of-Check
to Time-of-Use exploits.

[ ... ]
> function verify_dmesg_slice {
>     # Slices dmesg, computes its hash, and verifies it against the database.
>     # $1 - unique test key (e.g. normal_513)
>     # $2 - optional start marker (defaults to ${APP}_START_${label})
>     # $3 - optional end marker (defaults to ${APP}_END_${label})
> 
>     local label="$1"
>     local app="${APP:-DYNDBG}"
>     local start_marker="${2:-${app}_START_${label}_$$}"
>     local end_marker="${3:-${app}_END_${label}_$$}"
>     local extra_args="dmesg"
> 
>     # 1. Capture the log slice (exactly once!)
>     local log_slice=$(dmesg | sed -n "/$start_marker/,/$end_marker/p" | \
> 	grep -E -v "$start_marker|$end_marker" | \
>         sed -e 's/^\[[^]]*\] //' )

[Severity: Medium]
Does this regex correctly handle kernels configured with
CONFIG_PRINTK_CALLER=y?

When printk caller info is enabled, a second bracket group containing the
thread ID is present in the dmesg output. Since the PID changes per run,
will the resulting MD5 hash constantly mismatch because the second bracket
was not stripped before hashing?

[Severity: Medium]
Can background kernel activity disrupt the MD5 hashes calculated from
this slice?

If unrelated subsystem prints (like networking, RCU, or USB) occur between
the log_start and log_stop markers, they will be captured here and alter
the exact hash. Should there be a way to filter the dmesg slice to only
include dyndbg-related lines to prevent test flakiness in noisy
environments?

[ ... ]
> function verify_after_change {
>     # Verifies the transition between the stored 'before' state and the current state
>     # $1 - optional unique test key (resolved via stack if empty)
[ ... ]
>     # 1. Capture the 'after' state (exactly once!)
>     local after_slice=$(slice_by_grep "$BEFORE_CAPTURE_PATTERN" "$BEFORE_CAPTURE_FILE")
> 
>     # 2. Generate the unified diff, stripped of volatile diff headers AND hunk line-numbers
>     local transition_diff=$(diff -u <(echo "$BEFORE_CAPTURE_SLICE") <(echo "$after_slice") | \
>         tail -n +3 | \
>         sed -E 's/^@@ -[0-9]+.* \+[0-9]+.* @@/@@/g')
> 
>     # 3. Compute its fingerprint
>     local fingerprint=$(echo "$transition_diff" | tr -d '\r' | md5sum | cut -d' ' -f1)

[Severity: Medium]
Does the generated transition_diff still include source code line numbers
from the control file?

The sed command strips the chunk headers, but the body text from
/proc/dynamic_debug/control inherently outputs the format filename:lineno.
If unrelated upstream commits add or remove lines in tested files like
kernel/params.c, won't this cause the tests to spuriously fail because
the hashed line numbers drifted?

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260721-dd-maint-2-v7-0-010fbe73b311@gmail.com?part=2

  reply	other threads:[~2026-07-21 21:06 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-21 20:56 [PATCH v7 00/29] fix dynamic-debug classmaps API for DRM Jim Cromie
2026-07-21 20:56 ` [PATCH v7 01/29] params: fix a pr_debug(" %p ") use - already in MM-* Jim Cromie
2026-07-21 20:56 ` [PATCH v7 02/29] selftests/dyndbg: Add kselftest script to verify dynamic-debug Jim Cromie
2026-07-21 21:06   ` sashiko-bot [this message]
2026-07-21 20:56 ` [PATCH v7 03/29] drm: Fix incorrect ccflags-y spelling inside Makefile Jim Cromie
2026-07-21 20:56 ` [PATCH v7 04/29] drm: fix config dependent unused variable warning Jim Cromie
2026-07-21 20:56 ` [PATCH v7 05/29] drm: Mark CONFIG_DRM_USE_DYNAMIC_DEBUG as unBROKEN Jim Cromie
2026-07-21 20:56 ` [PATCH v7 06/29] vmlinux.lds.h: refactor BOUNDED_SECTION_* macros into bounded_sections.lds.h Jim Cromie
2026-07-21 20:56 ` [PATCH v7 07/29] vmlinux.lds.h: drop unused HEADERED_SECTION* macros Jim Cromie
2026-07-21 20:56 ` [PATCH v7 08/29] vmlinux.lds.h: Fix ALIGN(8) omission causing NULL ptr on i386 Jim Cromie
2026-07-21 20:56 ` [PATCH v7 09/29] vmlinux.lds.h: remove redundant ALIGN(8) directives Jim Cromie
2026-07-21 20:56 ` [PATCH v7 10/29] dyndbg.lds.S: fix lost dyndbg sections in modules Jim Cromie
2026-07-21 20:57 ` [PATCH v7 11/29] dyndbg: factor ddebug_match_desc out from ddebug_change Jim Cromie
2026-07-21 21:05   ` sashiko-bot
2026-07-21 20:57 ` [PATCH v7 12/29] dyndbg: add stub macro for DECLARE_DYNDBG_CLASSMAP Jim Cromie
2026-07-21 20:57 ` [PATCH v7 13/29] dyndbg: reword "class unknown," to "class:_UNKNOWN_" Jim Cromie
2026-07-21 20:57 ` [PATCH v7 14/29] dyndbg-API: remove DD_CLASS_TYPE_(DISJOINT|LEVEL)_NAMES and code Jim Cromie
2026-07-21 20:57 ` [PATCH v7 15/29] dyndbg: drop NUM_TYPE_ARGS Jim Cromie
2026-07-21 20:57 ` [PATCH v7 16/29] dyndbg: bump num-tokens in a query-cmd from 9 to 15 Jim Cromie
2026-07-21 20:57 ` [PATCH v7 17/29] dyndbg: reduce verbose/debug clutter Jim Cromie
2026-07-21 20:57 ` [PATCH v7 18/29] lib/parser: add match_wildcard_hyphen() for agnostic matching Jim Cromie
2026-07-21 20:57 ` [PATCH v7 19/29] dyndbg: use KBUILD_MODFILE for unique builtin module names Jim Cromie
2026-07-21 20:57 ` [PATCH v7 20/29] dyndbg: refactor param_set_dyndbg_classes and below Jim Cromie
2026-07-21 21:11   ` sashiko-bot
2026-07-21 20:57 ` [PATCH v7 21/29] dyndbg: tighten fn-sig of ddebug_apply_class_bitmap Jim Cromie
2026-07-21 20:57 ` [PATCH v7 22/29] dyndbg: replace classmap list with an array-slice Jim Cromie
2026-07-21 20:57 ` [PATCH v7 23/29] dyndbg: macrofy a 2-index for-loop pattern Jim Cromie
2026-07-21 20:57 ` [PATCH v7 24/29] dyndbg: pin class param storage to u32 Jim Cromie
2026-07-21 21:10   ` sashiko-bot
2026-07-21 20:57 ` [PATCH v7 25/29] dyndbg,module: make proper substructs in _ddebug_info Jim Cromie
2026-07-21 21:09   ` sashiko-bot
2026-07-21 20:57 ` [PATCH v7 26/29] dyndbg: move mod_name down from struct ddebug_table to _ddebug_info Jim Cromie
2026-07-21 21:13   ` sashiko-bot
2026-07-21 20:57 ` [PATCH v7 27/29] dyndbg: hoist classmap-filter-by-modname up to ddebug_add_module Jim Cromie
2026-07-21 20:57 ` [PATCH v7 28/29] dyndbg-API: replace DECLARE_DYNDBG_CLASSMAP Jim Cromie
2026-07-21 21:18   ` sashiko-bot
2026-07-21 20:57 ` [PATCH v7 29/29] selftests/dyndbg: enable FT_classmap_inheritance Jim Cromie
2026-07-21 21:11   ` sashiko-bot

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=20260721210625.CC4EF1F00A3D@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=jim.cromie@gmail.com \
    --cc=linux-modules@vger.kernel.org \
    --cc=sashiko-reviews@lists.linux.dev \
    /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.