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

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.de


Reviewed-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
parent 3e899fec
Loading
Loading
Loading
Loading
+12 −5
Original line number Diff line number Diff line
@@ -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,