mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 01:32:21 +02:00
modpost: Handle malformed WMI GUID strings
Some WMI GUIDs found inside binary MOF files contain both uppercase and lowercase characters. Blindly copying such GUIDs will prevent the associated WMI driver from loading automatically because the WMI GUID found inside WMI device ids always contains uppercase characters. Avoid this issue by always converting WMI GUID strings to uppercase. Also verify that the WMI GUID string actually looks like a valid GUID. Signed-off-by: Armin Wolf <W_Armin@gmx.de> Reviewed-by: Mario Limonciello <mario.limonciello@amd.com> Link: https://patch.msgid.link/20260610203453.816254-10-W_Armin@gmx.de Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
This commit is contained in:
parent
c3cbac4be0
commit
3429ae7b2f
|
|
@ -54,7 +54,7 @@ to matching WMI devices using a struct wmi_device_id table:
|
|||
::
|
||||
|
||||
static const struct wmi_device_id foo_id_table[] = {
|
||||
/* Only use uppercase letters! */
|
||||
/* Using only uppercase letters is recommended */
|
||||
{ "936DA01F-9ABD-4D9D-80C7-02AF85C822A8", NULL },
|
||||
{ }
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1253,6 +1253,8 @@ static void do_tee_entry(struct module *mod, void *symval)
|
|||
static void do_wmi_entry(struct module *mod, void *symval)
|
||||
{
|
||||
DEF_FIELD_ADDR(symval, wmi_device_id, guid_string);
|
||||
char result[sizeof(*guid_string)];
|
||||
int i;
|
||||
|
||||
if (strlen(*guid_string) != UUID_STRING_LEN) {
|
||||
warn("Invalid WMI device id 'wmi:%s' in '%s'\n",
|
||||
|
|
@ -1260,7 +1262,31 @@ static void do_wmi_entry(struct module *mod, void *symval)
|
|||
return;
|
||||
}
|
||||
|
||||
module_alias_printf(mod, false, WMI_MODULE_PREFIX "%s", *guid_string);
|
||||
for (i = 0; i < UUID_STRING_LEN; i++) {
|
||||
char value = (*guid_string)[i];
|
||||
bool valid = false;
|
||||
|
||||
if (i == 8 || i == 13 || i == 18 || i == 23) {
|
||||
if (value == '-')
|
||||
valid = true;
|
||||
} else {
|
||||
if (isxdigit(value))
|
||||
valid = true;
|
||||
}
|
||||
|
||||
if (!valid) {
|
||||
warn("Invalid character %c inside WMI GUID string '%s' in '%s'\n",
|
||||
value, *guid_string, mod->name);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Some GUIDs from BMOF definitions contain lowercase characters */
|
||||
result[i] = toupper(value);
|
||||
}
|
||||
|
||||
result[i] = '\0';
|
||||
|
||||
module_alias_printf(mod, false, WMI_MODULE_PREFIX "%s", result);
|
||||
}
|
||||
|
||||
/* Looks like: mhi:S */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user