Skip to content

Commit b2a6996

Browse files
mz-pdmjic23
authored andcommitted
iio: core: Prevent invalid memory access when there is no parent
Commit 8136655 ("iio: core: Convert to use firmware node handle instead of OF node") switched the kind of nodes to use for label retrieval in device registration. Probably an unwanted change in that commit was that if the device has no parent then NULL pointer is accessed. This is what happens in the stock IIO dummy driver when a new entry is created in configfs: # mkdir /sys/kernel/config/iio/devices/dummy/foo BUG: kernel NULL pointer dereference, address: ... ... Call Trace: __iio_device_register iio_dummy_probe Since there seems to be no reason to make a parent device of an IIO dummy device mandatory, let’s prevent the invalid memory access in __iio_device_register when the parent device is NULL. With this change, the IIO dummy driver works fine with configfs. Fixes: 8136655 ("iio: core: Convert to use firmware node handle instead of OF node") Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Signed-off-by: Milan Zamazal <mzamazal@redhat.com> Link: https://lore.kernel.org/r/20230719083208.88149-1-mzamazal@redhat.com Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
1 parent 507397d commit b2a6996

File tree

1 file changed

+3
-2
lines changed

1 file changed

+3
-2
lines changed

drivers/iio/industrialio-core.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1888,7 +1888,7 @@ static const struct iio_buffer_setup_ops noop_ring_setup_ops;
18881888
int __iio_device_register(struct iio_dev *indio_dev, struct module *this_mod)
18891889
{
18901890
struct iio_dev_opaque *iio_dev_opaque = to_iio_dev_opaque(indio_dev);
1891-
struct fwnode_handle *fwnode;
1891+
struct fwnode_handle *fwnode = NULL;
18921892
int ret;
18931893

18941894
if (!indio_dev->info)
@@ -1899,7 +1899,8 @@ int __iio_device_register(struct iio_dev *indio_dev, struct module *this_mod)
18991899
/* If the calling driver did not initialize firmware node, do it here */
19001900
if (dev_fwnode(&indio_dev->dev))
19011901
fwnode = dev_fwnode(&indio_dev->dev);
1902-
else
1902+
/* The default dummy IIO device has no parent */
1903+
else if (indio_dev->dev.parent)
19031904
fwnode = dev_fwnode(indio_dev->dev.parent);
19041905
device_set_node(&indio_dev->dev, fwnode);
19051906

0 commit comments

Comments
 (0)