Messages in this thread Patch in this message | | | From | Sergey Shtylyov <> | Subject | [PATCH] irq: ipi: fix NULL pointer deref in irq_data_get_affinity_mask() | Date | Wed, 17 Aug 2022 23:00:45 +0300 |
| |
Iff ipi_send_{mask|single}() get called with e.g. an invalid IRQ #, all the local variables there will be NULL -- the problem is that ipi_send_verify() (that's called first thing) doesn't verify its 'data' parameter, resulting in a kernel oops in irq_data_get_affinity_mask() as the passed NULL pointer gets dereferenced. Add a missing NULL check in ipi_send_verify()...
Found by Linux Verification Center (linuxtesting.org) with the SVACE static analysis tool.
Fixes: 3b8e29a82dd1 ("genirq: Implement ipi_send_mask/single()") Signed-off-by: Sergey Shtylyov <s.shtylyov@omp.ru>
--- The patch is against the 'tip.git' repo's 'master' branch...
kernel/irq/ipi.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
Index: tip/kernel/irq/ipi.c =================================================================== --- tip.orig/kernel/irq/ipi.c +++ tip/kernel/irq/ipi.c @@ -188,9 +188,9 @@ EXPORT_SYMBOL_GPL(ipi_get_hwirq); static int ipi_send_verify(struct irq_chip *chip, struct irq_data *data, const struct cpumask *dest, unsigned int cpu) { - const struct cpumask *ipimask = irq_data_get_affinity_mask(data); + const struct cpumask *ipimask; - if (!chip || !ipimask) + if (!chip || !data) return -EINVAL; if (!chip->ipi_send_single && !chip->ipi_send_mask) @@ -199,6 +199,10 @@ static int ipi_send_verify(struct irq_ch if (cpu >= nr_cpu_ids) return -EINVAL; + ipimask = irq_data_get_affinity_mask(data); + if (!ipimask) + return -EINVAL; + if (dest) { if (!cpumask_subset(dest, ipimask)) return -EINVAL;
| |