.. | .. |
---|
28 | 28 | # override by exporting to your environment prior running this script. |
---|
29 | 29 | # For instance this script assumes you do not have xfs loaded upon boot. |
---|
30 | 30 | # If this is false, export DEFAULT_KMOD_FS="ext4" prior to running this |
---|
31 | | -# script if the filesyste module you don't have loaded upon bootup |
---|
| 31 | +# script if the filesystem module you don't have loaded upon bootup |
---|
32 | 32 | # is ext4 instead. Refer to allow_user_defaults() for a list of user |
---|
33 | 33 | # override variables possible. |
---|
34 | 34 | # |
---|
.. | .. |
---|
61 | 61 | ALL_TESTS="$ALL_TESTS 0007:5:1" |
---|
62 | 62 | ALL_TESTS="$ALL_TESTS 0008:150:1" |
---|
63 | 63 | ALL_TESTS="$ALL_TESTS 0009:150:1" |
---|
| 64 | +ALL_TESTS="$ALL_TESTS 0010:1:1" |
---|
| 65 | +ALL_TESTS="$ALL_TESTS 0011:1:1" |
---|
| 66 | +ALL_TESTS="$ALL_TESTS 0012:1:1" |
---|
| 67 | +ALL_TESTS="$ALL_TESTS 0013:1:1" |
---|
64 | 68 | |
---|
65 | 69 | # Kselftest framework requirement - SKIP code is 4. |
---|
66 | 70 | ksft_skip=4 |
---|
.. | .. |
---|
126 | 130 | if [[ $KMOD_VERSION -le 19 ]]; then |
---|
127 | 131 | echo "$0: You need at least kmod 20" >&2 |
---|
128 | 132 | echo "kmod <= 19 is buggy, for details see:" >&2 |
---|
129 | | - echo "http://git.kernel.org/cgit/utils/kernel/kmod/kmod.git/commit/libkmod/libkmod-module.c?id=fd44a98ae2eb5eb32161088954ab21e58e19dfc4" >&2 |
---|
| 133 | + echo "https://git.kernel.org/cgit/utils/kernel/kmod/kmod.git/commit/libkmod/libkmod-module.c?id=fd44a98ae2eb5eb32161088954ab21e58e19dfc4" >&2 |
---|
130 | 134 | exit $ksft_skip |
---|
131 | 135 | fi |
---|
132 | 136 | |
---|
.. | .. |
---|
149 | 153 | |
---|
150 | 154 | test_finish() |
---|
151 | 155 | { |
---|
| 156 | + echo "$MODPROBE" > /proc/sys/kernel/modprobe |
---|
152 | 157 | echo "Test completed" |
---|
153 | 158 | } |
---|
154 | 159 | |
---|
.. | .. |
---|
263 | 268 | config_reset() |
---|
264 | 269 | { |
---|
265 | 270 | if ! echo -n "1" >"$DIR"/reset; then |
---|
266 | | - echo "$0: reset shuld have worked" >&2 |
---|
| 271 | + echo "$0: reset should have worked" >&2 |
---|
267 | 272 | exit 1 |
---|
268 | 273 | fi |
---|
269 | 274 | } |
---|
.. | .. |
---|
338 | 343 | |
---|
339 | 344 | kmod_defaults_driver |
---|
340 | 345 | config_num_threads 1 |
---|
341 | | - printf '\000' >"$DIR"/config_test_driver |
---|
| 346 | + printf $NAME >"$DIR"/config_test_driver |
---|
342 | 347 | config_trigger ${FUNCNAME[0]} |
---|
343 | 348 | config_expect_result ${FUNCNAME[0]} MODULE_NOT_FOUND |
---|
344 | 349 | } |
---|
.. | .. |
---|
349 | 354 | |
---|
350 | 355 | kmod_defaults_fs |
---|
351 | 356 | config_num_threads 1 |
---|
352 | | - printf '\000' >"$DIR"/config_test_fs |
---|
| 357 | + printf $NAME >"$DIR"/config_test_fs |
---|
353 | 358 | config_trigger ${FUNCNAME[0]} |
---|
354 | 359 | config_expect_result ${FUNCNAME[0]} -EINVAL |
---|
355 | 360 | } |
---|
.. | .. |
---|
443 | 448 | config_expect_result ${FUNCNAME[0]} SUCCESS |
---|
444 | 449 | } |
---|
445 | 450 | |
---|
| 451 | +kmod_test_0010() |
---|
| 452 | +{ |
---|
| 453 | + kmod_defaults_driver |
---|
| 454 | + config_num_threads 1 |
---|
| 455 | + echo "/KMOD_TEST_NONEXISTENT" > /proc/sys/kernel/modprobe |
---|
| 456 | + config_trigger ${FUNCNAME[0]} |
---|
| 457 | + config_expect_result ${FUNCNAME[0]} -ENOENT |
---|
| 458 | + echo "$MODPROBE" > /proc/sys/kernel/modprobe |
---|
| 459 | +} |
---|
| 460 | + |
---|
| 461 | +kmod_test_0011() |
---|
| 462 | +{ |
---|
| 463 | + kmod_defaults_driver |
---|
| 464 | + config_num_threads 1 |
---|
| 465 | + # This causes the kernel to not even try executing modprobe. The error |
---|
| 466 | + # code is still -ENOENT like when modprobe doesn't exist, so we can't |
---|
| 467 | + # easily test for the exact difference. But this still is a useful test |
---|
| 468 | + # since there was a bug where request_module() returned 0 in this case. |
---|
| 469 | + echo > /proc/sys/kernel/modprobe |
---|
| 470 | + config_trigger ${FUNCNAME[0]} |
---|
| 471 | + config_expect_result ${FUNCNAME[0]} -ENOENT |
---|
| 472 | + echo "$MODPROBE" > /proc/sys/kernel/modprobe |
---|
| 473 | +} |
---|
| 474 | + |
---|
| 475 | +kmod_check_visibility() |
---|
| 476 | +{ |
---|
| 477 | + local name="$1" |
---|
| 478 | + local cmd="$2" |
---|
| 479 | + |
---|
| 480 | + modprobe $DEFAULT_KMOD_DRIVER |
---|
| 481 | + |
---|
| 482 | + local priv=$(eval $cmd) |
---|
| 483 | + local unpriv=$(capsh --drop=CAP_SYSLOG -- -c "$cmd") |
---|
| 484 | + |
---|
| 485 | + if [ "$priv" = "$unpriv" ] || \ |
---|
| 486 | + [ "${priv:0:3}" = "0x0" ] || \ |
---|
| 487 | + [ "${unpriv:0:3}" != "0x0" ] ; then |
---|
| 488 | + echo "${FUNCNAME[0]}: FAIL, $name visible to unpriv: '$priv' vs '$unpriv'" >&2 |
---|
| 489 | + exit 1 |
---|
| 490 | + else |
---|
| 491 | + echo "${FUNCNAME[0]}: OK!" |
---|
| 492 | + fi |
---|
| 493 | +} |
---|
| 494 | + |
---|
| 495 | +kmod_test_0012() |
---|
| 496 | +{ |
---|
| 497 | + kmod_check_visibility /proc/modules \ |
---|
| 498 | + "grep '^${DEFAULT_KMOD_DRIVER}\b' /proc/modules | awk '{print \$NF}'" |
---|
| 499 | +} |
---|
| 500 | + |
---|
| 501 | +kmod_test_0013() |
---|
| 502 | +{ |
---|
| 503 | + kmod_check_visibility '/sys/module/*/sections/*' \ |
---|
| 504 | + "cat /sys/module/${DEFAULT_KMOD_DRIVER}/sections/.*text | head -n1" |
---|
| 505 | +} |
---|
| 506 | + |
---|
446 | 507 | list_tests() |
---|
447 | 508 | { |
---|
448 | 509 | echo "Test ID list:" |
---|
.. | .. |
---|
460 | 521 | echo "0007 x $(get_test_count 0007) - multithreaded tests with default setup test request_module() and get_fs_type()" |
---|
461 | 522 | echo "0008 x $(get_test_count 0008) - multithreaded - push kmod_concurrent over max_modprobes for request_module()" |
---|
462 | 523 | echo "0009 x $(get_test_count 0009) - multithreaded - push kmod_concurrent over max_modprobes for get_fs_type()" |
---|
| 524 | + echo "0010 x $(get_test_count 0010) - test nonexistent modprobe path" |
---|
| 525 | + echo "0011 x $(get_test_count 0011) - test completely disabling module autoloading" |
---|
| 526 | + echo "0012 x $(get_test_count 0012) - test /proc/modules address visibility under CAP_SYSLOG" |
---|
| 527 | + echo "0013 x $(get_test_count 0013) - test /sys/module/*/sections/* visibility under CAP_SYSLOG" |
---|
463 | 528 | } |
---|
464 | 529 | |
---|
465 | 530 | usage() |
---|
.. | .. |
---|
488 | 553 | echo Example uses: |
---|
489 | 554 | echo |
---|
490 | 555 | echo "${TEST_NAME}.sh -- executes all tests" |
---|
491 | | - echo "${TEST_NAME}.sh -t 0008 -- Executes test ID 0008 number of times is recomended" |
---|
| 556 | + echo "${TEST_NAME}.sh -t 0008 -- Executes test ID 0008 number of times is recommended" |
---|
492 | 557 | echo "${TEST_NAME}.sh -w 0008 -- Watch test ID 0008 run until an error occurs" |
---|
493 | 558 | echo "${TEST_NAME}.sh -s 0008 -- Run test ID 0008 once" |
---|
494 | 559 | echo "${TEST_NAME}.sh -c 0008 3 -- Run test ID 0008 three times" |
---|
.. | .. |
---|
616 | 681 | allow_user_defaults |
---|
617 | 682 | load_req_mod |
---|
618 | 683 | |
---|
| 684 | +MODPROBE=$(</proc/sys/kernel/modprobe) |
---|
619 | 685 | trap "test_finish" EXIT |
---|
620 | 686 | |
---|
621 | 687 | parse_args $@ |
---|