]> git.ipfire.org Git - thirdparty/linux.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)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Wed, 5 Feb 2025 20:09:28 +0000 (21:09 +0100)
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>
drivers/acpi/property.c

index 98d93ed5831504b10f8de99c943bd88ae626f7d5..436019d96027bd3bfdcdc49fb82dfb8629df1659 100644 (file)
@@ -1187,8 +1187,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)
@@ -1212,9 +1210,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;