diff options
author | Zenghui Yu <yuzenghui@huawei.com> | 2020-04-14 05:03:48 +0200 |
---|---|---|
committer | Marc Zyngier <maz@kernel.org> | 2020-04-23 17:26:56 +0200 |
commit | 57bdb436ce869a45881d8aa4bc5dac8e072dd2b6 (patch) | |
tree | c3ef73b2a34540ec32b1195025b0f8a5d18ed4d3 /virt | |
parent | KVM: arm64: vgic-v3: Retire all pending LPIs on vcpu destroy (diff) | |
download | linux-57bdb436ce869a45881d8aa4bc5dac8e072dd2b6.tar.xz linux-57bdb436ce869a45881d8aa4bc5dac8e072dd2b6.zip |
KVM: arm64: vgic-its: Fix memory leak on the error path of vgic_add_lpi()
If we're going to fail out the vgic_add_lpi(), let's make sure the
allocated vgic_irq memory is also freed. Though it seems that both
cases are unlikely to fail.
Signed-off-by: Zenghui Yu <yuzenghui@huawei.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20200414030349.625-3-yuzenghui@huawei.com
Diffstat (limited to 'virt')
-rw-r--r-- | virt/kvm/arm/vgic/vgic-its.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/virt/kvm/arm/vgic/vgic-its.c b/virt/kvm/arm/vgic/vgic-its.c index d53d34a33e35..c012a52b19f5 100644 --- a/virt/kvm/arm/vgic/vgic-its.c +++ b/virt/kvm/arm/vgic/vgic-its.c @@ -96,14 +96,21 @@ out_unlock: * We "cache" the configuration table entries in our struct vgic_irq's. * However we only have those structs for mapped IRQs, so we read in * the respective config data from memory here upon mapping the LPI. + * + * Should any of these fail, behave as if we couldn't create the LPI + * by dropping the refcount and returning the error. */ ret = update_lpi_config(kvm, irq, NULL, false); - if (ret) + if (ret) { + vgic_put_irq(kvm, irq); return ERR_PTR(ret); + } ret = vgic_v3_lpi_sync_pending_status(kvm, irq); - if (ret) + if (ret) { + vgic_put_irq(kvm, irq); return ERR_PTR(ret); + } return irq; } |