Skip to content

Commit a814d2f

Browse files
committed
Merge: CVE-2025-38412: platform/x86: dell-wmi-sysman: Fix WMI data block retrieval in sysfs callbacks
MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-10/-/merge_requests/1275 JIRA: https://issues.redhat.com/browse/RHEL-106717 CVE: CVE-2025-38412 ``` commit eb617dd Author: Kurt Borja <kuurtb@gmail.com> Date: Mon Jun 30 00:43:12 2025 -0300 platform/x86: dell-wmi-sysman: Fix WMI data block retrieval in sysfs callbacks After retrieving WMI data blocks in sysfs callbacks, check for the validity of them before dereferencing their content. Reported-by: Jan Graczyk <jangraczyk@yahoo.ca> Closes: https://lore.kernel.org/r/CAHk-=wgMiSKXf7SvQrfEnxVtmT=QVQPjJdNjfm3aXS7wc=rzTw@mail.gmail.com/ Fixes: e8a60aa ("platform/x86: Introduce support for Systems Management Driver over WMI for Dell Systems") Suggested-by: Linus Torvalds <torvalds@linux-foundation.org> Reviewed-by: Armin Wolf <W_Armin@gmx.de> Signed-off-by: Kurt Borja <kuurtb@gmail.com> Link: https://lore.kernel.org/r/20250630-sysman-fix-v2-1-d185674d0a30@gmail.com Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> ``` Signed-off-by: CKI Backport Bot <cki-ci-bot+cki-gitlab-backport-bot@redhat.com> --- <small>Created 2025-07-31 09:57 UTC by backporter - [KWF FAQ](https://red.ht/kernel_workflow_doc) - [Slack #team-kernel-workflow](https://redhat-internal.slack.com/archives/C04LRUPMJQ5) - [Source](https://gitlab.com/cki-project/kernel-workflow/-/blob/main/webhook/utils/backporter.py) - [Documentation](https://gitlab.com/cki-project/kernel-workflow/-/blob/main/docs/README.backporter.md) - [Report an issue](https://issues.redhat.com/secure/CreateIssueDetails!init.jspa?pid=12334433&issuetype=1&priority=4&summary=backporter+webhook+issue&components=kernel-workflow+/+backporter)</small> Approved-by: Steve Best <sbest@redhat.com> Approved-by: Tony Camuso <tcamuso@redhat.com> Approved-by: CKI KWF Bot <cki-ci-bot+kwf-gitlab-com@redhat.com> Merged-by: Julio Faracco <jfaracco@redhat.com>
2 parents b9c1de8 + eb9a3db commit a814d2f

File tree

6 files changed

+21
-12
lines changed

6 files changed

+21
-12
lines changed

drivers/platform/x86/dell/dell-wmi-sysman/dell-wmi-sysman.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,11 @@ extern struct wmi_sysman_priv wmi_priv;
8989

9090
enum { ENUM, INT, STR, PO };
9191

92+
#define ENUM_MIN_ELEMENTS 8
93+
#define INT_MIN_ELEMENTS 9
94+
#define STR_MIN_ELEMENTS 8
95+
#define PO_MIN_ELEMENTS 4
96+
9297
enum {
9398
ATTR_NAME,
9499
DISPL_NAME_LANG_CODE,

drivers/platform/x86/dell/dell-wmi-sysman/enum-attributes.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,10 @@ static ssize_t current_value_show(struct kobject *kobj, struct kobj_attribute *a
2323
obj = get_wmiobj_pointer(instance_id, DELL_WMI_BIOS_ENUMERATION_ATTRIBUTE_GUID);
2424
if (!obj)
2525
return -EIO;
26-
if (obj->package.elements[CURRENT_VAL].type != ACPI_TYPE_STRING) {
26+
if (obj->type != ACPI_TYPE_PACKAGE || obj->package.count < ENUM_MIN_ELEMENTS ||
27+
obj->package.elements[CURRENT_VAL].type != ACPI_TYPE_STRING) {
2728
kfree(obj);
28-
return -EINVAL;
29+
return -EIO;
2930
}
3031
ret = snprintf(buf, PAGE_SIZE, "%s\n", obj->package.elements[CURRENT_VAL].string.pointer);
3132
kfree(obj);

drivers/platform/x86/dell/dell-wmi-sysman/int-attributes.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,10 @@ static ssize_t current_value_show(struct kobject *kobj, struct kobj_attribute *a
2525
obj = get_wmiobj_pointer(instance_id, DELL_WMI_BIOS_INTEGER_ATTRIBUTE_GUID);
2626
if (!obj)
2727
return -EIO;
28-
if (obj->package.elements[CURRENT_VAL].type != ACPI_TYPE_INTEGER) {
28+
if (obj->type != ACPI_TYPE_PACKAGE || obj->package.count < INT_MIN_ELEMENTS ||
29+
obj->package.elements[CURRENT_VAL].type != ACPI_TYPE_INTEGER) {
2930
kfree(obj);
30-
return -EINVAL;
31+
return -EIO;
3132
}
3233
ret = snprintf(buf, PAGE_SIZE, "%lld\n", obj->package.elements[CURRENT_VAL].integer.value);
3334
kfree(obj);

drivers/platform/x86/dell/dell-wmi-sysman/passobj-attributes.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,10 @@ static ssize_t is_enabled_show(struct kobject *kobj, struct kobj_attribute *attr
2626
obj = get_wmiobj_pointer(instance_id, DELL_WMI_BIOS_PASSOBJ_ATTRIBUTE_GUID);
2727
if (!obj)
2828
return -EIO;
29-
if (obj->package.elements[IS_PASS_SET].type != ACPI_TYPE_INTEGER) {
29+
if (obj->type != ACPI_TYPE_PACKAGE || obj->package.count < PO_MIN_ELEMENTS ||
30+
obj->package.elements[IS_PASS_SET].type != ACPI_TYPE_INTEGER) {
3031
kfree(obj);
31-
return -EINVAL;
32+
return -EIO;
3233
}
3334
ret = snprintf(buf, PAGE_SIZE, "%lld\n", obj->package.elements[IS_PASS_SET].integer.value);
3435
kfree(obj);

drivers/platform/x86/dell/dell-wmi-sysman/string-attributes.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,10 @@ static ssize_t current_value_show(struct kobject *kobj, struct kobj_attribute *a
2525
obj = get_wmiobj_pointer(instance_id, DELL_WMI_BIOS_STRING_ATTRIBUTE_GUID);
2626
if (!obj)
2727
return -EIO;
28-
if (obj->package.elements[CURRENT_VAL].type != ACPI_TYPE_STRING) {
28+
if (obj->type != ACPI_TYPE_PACKAGE || obj->package.count < STR_MIN_ELEMENTS ||
29+
obj->package.elements[CURRENT_VAL].type != ACPI_TYPE_STRING) {
2930
kfree(obj);
30-
return -EINVAL;
31+
return -EIO;
3132
}
3233
ret = snprintf(buf, PAGE_SIZE, "%s\n", obj->package.elements[CURRENT_VAL].string.pointer);
3334
kfree(obj);

drivers/platform/x86/dell/dell-wmi-sysman/sysman.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -408,10 +408,10 @@ static int init_bios_attributes(int attr_type, const char *guid)
408408
return retval;
409409

410410
switch (attr_type) {
411-
case ENUM: min_elements = 8; break;
412-
case INT: min_elements = 9; break;
413-
case STR: min_elements = 8; break;
414-
case PO: min_elements = 4; break;
411+
case ENUM: min_elements = ENUM_MIN_ELEMENTS; break;
412+
case INT: min_elements = INT_MIN_ELEMENTS; break;
413+
case STR: min_elements = STR_MIN_ELEMENTS; break;
414+
case PO: min_elements = PO_MIN_ELEMENTS; break;
415415
default:
416416
pr_err("Error: Unknown attr_type: %d\n", attr_type);
417417
return -EINVAL;

0 commit comments

Comments
 (0)