Patch "iio: inkern: only release the device node when done with it" has been added to the 5.10-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    iio: inkern: only release the device node when done with it

to the 5.10-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     iio-inkern-only-release-the-device-node-when-done-wi.patch
and it can be found in the queue-5.10 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit db93aae1642281f169408ab67cce5e8d601848de
Author: Nuno Sá <nuno.sa@xxxxxxxxxx>
Date:   Fri Jul 15 14:28:49 2022 +0200

    iio: inkern: only release the device node when done with it
    
    [ Upstream commit 79c3e84874c7d14f04ad58313b64955a0d2e9437 ]
    
    'of_node_put()' can potentially release the memory pointed to by
    'iiospec.np' which would leave us with an invalid pointer (and we would
    still pass it in 'of_xlate()'). Note that it is not guaranteed for the
    of_node lifespan to be attached to the device (to which is attached)
    lifespan so that there is (even though very unlikely) the possibility
    for the node to be freed while the device is still around. Thus, as there
    are indeed some of_xlate users which do access the node, a race is indeed
    possible.
    
    As such, we can only release the node after we are done with it.
    
    Fixes: 17d82b47a215d ("iio: Add OF support")
    Signed-off-by: Nuno Sá <nuno.sa@xxxxxxxxxx>
    Link: https://lore.kernel.org/r/20220715122903.332535-2-nuno.sa@xxxxxxxxxx
    Signed-off-by: Jonathan Cameron <Jonathan.Cameron@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/iio/inkern.c b/drivers/iio/inkern.c
index 8c3faa797284..c32b2577dd99 100644
--- a/drivers/iio/inkern.c
+++ b/drivers/iio/inkern.c
@@ -136,9 +136,10 @@ static int __of_iio_channel_get(struct iio_channel *channel,
 
 	idev = bus_find_device(&iio_bus_type, NULL, iiospec.np,
 			       iio_dev_node_match);
-	of_node_put(iiospec.np);
-	if (idev == NULL)
+	if (idev == NULL) {
+		of_node_put(iiospec.np);
 		return -EPROBE_DEFER;
+	}
 
 	indio_dev = dev_to_iio_dev(idev);
 	channel->indio_dev = indio_dev;
@@ -146,6 +147,7 @@ static int __of_iio_channel_get(struct iio_channel *channel,
 		index = indio_dev->info->of_xlate(indio_dev, &iiospec);
 	else
 		index = __of_iio_simple_xlate(indio_dev, &iiospec);
+	of_node_put(iiospec.np);
 	if (index < 0)
 		goto err_put;
 	channel->channel = &indio_dev->channels[index];



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux