summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJia-Ju Bai <baijiaju1990@gmail.com>2018-09-15 11:13:03 +0800
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2018-09-18 13:29:10 +0200
commitbffa9b1cc64a12f3162f79151dee56199efbc785 (patch)
treed7a541b5324a9b1e7d168c8fdf8d6a29a31fcd5f
parent2051c6ae928ddbd4d314ba8ea89298d686ad86b7 (diff)
downloadlinux-stable-bffa9b1cc64a12f3162f79151dee56199efbc785.tar.gz
linux-stable-bffa9b1cc64a12f3162f79151dee56199efbc785.tar.bz2
linux-stable-bffa9b1cc64a12f3162f79151dee56199efbc785.zip
staging: dgnc: Fix a sleep-in-atomic-context bug in cls_assert_modem_signals()
The driver may sleep with holding a spinlock. The function call path (from bottom to top) in Linux-4.17 is: [FUNC] usleep_range drivers/staging/dgnc/dgnc_cls.c, 391: usleep_range in cls_assert_modem_signals drivers/staging/dgnc/dgnc_cls.c, 449: cls_assert_modem_signals in cls_copy_data_from_queue_to_uart drivers/staging/dgnc/dgnc_cls.c, 406: _raw_spin_lock_irqsave in cls_copy_data_from_queue_to_uart To fix this bug, usleep_range() is replaced with udelay(). This bug is found by my static analysis tool DSAC. Signed-off-by: Jia-Ju Bai <baijiaju1990@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/staging/dgnc/dgnc_cls.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/staging/dgnc/dgnc_cls.c b/drivers/staging/dgnc/dgnc_cls.c
index 7e6cbfe4e4ee..a1e98ee7f9e0 100644
--- a/drivers/staging/dgnc/dgnc_cls.c
+++ b/drivers/staging/dgnc/dgnc_cls.c
@@ -388,7 +388,7 @@ static void cls_assert_modem_signals(struct channel_t *ch)
writeb(out, &ch->ch_cls_uart->mcr);
/* Give time for the UART to actually drop the signals */
- usleep_range(10, 20);
+ udelay(20);
}
static void cls_copy_data_from_queue_to_uart(struct channel_t *ch)