All of lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Arnaldo Carvalho de Melo" <acme@kernel.org>
Cc: linux-perf-users@vger.kernel.org
Subject: Re: [PATCH v1 6/8] perf scripts: Add perf-stuck, to tell where a running perf is stuck
Date: Sun, 13 Sep 2026 02:44:13 +0000	[thread overview]
Message-ID: <20260913024413.CE6B21F000FF@smtp.kernel.org> (raw)
In-Reply-To: <20260913023459.112654-7-acme@kernel.org>

Thank you for your contribution! Sashiko AI review found 4 potential issue(s) to consider:
- [Medium] Time-of-check to time-of-use race condition when accessing process statistics leads to script crash.
- [Medium] Incorrect parsing of /proc/[pid]/stat for processes with spaces in their name.
- [Medium] Unsanitized output of process command lines allows terminal escape sequence injection.
- [Medium] Arithmetic evaluation failure due to awk outputting scientific notation for large CPU times.
--

commit bb6bb44a87ff31de8100a51a6f3b35196458dff1
Author: Arnaldo Carvalho de Melo <acme@redhat.com>

perf scripts: Add perf-stuck, to tell where a running perf is stuck

This commit introduces the perf-stuck.sh script and an accompanying gdb script
to help identify where a running perf process is stuck. It samples /proc/<pid>
at fixed intervals to distinguish between spinning, blocking, and recursion,
and can automatically attach gdb if no progress is made.

> diff --git a/tools/perf/scripts/perf-stuck.sh b/tools/perf/scripts/perf-stuck.sh
> new file mode 100755
> index 0000000000000..8b284bcf5e313
> --- /dev/null
> +++ b/tools/perf/scripts/perf-stuck.sh
> @@ -0,0 +1,165 @@

[ ... ]

> +hz=$(getconf CLK_TCK)
> +psz=$(getconf PAGESIZE)
> +prev_cpu=
> +prev_stack=
> +prev_progress=
> +stuck=0
> +gdb_done=
> +nsample=0
> +
> +echo "watching $pid ($(tr '\0' ' ' < /proc/"$pid"/cmdline)) every ${interval}s"

[Severity: Medium]
Does directly printing the process command line allow for terminal escape
sequence injection?

The tr command does not sanitize non-printable characters, which could allow
a process launched with malicious ANSI escape sequences in its command line
arguments to corrupt the local terminal when monitored.

> +
> +while :; do
> +	if [ ! -d /proc/"$pid" ]; then
> +		echo "$(date +%T) process gone"
> +		break
> +	fi
> +
> +	stat=($(awk '{print $3, $14 + $15, $24}' /proc/"$pid"/stat))

[Severity: Medium]
If the monitored process has a space in its command name (e.g., "(my script)"),
will awk split the name into multiple fields using its default whitespace
delimiter, incorrectly shifting positional variables like $14 and $24?

[Severity: Medium]
If the process terminates immediately after the directory check on the previous
lines, but before the awk command reads the file, will awk return an empty
output?

Because set -u is enabled, accessing the unbound stat[0] variable below
would cause the script to abruptly crash instead of cleanly exiting.

> +	state=${stat[0]}
> +	cpu=${stat[1]}
> +	# field 24 is the resident set size in pages
> +	rss=$(( stat[2] * psz / 1024 ))
> +
> +	stack=$(awk '/\[stack\]/{print $1; exit}' /proc/"$pid"/maps)

[ ... ]

> +	if [ -n "$prev_cpu" ]; then
> +		cpu_delta=$(( cpu - prev_cpu ))

[Severity: Medium]
If the sum of utime and stime ($14 + $15) calculated by awk above exceeds
1,000,000 ticks, will awk format the output in scientific notation (e.g.,
1e+06) based on the default OFMT?

If so, the bash arithmetic context here will be unable to parse this format,
causing a fatal syntax error and crashing the script when monitoring
long-running processes.

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260913023459.112654-1-acme@kernel.org?part=6

  reply	other threads:[~2026-09-13  2:44 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-13  2:34 [PATCH v1 0/8] perf tools: Annotate fixes, stdio progress indication, debuginfo-client in more places Arnaldo Carvalho de Melo
2026-09-13  2:34 ` [PATCH v1 1/8] perf test: Skip data_type_profiling when the PMU cannot record memory events Arnaldo Carvalho de Melo
2026-09-13  2:40   ` sashiko-bot
2026-09-13  2:34 ` [PATCH v1 2/8] perf debuginfo: Fetch debuginfo keyed by build ID using debuginfod Arnaldo Carvalho de Melo
2026-09-13  2:47   ` sashiko-bot
2026-09-13  2:34 ` [PATCH v1 3/8] perf symbol: Fall back to fetching the vmlinux by build ID Arnaldo Carvalho de Melo
2026-09-13  2:43   ` sashiko-bot
2026-09-13  2:34 ` [PATCH v1 4/8] perf annotate-data: Show the sample count in the data-type browser Arnaldo Carvalho de Melo
2026-09-13  2:43   ` sashiko-bot
2026-09-13  2:34 ` [PATCH v1 5/8] perf report: Add --progress option Arnaldo Carvalho de Melo
2026-09-13  2:42   ` sashiko-bot
2026-09-13  2:34 ` [PATCH v1 6/8] perf scripts: Add perf-stuck, to tell where a running perf is stuck Arnaldo Carvalho de Melo
2026-09-13  2:44   ` sashiko-bot [this message]
2026-09-13  2:34 ` [PATCH v1 7/8] perf annotate-data: Resolve type DIEs in the debug file they came from Arnaldo Carvalho de Melo
2026-09-13  2:44   ` sashiko-bot
2026-09-13  2:34 ` [PATCH v1 8/8] perf mem record: Request PERF_SAMPLE_CPU by default Arnaldo Carvalho de Melo
2026-09-13  2:53   ` 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=20260913024413.CE6B21F000FF@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=acme@kernel.org \
    --cc=linux-perf-users@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.