]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ACPI: property: Fix return value for nval == 0 in acpi_data_prop_read()
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Mon, 3 Feb 2025 19:46:29 +0000 (21:46 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 21 Feb 2025 12:49:37 +0000 (13:49 +0100)
[ Upstream commit ab930483eca9f3e816c35824b5868599af0c61d7 ]

While analysing code for software and OF node for the corner case when
caller asks to read zero items in the supposed to be an array of values
I found that ACPI behaves differently to what OF does, i.e.

 1. It returns -EINVAL when caller asks to read zero items from integer
    array, while OF returns 0, if no other errors happened.

 2. It returns -EINVAL when caller asks to read zero items from string
    array, while OF returns -ENODATA, if no other errors happened.

Amend ACPI implementation to follow what OF does.

Fixes: b31384fa5de3 ("Driver core: Unified device properties interface for platform firmware")
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Link: https://patch.msgid.link/20250203194629.3731895-1-andriy.shevchenko@linux.intel.com
[ rjw: Added empty line after a conditional ]
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/acpi/property.c

index 62aee900af3df2bd4a3f7e1485c9882ebef3f45a..f8a56aae97a5aca39c50cd6c4a4effd02a503078 100644 (file)
@@ -1128,8 +1128,6 @@ static int acpi_data_prop_read(const struct acpi_device_data *data,
                }
                break;
        }
-       if (nval == 0)
-               return -EINVAL;
 
        if (obj->type == ACPI_TYPE_BUFFER) {
                if (proptype != DEV_PROP_U8)
@@ -1153,9 +1151,11 @@ static int acpi_data_prop_read(const struct acpi_device_data *data,
                ret = acpi_copy_property_array_uint(items, (u64 *)val, nval);
                break;
        case DEV_PROP_STRING:
-               ret = acpi_copy_property_array_string(
-                       items, (char **)val,
-                       min_t(u32, nval, obj->package.count));
+               nval = min_t(u32, nval, obj->package.count);
+               if (nval == 0)
+                       return -ENODATA;
+
+               ret = acpi_copy_property_array_string(items, (char **)val, nval);
                break;
        default:
                ret = -EINVAL;