lkml.org 
[lkml]   [2020]   [Feb]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 027/113] uio: fix a sleep-in-atomic-context bug in uio_dmem_genirq_irqcontrol()
    Date
    From: Jia-Ju Bai <baijiaju1990@gmail.com>

    [ Upstream commit b74351287d4bd90636c3f48bc188c2f53824c2d4 ]

    The driver may sleep while holding a spinlock.
    The function call path (from bottom to top) in Linux 4.19 is:

    kernel/irq/manage.c, 523:
    synchronize_irq in disable_irq
    drivers/uio/uio_dmem_genirq.c, 140:
    disable_irq in uio_dmem_genirq_irqcontrol
    drivers/uio/uio_dmem_genirq.c, 134:
    _raw_spin_lock_irqsave in uio_dmem_genirq_irqcontrol

    synchronize_irq() can sleep at runtime.

    To fix this bug, disable_irq() is called without holding the spinlock.

    This bug is found by a static analysis tool STCheck written by myself.

    Signed-off-by: Jia-Ju Bai <baijiaju1990@gmail.com>
    Link: https://lore.kernel.org/r/20191218094405.6009-1-baijiaju1990@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/uio/uio_dmem_genirq.c | 6 ++++--
    1 file changed, 4 insertions(+), 2 deletions(-)

    diff --git a/drivers/uio/uio_dmem_genirq.c b/drivers/uio/uio_dmem_genirq.c
    index e1134a4d97f3f..a00b4aee6c799 100644
    --- a/drivers/uio/uio_dmem_genirq.c
    +++ b/drivers/uio/uio_dmem_genirq.c
    @@ -135,11 +135,13 @@ static int uio_dmem_genirq_irqcontrol(struct uio_info *dev_info, s32 irq_on)
    if (irq_on) {
    if (test_and_clear_bit(0, &priv->flags))
    enable_irq(dev_info->irq);
    + spin_unlock_irqrestore(&priv->lock, flags);
    } else {
    - if (!test_and_set_bit(0, &priv->flags))
    + if (!test_and_set_bit(0, &priv->flags)) {
    + spin_unlock_irqrestore(&priv->lock, flags);
    disable_irq(dev_info->irq);
    + }
    }
    - spin_unlock_irqrestore(&priv->lock, flags);

    return 0;
    }
    --
    2.20.1


    \
     
     \ /
      Last update: 2020-02-27 14:41    [W:4.199 / U:0.652 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site