x86/ioapic: Prevent NULL pointer dereference in setup_ioapic_dest()
authorWerner Pawlitschko <werner.pawlitschko@arcor.de>
Tue, 27 Oct 2015 00:08:04 +0000 (09:08 +0900)
committerThomas Gleixner <tglx@linutronix.de>
Tue, 27 Oct 2015 00:18:34 +0000 (09:18 +0900)
Commit 4857c91f0d19 changed the way how irq affinity is setup in
setup_ioapic_dest() from using the core helper function to
unconditionally calling the irq_set_affinity() callback of the
underlying irq chip.

That results in a NULL pointer dereference for the rare case where the
underlying irq chip is lapic_chip which has no irq_set_affinity()
callback. lapic_chip is occasionally used for the timer interrupt (irq
0).

The fix is simple: Check the availability of the callback instead of
calling it unconditionally.

Fixes: 4857c91f0d19 "x86/ioapic: Force affinity setting in setup_ioapic_dest()"
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: stable@vger.kernel.org
arch/x86/kernel/apic/io_apic.c

index bb6bfc01cb82dd6ffbe4aa49e92020b2600584d6..4f2821527014e14eba4051c27d05dc53ffe958f3 100644 (file)
@@ -2547,7 +2547,9 @@ void __init setup_ioapic_dest(void)
                        mask = apic->target_cpus();
 
                chip = irq_data_get_irq_chip(idata);
-               chip->irq_set_affinity(idata, mask, false);
+               /* Might be lapic_chip for irq 0 */
+               if (chip->irq_set_affinity)
+                       chip->irq_set_affinity(idata, mask, false);
        }
 }
 #endif