Commit 303f8e2d authored by SeongJae Park's avatar SeongJae Park Committed by Linus Torvalds

selftests/kselftest/runner/run_one(): allow running non-executable files

When running a test program, 'run_one()' checks if the program has the
execution permission and fails if it doesn't.  However, it's easy to
mistakenly lose the permissions, as some common tools like 'diff' don't
support the permission change well[1].  Compared to that, making mistakes
in the test program's path would only rare, as those are explicitly listed
in 'TEST_PROGS'.  Therefore, it might make more sense to resolve the
situation on our own and run the program.

For this reason, this commit makes the test program runner function still
print the warning message but to try parsing the interpreter of the
program and to explicitly run it with the interpreter, in this case.

[1] https://lore.kernel.org/mm-commits/YRJisBs9AunccCD4@kroah.com/

Link: https://lkml.kernel.org/r/20210810164534.25902-1-sj38.park@gmail.comSigned-off-by: default avatarSeongJae Park <sjpark@amazon.de>
Suggested-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Shuah Khan <shuah@kernel.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 2128f4e2
...@@ -33,9 +33,9 @@ tap_timeout() ...@@ -33,9 +33,9 @@ tap_timeout()
{ {
# Make sure tests will time out if utility is available. # Make sure tests will time out if utility is available.
if [ -x /usr/bin/timeout ] ; then if [ -x /usr/bin/timeout ] ; then
/usr/bin/timeout --foreground "$kselftest_timeout" "$1" /usr/bin/timeout --foreground "$kselftest_timeout" $1
else else
"$1" $1
fi fi
} }
...@@ -65,17 +65,25 @@ run_one() ...@@ -65,17 +65,25 @@ run_one()
TEST_HDR_MSG="selftests: $DIR: $BASENAME_TEST" TEST_HDR_MSG="selftests: $DIR: $BASENAME_TEST"
echo "# $TEST_HDR_MSG" echo "# $TEST_HDR_MSG"
if [ ! -x "$TEST" ]; then
echo -n "# Warning: file $TEST is "
if [ ! -e "$TEST" ]; then if [ ! -e "$TEST" ]; then
echo "missing!" echo "# Warning: file $TEST is missing!"
else
echo "not executable, correct this."
fi
echo "not ok $test_num $TEST_HDR_MSG" echo "not ok $test_num $TEST_HDR_MSG"
else else
cmd="./$BASENAME_TEST"
if [ ! -x "$TEST" ]; then
echo "# Warning: file $TEST is not executable"
if [ $(head -n 1 "$TEST" | cut -c -2) = "#!" ]
then
interpreter=$(head -n 1 "$TEST" | cut -c 3-)
cmd="$interpreter ./$BASENAME_TEST"
else
echo "not ok $test_num $TEST_HDR_MSG"
return
fi
fi
cd `dirname $TEST` > /dev/null cd `dirname $TEST` > /dev/null
((((( tap_timeout ./$BASENAME_TEST 2>&1; echo $? >&3) | ((((( tap_timeout "$cmd" 2>&1; echo $? >&3) |
tap_prefix >&4) 3>&1) | tap_prefix >&4) 3>&1) |
(read xs; exit $xs)) 4>>"$logfile" && (read xs; exit $xs)) 4>>"$logfile" &&
echo "ok $test_num $TEST_HDR_MSG") || echo "ok $test_num $TEST_HDR_MSG") ||
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment