Commit baaabecf authored by Kees Cook's avatar Kees Cook Committed by Greg Kroah-Hartman

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 symbol namespace so there is greater
enforcement of the symbol visibility.

Fixes: 548193cb ("test_firmware: add support for firmware_request_platform")
Cc: stable@vger.kernel.org
Signed-off-by: default avatarKees Cook <keescook@chromium.org>
Acked-by: default avatarArd Biesheuvel <ardb@kernel.org>
Link: https://lore.kernel.org/r/20200909225354.3118328-1-keescook@chromium.orgSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 1c304748
...@@ -16,9 +16,9 @@ ...@@ -16,9 +16,9 @@
/* Exported for use by lib/test_firmware.c only */ /* Exported for use by lib/test_firmware.c only */
LIST_HEAD(efi_embedded_fw_list); LIST_HEAD(efi_embedded_fw_list);
EXPORT_SYMBOL_GPL(efi_embedded_fw_list); EXPORT_SYMBOL_NS_GPL(efi_embedded_fw_list, TEST_FIRMWARE);
bool efi_embedded_fw_checked;
static bool checked_for_fw; EXPORT_SYMBOL_NS_GPL(efi_embedded_fw_checked, TEST_FIRMWARE);
static const struct dmi_system_id * const embedded_fw_table[] = { static const struct dmi_system_id * const embedded_fw_table[] = {
#ifdef CONFIG_TOUCHSCREEN_DMI #ifdef CONFIG_TOUCHSCREEN_DMI
...@@ -116,14 +116,14 @@ void __init efi_check_for_embedded_firmwares(void) ...@@ -116,14 +116,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) int efi_get_embedded_fw(const char *name, const u8 **data, size_t *size)
{ {
struct efi_embedded_fw *iter, *fw = NULL; 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", pr_warn("Warning %s called while we did not check for embedded fw\n",
__func__); __func__);
return -ENOENT; return -ENOENT;
......
...@@ -8,8 +8,8 @@ ...@@ -8,8 +8,8 @@
#define EFI_EMBEDDED_FW_PREFIX_LEN 8 #define EFI_EMBEDDED_FW_PREFIX_LEN 8
/* /*
* This struct and efi_embedded_fw_list are private to the efi-embedded fw * This struct is private to the efi-embedded fw implementation.
* implementation they are in this header for use by lib/test_firmware.c only! * They are in this header for use by lib/test_firmware.c only!
*/ */
struct efi_embedded_fw { struct efi_embedded_fw {
struct list_head list; struct list_head list;
...@@ -18,8 +18,6 @@ struct efi_embedded_fw { ...@@ -18,8 +18,6 @@ struct efi_embedded_fw {
size_t length; size_t length;
}; };
extern struct list_head efi_embedded_fw_list;
/** /**
* struct efi_embedded_fw_desc - This struct is used by the EFI embedded-fw * struct efi_embedded_fw_desc - This struct is used by the EFI embedded-fw
* code to search for embedded firmwares. * code to search for embedded firmwares.
......
...@@ -26,6 +26,8 @@ ...@@ -26,6 +26,8 @@
#include <linux/vmalloc.h> #include <linux/vmalloc.h>
#include <linux/efi_embedded_fw.h> #include <linux/efi_embedded_fw.h>
MODULE_IMPORT_NS(TEST_FIRMWARE);
#define TEST_FIRMWARE_NAME "test-firmware.bin" #define TEST_FIRMWARE_NAME "test-firmware.bin"
#define TEST_FIRMWARE_NUM_REQS 4 #define TEST_FIRMWARE_NUM_REQS 4
#define TEST_FIRMWARE_BUF_SIZE SZ_1K #define TEST_FIRMWARE_BUF_SIZE SZ_1K
...@@ -489,6 +491,9 @@ static ssize_t trigger_request_store(struct device *dev, ...@@ -489,6 +491,9 @@ static ssize_t trigger_request_store(struct device *dev,
static DEVICE_ATTR_WO(trigger_request); static DEVICE_ATTR_WO(trigger_request);
#ifdef CONFIG_EFI_EMBEDDED_FIRMWARE #ifdef CONFIG_EFI_EMBEDDED_FIRMWARE
extern struct list_head efi_embedded_fw_list;
extern bool efi_embedded_fw_checked;
static ssize_t trigger_request_platform_store(struct device *dev, static ssize_t trigger_request_platform_store(struct device *dev,
struct device_attribute *attr, struct device_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
...@@ -501,6 +506,7 @@ static ssize_t trigger_request_platform_store(struct device *dev, ...@@ -501,6 +506,7 @@ static ssize_t trigger_request_platform_store(struct device *dev,
}; };
struct efi_embedded_fw efi_embedded_fw; struct efi_embedded_fw efi_embedded_fw;
const struct firmware *firmware = NULL; const struct firmware *firmware = NULL;
bool saved_efi_embedded_fw_checked;
char *name; char *name;
int rc; int rc;
...@@ -513,6 +519,8 @@ static ssize_t trigger_request_platform_store(struct device *dev, ...@@ -513,6 +519,8 @@ static ssize_t trigger_request_platform_store(struct device *dev,
efi_embedded_fw.data = (void *)test_data; efi_embedded_fw.data = (void *)test_data;
efi_embedded_fw.length = sizeof(test_data); efi_embedded_fw.length = sizeof(test_data);
list_add(&efi_embedded_fw.list, &efi_embedded_fw_list); list_add(&efi_embedded_fw.list, &efi_embedded_fw_list);
saved_efi_embedded_fw_checked = efi_embedded_fw_checked;
efi_embedded_fw_checked = true;
pr_info("loading '%s'\n", name); pr_info("loading '%s'\n", name);
rc = firmware_request_platform(&firmware, name, dev); rc = firmware_request_platform(&firmware, name, dev);
...@@ -530,6 +538,7 @@ static ssize_t trigger_request_platform_store(struct device *dev, ...@@ -530,6 +538,7 @@ static ssize_t trigger_request_platform_store(struct device *dev,
rc = count; rc = count;
out: out:
efi_embedded_fw_checked = saved_efi_embedded_fw_checked;
release_firmware(firmware); release_firmware(firmware);
list_del(&efi_embedded_fw.list); list_del(&efi_embedded_fw.list);
kfree(name); kfree(name);
......
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