OSDN Git Service

platform/x86: dell-ddv: Return error if buffer is empty
authorArmin Wolf <W_Armin@gmx.de>
Thu, 26 Jan 2023 19:40:18 +0000 (20:40 +0100)
committerHans de Goede <hdegoede@redhat.com>
Fri, 3 Feb 2023 09:01:50 +0000 (10:01 +0100)
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>
drivers/platform/x86/dell/dell-wmi-ddv.c

index 9cb6ae4..f99c4cb 100644 (file)
@@ -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>
@@ -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;
        }
@@ -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,