Skip to content

Commit 87f2d1c

Browse files
asverdlinKAGA-KOKO
authored andcommitted
genirq/irqdomain: Check pointer in irq_domain_alloc_irqs_hierarchy()
irq_domain_alloc_irqs_hierarchy() has 3 call sites in the compilation unit but only one of them checks for the pointer which is being dereferenced inside the called function. Move the check into the function. This allows for catching the error instead of the following crash: Unable to handle kernel NULL pointer dereference at virtual address 00000000 PC is at 0x0 LR is at gpiochip_hierarchy_irq_domain_alloc+0x11f/0x140 ... [<c06c23ff>] (gpiochip_hierarchy_irq_domain_alloc) [<c0462a89>] (__irq_domain_alloc_irqs) [<c0462dad>] (irq_create_fwspec_mapping) [<c06c2251>] (gpiochip_to_irq) [<c06c1c9b>] (gpiod_to_irq) [<bf973073>] (gpio_irqs_init [gpio_irqs]) [<bf974048>] (gpio_irqs_exit+0xecc/0xe84 [gpio_irqs]) Code: bad PC value Signed-off-by: Alexander Sverdlin <[email protected]> Signed-off-by: Thomas Gleixner <[email protected]> Link: https://lkml.kernel.org/r/[email protected]
1 parent 9ae0522 commit 87f2d1c

File tree

1 file changed

+5
-5
lines changed

1 file changed

+5
-5
lines changed

kernel/irq/irqdomain.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1310,6 +1310,11 @@ int irq_domain_alloc_irqs_hierarchy(struct irq_domain *domain,
13101310
unsigned int irq_base,
13111311
unsigned int nr_irqs, void *arg)
13121312
{
1313+
if (!domain->ops->alloc) {
1314+
pr_debug("domain->ops->alloc() is NULL\n");
1315+
return -ENOSYS;
1316+
}
1317+
13131318
return domain->ops->alloc(domain, irq_base, nr_irqs, arg);
13141319
}
13151320

@@ -1347,11 +1352,6 @@ int __irq_domain_alloc_irqs(struct irq_domain *domain, int irq_base,
13471352
return -EINVAL;
13481353
}
13491354

1350-
if (!domain->ops->alloc) {
1351-
pr_debug("domain->ops->alloc() is NULL\n");
1352-
return -ENOSYS;
1353-
}
1354-
13551355
if (realloc && irq_base >= 0) {
13561356
virq = irq_base;
13571357
} else {

0 commit comments

Comments
 (0)