Skip to content

Commit baaabec

Browse files
keesgregkh
authored andcommitted
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: 548193c ("test_firmware: add support for firmware_request_platform") Cc: stable@vger.kernel.org Signed-off-by: Kees Cook <keescook@chromium.org> Acked-by: Ard Biesheuvel <ardb@kernel.org> Link: https://lore.kernel.org/r/20200909225354.3118328-1-keescook@chromium.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 1c30474 commit baaabec

File tree

3 files changed

+16
-9
lines changed

3 files changed

+16
-9
lines changed

drivers/firmware/efi/embedded-firmware.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@
1616

1717
/* Exported for use by lib/test_firmware.c only */
1818
LIST_HEAD(efi_embedded_fw_list);
19-
EXPORT_SYMBOL_GPL(efi_embedded_fw_list);
20-
21-
static bool checked_for_fw;
19+
EXPORT_SYMBOL_NS_GPL(efi_embedded_fw_list, TEST_FIRMWARE);
20+
bool efi_embedded_fw_checked;
21+
EXPORT_SYMBOL_NS_GPL(efi_embedded_fw_checked, TEST_FIRMWARE);
2222

2323
static const struct dmi_system_id * const embedded_fw_table[] = {
2424
#ifdef CONFIG_TOUCHSCREEN_DMI
@@ -116,14 +116,14 @@ void __init efi_check_for_embedded_firmwares(void)
116116
}
117117
}
118118

119-
checked_for_fw = true;
119+
efi_embedded_fw_checked = true;
120120
}
121121

122122
int efi_get_embedded_fw(const char *name, const u8 **data, size_t *size)
123123
{
124124
struct efi_embedded_fw *iter, *fw = NULL;
125125

126-
if (!checked_for_fw) {
126+
if (!efi_embedded_fw_checked) {
127127
pr_warn("Warning %s called while we did not check for embedded fw\n",
128128
__func__);
129129
return -ENOENT;

include/linux/efi_embedded_fw.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
#define EFI_EMBEDDED_FW_PREFIX_LEN 8
99

1010
/*
11-
* This struct and efi_embedded_fw_list are private to the efi-embedded fw
12-
* implementation they are in this header for use by lib/test_firmware.c only!
11+
* This struct is private to the efi-embedded fw implementation.
12+
* They are in this header for use by lib/test_firmware.c only!
1313
*/
1414
struct efi_embedded_fw {
1515
struct list_head list;
@@ -18,8 +18,6 @@ struct efi_embedded_fw {
1818
size_t length;
1919
};
2020

21-
extern struct list_head efi_embedded_fw_list;
22-
2321
/**
2422
* struct efi_embedded_fw_desc - This struct is used by the EFI embedded-fw
2523
* code to search for embedded firmwares.

lib/test_firmware.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
#include <linux/vmalloc.h>
2727
#include <linux/efi_embedded_fw.h>
2828

29+
MODULE_IMPORT_NS(TEST_FIRMWARE);
30+
2931
#define TEST_FIRMWARE_NAME "test-firmware.bin"
3032
#define TEST_FIRMWARE_NUM_REQS 4
3133
#define TEST_FIRMWARE_BUF_SIZE SZ_1K
@@ -489,6 +491,9 @@ static ssize_t trigger_request_store(struct device *dev,
489491
static DEVICE_ATTR_WO(trigger_request);
490492

491493
#ifdef CONFIG_EFI_EMBEDDED_FIRMWARE
494+
extern struct list_head efi_embedded_fw_list;
495+
extern bool efi_embedded_fw_checked;
496+
492497
static ssize_t trigger_request_platform_store(struct device *dev,
493498
struct device_attribute *attr,
494499
const char *buf, size_t count)
@@ -501,6 +506,7 @@ static ssize_t trigger_request_platform_store(struct device *dev,
501506
};
502507
struct efi_embedded_fw efi_embedded_fw;
503508
const struct firmware *firmware = NULL;
509+
bool saved_efi_embedded_fw_checked;
504510
char *name;
505511
int rc;
506512

@@ -513,6 +519,8 @@ static ssize_t trigger_request_platform_store(struct device *dev,
513519
efi_embedded_fw.data = (void *)test_data;
514520
efi_embedded_fw.length = sizeof(test_data);
515521
list_add(&efi_embedded_fw.list, &efi_embedded_fw_list);
522+
saved_efi_embedded_fw_checked = efi_embedded_fw_checked;
523+
efi_embedded_fw_checked = true;
516524

517525
pr_info("loading '%s'\n", name);
518526
rc = firmware_request_platform(&firmware, name, dev);
@@ -530,6 +538,7 @@ static ssize_t trigger_request_platform_store(struct device *dev,
530538
rc = count;
531539

532540
out:
541+
efi_embedded_fw_checked = saved_efi_embedded_fw_checked;
533542
release_firmware(firmware);
534543
list_del(&efi_embedded_fw.list);
535544
kfree(name);

0 commit comments

Comments
 (0)