Commit 36d44825 authored by Armin Wolf's avatar Armin Wolf Committed by Hans de Goede

platform/x86: dell-ddv: Return error if buffer is empty

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: default avatarArmin Wolf <W_Armin@gmx.de>
Link: https://lore.kernel.org/r/20230126194021.381092-3-W_Armin@gmx.deReviewed-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
parent 3e899fec
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <linux/debugfs.h> #include <linux/debugfs.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/dev_printk.h> #include <linux/dev_printk.h>
#include <linux/errno.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/kstrtox.h> #include <linux/kstrtox.h>
#include <linux/math.h> #include <linux/math.h>
...@@ -125,21 +126,27 @@ static int dell_wmi_ddv_query_buffer(struct wmi_device *wdev, enum dell_ddv_meth ...@@ -125,21 +126,27 @@ static int dell_wmi_ddv_query_buffer(struct wmi_device *wdev, enum dell_ddv_meth
if (ret < 0) if (ret < 0)
return ret; return ret;
if (obj->package.count != 2) if (obj->package.count != 2 ||
goto err_free; 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; goto err_free;
}
buffer_size = obj->package.elements[0].integer.value; 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; goto err_free;
}
if (buffer_size > obj->package.elements[1].buffer.length) { if (buffer_size > obj->package.elements[1].buffer.length) {
dev_warn(&wdev->dev, dev_warn(&wdev->dev,
FW_WARN "WMI buffer size (%llu) exceeds ACPI buffer size (%d)\n", FW_WARN "WMI buffer size (%llu) exceeds ACPI buffer size (%d)\n",
buffer_size, obj->package.elements[1].buffer.length); buffer_size, obj->package.elements[1].buffer.length);
ret = -EMSGSIZE;
goto err_free; goto err_free;
} }
...@@ -151,7 +158,7 @@ static int dell_wmi_ddv_query_buffer(struct wmi_device *wdev, enum dell_ddv_meth ...@@ -151,7 +158,7 @@ static int dell_wmi_ddv_query_buffer(struct wmi_device *wdev, enum dell_ddv_meth
err_free: err_free:
kfree(obj); kfree(obj);
return -EIO; return ret;
} }
static int dell_wmi_ddv_query_string(struct wmi_device *wdev, enum dell_ddv_method method, static int dell_wmi_ddv_query_string(struct wmi_device *wdev, enum dell_ddv_method method,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment