Re: [PATCH v2 11/11] test_firmware: test three firmware kernel configs using a proc knob

From: Kees Cook
Date: Tue Feb 27 2018 - 18:18:22 EST


On Fri, Feb 23, 2018 at 6:46 PM, Luis R. Rodriguez <mcgrof@xxxxxxxxxx> wrote:
> Since we now have knobs to twiddle what used to be set on kernel
> configurations we can build one base kernel configuration and modify
> behaviour to mimic such kernel configurations to test them.
>
> Provided you build a kernel with:
>
> CONFIG_TEST_FIRMWARE=y
> CONFIG_FW_LOADER=y
> CONFIG_FW_LOADER_USER_HELPER=y
> CONFIG_IKCONFIG=y
> CONFIG_IKCONFIG_PROC=y
>
> We should now be able test all possible kernel configurations
> when FW_LOADER=y. Note that when FW_LOADER=m we just don't provide
> the built-in functionality of the built-in firmware.
>
> If you're on an old kernel and either don't have /proc/config.gz
> (CONFIG_IKCONFIG_PROC) or haven't enabled CONFIG_FW_LOADER_USER_HELPER
> we cannot run these dynamic tests, so just run both scripts just
> as we used to before making blunt assumptions about your setup
> and requirements exactly as we did before.
>
> Signed-off-by: Luis R. Rodriguez <mcgrof@xxxxxxxxxx>

Cool. Nice to have it all in one test build now. :)

Acked-by: Kees Cook <keescook@xxxxxxxxxxxx>

-Kees

> ---
> tools/testing/selftests/firmware/Makefile | 2 +-
> tools/testing/selftests/firmware/fw_lib.sh | 53 +++++++++++++++++++
> tools/testing/selftests/firmware/fw_run_tests.sh | 67 ++++++++++++++++++++++++
> 3 files changed, 121 insertions(+), 1 deletion(-)
> create mode 100755 tools/testing/selftests/firmware/fw_run_tests.sh
>
> diff --git a/tools/testing/selftests/firmware/Makefile b/tools/testing/selftests/firmware/Makefile
> index 1894d625af2d..826f38d5dd19 100644
> --- a/tools/testing/selftests/firmware/Makefile
> +++ b/tools/testing/selftests/firmware/Makefile
> @@ -3,7 +3,7 @@
> # No binaries, but make sure arg-less "make" doesn't trigger "run_tests"
> all:
>
> -TEST_PROGS := fw_filesystem.sh fw_fallback.sh
> +TEST_PROGS := fw_run_tests.sh
>
> include ../lib.mk
>
> diff --git a/tools/testing/selftests/firmware/fw_lib.sh b/tools/testing/selftests/firmware/fw_lib.sh
> index 0702dbf0f06b..3362a2aac40e 100755
> --- a/tools/testing/selftests/firmware/fw_lib.sh
> +++ b/tools/testing/selftests/firmware/fw_lib.sh
> @@ -47,6 +47,34 @@ check_setup()
> {
> HAS_FW_LOADER_USER_HELPER=$(kconfig_has CONFIG_FW_LOADER_USER_HELPER=y)
> HAS_FW_LOADER_USER_HELPER_FALLBACK=$(kconfig_has CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y)
> + PROC_FW_IGNORE_SYSFS_FALLBACK="N"
> + PROC_FW_FORCE_SYSFS_FALLBACK="N"
> +
> + if [ -z $PROC_SYS_DIR ]; then
> + PROC_SYS_DIR="/proc/sys/kernel"
> + fi
> +
> + FW_PROC="${PROC_SYS_DIR}/firmware_config"
> + FW_FORCE_SYSFS_FALLBACK="$FW_PROC/force_sysfs_fallback"
> + FW_IGNORE_SYSFS_FALLBACK="$FW_PROC/ignore_sysfs_fallback"
> +
> + if [ -f $FW_FORCE_SYSFS_FALLBACK ]; then
> + PROC_FW_FORCE_SYSFS_FALLBACK=$(cat $FW_FORCE_SYSFS_FALLBACK)
> + fi
> +
> + if [ -f $FW_IGNORE_SYSFS_FALLBACK ]; then
> + PROC_FW_IGNORE_SYSFS_FALLBACK=$(cat $FW_IGNORE_SYSFS_FALLBACK)
> + fi
> +
> + if [ "$PROC_FW_IGNORE_SYSFS_FALLBACK" = "1" ]; then
> + HAS_FW_LOADER_USER_HELPER_FALLBACK="no"
> + HAS_FW_LOADER_USER_HELPER="no"
> + fi
> +
> + if [ "$PROC_FW_FORCE_SYSFS_FALLBACK" = "1" ]; then
> + HAS_FW_LOADER_USER_HELPER="yes"
> + HAS_FW_LOADER_USER_HELPER_FALLBACK="yes"
> + fi
>
> if [ "$HAS_FW_LOADER_USER_HELPER" = "yes" ]; then
> OLD_TIMEOUT=$(cat /sys/class/firmware/timeout)
> @@ -76,6 +104,30 @@ setup_tmp_file()
> fi
> }
>
> +proc_set_force_sysfs_fallback()
> +{
> + if [ -f $FW_FORCE_SYSFS_FALLBACK ]; then
> + echo -n $1 > $FW_FORCE_SYSFS_FALLBACK
> + PROC_FW_FORCE_SYSFS_FALLBACK=$(cat $FW_FORCE_SYSFS_FALLBACK)
> + check_setup
> + fi
> +}
> +
> +proc_set_ignore_sysfs_fallback()
> +{
> + if [ -f $FW_IGNORE_SYSFS_FALLBACK ]; then
> + echo -n $1 > $FW_IGNORE_SYSFS_FALLBACK
> + PROC_FW_IGNORE_SYSFS_FALLBACK=$(cat $FW_IGNORE_SYSFS_FALLBACK)
> + check_setup
> + fi
> +}
> +
> +proc_restore_defaults()
> +{
> + proc_set_force_sysfs_fallback 0
> + proc_set_ignore_sysfs_fallback 0
> +}
> +
> test_finish()
> {
> if [ "$HAS_FW_LOADER_USER_HELPER" = "yes" ]; then
> @@ -93,6 +145,7 @@ test_finish()
> if [ -d $FWPATH ]; then
> rm -rf "$FWPATH"
> fi
> + proc_restore_defaults
> }
>
> kconfig_has()
> diff --git a/tools/testing/selftests/firmware/fw_run_tests.sh b/tools/testing/selftests/firmware/fw_run_tests.sh
> new file mode 100755
> index 000000000000..a12b5809ad8b
> --- /dev/null
> +++ b/tools/testing/selftests/firmware/fw_run_tests.sh
> @@ -0,0 +1,67 @@
> +#!/bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +
> +# This runs all known tests across all known possible configurations we could
> +# emulate in one run.
> +
> +set -e
> +
> +TEST_DIR=$(dirname $0)
> +source $TEST_DIR/fw_lib.sh
> +
> +run_tests()
> +{
> + $TEST_DIR/fw_filesystem.sh
> + $TEST_DIR/fw_fallback.sh
> +}
> +
> +run_test_config_0001()
> +{
> + echo "-----------------------------------------------------"
> + echo "Running kernel configuration test 1 -- rare"
> + echo "Emulates:"
> + echo "CONFIG_FW_LOADER=y"
> + echo "CONFIG_FW_LOADER_USER_HELPER=n"
> + echo "CONFIG_FW_LOADER_USER_HELPER_FALLBACK=n"
> + proc_set_force_sysfs_fallback 0
> + proc_set_ignore_sysfs_fallback 1
> + run_tests
> +}
> +
> +run_test_config_0002()
> +{
> + echo "-----------------------------------------------------"
> + echo "Running kernel configuration test 2 -- distro"
> + echo "Emulates:"
> + echo "CONFIG_FW_LOADER=y"
> + echo "CONFIG_FW_LOADER_USER_HELPER=y"
> + echo "CONFIG_FW_LOADER_USER_HELPER_FALLBACK=n"
> + proc_set_force_sysfs_fallback 0
> + proc_set_ignore_sysfs_fallback 0
> + run_tests
> +}
> +
> +run_test_config_0003()
> +{
> + echo "-----------------------------------------------------"
> + echo "Running kernel configuration test 3 -- android"
> + echo "Emulates:"
> + echo "CONFIG_FW_LOADER=y"
> + echo "CONFIG_FW_LOADER_USER_HELPER=y"
> + echo "CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y"
> + proc_set_force_sysfs_fallback 1
> + proc_set_ignore_sysfs_fallback 0
> + run_tests
> +}
> +
> +check_mods
> +check_setup
> +
> +if [ -f $FW_FORCE_SYSFS_FALLBACK ]; then
> + run_test_config_0001
> + run_test_config_0002
> + run_test_config_0003
> +else
> + echo "Running basic kernel configuration, working with your config"
> + run_test
> +fi
> --
> 2.16.2
>



--
Kees Cook
Pixel Security