Explorar o código

device property: the secondary fwnode needs to depend on the primary

This fixes NULL pointer dereference when the primary fwnode handle
does not exist, for example with PCI devices that do not have ACPI
companion.

Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Heikki Krogerus %!s(int64=9) %!d(string=hai) anos
pai
achega
0fb5902f2f
Modificáronse 1 ficheiros con 4 adicións e 4 borrados
  1. 4 4
      drivers/base/property.c

+ 4 - 4
drivers/base/property.c

@@ -218,7 +218,7 @@ bool fwnode_property_present(struct fwnode_handle *fwnode, const char *propname)
 	bool ret;
 	bool ret;
 
 
 	ret = __fwnode_property_present(fwnode, propname);
 	ret = __fwnode_property_present(fwnode, propname);
-	if (ret == false && fwnode->secondary)
+	if (ret == false && fwnode && fwnode->secondary)
 		ret = __fwnode_property_present(fwnode->secondary, propname);
 		ret = __fwnode_property_present(fwnode->secondary, propname);
 	return ret;
 	return ret;
 }
 }
@@ -423,7 +423,7 @@ EXPORT_SYMBOL_GPL(device_property_match_string);
 	int _ret_;									\
 	int _ret_;									\
 	_ret_ = FWNODE_PROP_READ(_fwnode_, _propname_, _type_, _proptype_,		\
 	_ret_ = FWNODE_PROP_READ(_fwnode_, _propname_, _type_, _proptype_,		\
 				 _val_, _nval_);					\
 				 _val_, _nval_);					\
-	if (_ret_ == -EINVAL && _fwnode_->secondary)					\
+	if (_ret_ == -EINVAL && _fwnode_ && _fwnode_->secondary)			\
 		_ret_ = FWNODE_PROP_READ(_fwnode_->secondary, _propname_, _type_,	\
 		_ret_ = FWNODE_PROP_READ(_fwnode_->secondary, _propname_, _type_,	\
 				_proptype_, _val_, _nval_);				\
 				_proptype_, _val_, _nval_);				\
 	_ret_;										\
 	_ret_;										\
@@ -593,7 +593,7 @@ int fwnode_property_read_string_array(struct fwnode_handle *fwnode,
 	int ret;
 	int ret;
 
 
 	ret = __fwnode_property_read_string_array(fwnode, propname, val, nval);
 	ret = __fwnode_property_read_string_array(fwnode, propname, val, nval);
-	if (ret == -EINVAL && fwnode->secondary)
+	if (ret == -EINVAL && fwnode && fwnode->secondary)
 		ret = __fwnode_property_read_string_array(fwnode->secondary,
 		ret = __fwnode_property_read_string_array(fwnode->secondary,
 							  propname, val, nval);
 							  propname, val, nval);
 	return ret;
 	return ret;
@@ -621,7 +621,7 @@ int fwnode_property_read_string(struct fwnode_handle *fwnode,
 	int ret;
 	int ret;
 
 
 	ret = __fwnode_property_read_string(fwnode, propname, val);
 	ret = __fwnode_property_read_string(fwnode, propname, val);
-	if (ret == -EINVAL && fwnode->secondary)
+	if (ret == -EINVAL && fwnode && fwnode->secondary)
 		ret = __fwnode_property_read_string(fwnode->secondary,
 		ret = __fwnode_property_read_string(fwnode->secondary,
 						    propname, val);
 						    propname, val);
 	return ret;
 	return ret;