getopts reports unknown options and missing arguments, but run_vmtests.sh
ignores its error result and continues with test setup. An empty -t
argument also falls back to the default selection, while unknown category
names can silently select no tests and still reach setup code.

Exit on getopts errors and validate category names against the existing
list in usage() before any test setup. Reject empty and whitespace-only
selections, and normalize category separators so validation and execution
agree. Keep the default selection for an unset or empty VM_SELFTEST_ITEMS
environment variable, and preserve the existing standalone default value.

Fixes: 85463321e726 ("selftests/vm: enable running select groups of tests")
Assisted-by: Codex:GPT-6
Signed-off-by: Tianyi Chen <[email protected]>
---
 tools/testing/selftests/mm/run_vmtests.sh | 27 +++++++++++++++++++----
 1 file changed, 23 insertions(+), 4 deletions(-)

diff --git a/tools/testing/selftests/mm/run_vmtests.sh 
b/tools/testing/selftests/mm/run_vmtests.sh
index d09f9f6a384..836c7454cba 100755
--- a/tools/testing/selftests/mm/run_vmtests.sh
+++ b/tools/testing/selftests/mm/run_vmtests.sh
@@ -96,26 +96,45 @@ separated by spaces:
 
 example: ./run_vmtests.sh -t "hmm mmap ksm"
 EOF
-       exit 0
 }
 
 RUN_ALL=false
 RUN_DESTRUCTIVE=false
 TAP_PREFIX="# "
 
+# An unset or empty environment selection keeps the default behavior.
+VM_SELFTEST_ITEMS=${VM_SELFTEST_ITEMS:-default}
+
 while getopts "aht:nd" OPT; do
        case ${OPT} in
                "a") RUN_ALL=true ;;
-               "h") usage ;;
+               "h") usage; exit 0 ;;
                "t") VM_SELFTEST_ITEMS=${OPTARG} ;;
                "n") TAP_PREFIX= ;;
                "d") RUN_DESTRUCTIVE=true ;;
+               "?") exit 1 ;;
        esac
 done
 shift $((OPTIND -1))
 
-# default behavior: run all tests
-VM_SELFTEST_ITEMS=${VM_SELFTEST_ITEMS:-default}
+# Normalize whitespace so validation and test_selected() use the same names.
+read -r -a selected_categories <<< "${VM_SELFTEST_ITEMS//$'\n'/ }"
+VM_SELFTEST_ITEMS="${selected_categories[*]}"
+if [ -z "$VM_SELFTEST_ITEMS" ]; then
+       echo "No test categories specified" >&2
+       exit 1
+fi
+
+if [ "$VM_SELFTEST_ITEMS" != "default" ]; then
+       # Keep the documented category list as the source of valid names.
+       valid_categories=$(usage | sed -n 's/^- //p')
+       for category in "${selected_categories[@]}"; do
+               if ! grep -Fxq -- "$category" <<< "$valid_categories"; then
+                       echo "Unknown test category: $category" >&2
+                       exit 1
+               fi
+       done
+fi
 
 test_selected() {
        if [ "$VM_SELFTEST_ITEMS" == "default" ]; then
-- 
2.55.0


Reply via email to