Message ID | 20230126194021.381092-3-W_Armin@gmx.de (mailing list archive) |
---|---|
State | Handled Elsewhere |
Headers | show |
Series | platform/x86: dell-ddv: Various driver updates | expand |
Hi, On 1/26/23 20:40, Armin Wolf wrote: > 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> Thank you for your patch, I've applied this patch to my review-hans branch: https://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86.git/log/?h=review-hans Note it will show up in my review-hans branch once I've pushed my local branch there, which might take a while. Once I've run some tests on this branch the patches there will be added to the platform-drivers-x86/for-next branch and eventually will be included in the pdx86 pull-request to Linus for the next merge-window. Regards, Hans > --- > drivers/platform/x86/dell/dell-wmi-ddv.c | 17 ++++++++++++----- > 1 file changed, 12 insertions(+), 5 deletions(-) > > diff --git a/drivers/platform/x86/dell/dell-wmi-ddv.c b/drivers/platform/x86/dell/dell-wmi-ddv.c > index 9cb6ae42dbdc..f99c4cb686fd 100644 > --- a/drivers/platform/x86/dell/dell-wmi-ddv.c > +++ b/drivers/platform/x86/dell/dell-wmi-ddv.c > @@ -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, > -- > 2.30.2 >
diff --git a/drivers/platform/x86/dell/dell-wmi-ddv.c b/drivers/platform/x86/dell/dell-wmi-ddv.c index 9cb6ae42dbdc..f99c4cb686fd 100644 --- a/drivers/platform/x86/dell/dell-wmi-ddv.c +++ b/drivers/platform/x86/dell/dell-wmi-ddv.c @@ -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,
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> --- drivers/platform/x86/dell/dell-wmi-ddv.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) -- 2.30.2