Skip to content

Commit

Permalink
platform/x86: dell-ddv: Return error if buffer is empty
Browse files Browse the repository at this point in the history
[ Upstream commit 36d4482 ]

In several cases, the DDV WMI interface can return buffers
with a length of zero. Return -ENODATA in such a case for
proper error handling. Also replace some -EIO errors with
more specialized ones.

Signed-off-by: Armin Wolf <W_Armin@gmx.de>
Link: https://lore.kernel.org/r/20230126194021.381092-3-W_Armin@gmx.de
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Stable-dep-of: 0331b1b ("platform/x86: dell-ddv: Fix temperature scaling")
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
Wer-Wolf authored and gregkh committed Mar 17, 2023
1 parent d62e03b commit cc9d189
Showing 1 changed file with 12 additions and 5 deletions.
17 changes: 12 additions & 5 deletions drivers/platform/x86/dell/dell-wmi-ddv.c
Expand Up @@ -11,6 +11,7 @@
#include <linux/debugfs.h>
#include <linux/device.h>
#include <linux/dev_printk.h>
#include <linux/errno.h>
#include <linux/kernel.h>
#include <linux/kstrtox.h>
#include <linux/math.h>
Expand Down Expand Up @@ -125,21 +126,27 @@ static int dell_wmi_ddv_query_buffer(struct wmi_device *wdev, enum dell_ddv_meth
if (ret < 0)
return ret;

if (obj->package.count != 2)
goto err_free;
if (obj->package.count != 2 ||
obj->package.elements[0].type != ACPI_TYPE_INTEGER ||
obj->package.elements[1].type != ACPI_TYPE_BUFFER) {
ret = -ENOMSG;

if (obj->package.elements[0].type != ACPI_TYPE_INTEGER)
goto err_free;
}

buffer_size = obj->package.elements[0].integer.value;

if (obj->package.elements[1].type != ACPI_TYPE_BUFFER)
if (!buffer_size) {
ret = -ENODATA;

goto err_free;
}

if (buffer_size > obj->package.elements[1].buffer.length) {
dev_warn(&wdev->dev,
FW_WARN "WMI buffer size (%llu) exceeds ACPI buffer size (%d)\n",
buffer_size, obj->package.elements[1].buffer.length);
ret = -EMSGSIZE;

goto err_free;
}
Expand All @@ -151,7 +158,7 @@ static int dell_wmi_ddv_query_buffer(struct wmi_device *wdev, enum dell_ddv_meth
err_free:
kfree(obj);

return -EIO;
return ret;
}

static int dell_wmi_ddv_query_string(struct wmi_device *wdev, enum dell_ddv_method method,
Expand Down

0 comments on commit cc9d189

Please sign in to comment.