mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-31 23:27:20 +00:00

bash and dash evaluate variables differently.
dash will evaluate '\\' every time it is read whereas bash does not.
TEST_STRING="$TEST_STRING \\$i"
echo $TEST_STRING
With i=123
On bash, that will print "\123"
but on dash, that will print the escape sequence of \123 as the \ will be
interpreted again in the echo.
The dynevent_limitations.tc test created a very large list of arguments to
test the maximum number of arguments to pass to the dynamic events file.
It had a loop of:
TEST_STRING=$1
# Acceptable
for i in `seq 1 $MAX_ARGS`; do
TEST_STRING="$TEST_STRING \\$i"
done
echo "$TEST_STRING" >> dynamic_events
This worked fine on bash, but when run on dash it failed.
This was due to dash interpreting the "\\$i" twice. Once when it was
assigned to TEST_STRING and a second time with the echo $TEST_STRING.
bash does not process the backslash more than the first time.
To solve this, assign a double backslash to a variable "bs" and then echo
it to "ts". If "ts" changes, it is dash, if not, it is bash. Then update
"bs" accordingly, and use that to assign TEST_STRING.
Now this could possibly just check if "$BASH" is defined or not, but this
is testing if the issue exists and not just which shell is being used.
Link: https://lore.kernel.org/r/20250414210900.4de5e8b9@gandalf.local.home
Fixes: 581a7b26ab
("selftests/ftrace: Add dynamic events argument limitation test case")
Reported-by: Mark Brown <broonie@kernel.org>
Closes: https://lore.kernel.org/all/350786cc-9e40-4396-ab95-4f10d69122fb@sirena.org.uk/
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
Acked-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
63 lines
1.6 KiB
Bash
63 lines
1.6 KiB
Bash
#!/bin/sh
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
# description: Checking dynamic events limitations
|
|
# requires: dynamic_events "imm-value":README
|
|
|
|
# Max arguments limitation
|
|
MAX_ARGS=128
|
|
EXCEED_ARGS=$((MAX_ARGS + 1))
|
|
|
|
# bash and dash evaluate variables differently.
|
|
# dash will evaluate '\\' every time it is read whereas bash does not.
|
|
#
|
|
# TEST_STRING="$TEST_STRING \\$i"
|
|
# echo $TEST_STRING
|
|
#
|
|
# With i=123
|
|
# On bash, that will print "\123"
|
|
# but on dash, that will print the escape sequence of \123 as the \ will
|
|
# be interpreted again in the echo.
|
|
#
|
|
# Set a variable "bs" to save a double backslash, then echo that
|
|
# to "ts" to see if $ts changed or not. If it changed, it's dash,
|
|
# if not, it's bash, and then bs can equal a single backslash.
|
|
bs='\\'
|
|
ts=`echo $bs`
|
|
if [ "$ts" = '\\' ]; then
|
|
# this is bash
|
|
bs='\'
|
|
fi
|
|
|
|
check_max_args() { # event_header
|
|
TEST_STRING=$1
|
|
# Acceptable
|
|
for i in `seq 1 $MAX_ARGS`; do
|
|
TEST_STRING="$TEST_STRING $bs$i"
|
|
done
|
|
echo "$TEST_STRING" >> dynamic_events
|
|
echo > dynamic_events
|
|
# Error
|
|
TEST_STRING="$TEST_STRING \\$EXCEED_ARGS"
|
|
! echo "$TEST_STRING" >> dynamic_events
|
|
return 0
|
|
}
|
|
|
|
# Kprobe max args limitation
|
|
if grep -q "kprobe_events" README; then
|
|
check_max_args "p vfs_read"
|
|
fi
|
|
|
|
# Fprobe max args limitation
|
|
if grep -q "f[:[<group>/][<event>]] <func-name>[%return] [<args>]" README; then
|
|
check_max_args "f vfs_read"
|
|
fi
|
|
|
|
# Tprobe max args limitation
|
|
if grep -q "t[:[<group>/][<event>]] <tracepoint> [<args>]" README; then
|
|
check_max_args "t kfree"
|
|
fi
|
|
|
|
# Uprobe max args limitation
|
|
if grep -q "uprobe_events" README; then
|
|
check_max_args "p /bin/sh:10"
|
|
fi
|