lkml.org 
[lkml]   [2015]   [Mar]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.13.y-ckt 29/80] regulator: core: fix race condition in regulator_put()
    Date
    3.13.11-ckt17 -stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Ashay Jaiswal <ashayj@codeaurora.org>

    commit 83b0302d347a49f951e904184afe57ac3723476e upstream.

    The regulator framework maintains a list of consumer regulators
    for a regulator device and protects it from concurrent access using
    the regulator device's mutex lock.

    In the case of regulator_put() the consumer is removed and regulator
    device's parameters are updated without holding the regulator device's
    mutex. This would lead to a race condition between the regulator_put()
    and any function which traverses the consumer list or modifies regulator
    device's parameters.
    Fix this race condition by holding the regulator device's mutex in case
    of regulator_put.

    Signed-off-by: Ashay Jaiswal <ashayj@codeaurora.org>
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Kamal Mostafa <kamal@canonical.com>
    ---
    drivers/regulator/core.c | 4 +++-
    1 file changed, 3 insertions(+), 1 deletion(-)

    diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
    index 7271299..1291043 100644
    --- a/drivers/regulator/core.c
    +++ b/drivers/regulator/core.c
    @@ -1479,7 +1479,7 @@ struct regulator *regulator_get_optional(struct device *dev, const char *id)
    }
    EXPORT_SYMBOL_GPL(regulator_get_optional);

    -/* Locks held by regulator_put() */
    +/* regulator_list_mutex lock held by regulator_put() */
    static void _regulator_put(struct regulator *regulator)
    {
    struct regulator_dev *rdev;
    @@ -1494,12 +1494,14 @@ static void _regulator_put(struct regulator *regulator)
    /* remove any sysfs entries */
    if (regulator->dev)
    sysfs_remove_link(&rdev->dev.kobj, regulator->supply_name);
    + mutex_lock(&rdev->mutex);
    kfree(regulator->supply_name);
    list_del(&regulator->list);
    kfree(regulator);

    rdev->open_count--;
    rdev->exclusive = 0;
    + mutex_unlock(&rdev->mutex);

    module_put(rdev->owner);
    }
    --
    1.9.1


    \
     
     \ /
      Last update: 2015-03-20 00:01    [W:4.048 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site