x86/xen: Fix memory leak in xen_init_lock_cpu()
authorXiu Jianfeng <xiujianfeng@huawei.com>
Wed, 23 Nov 2022 15:58:58 +0000 (23:58 +0800)
committerJuergen Gross <jgross@suse.com>
Mon, 5 Dec 2022 11:59:50 +0000 (12:59 +0100)
In xen_init_lock_cpu(), the @name has allocated new string by kasprintf(),
if bind_ipi_to_irqhandler() fails, it should be freed, otherwise may lead
to a memory leak issue, fix it.

Fixes: 2d9e1e2f58b5 ("xen: implement Xen-specific spinlocks")
Signed-off-by: Xiu Jianfeng <xiujianfeng@huawei.com>
Reviewed-by: Juergen Gross <jgross@suse.com>
Link: https://lore.kernel.org/r/20221123155858.11382-3-xiujianfeng@huawei.com
Signed-off-by: Juergen Gross <jgross@suse.com>
arch/x86/xen/spinlock.c

index 043c73d..5c6fc16 100644 (file)
@@ -75,6 +75,7 @@ void xen_init_lock_cpu(int cpu)
             cpu, per_cpu(lock_kicker_irq, cpu));
 
        name = kasprintf(GFP_KERNEL, "spinlock%d", cpu);
+       per_cpu(irq_name, cpu) = name;
        irq = bind_ipi_to_irqhandler(XEN_SPIN_UNLOCK_VECTOR,
                                     cpu,
                                     dummy_handler,
@@ -85,7 +86,6 @@ void xen_init_lock_cpu(int cpu)
        if (irq >= 0) {
                disable_irq(irq); /* make sure it's never delivered */
                per_cpu(lock_kicker_irq, cpu) = irq;
-               per_cpu(irq_name, cpu) = name;
        }
 
        printk("cpu %d spinlock event irq %d\n", cpu, irq);
@@ -98,6 +98,8 @@ void xen_uninit_lock_cpu(int cpu)
        if (!xen_pvspin)
                return;
 
+       kfree(per_cpu(irq_name, cpu));
+       per_cpu(irq_name, cpu) = NULL;
        /*
         * When booting the kernel with 'mitigations=auto,nosmt', the secondary
         * CPUs are not activated, and lock_kicker_irq is not initialized.
@@ -108,8 +110,6 @@ void xen_uninit_lock_cpu(int cpu)
 
        unbind_from_irqhandler(irq, NULL);
        per_cpu(lock_kicker_irq, cpu) = -1;
-       kfree(per_cpu(irq_name, cpu));
-       per_cpu(irq_name, cpu) = NULL;
 }
 
 PV_CALLEE_SAVE_REGS_THUNK(xen_vcpu_stolen);