| From 8180a675e39d5544b9ed9e404bde7bf215194c75 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 29 Apr 2021 00:12:26 +0200 |
| Subject: media: bt878: do not schedule tasklet when it is not setup |
| |
| From: Tong Zhang <ztong0001@gmail.com> |
| |
| [ Upstream commit a3a54bf4bddaecda8b5767209cfc703f0be2841d ] |
| |
| There is a problem with the tasklet in bt878. bt->tasklet is set by |
| dvb-bt8xx.ko, and bt878.ko can be loaded independently. |
| In this case if interrupt comes it may cause null-ptr-dereference. |
| To solve this issue, we check if the tasklet is actually set before |
| calling tasklet_schedule. |
| |
| [ 1.750438] bt878(0): irq FDSR FBUS risc_pc= |
| [ 1.750728] BUG: kernel NULL pointer dereference, address: 0000000000000000 |
| [ 1.752969] RIP: 0010:0x0 |
| [ 1.757526] Call Trace: |
| [ 1.757659] <IRQ> |
| [ 1.757770] tasklet_action_common.isra.0+0x107/0x110 |
| [ 1.758041] tasklet_action+0x22/0x30 |
| [ 1.758237] __do_softirq+0xe0/0x29b |
| [ 1.758430] irq_exit_rcu+0xa4/0xb0 |
| [ 1.758618] common_interrupt+0x8d/0xa0 |
| [ 1.758824] </IRQ> |
| |
| Signed-off-by: Tong Zhang <ztong0001@gmail.com> |
| Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/media/pci/bt8xx/bt878.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/media/pci/bt8xx/bt878.c b/drivers/media/pci/bt8xx/bt878.c |
| index 79ba15a9385a..69a304e0db11 100644 |
| --- a/drivers/media/pci/bt8xx/bt878.c |
| +++ b/drivers/media/pci/bt8xx/bt878.c |
| @@ -300,7 +300,8 @@ static irqreturn_t bt878_irq(int irq, void *dev_id) |
| } |
| if (astat & BT878_ARISCI) { |
| bt->finished_block = (stat & BT878_ARISCS) >> 28; |
| - tasklet_schedule(&bt->tasklet); |
| + if (bt->tasklet.callback) |
| + tasklet_schedule(&bt->tasklet); |
| break; |
| } |
| count++; |
| -- |
| 2.30.2 |
| |