]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
KVM: arm64: Tear down vGIC on failed vCPU creation
authorWill Deacon <will@kernel.org>
Fri, 14 Mar 2025 13:34:09 +0000 (13:34 +0000)
committerOliver Upton <oliver.upton@linux.dev>
Tue, 18 Mar 2025 06:30:51 +0000 (23:30 -0700)
If kvm_arch_vcpu_create() fails to share the vCPU page with the
hypervisor, we propagate the error back to the ioctl but leave the
vGIC vCPU data initialised. Note only does this leak the corresponding
memory when the vCPU is destroyed but it can also lead to use-after-free
if the redistributor device handling tries to walk into the vCPU.

Add the missing cleanup to kvm_arch_vcpu_create(), ensuring that the
vGIC vCPU structures are destroyed on error.

Cc: <stable@vger.kernel.org>
Cc: Marc Zyngier <maz@kernel.org>
Cc: Oliver Upton <oliver.upton@linux.dev>
Cc: Quentin Perret <qperret@google.com>
Signed-off-by: Will Deacon <will@kernel.org>
Reviewed-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20250314133409.9123-1-will@kernel.org
Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
arch/arm64/kvm/arm.c

index 36d8dd80b4310f2db159255d0556c4ff8d4b9d1b..fe1e1a1adc502c0dbfd9f1bd32fbb155043dc2ce 100644 (file)
@@ -466,7 +466,11 @@ int kvm_arch_vcpu_create(struct kvm_vcpu *vcpu)
        if (err)
                return err;
 
-       return kvm_share_hyp(vcpu, vcpu + 1);
+       err = kvm_share_hyp(vcpu, vcpu + 1);
+       if (err)
+               kvm_vgic_vcpu_destroy(vcpu);
+
+       return err;
 }
 
 void kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu)