Commit 3589972e authored by Alan Stern's avatar Alan Stern Committed by Greg Kroah-Hartman

Driver core: fix race in dev_driver_string

This patch (as1310) works around a race in dev_driver_string().  If
the device is unbound while the function is running, dev->driver might
become NULL after we test it and before we dereference it.
Signed-off-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Cc: stable <stable@kernel.org>
Cc: Oliver Neukum <oliver@neukum.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent c60e0504
...@@ -56,7 +56,14 @@ static inline int device_is_not_partition(struct device *dev) ...@@ -56,7 +56,14 @@ static inline int device_is_not_partition(struct device *dev)
*/ */
const char *dev_driver_string(const struct device *dev) const char *dev_driver_string(const struct device *dev)
{ {
return dev->driver ? dev->driver->name : struct device_driver *drv;
/* dev->driver can change to NULL underneath us because of unbinding,
* so be careful about accessing it. dev->bus and dev->class should
* never change once they are set, so they don't need special care.
*/
drv = ACCESS_ONCE(dev->driver);
return drv ? drv->name :
(dev->bus ? dev->bus->name : (dev->bus ? dev->bus->name :
(dev->class ? dev->class->name : "")); (dev->class ? dev->class->name : ""));
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment