[PATCH 02/20] device property: Fix reading pset strings using array access functions

Sakari Ailus
2017-02-23T17:08:33Z

The length field value of non-array string properties is the length of the
string itself. Non-array string properties thus require specific handling.
Fix this.

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
---
drivers/base/property.c | 28 +++++++++++++++++++++-------
1 file changed, 21 insertions(+), 7 deletions(-)

diff --git a/drivers/base/property.c b/drivers/base/property.c
index 04c2174..e42dc93 100644
--- a/drivers/base/property.c
+++ b/drivers/base/property.c
@@ -547,13 +547,27 @@ static int __fwnode_property_read_string_array(struct fwnode_handle *fwnode,
else if (is_acpi_node(fwnode))
return acpi_node_prop_read(fwnode, propname, DEV_PROP_STRING,
val, nval);
- else if (is_pset_node(fwnode))
- return val ?
- pset_prop_read_string_array(to_pset_node(fwnode),
- propname, val, nval) :
- pset_prop_count_elems_of_size(to_pset_node(fwnode),
- propname,
- sizeof(const char *));
+ else if (is_pset_node(fwnode)) {
+ struct property_set *node = to_pset_node(fwnode);
+ struct property_entry *prop;
+
+ /* Read properties if val is non-NULL */
+ if (val)
+ return pset_prop_read_string_array(node, propname,
+ val, nval);
+
+ prop = pset_prop_get(node, propname);
+ if (!prop)
+ return -EINVAL;
+
+ /* The array length for a non-array string property is 1. */
+ if (!prop->is_array)
+ return 1;
+
+ /* Return the length of an array. */
+ return pset_prop_count_elems_of_size(node, propname,
+ sizeof(const char *));
+ }
return -ENXIO;
}

--
2.7.4