test_firmware: Test platform fw loading on non-EFI systems

On non-EFI systems, it wasn't possible to test the platform firmware
loader because it will have never set "checked_fw" during __init.
Instead, allow the test code to override this check. Additionally split
the declarations into a private header file so it there is greater
enforcement of the symbol visibility.

Fixes: 548193cba2 ("test_firmware: add support for firmware_request_platform")
Cc: stable@vger.kernel.org
Acked-by: Scott Branden <scott.branden@broadcom.com>
Signed-off-by: Kees Cook <keescook@chromium.org>
Link: https://lore.kernel.org/r/20200724213640.389191-2-keescook@chromium.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Kees Cook
2020-07-24 14:36:22 -07:00
committed by Greg Kroah-Hartman
parent 90b109d50d
commit 2d38dbf89a
4 changed files with 41 additions and 19 deletions

View File

@@ -14,11 +14,22 @@
#include <linux/vmalloc.h>
#include <crypto/sha.h>
/* Exported for use by lib/test_firmware.c only */
LIST_HEAD(efi_embedded_fw_list);
EXPORT_SYMBOL_GPL(efi_embedded_fw_list);
#include "embedded-firmware.h"
static bool checked_for_fw;
#ifdef CONFIG_TEST_FIRMWARE
# define EFI_EMBEDDED_FW_VISIBILITY
#else
# define EFI_EMBEDDED_FW_VISIBILITY static
#endif
EFI_EMBEDDED_FW_VISIBILITY LIST_HEAD(efi_embedded_fw_list);
EFI_EMBEDDED_FW_VISIBILITY bool efi_embedded_fw_checked;
/* Exported for use by lib/test_firmware.c only */
#ifdef CONFIG_TEST_FIRMWARE
EXPORT_SYMBOL_GPL(efi_embedded_fw_list);
EXPORT_SYMBOL_GPL(efi_embedded_fw_checked);
#endif
static const struct dmi_system_id * const embedded_fw_table[] = {
#ifdef CONFIG_TOUCHSCREEN_DMI
@@ -119,14 +130,14 @@ void __init efi_check_for_embedded_firmwares(void)
}
}
checked_for_fw = true;
efi_embedded_fw_checked = true;
}
int efi_get_embedded_fw(const char *name, const u8 **data, size_t *size)
{
struct efi_embedded_fw *iter, *fw = NULL;
if (!checked_for_fw) {
if (!efi_embedded_fw_checked) {
pr_warn("Warning %s called while we did not check for embedded fw\n",
__func__);
return -ENOENT;