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>
---
.../wmi/driver-development-guide.rst | 2 +-
scripts/mod/file2alias.c | 28 ++++++++++++++++++-
2 files changed, 28 insertions(+), 2 deletions(-)
diff --git a/Documentation/wmi/driver-development-guide.rst b/Documentation/wmi/driver-development-guide.rst
index fbc2d9b12fe9..74bb156ad9cc 100644
--- a/Documentation/wmi/driver-development-guide.rst
+++ b/Documentation/wmi/driver-development-guide.rst
@@ -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 },
{ }
};
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c
index 4e99393a35f1..20e542a888c4 100644
--- a/scripts/mod/file2alias.c
+++ b/scripts/mod/file2alias.c
@@ -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 */
--
2.39.5
On 3/7/2026 6:25 PM, Armin Wolf wrote:
> 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>
> ---
> .../wmi/driver-development-guide.rst | 2 +-
> scripts/mod/file2alias.c | 28 ++++++++++++++++++-
> 2 files changed, 28 insertions(+), 2 deletions(-)
>
> diff --git a/Documentation/wmi/driver-development-guide.rst b/Documentation/wmi/driver-development-guide.rst
> index fbc2d9b12fe9..74bb156ad9cc 100644
> --- a/Documentation/wmi/driver-development-guide.rst
> +++ b/Documentation/wmi/driver-development-guide.rst
> @@ -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 },
> { }
> };
> diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c
> index 4e99393a35f1..20e542a888c4 100644
> --- a/scripts/mod/file2alias.c
> +++ b/scripts/mod/file2alias.c
> @@ -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);
> + }
Minor logic change that could drop the boolean variable in the for loop:
for (i = 0; i < UUID_STRING_LEN; i++) {
char value = (*guid_string)[i];
if (isxdigit(value)) {
result[i] = toupper(value);
continue;
}
if (value == '-' && (i == 8 || i == 13 || i == 18 || i == 23)) {
result[i] = value;
continue;
}
warn("Invalid character %c inside WMI GUID string '%s' in '%s'\n",
value, *guid_string, mod->name);
return;
}
> +
> + result[i] = '\0';
> +
> + module_alias_printf(mod, false, WMI_MODULE_PREFIX "%s", result);
> }
>
> /* Looks like: mhi:S */
Am 09.03.26 um 17:07 schrieb Mario Limonciello:
>
>
> On 3/7/2026 6:25 PM, Armin Wolf wrote:
>> 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>
>> ---
>> .../wmi/driver-development-guide.rst | 2 +-
>> scripts/mod/file2alias.c | 28 ++++++++++++++++++-
>> 2 files changed, 28 insertions(+), 2 deletions(-)
>>
>> diff --git a/Documentation/wmi/driver-development-guide.rst
>> b/Documentation/wmi/driver-development-guide.rst
>> index fbc2d9b12fe9..74bb156ad9cc 100644
>> --- a/Documentation/wmi/driver-development-guide.rst
>> +++ b/Documentation/wmi/driver-development-guide.rst
>> @@ -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 },
>> { }
>> };
>> diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c
>> index 4e99393a35f1..20e542a888c4 100644
>> --- a/scripts/mod/file2alias.c
>> +++ b/scripts/mod/file2alias.c
>> @@ -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);
>> + }
>
> Minor logic change that could drop the boolean variable in the for loop:
>
> for (i = 0; i < UUID_STRING_LEN; i++) {
> char value = (*guid_string)[i];
>
> if (isxdigit(value)) {
> result[i] = toupper(value);
> continue;
> }
This would not catch invalid GUID strings containing only digits.
Thanks,
Armin Wolf
>
> if (value == '-' && (i == 8 || i == 13 || i == 18 || i == 23)) {
> result[i] = value;
> continue;
> }
>
> warn("Invalid character %c inside WMI GUID string '%s' in '%s'\n",
> value, *guid_string, mod->name);
> return;
> }
>
>> +
>> + result[i] = '\0';
>> +
>> + module_alias_printf(mod, false, WMI_MODULE_PREFIX "%s", result);
>> }
>> /* Looks like: mhi:S */
>
>
© 2016 - 2026 Red Hat, Inc.